diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt index 467aeeb..0f4de3f 100644 --- a/firmware/CMakeLists.txt +++ b/firmware/CMakeLists.txt @@ -16,7 +16,7 @@ target_sources(app PRIVATE zephyr_linker_sources(ROM_SECTIONS src/event.ld) -target_sources_ifdef(CONFIG_BT app PRIVATE src/ble.c src/ble_status.c src/ble_shell.c) +target_sources_ifdef(CONFIG_BT app PRIVATE src/ble.c src/ble_shell.c) target_sources_ifdef(CONFIG_APP_BAS_FUEL_GAUGE app PRIVATE src/bas_fuel_gauge.c) target_sources_ifdef(CONFIG_APP_BAS_FUEL_GAUGE_SENSOR app PRIVATE src/bas_fuel_gauge_sensor.c) @@ -34,5 +34,6 @@ target_sources_ifdef(CONFIG_DT_HAS_USB_HID_ENABLED app PRIVATE src/usb_hid.c) target_sources_ifdef(CONFIG_DT_HAS_BLE_UNPAIR_ENABLED app PRIVATE src/ble_unpair.c) target_sources_ifdef(CONFIG_DT_HAS_XINPUT_ENABLED app PRIVATE src/xinput.c) target_sources_ifdef(CONFIG_DT_HAS_TI_DRV8830_ENABLED app PRIVATE src/drv8830.c) +target_sources_ifdef(CONFIG_DT_HAS_PM_CONTROL_ENABLED app PRIVATE src/pm_control.c) target_sources_ifdef(CONFIG_USB_DEVICE_STACK_NEXT app PRIVATE src/usbd.c) diff --git a/firmware/boards/balto/ble_pulse_encoder/ble_pulse_encoder.dts b/firmware/boards/balto/ble_pulse_encoder/ble_pulse_encoder.dts index 050ab9a..a1cdbe6 100644 --- a/firmware/boards/balto/ble_pulse_encoder/ble_pulse_encoder.dts +++ b/firmware/boards/balto/ble_pulse_encoder/ble_pulse_encoder.dts @@ -41,7 +41,7 @@ }; }; - sensor: gpio_qdec: gpio-qdec { + gpio_qdec: gpio-qdec { compatible = "gpio-qdec"; gpios = <&gpio0 17 GPIO_ACTIVE_LOW>, <&gpio0 13 GPIO_ACTIVE_LOW>; @@ -97,6 +97,12 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&gpio_qdec>; + }; }; &uicr { diff --git a/firmware/boards/balto/ds2_retrofit/ds2_retrofit.dts b/firmware/boards/balto/ds2_retrofit/ds2_retrofit.dts index 4259dba..29d2960 100644 --- a/firmware/boards/balto/ds2_retrofit/ds2_retrofit.dts +++ b/firmware/boards/balto/ds2_retrofit/ds2_retrofit.dts @@ -185,6 +185,12 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&aa &button_scan>; + }; }; &uicr { @@ -260,7 +266,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; clock-frequency = ; pinctrl-0 = <&i2c0_default>; diff --git a/firmware/boards/balto/kbd_matrix/kbd_matrix.dts b/firmware/boards/balto/kbd_matrix/kbd_matrix.dts index f97a08b..f8367d2 100644 --- a/firmware/boards/balto/kbd_matrix/kbd_matrix.dts +++ b/firmware/boards/balto/kbd_matrix/kbd_matrix.dts @@ -25,7 +25,7 @@ }; }; - sensor: kbd-matrix { + kbd_matrix: kbd-matrix { compatible = "gpio-kbd-matrix"; /* row-gpios = <&gpio0 14 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>, @@ -105,6 +105,11 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + connect-on = <&kbd_matrix>; + }; }; &uicr { @@ -134,7 +139,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; clock-frequency = ; pinctrl-0 = <&i2c0_default>; diff --git a/firmware/boards/balto/negcon-retro/negcon_retro.dts b/firmware/boards/balto/negcon-retro/negcon_retro.dts index d23bd76..d942199 100644 --- a/firmware/boards/balto/negcon-retro/negcon_retro.dts +++ b/firmware/boards/balto/negcon-retro/negcon_retro.dts @@ -158,6 +158,12 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&aa>; + }; }; &uicr { @@ -226,7 +232,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; clock-frequency = ; pinctrl-0 = <&i2c0_default>; diff --git a/firmware/boards/balto/paw_g3/paw_g3.dts b/firmware/boards/balto/paw_g3/paw_g3.dts index 0106d16..4c4b7f6 100644 --- a/firmware/boards/balto/paw_g3/paw_g3.dts +++ b/firmware/boards/balto/paw_g3/paw_g3.dts @@ -91,6 +91,12 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&paw &pat>; + }; }; &uicr { @@ -114,8 +120,9 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; + clock-frequency = ; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -157,7 +164,7 @@ cs-gpios = <&gpio0 30 GPIO_ACTIVE_LOW>; - sensor: paw: paw3222@0 { + paw: paw3222@0 { compatible = "pixart,paw32xx"; reg = <0>; spi-max-frequency = ; diff --git a/firmware/boards/balto/paw_pogo/paw_pogo.dts b/firmware/boards/balto/paw_pogo/paw_pogo.dts index 9fecac5..0d3eb44 100644 --- a/firmware/boards/balto/paw_pogo/paw_pogo.dts +++ b/firmware/boards/balto/paw_pogo/paw_pogo.dts @@ -64,6 +64,12 @@ in-report-size = <16>; in-polling-period-us = <1000>; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&paw &pat>; + }; }; &clk_lsi { diff --git a/firmware/boards/balto/paw_testboard/paw_testboard.dts b/firmware/boards/balto/paw_testboard/paw_testboard.dts index ea47700..f96ad08 100644 --- a/firmware/boards/balto/paw_testboard/paw_testboard.dts +++ b/firmware/boards/balto/paw_testboard/paw_testboard.dts @@ -93,6 +93,12 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&paw>; + }; }; &uicr { @@ -140,8 +146,9 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; + clock-frequency = ; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -162,7 +169,7 @@ cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; - sensor: paw: paw3222@0 { + paw: paw3222@0 { compatible = "pixart,paw32xx"; reg = <0>; spi-max-frequency = ; diff --git a/firmware/boards/balto/ploopy_mouse_nrf/ploopy_mouse_nrf.dts b/firmware/boards/balto/ploopy_mouse_nrf/ploopy_mouse_nrf.dts index ad2de66..b83fcd7 100644 --- a/firmware/boards/balto/ploopy_mouse_nrf/ploopy_mouse_nrf.dts +++ b/firmware/boards/balto/ploopy_mouse_nrf/ploopy_mouse_nrf.dts @@ -135,6 +135,12 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&pmw &gpio_qdec>; + }; }; &uicr { @@ -173,8 +179,9 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; + clock-frequency = ; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -206,7 +213,7 @@ cs-gpios = <&gpio0 2 GPIO_ACTIVE_LOW>; - sensor: pmw: pmw3610@0 { + pmw: pmw3610@0 { compatible = "pixart,pmw3610"; reg = <0>; spi-max-frequency = ; diff --git a/firmware/boards/balto/pmw_testboard/pmw_testboard.dts b/firmware/boards/balto/pmw_testboard/pmw_testboard.dts index e4f97c6..d90ff30 100644 --- a/firmware/boards/balto/pmw_testboard/pmw_testboard.dts +++ b/firmware/boards/balto/pmw_testboard/pmw_testboard.dts @@ -93,6 +93,12 @@ key-a = ; key-b = ; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&pmw>; + }; }; &uicr { @@ -140,8 +146,9 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; + clock-frequency = ; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -162,7 +169,7 @@ cs-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; - sensor: pmw: pmw3610@0 { + pmw: pmw3610@0 { compatible = "pixart,pmw3610"; reg = <0>; spi-max-frequency = ; diff --git a/firmware/boards/balto/zalpakka/zalpakka.dts b/firmware/boards/balto/zalpakka/zalpakka.dts index 982b0fa..5a9a424 100644 --- a/firmware/boards/balto/zalpakka/zalpakka.dts +++ b/firmware/boards/balto/zalpakka/zalpakka.dts @@ -276,6 +276,11 @@ }; }; + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&aa &gyro &gpio_qdec>; + }; }; &uicr { @@ -337,7 +342,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; + compatible = "nordic,nrf-twim"; status = "okay"; clock-frequency = ; pinctrl-0 = <&i2c0_default>; diff --git a/firmware/boards/darfon.conf b/firmware/boards/darfon.conf index 05d1a77..511902c 100644 --- a/firmware/boards/darfon.conf +++ b/firmware/boards/darfon.conf @@ -2,3 +2,4 @@ CONFIG_APP_DEVICE_NAME="ZDarfon" CONFIG_PWM=y CONFIG_USB_DEVICE_STACK_NEXT=y CONFIG_APP_USB_REMOTE_WAKEUP=y +CONFIG_PM_DEVICE_RUNTIME=n diff --git a/firmware/boards/mimxrt1010_evk.overlay b/firmware/boards/mimxrt1010_evk.overlay index 0e6e417..dfc8134 100644 --- a/firmware/boards/mimxrt1010_evk.overlay +++ b/firmware/boards/mimxrt1010_evk.overlay @@ -50,6 +50,12 @@ compatible = "xinput"; input = <&buttons>; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&buttons>; + }; }; led_input_activity: &green_led {}; diff --git a/firmware/boards/nrf52840dongle.overlay b/firmware/boards/nrf52840dongle.overlay index e64e50b..4d36799 100644 --- a/firmware/boards/nrf52840dongle.overlay +++ b/firmware/boards/nrf52840dongle.overlay @@ -76,6 +76,12 @@ compatible = "xinput"; input = <&buttons>; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&buttons>; + }; }; led_input_activity: &led1_red {}; diff --git a/firmware/boards/nrf52dk_nrf52832.overlay b/firmware/boards/nrf52dk_nrf52832.overlay index 8b51317..d1e20c0 100644 --- a/firmware/boards/nrf52dk_nrf52832.overlay +++ b/firmware/boards/nrf52dk_nrf52832.overlay @@ -87,6 +87,12 @@ }; }; }; + + pm-control { + compatible = "pm-control"; + always-on = <&buttons>; + connect-on = <&buttons_2>; + }; }; led_status: &led0 {}; diff --git a/firmware/boards/paw_pogo.conf b/firmware/boards/paw_pogo.conf index 86c9d91..70312b9 100644 --- a/firmware/boards/paw_pogo.conf +++ b/firmware/boards/paw_pogo.conf @@ -7,3 +7,5 @@ CONFIG_CONSOLE=y CONFIG_USB_DEVICE_STACK=n CONFIG_USB_DEVICE_STACK_NEXT=y + +CONFIG_PM_DEVICE_RUNTIME=n diff --git a/firmware/dts/bindings/pm-control.yaml b/firmware/dts/bindings/pm-control.yaml new file mode 100644 index 0000000..549d1be --- /dev/null +++ b/firmware/dts/bindings/pm-control.yaml @@ -0,0 +1,10 @@ +description: PM control node + +compatible: pm-control + +properties: + always-on: + type: phandles + + connect-on: + type: phandles diff --git a/firmware/prj.conf b/firmware/prj.conf index 2f8997b..e76c5cf 100644 --- a/firmware/prj.conf +++ b/firmware/prj.conf @@ -1,4 +1,5 @@ CONFIG_PM_DEVICE=y +CONFIG_PM_DEVICE_RUNTIME=y CONFIG_GPIO=y CONFIG_LOG=y CONFIG_DEBUG_THREAD_INFO=y diff --git a/firmware/src/ble_status.c b/firmware/src/ble_status.c deleted file mode 100644 index 19fddc1..0000000 --- a/firmware/src/ble_status.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include - -LOG_MODULE_REGISTER(ble_state, LOG_LEVEL_INF); - -static const struct device *sensor = DEVICE_DT_GET_OR_NULL(DT_NODELABEL(sensor)); - -static void connected(struct bt_conn *conn, uint8_t err) -{ - if (sensor != NULL) { - pm_device_action_run(sensor, PM_DEVICE_ACTION_RESUME); - } -} - -static void disconnected(struct bt_conn *conn, uint8_t reason) -{ - if (sensor != NULL) { - pm_device_action_run(sensor, PM_DEVICE_ACTION_SUSPEND); - } -} - -BT_CONN_CB_DEFINE(conn_callbacks) = { - .connected = connected, - .disconnected = disconnected, -}; diff --git a/firmware/src/pm_control.c b/firmware/src/pm_control.c new file mode 100644 index 0000000..02407f8 --- /dev/null +++ b/firmware/src/pm_control.c @@ -0,0 +1,50 @@ +#define DT_DRV_COMPAT pm_control + +#include +#include +#include +#include + +#include "event.h" + +LOG_MODULE_REGISTER(pm_control, LOG_LEVEL_INF); + +#define DEVICE_DT_GET_BY_IDX(node, prop, idx) \ + DEVICE_DT_GET(DT_PHANDLE_BY_IDX(node, prop, idx)) + +static const struct device *always_on[] = { +#if DT_INST_NODE_HAS_PROP(0, always_on) + DT_INST_FOREACH_PROP_ELEM_SEP(0, always_on, DEVICE_DT_GET_BY_IDX, (,)) +#endif +}; + +static const struct device *connect_on[] = { + DT_INST_FOREACH_PROP_ELEM_SEP(0, connect_on, DEVICE_DT_GET_BY_IDX, (,)) +}; + +static void pm_control_cb(enum event_code code) +{ + uint8_t i; + + switch (code) { + case EVENT_BOOT: + for (i = 0; i < ARRAY_SIZE(always_on); i++) { + pm_device_runtime_get(always_on[i]); + } + break; + case EVENT_BT_CONNECTED: + case EVENT_USB_CONNECTED: + for (i = 0; i < ARRAY_SIZE(connect_on); i++) { + pm_device_runtime_get(connect_on[i]); + } + break; + case EVENT_BT_DISCONNECTED: + case EVENT_USB_DISCONNECTED: + for (i = 0; i < ARRAY_SIZE(connect_on); i++) { + pm_device_runtime_put(connect_on[i]); + } + break; + default: + } +} +EVENT_CALLBACK_DEFINE(pm_control_cb);