button with "gpio-keys" not fired when CONFIG_PM_DEVICE_RUNTIME=y

Hi,

using nrf connect SDK v3.1.1

using nrf54L15 development board.

I am trying to run a simple button event yet callback is not fired when 

CONFIG_PM_DEVICE_RUNTIME=y

when 

CONFIG_PM_DEVICE_RUNTIME=n
it works.
single change in the project.

INPUT_CALLBACK_DEFINE(pad_input,
                      input_cb,
                      NULL);

static void input_cb(struct input_event *evt, void *user_data)
{
    LOG_DBG("Button event code %d: pressed=%d", evt->code, evt->value);

}

	///
	/// Inputs with debouncing.
	///
    pad_input:pad_input {
        compatible = "gpio-keys";
		debounce-interval-ms = <150>;                      /* Debouncing time */
        pad_state_in: pad_state_in {
            gpios = PAD_IN_GPIO_SPEC;
            label = "pad_signal_in";
            zephyr,code = <INPUT_KEY_0>;
        };

thanks

Dan

  • #define PAD_IN_GPIO_SPEC        <&gpio1 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
    
    using dev board button0
    

  • CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000
    
    CONFIG_PM_DEVICE=y
    CONFIG_PM_DEVICE_RUNTIME=y
    #CONFIG_NRFX_UARTE20=y
    #CONFIG_PINCTRL=y
    #CONFIG_PINCTRL_NRF=y
    #CONFIG_PINCTRL_DYNAMIC=y
    
    # Shell
    CONFIG_SHELL=y
    CONFIG_SHELL_BACKEND_SERIAL=y
    CONFIG_UART_CONSOLE=y
    
    # Logging
    CONFIG_LOG=y
    CONFIG_LOG_DEFAULT_LEVEL=2
    CONFIG_LOG_MODE_MINIMAL=n
    #CONFIG_LOG_BACKEND_UART=n
    CONFIG_LOG_RUNTIME_FILTERING=y              # adds ability to change log levels at runtime
    #CONFIG_LOG_MODE_IMMEDIATE=y
    CONFIG_LOG_CMDS=y                           # shell commands
    CONFIG_LOG_PRINTK=y
    
    # Bluetooth
    CONFIG_BT=y
    CONFIG_BT_PERIPHERAL=y
    CONFIG_BT_DEVICE_NAME="BLE_Advertiser"
    CONFIG_BT_DEVICE_APPEARANCE=0
    CONFIG_BT_PRIVACY=n
    CONFIG_BT_HCI=y
    
    
    #float support
    CONFIG_CBPRINTF_FP_SUPPORT=y                # enables float support in printf functions
    
    # external flash
    CONFIG_FLASH=y
    CONFIG_SPI_NOR_SFDP_RUNTIME=y               # enable SFDP support for SPI NOR flash
    CONFIG_SPI_NOR=y
    CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096
    CONFIG_FLASH_PAGE_LAYOUT=y                  # enable flash page layout API    
    CONFIG_FLASH_SHELL=y
    CONFIG_FLASH_MAP=y
    
    # NVS Filesystem
    CONFIG_NVS=y
    CONFIG_NVS_LOG_LEVEL_DBG=y
    CONFIG_MPU_ALLOW_FLASH_WRITE=y
    
    # Input sub system
    CONFIG_INPUT=y
    CONFIG_INPUT_EVENT_DUMP=y
    CONFIG_INPUT_GPIO_KEYS=y
    CONFIG_GPIO=y
    CONFIG_LED=y
    CONFIG_LED_GPIO=y
    
    # NFC
    CONFIG_NFC_T4T_NRFXLIB=y
    CONFIG_NFC_NDEF=y
    CONFIG_NFC_NDEF_MSG=y
    CONFIG_NFC_NDEF_RECORD=y
    CONFIG_NFC_NDEF_LE_OOB_REC=y
    CONFIG_NFC_NDEF_PARSER=y
    
    
    # HEAP
    
    # CONFIG_PM_PARTITION_SIZE_NVS_STORAGE=0x00
    
    # MAIN TASK MODULE
    CONFIG_APP_MAIN_TASK_ENABLED=y
    CONFIG_APP_MAIN_TASK_SHORT_QUEUE_LEN=10
    CONFIG_APP_MAIN_TASK_MAX_SHORT_MESSAGE_LEN=4
    CONFIG_APP_MAIN_TASK_LONG_QUEUE_LEN=4
    CONFIG_APP_MAIN_TASK_MAX_LONG_MESSAGE_LEN=128
    CONFIG_APP_MAIN_TASK_MAX_NUM_OF_EVENTS=15 
    

    added proj.conf
  • Hi,

     

    My apologies for the late response.

    When setting 

    CONFIG_PM_DEVICE_RUNTIME=y

    the default state of the power management system is to place each device in a suspended state, as per the zephyr docs:

    https://docs.zephyrproject.org/latest/services/pm/device_runtime.html#introduction

     

    To enable it, you need to:

    #include <zephyr/devicetree.h>
    #include <zephyr/pm/device_runtime.h>
    
    ...
    pm_device_runtime_get(DEVICE_DT_GET(DT_NODELABEL(pad_input)));

    On a DK, you need to use DT_PATH, as the "buttons" node has no label:

    pm_device_runtime_get(DEVICE_DT_GET(DT_PATH(buttons)));

     

    Kind regards,

    Håkon

  • thanks for your very helpful assistants,

    zephyr doc states:

    yet the proj.conf has two define we can play with

    CONFIG_PM_DEVICE=y
    CONFIG_PM_DEVICE_RUNTIME=n
    do I understand correctly?
    if CONFIG_PM_DEVICE_RUNTIME=n
    then use:
    pm_device_action_run(uart, PM_DEVICE_ACTION_SUSPEND);
    pm_device_action_run(uart, PM_DEVICE_ACTION_RESUME);
    if CONFIG_PM_DEVICE_RUNTIME=y
    then use:
    pm_device_runtime_enable(uart);
    pm_device_runtime_put(uart);
    pm_device_runtime_get(uart);
    etc..
    Also the pm_device_runtime_enable won't enable when CONFIG is n.
    What is recommendation when to use one, or both CONFIG settings.
    thanks
    Dan

  • Hi Dan,

     

    Yes, your observations are indeed correct wrt. having CONFIG_PM_DEVICE_RUNTIME either selected or n-selected.

    narfster said:
    What is recommendation when to use one, or both CONFIG settings.

    Both are fine to use in this case, but requires different API handling, unfortunately. Which one to use and implement is based on your own preference on the matter.

     

    Kind regards,

    Håkon

Related