@@ -94,7 +94,11 @@ static void machine_pin_obj_init_helper(machine_pin_obj_t *self, size_t n_args,
94
94
(self -> mode == MACHINE_PIN_MODE_OPEN_DRAIN && !init );
95
95
96
96
uint32_t block = self -> port -> output ;
97
- block = set_pin_enable (block , self -> pin , enabled );
97
+
98
+ if (self -> port != MMIO_CAPABILITY (gpio_block_t , gpio )) {
99
+ block = set_pin_enable (block , self -> pin , enabled );
100
+ }
101
+
98
102
block = set_pin_value (block , self -> pin , init );
99
103
self -> port -> output = block ;
100
104
}
@@ -120,6 +124,7 @@ mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
120
124
pin -> base .type = & machine_pin_type ;
121
125
pin -> port = wanted_port ;
122
126
pin -> pin = wanted_pin ;
127
+ pin -> mode = MACHINE_PIN_MODE_OUT ;
123
128
124
129
if (n_args > 1 || n_kw > 0 ) {
125
130
mp_map_t kw_args ;
@@ -157,7 +162,7 @@ static mp_uint_t pin_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, i
157
162
}
158
163
case MP_PIN_WRITE : {
159
164
uint32_t block = set_pin_value (self -> port -> output , self -> pin , (bool )arg );
160
- if (self -> mode == MACHINE_PIN_MODE_OPEN_DRAIN ) {
165
+ if (( self -> port != MMIO_CAPABILITY ( gpio_block_t , gpio )) & ( self -> mode == MACHINE_PIN_MODE_OPEN_DRAIN ) ) {
161
166
block = set_pin_enable (block , self -> pin , !(bool )arg );
162
167
}
163
168
self -> port -> output = block ;
@@ -237,6 +242,21 @@ static void machine_pin_print(const mp_print_t *print, mp_obj_t self_in,
237
242
}
238
243
239
244
245
+ static mp_obj_t machine_pin_toggle (mp_obj_t self_in ) {
246
+ machine_pin_obj_t * self = MP_OBJ_TO_PTR (self_in );
247
+ // if (self->mode == MACHINE_PIN_MODE_IN) {
248
+ // }
249
+ if (self -> mode == MACHINE_PIN_MODE_OUT ) {
250
+ self -> port -> output = set_pin_value (self -> port -> output , self -> pin , !GET_BUFFER (self ));
251
+ } else if (self -> mode == MACHINE_PIN_MODE_OPEN_DRAIN ) {
252
+ bool value = GET_BUFFER (self );
253
+ uint32_t block = set_pin_value (self -> port -> output , self -> pin , !value );
254
+ self -> port -> output = set_pin_enable (block , self -> pin , value );
255
+ }
256
+ return mp_const_none ;
257
+ }
258
+ static MP_DEFINE_CONST_FUN_OBJ_1 (machine_pin_toggle_obj , machine_pin_toggle ) ;
259
+
240
260
static const mp_rom_map_elem_t machine_pin_locals_dict_table [] = {
241
261
// instance methods
242
262
{MP_ROM_QSTR (MP_QSTR_init ), MP_ROM_PTR (& machine_pin_init_obj )},
@@ -245,6 +265,7 @@ static const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
245
265
{MP_ROM_QSTR (MP_QSTR_high ), MP_ROM_PTR (& machine_pin_on_obj )},
246
266
{MP_ROM_QSTR (MP_QSTR_off ), MP_ROM_PTR (& machine_pin_off_obj )},
247
267
{MP_ROM_QSTR (MP_QSTR_on ), MP_ROM_PTR (& machine_pin_on_obj )},
268
+ {MP_ROM_QSTR (MP_QSTR_toggle ), MP_ROM_PTR (& machine_pin_toggle_obj )},
248
269
249
270
// class constants
250
271
{MP_ROM_QSTR (MP_QSTR_IN ), MP_ROM_INT (MACHINE_PIN_MODE_IN )},
0 commit comments