3030
3131#include "driver/gpio.h"
3232
33-
34- #include "esp_log.h"
35-
36- static const char * TAG = "CircuitPython digitalio" ;
33+ #include "esp-idf/components/soc/include/hal/gpio_hal.h"
3734
3835void common_hal_digitalio_digitalinout_never_reset (
3936 digitalio_digitalinout_obj_t * self ) {
40- ( void ) self ;
37+ never_reset_pin_number ( self -> pin -> number ) ;
4138}
4239
4340digitalinout_result_t common_hal_digitalio_digitalinout_construct (
4441 digitalio_digitalinout_obj_t * self , const mcu_pin_obj_t * pin ) {
45-
46- // claim_pin(pin);
42+ claim_pin (pin );
4743 self -> pin = pin ;
4844
49- ESP_EARLY_LOGW (TAG , "construct %d" , pin -> number );
50-
5145 return DIGITALINOUT_OK ;
5246}
5347
@@ -60,78 +54,86 @@ void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t *self
6054 return ;
6155 }
6256
63- // reset_pin_number(0, self->pin->number);
57+ reset_pin_number (self -> pin -> number );
6458 self -> pin = mp_const_none ;
6559}
6660
6761void common_hal_digitalio_digitalinout_switch_to_input (
6862 digitalio_digitalinout_obj_t * self , digitalio_pull_t pull ) {
69- gpio_config_t config = {
70- .pin_bit_mask = 1 << self -> pin -> number ,
71- .mode = GPIO_MODE_INPUT
72- };
73- if (pull == PULL_UP ) {
74- config .pull_up_en = GPIO_PULLUP_ENABLE ;
75- } else if (pull == PULL_DOWN ) {
76- config .pull_down_en = GPIO_PULLDOWN_ENABLE ;
77- }
78-
79- gpio_config (& config );
63+ common_hal_digitalio_digitalinout_set_pull (self , pull );
64+ gpio_set_direction (self -> pin -> number , GPIO_MODE_DEF_INPUT );
8065}
8166
82- void common_hal_digitalio_digitalinout_switch_to_output (
67+ digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output (
8368 digitalio_digitalinout_obj_t * self , bool value ,
8469 digitalio_drive_mode_t drive_mode ) {
85- gpio_config_t config = {
86- .pin_bit_mask = 1ULL << self -> pin -> number ,
87- .mode = GPIO_MODE_OUTPUT
88- };
89- if (drive_mode == DRIVE_MODE_OPEN_DRAIN ) {
90- config .mode = GPIO_MODE_OUTPUT_OD ;
91- }
9270 gpio_set_level (self -> pin -> number , value );
93- gpio_config ( & config );
71+ return common_hal_digitalio_digitalinout_set_drive_mode ( self , drive_mode );
9472}
9573
9674digitalio_direction_t common_hal_digitalio_digitalinout_get_direction (
9775 digitalio_digitalinout_obj_t * self ) {
98-
76+ uint32_t iomux = READ_PERI_REG (GPIO_PIN_MUX_REG [self -> pin -> number ]);
77+ if ((iomux & FUN_IE ) != 0 ) {
78+ return DIRECTION_INPUT ;
79+ }
9980 return DIRECTION_OUTPUT ;
10081}
10182
10283void common_hal_digitalio_digitalinout_set_value (
10384 digitalio_digitalinout_obj_t * self , bool value ) {
104- ESP_EARLY_LOGW (TAG , "set %d %d" , self -> pin -> number , value );
10585 gpio_set_level (self -> pin -> number , value );
10686}
10787
10888bool common_hal_digitalio_digitalinout_get_value (
10989 digitalio_digitalinout_obj_t * self ) {
110- return true ;
90+ return gpio_get_level ( self -> pin -> number ) == 1 ;
11191}
11292
113- void common_hal_digitalio_digitalinout_set_drive_mode (
93+ digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode (
11494 digitalio_digitalinout_obj_t * self ,
11595 digitalio_drive_mode_t drive_mode ) {
116- (void )self ;
117- (void )drive_mode ;
96+ gpio_num_t number = self -> pin -> number ;
97+ gpio_mode_t mode ;
98+ if (drive_mode == DRIVE_MODE_OPEN_DRAIN ) {
99+ mode = GPIO_MODE_DEF_OD ;
100+ } else {
101+ mode = GPIO_MODE_DEF_OUTPUT ;
102+ }
103+ esp_err_t result = gpio_set_direction (number , mode );
104+ if (result != ESP_OK ) {
105+ return DIGITALINOUT_INPUT_ONLY ;
106+ }
107+ return DIGITALINOUT_OK ;
118108}
119109
120110digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode (
121111 digitalio_digitalinout_obj_t * self ) {
122- // if (common_hal_digitalio_digitalinout_get_direction(self) == DIRECTION_OUTPUT)
123- // return DRIVE_MODE_PUSH_PULL ;
124- // else
125- return DRIVE_MODE_OPEN_DRAIN ;
112+ if (GPIO_HAL_GET_HW ( GPIO_PORT_0 ) -> pin [ self -> pin -> number ]. pad_driver == 1 ) {
113+ return DRIVE_MODE_OPEN_DRAIN ;
114+ }
115+ return DRIVE_MODE_PUSH_PULL ;
126116}
127117
128118void common_hal_digitalio_digitalinout_set_pull (
129119 digitalio_digitalinout_obj_t * self , digitalio_pull_t pull ) {
130- (void )self ;
131- (void )pull ;
120+ gpio_num_t number = self -> pin -> number ;
121+ gpio_pullup_dis (number );
122+ gpio_pulldown_dis (number );
123+ if (pull == PULL_UP ) {
124+ gpio_pullup_en (number );
125+ } else if (pull == PULL_DOWN ) {
126+ gpio_pulldown_en (number );
127+ }
132128}
133129
134130digitalio_pull_t common_hal_digitalio_digitalinout_get_pull (
135131 digitalio_digitalinout_obj_t * self ) {
132+ gpio_num_t gpio_num = self -> pin -> number ;
133+ if (REG_GET_BIT (GPIO_PIN_MUX_REG [gpio_num ], FUN_PU ) == 1 ) {
134+ return PULL_UP ;
135+ } else if (REG_GET_BIT (GPIO_PIN_MUX_REG [gpio_num ], FUN_PD ) == 1 ) {
136+ return PULL_DOWN ;
137+ }
136138 return PULL_NONE ;
137139}
0 commit comments