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:
Erwan Gouriou 2023-09-27 17:58:43 +02:00 committed by Fabio Baltieri
commit 3d0c391ff2
4 changed files with 57 additions and 0 deletions

View file

@ -0,0 +1,5 @@
description: Serial Wire - JTAG Connector
compatible: "swj-connector"
include: pinctrl-device.yaml

View file

@ -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()

View file

@ -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

View 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);