I am trying to setup the pico2 to use GPIO4 as a power mode aware gpio. I believe I have configured the powman ext_ctrl0 register correctly, but GPIO4 does not change states as expected. Do you have any suggestions on what I can try next?
Here is the snipet of code I have used to configure the ext_ctrl0 register:
// Access the POWMAN EXT_CTRL0 register
// This register is used for extended power control
hw_write_masked((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_GPIO << POWMAN_EXT_CTRL0_GPIO_SELECT_LSB, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_GPIO_SELECT_BITS); // Write the EXT_CTRL0 GPIO bits to value of 4 to select GPIO4
hw_clear_bits((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_INIT_STATE_BITS); // Clear the EXT_CTRL0 initial state for GPIO4 to go low on startup
hw_clear_bits((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_LP_EXIT_STATE_BITS); // Clear the EXT_CTRL0 exit state for GPIO4 to go low on exit from low power mode
hw_set_bits((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_LP_ENTRY_STATE_BITS); // Set the EXT_CTRL0 entry state for GPIO4 to go high on entry to low power mode
Here is what I see when viewing the register from Visual Studio in debug mode:
V XPERIPHERALS
v POWMAN @ 0x40100000
> POW_FASTDIV @ 0x3c 0x00000040
> POW_DELAY @ 0x40 0x00002011
V EXT_CTRLO @ 0x44 0x00002004
GPIO_SELECT [5:0] 0x04
INIT [8:8] 0bo
INIT_STATE [12:12] 0b0
LP_ENTRY_STATE [13:13] 0b1
LP_EXIT_STATE [14:14] 0b0
v EXT_CTRL1 @ 0x48 0x0000003f
GPIO_SELECT [5:0] 0x3f
INIT [8:8] 0b0
INIT_STATE [12:12] 0b0
LP_ENTRY_STATE [13:13] 0b0
LP_EXIT_STATE [14:14] 0b0
Here is the snipet of code I have used to configure the ext_ctrl0 register:
// Access the POWMAN EXT_CTRL0 register
// This register is used for extended power control
hw_write_masked((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_GPIO << POWMAN_EXT_CTRL0_GPIO_SELECT_LSB, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_GPIO_SELECT_BITS); // Write the EXT_CTRL0 GPIO bits to value of 4 to select GPIO4
hw_clear_bits((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_INIT_STATE_BITS); // Clear the EXT_CTRL0 initial state for GPIO4 to go low on startup
hw_clear_bits((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_LP_EXIT_STATE_BITS); // Clear the EXT_CTRL0 exit state for GPIO4 to go low on exit from low power mode
hw_set_bits((io_rw_32 *)&powman_hw->ext_ctrl, POWMAN_PASSWORD_BITS | POWMAN_EXT_CTRL0_LP_ENTRY_STATE_BITS); // Set the EXT_CTRL0 entry state for GPIO4 to go high on entry to low power mode
Here is what I see when viewing the register from Visual Studio in debug mode:
V XPERIPHERALS
v POWMAN @ 0x40100000
> POW_FASTDIV @ 0x3c 0x00000040
> POW_DELAY @ 0x40 0x00002011
V EXT_CTRLO @ 0x44 0x00002004
GPIO_SELECT [5:0] 0x04
INIT [8:8] 0bo
INIT_STATE [12:12] 0b0
LP_ENTRY_STATE [13:13] 0b1
LP_EXIT_STATE [14:14] 0b0
v EXT_CTRL1 @ 0x48 0x0000003f
GPIO_SELECT [5:0] 0x3f
INIT [8:8] 0b0
INIT_STATE [12:12] 0b0
LP_ENTRY_STATE [13:13] 0b0
LP_EXIT_STATE [14:14] 0b0
Statistics: Posted by Karbo — Thu Jul 17, 2025 2:55 pm