diff --git a/.github/workflows/micropython-picow.yml b/.github/workflows/micropython-picow.yml index 77dbc368..e73c7cca 100644 --- a/.github/workflows/micropython-picow.yml +++ b/.github/workflows/micropython-picow.yml @@ -73,7 +73,7 @@ jobs: - name: picow_galactic_unicorn board: PICO_W - name: picow_inky_frame - board: PICO_W + board: PICO_W_INKY env: # MicroPython version will be contained in github.event.release.tag_name for releases diff --git a/micropython/_board/picow_inky_frame/pico_w_inky.h b/micropython/_board/picow_inky_frame/pico_w_inky.h index b4a8bd7a..8c6e3fdd 100644 --- a/micropython/_board/picow_inky_frame/pico_w_inky.h +++ b/micropython/_board/picow_inky_frame/pico_w_inky.h @@ -99,4 +99,9 @@ #define CYW43_WL_GPIO_LED_PIN 0 #endif +#ifdef WAKEUP_HAS_SHIFT_REGISTER +#undef WAKEUP_HAS_SHIFT_REGISTER +#endif +#define WAKEUP_HAS_SHIFT_REGISTER (1) + #endif diff --git a/micropython/modules/wakeup/wakeup.c b/micropython/modules/wakeup/wakeup.c index 5c4c326b..918c3220 100644 --- a/micropython/modules/wakeup/wakeup.c +++ b/micropython/modules/wakeup/wakeup.c @@ -1,10 +1,16 @@ #include "wakeup.h" STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_get_gpio_state_obj, Wakeup_get_gpio_state); +#if WAKEUP_HAS_SHIFT_REGISTER==1 +STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_get_shift_state_obj, Wakeup_get_shift_state); +#endif STATIC const mp_map_elem_t wakeup_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_wakeup) }, - { MP_ROM_QSTR(MP_QSTR_get_gpio_state), MP_ROM_PTR(&Wakeup_get_gpio_state_obj) } + { MP_ROM_QSTR(MP_QSTR_get_gpio_state), MP_ROM_PTR(&Wakeup_get_gpio_state_obj) }, +#if WAKEUP_HAS_SHIFT_REGISTER==1 + { MP_ROM_QSTR(MP_QSTR_get_shift_state), MP_ROM_PTR(&Wakeup_get_shift_state_obj) } +#endif }; STATIC MP_DEFINE_CONST_DICT(mp_module_wakeup_globals, wakeup_globals_table); diff --git a/micropython/modules/wakeup/wakeup.config.hpp b/micropython/modules/wakeup/wakeup.config.hpp index 44f9704f..056b11cb 100644 --- a/micropython/modules/wakeup/wakeup.config.hpp +++ b/micropython/modules/wakeup/wakeup.config.hpp @@ -19,6 +19,10 @@ #define WAKEUP_HAS_RTC (1) #endif +#ifndef WAKEUP_HAS_SHIFT_REGISTER +#define WAKEUP_HAS_SHIFT_REGISTER (0) +#endif + #ifndef WAKEUP_RTC_SDA #define WAKEUP_RTC_SDA (4) #endif @@ -33,4 +37,29 @@ #ifndef WAKEUP_RTC_I2C_INST #define WAKEUP_RTC_I2C_INST i2c0 +#endif + +// Pins to toggle on wakeup +#ifndef WAKEUP_SHIFT_REG_PIN_MASK +#define WAKEUP_SHIFT_REG_PIN_MASK ((0b1 << 8) | (0b1 << 9) | (0b1 << 10)) +#endif + +// Direction +#ifndef WAKEUP_SHIFT_REG_PIN_DIR +#define WAKEUP_SHIFT_REG_PIN_DIR ((0b1 << 8) | (0b1 << 9)) +#endif + +// Value +#ifndef WAKEUP_SHIFT_REG_PIN_VALUE +#define WAKEUP_SHIFT_REG_PIN_VALUE ((0b1 << 9)) +#endif + +// Clock +#ifndef WAKEUP_SHIFT_REG_CLK +#define WAKEUP_SHIFT_REG_CLK (8) +#endif + +// Data +#ifndef WAKEUP_SHIFT_REG_DATA +#define WAKEUP_SHIFT_REG_DATA (10) #endif \ No newline at end of file diff --git a/micropython/modules/wakeup/wakeup.cpp b/micropython/modules/wakeup/wakeup.cpp index 86934093..99653520 100644 --- a/micropython/modules/wakeup/wakeup.cpp +++ b/micropython/modules/wakeup/wakeup.cpp @@ -6,6 +6,8 @@ extern uint32_t runtime_wakeup_gpio_state; namespace { struct Wakeup { public: + uint8_t shift_register_state = 0b0; + Wakeup() { // Assert wakeup pins (indicator LEDs, VSYS hold etc) //gpio_init_mask(WAKEUP_PIN_MASK); @@ -30,6 +32,23 @@ namespace { gpio_init(WAKEUP_RTC_SDA); gpio_init(WAKEUP_RTC_SCL); #endif + +#if WAKEUP_HAS_SHIFT_REGISTER==1 + // Assert shift register pins (indicator LEDs, VSYS hold etc) + gpio_init_mask(WAKEUP_SHIFT_REG_PIN_MASK); + gpio_set_dir_masked(WAKEUP_SHIFT_REG_PIN_MASK, WAKEUP_SHIFT_REG_PIN_DIR); + gpio_put_masked(WAKEUP_SHIFT_REG_PIN_MASK, WAKEUP_SHIFT_REG_PIN_VALUE); + + uint8_t state = 0u; + for(auto i = 0u; i < 8; i++) { + if(gpio_get(WAKEUP_SHIFT_REG_DATA)) { + state |= (0b1 << i); + } + gpio_put(WAKEUP_SHIFT_REG_CLK, true); + gpio_put(WAKEUP_SHIFT_REG_CLK, false); + } + shift_register_state = state; +#endif } }; @@ -43,4 +62,10 @@ mp_obj_t Wakeup_get_gpio_state() { return mp_obj_new_int(runtime_wakeup_gpio_state); } +#if WAKEUP_HAS_SHIFT_REGISTER==1 +mp_obj_t Wakeup_get_shift_state() { + return mp_obj_new_int(wakeup.shift_register_state); +} +#endif + } \ No newline at end of file diff --git a/micropython/modules/wakeup/wakeup.h b/micropython/modules/wakeup/wakeup.h index bb2a5876..289f35f1 100644 --- a/micropython/modules/wakeup/wakeup.h +++ b/micropython/modules/wakeup/wakeup.h @@ -1,4 +1,7 @@ #include "py/runtime.h" #include "py/objstr.h" -extern mp_obj_t Wakeup_get_gpio_state(); \ No newline at end of file +extern mp_obj_t Wakeup_get_gpio_state(); +#if WAKEUP_HAS_SHIFT_REGISTER==1 +extern mp_obj_t Wakeup_get_shift_state(); +#endif \ No newline at end of file