soc: stm32: PM: Disable jtag port pins if no debug
At chip startup, jtag pins are configured by default to enable debug. This configuration adds consumption and when using PM profile, we can save ~40uA by resetting this configuration and setting pins to analog mode. Signed-off-by: Erwan Gouriou <erwan.gouriou@st.com>
This commit is contained in:
parent
9c7c63eb13
commit
3d0c391ff2
4 changed files with 57 additions and 0 deletions
5
dts/bindings/gpio/swj-connector.yaml
Normal file
5
dts/bindings/gpio/swj-connector.yaml
Normal file
|
@ -0,0 +1,5 @@
|
|||
description: Serial Wire - JTAG Connector
|
||||
|
||||
compatible: "swj-connector"
|
||||
|
||||
include: pinctrl-device.yaml
|
|
@ -8,3 +8,7 @@ zephyr_sources_ifdef(CONFIG_STM32_BACKUP_SRAM stm32_backup_sram.c)
|
|||
zephyr_linker_sources_ifdef(CONFIG_STM32_BACKUP_SRAM SECTIONS stm32_backup_sram.ld)
|
||||
|
||||
zephyr_sources(soc_config.c)
|
||||
|
||||
if (NOT CONFIG_DEBUG AND CONFIG_PM)
|
||||
zephyr_sources_ifdef(CONFIG_DT_HAS_SWJ_CONNECTOR_ENABLED pm_debug_swj.c)
|
||||
endif()
|
||||
|
|
|
@ -21,6 +21,14 @@ config USE_STM32_ASSERT
|
|||
help
|
||||
Enable asserts in STM32Cube HAL and LL drivers.
|
||||
|
||||
config SWJ_ANALOG_PRIORITY
|
||||
int "SWJ DP port to analog routine initialization priority"
|
||||
default 49
|
||||
help
|
||||
Initialization priority of the routine within the PRE_KERNEL1 level.
|
||||
This priority must be greater than GPIO_INIT_PRIORITY and lower than
|
||||
UART_INIT_PRIORITY.
|
||||
|
||||
choice POWER_SUPPLY_CHOICE
|
||||
prompt "STM32 power supply configuration"
|
||||
default POWER_SUPPLY_LDO
|
||||
|
|
40
soc/arm/st_stm32/common/pm_debug_swj.c
Normal file
40
soc/arm/st_stm32/common/pm_debug_swj.c
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright (c) 2023 STMicroelectronics
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/drivers/pinctrl.h>
|
||||
#include <zephyr/init.h>
|
||||
|
||||
#define SWJ_NODE DT_NODELABEL(swj_port)
|
||||
|
||||
PINCTRL_DT_DEFINE(SWJ_NODE);
|
||||
|
||||
const struct pinctrl_dev_config *swj_pcfg = PINCTRL_DT_DEV_CONFIG_GET(SWJ_NODE);
|
||||
|
||||
/*
|
||||
* Serial Wire / JTAG port pins are enabled as part of SoC default configuration.
|
||||
* When debug access is not needed and in case power consumption performance is
|
||||
* expected, configure matching pins to analog in order to save power.
|
||||
*/
|
||||
|
||||
static int swj_to_analog(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* Set Serial Wire / JTAG port pins to analog mode */
|
||||
err = pinctrl_apply_state(swj_pcfg, PINCTRL_STATE_SLEEP);
|
||||
if (err < 0) {
|
||||
__ASSERT(0, "SWJ pinctrl setup failed");
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Run this routine as the earliest pin configuration in the target,
|
||||
* to avoid potential conflicts with devices accessing SWJ-DG pins for
|
||||
* their own needs.
|
||||
*/
|
||||
SYS_INIT(swj_to_analog, PRE_KERNEL_1, CONFIG_SWJ_ANALOG_PRIORITY);
|
Loading…
Add table
Add a link
Reference in a new issue