3333#include "py/mphal.h"
3434
3535#include "shared-bindings/digitalio/DigitalInOut.h"
36+ #include "common-hal/microcontroller/Pin.h"
37+
38+ extern volatile bool gpio16_in_use ;
3639
3740digitalinout_result_t common_hal_digitalio_digitalinout_construct (
3841 digitalio_digitalinout_obj_t * self , const mcu_pin_obj_t * pin ) {
3942 self -> pin = pin ;
40- PIN_FUNC_SELECT (self -> pin -> peripheral , self -> pin -> gpio_function );
43+ if (self -> pin -> gpio_number == 16 ) {
44+ WRITE_PERI_REG (PAD_XPD_DCDC_CONF , (READ_PERI_REG (PAD_XPD_DCDC_CONF ) & 0xffffffbc ) | 1 ); // mux configuration for XPD_DCDC and rtc_gpio0 connection
45+ WRITE_PERI_REG (RTC_GPIO_CONF , READ_PERI_REG (RTC_GPIO_CONF ) & ~1 ); //mux configuration for out enable
46+ WRITE_PERI_REG (RTC_GPIO_ENABLE , READ_PERI_REG (RTC_GPIO_ENABLE ) & ~1 ); //out disable
47+ claim_pin (pin );
48+ } else {
49+ PIN_FUNC_SELECT (self -> pin -> peripheral , self -> pin -> gpio_function );
50+ }
4151 return DIGITALINOUT_OK ;
4252}
4353
@@ -54,6 +64,8 @@ void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t* self
5464 gpio_output_set (0x0 , 0x0 , 0x0 , pin_mask );
5565 PIN_FUNC_SELECT (self -> pin -> peripheral , 0 );
5666 PIN_PULLUP_DIS (self -> pin -> peripheral );
67+ } else {
68+ reset_pin (self -> pin );
5769 }
5870 self -> pin = mp_const_none ;
5971}
@@ -96,6 +108,23 @@ digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
96108
97109void common_hal_digitalio_digitalinout_set_value (
98110 digitalio_digitalinout_obj_t * self , bool value ) {
111+ if (self -> pin -> gpio_number == 16 ) {
112+ if (self -> open_drain && value ) {
113+ // configure GPIO16 as input with output register holding 0
114+ WRITE_PERI_REG (PAD_XPD_DCDC_CONF , (READ_PERI_REG (PAD_XPD_DCDC_CONF ) & 0xffffffbc ) | 1 );
115+ WRITE_PERI_REG (RTC_GPIO_CONF , READ_PERI_REG (RTC_GPIO_CONF ) & ~1 );
116+ WRITE_PERI_REG (RTC_GPIO_ENABLE , (READ_PERI_REG (RTC_GPIO_ENABLE ) & ~1 )); // input
117+ WRITE_PERI_REG (RTC_GPIO_OUT , (READ_PERI_REG (RTC_GPIO_OUT ) & 1 )); // out=1
118+ return ;
119+ } else {
120+ int out_en = self -> output ;
121+ WRITE_PERI_REG (PAD_XPD_DCDC_CONF , (READ_PERI_REG (PAD_XPD_DCDC_CONF ) & 0xffffffbc ) | 1 );
122+ WRITE_PERI_REG (RTC_GPIO_CONF , READ_PERI_REG (RTC_GPIO_CONF ) & ~1 );
123+ WRITE_PERI_REG (RTC_GPIO_ENABLE , (READ_PERI_REG (RTC_GPIO_ENABLE ) & ~1 ) | out_en );
124+ WRITE_PERI_REG (RTC_GPIO_OUT , (READ_PERI_REG (RTC_GPIO_OUT ) & ~1 ) | value );
125+ return ;
126+ }
127+ }
99128 if (value ) {
100129 if (self -> open_drain ) {
101130 // Disable output.
@@ -125,11 +154,19 @@ bool common_hal_digitalio_digitalinout_get_value(
125154 }
126155 return GPIO_INPUT_GET (self -> pin -> gpio_number );
127156 } else {
128- uint32_t pin_mask = 1 << self -> pin -> gpio_number ;
129- if (self -> open_drain && ((* PIN_DIR ) & pin_mask ) == 0 ) {
130- return true;
157+ if (self -> pin -> gpio_number == 16 ) {
158+ if (self -> open_drain && READ_PERI_REG (RTC_GPIO_ENABLE ) == 0 ) {
159+ return true;
160+ } else {
161+ return READ_PERI_REG (RTC_GPIO_OUT ) & 1 ;
162+ }
131163 } else {
132- return ((* PIN_OUT ) & pin_mask ) != 0 ;
164+ uint32_t pin_mask = 1 << self -> pin -> gpio_number ;
165+ if (self -> open_drain && ((* PIN_DIR ) & pin_mask ) == 0 ) {
166+ return true;
167+ } else {
168+ return ((* PIN_OUT ) & pin_mask ) != 0 ;
169+ }
133170 }
134171 }
135172}
@@ -163,8 +200,14 @@ void common_hal_digitalio_digitalinout_set_pull(
163200 return ;
164201 }
165202 if (self -> pin -> gpio_number == 16 ) {
166- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError ,
167- "Pin does not support pull." ));
203+ // PULL_DOWN is the only hardware pull direction available on GPIO16.
204+ // since we don't support pull down, just return without attempting
205+ // to set pull (which won't work anyway). If PULL_UP is requested,
206+ // raise the exception so the user knows PULL_UP is not available
207+ if (pull != PULL_NONE ){
208+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError ,
209+ "GPIO16 does not support pull up." ));
210+ }
168211 return ;
169212 }
170213 if (pull == PULL_NONE ) {
0 commit comments