3737 mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
3838}
3939
40- MP_DEFINE_CONST_OBJ_TYPE (
41- pin_cpu_pins_obj_type ,
42- MP_QSTR_cpu ,
43- MP_TYPE_FLAG_NONE ,
44- locals_dict , & machine_pin_cpu_pins_locals_dict
45- );
46-
47- MP_DEFINE_CONST_OBJ_TYPE (
48- pin_board_pins_obj_type ,
49- MP_QSTR_board ,
50- MP_TYPE_FLAG_NONE ,
51- locals_dict , & machine_pin_board_pins_locals_dict
52- );
53-
54- const machine_pin_obj_t * machine_pin_get_named_pin (const mp_obj_dict_t * named_pins , mp_obj_t name ) {
55- const mp_map_t * named_map = & named_pins -> map ;
56- mp_map_elem_t * named_elem = mp_map_lookup ((mp_map_t * )named_map , name , MP_MAP_LOOKUP );
57- if (named_elem != NULL && named_elem -> value != MP_OBJ_NULL ) {
58- return MP_OBJ_TO_PTR (named_elem -> value );
40+ static uint8_t pin_get_mode (const machine_pin_obj_t * self ) {
41+ uint32_t drive_mode = Cy_GPIO_GetDrivemode (Cy_GPIO_PortToAddr (self -> port ), self -> pin );
42+
43+ switch (drive_mode ) {
44+ case CY_GPIO_DM_HIGHZ :
45+ case CY_GPIO_DM_PULLUP :
46+ case CY_GPIO_DM_PULLDOWN :
47+ case CY_GPIO_DM_PULLUP_DOWN :
48+ return GPIO_MODE_IN ;
49+
50+ case CY_GPIO_DM_STRONG_IN_OFF :
51+ case CY_GPIO_DM_PULLUP_IN_OFF :
52+ case CY_GPIO_DM_PULLDOWN_IN_OFF :
53+ case CY_GPIO_DM_PULLUP_DOWN_IN_OFF :
54+ return GPIO_MODE_OUT ;
55+
56+ case CY_GPIO_DM_OD_DRIVESLOW_IN_OFF :
57+ /* These 2 modes are not configurable
58+ by the user but they could be set by
59+ at C level */
60+ case CY_GPIO_DM_OD_DRIVESLOW :
61+ case CY_GPIO_DM_OD_DRIVESHIGH :
62+ return GPIO_MODE_OPEN_DRAIN ;
63+
64+ default :
65+ return GPIO_MODE_NONE ;
5966 }
60- return NULL ;
6167}
62- const machine_pin_obj_t * machine_pin_get_pin_obj (mp_obj_t obj ) {
63- const machine_pin_obj_t * pin_obj ;
6468
65- // pin can a pin object already
66- if (mp_obj_is_type (obj , & machine_pin_type )) {
67- return MP_OBJ_TO_PTR (obj );
68- }
69+ static uint8_t pin_get_pull (const machine_pin_obj_t * self ) {
70+ uint32_t drive_mode = Cy_GPIO_GetDrivemode (Cy_GPIO_PortToAddr (self -> port ), self -> pin );
6971
70- // pin can be a board named pin
71- pin_obj = machine_pin_get_named_pin (& machine_pin_board_pins_locals_dict , obj );
72- if (pin_obj ) {
73- return pin_obj ;
74- }
72+ switch (drive_mode ) {
73+ case CY_GPIO_DM_PULLUP :
74+ case CY_GPIO_DM_PULLUP_IN_OFF :
75+ return GPIO_PULL_UP ;
7576
76- // pin can be a cpu named pin
77- pin_obj = machine_pin_get_named_pin (& machine_pin_cpu_pins_locals_dict , obj );
78- if (pin_obj ) {
79- return pin_obj ;
80- }
77+ case CY_GPIO_DM_PULLDOWN :
78+ case CY_GPIO_DM_PULLDOWN_IN_OFF :
79+ return GPIO_PULL_DOWN ;
8180
82- mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("Pin(%s) doesn't exist" ), mp_obj_str_get_str (obj ));
81+ case CY_GPIO_DM_PULLUP_DOWN :
82+ case CY_GPIO_DM_PULLUP_DOWN_IN_OFF :
83+ return GPIO_PULL_UP_DOWN ;
84+
85+ default :
86+ return GPIO_PULL_NONE ;
87+ }
8388}
8489
8590static uint32_t get_drive_mode (uint8_t mode , uint8_t pull ) {
@@ -200,6 +205,38 @@ static mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
200205 return mp_const_none ;
201206}
202207
208+ const machine_pin_obj_t * machine_pin_get_named_pin (const mp_obj_dict_t * named_pins , mp_obj_t name ) {
209+ const mp_map_t * named_map = & named_pins -> map ;
210+ mp_map_elem_t * named_elem = mp_map_lookup ((mp_map_t * )named_map , name , MP_MAP_LOOKUP );
211+ if (named_elem != NULL && named_elem -> value != MP_OBJ_NULL ) {
212+ return MP_OBJ_TO_PTR (named_elem -> value );
213+ }
214+ return NULL ;
215+ }
216+
217+ const machine_pin_obj_t * machine_pin_get_pin_obj (mp_obj_t obj ) {
218+ const machine_pin_obj_t * pin_obj ;
219+
220+ // pin can a pin object already
221+ if (mp_obj_is_type (obj , & machine_pin_type )) {
222+ return MP_OBJ_TO_PTR (obj );
223+ }
224+
225+ // pin can be a board named pin
226+ pin_obj = machine_pin_get_named_pin (& machine_pin_board_pins_locals_dict , obj );
227+ if (pin_obj ) {
228+ return pin_obj ;
229+ }
230+
231+ // pin can be a cpu named pin
232+ pin_obj = machine_pin_get_named_pin (& machine_pin_cpu_pins_locals_dict , obj );
233+ if (pin_obj ) {
234+ return pin_obj ;
235+ }
236+
237+ mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("Pin(%s) doesn't exist" ), mp_obj_str_get_str (obj ));
238+ }
239+
203240mp_obj_t mp_pin_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * args ) {
204241 mp_arg_check_num (n_args , n_kw , 1 , 6 , true);
205242
@@ -221,7 +258,36 @@ static mp_obj_t machine_pin_obj_init(size_t n_args, const mp_obj_t *args, mp_map
221258MP_DEFINE_CONST_FUN_OBJ_KW (machine_pin_obj_init_obj , 1 , machine_pin_obj_init );
222259
223260static void machine_pin_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
224- // TODO: Placeholder.
261+ machine_pin_obj_t * self = MP_OBJ_TO_PTR (self_in );
262+ mp_printf (print , "Pin(Pin.cpu.%q" , self -> name );
263+
264+ uint8_t mode = pin_get_mode (self );
265+ qstr mode_qst = MP_QSTRnull ;
266+ if (mode == GPIO_MODE_IN ) {
267+ mode_qst = MP_QSTR_IN ;
268+ } else if (mode == GPIO_MODE_OUT ) {
269+ mode_qst = MP_QSTR_OUT ;
270+ } else if (mode == GPIO_MODE_OPEN_DRAIN ) {
271+ mode_qst = MP_QSTR_OPEN_DRAIN ;
272+ }
273+ if (mode_qst != MP_QSTRnull ) {
274+ mp_printf (print , ", mode=Pin.%q" , mode_qst );
275+ }
276+
277+ uint8_t pull = pin_get_pull (self );
278+ qstr pull_qst = MP_QSTRnull ;
279+ if (pull == GPIO_PULL_UP ) {
280+ pull_qst = MP_QSTR_PULL_UP ;
281+ } else if (pull == GPIO_PULL_DOWN ) {
282+ pull_qst = MP_QSTR_PULL_DOWN ;
283+ } else if (pull == GPIO_PULL_UP_DOWN ) {
284+ pull_qst = MP_QSTR_PULL_UP_DOWN ;
285+ }
286+
287+ if (pull_qst != MP_QSTRnull ) {
288+ mp_printf (print , ", pull=Pin.%q" , pull_qst );
289+ }
290+ mp_print_str (print , ")" );
225291}
226292
227293static mp_obj_t machine_pin_call (mp_obj_t self_in , size_t n_args , size_t n_kw , const mp_obj_t * args ) {
@@ -238,6 +304,20 @@ static const mp_pin_p_t pin_pin_p = {
238304 .ioctl = pin_ioctl ,
239305};
240306
307+ MP_DEFINE_CONST_OBJ_TYPE (
308+ pin_cpu_pins_obj_type ,
309+ MP_QSTR_cpu ,
310+ MP_TYPE_FLAG_NONE ,
311+ locals_dict , & machine_pin_cpu_pins_locals_dict
312+ );
313+
314+ MP_DEFINE_CONST_OBJ_TYPE (
315+ pin_board_pins_obj_type ,
316+ MP_QSTR_board ,
317+ MP_TYPE_FLAG_NONE ,
318+ locals_dict , & machine_pin_board_pins_locals_dict
319+ );
320+
241321static const mp_rom_map_elem_t machine_pin_locals_dict_table [] = {
242322 // Instance methods
243323 { MP_ROM_QSTR (MP_QSTR_init ), MP_ROM_PTR (& machine_pin_obj_init_obj ) },
@@ -271,7 +351,6 @@ static const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
271351
272352static MP_DEFINE_CONST_DICT (machine_pin_locals_dict , machine_pin_locals_dict_table ) ;
273353
274-
275354MP_DEFINE_CONST_OBJ_TYPE (
276355 machine_pin_type ,
277356 MP_QSTR_Pin ,
0 commit comments