Skip to content

Commit 50e5a5a

Browse files
committed
psoc-edge/machine_pin: Added print() function.
Signed-off-by: jaenrig-ifx <enriquezgarcia.external@infineon.com>
1 parent 83e4593 commit 50e5a5a

File tree

1 file changed

+118
-39
lines changed

1 file changed

+118
-39
lines changed

ports/psoc-edge/machine_pin.c

Lines changed: 118 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -37,49 +37,54 @@
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

8590
static 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+
203240
mp_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
221258
MP_DEFINE_CONST_FUN_OBJ_KW(machine_pin_obj_init_obj, 1, machine_pin_obj_init);
222259

223260
static 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

227293
static 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+
241321
static 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

272352
static MP_DEFINE_CONST_DICT(machine_pin_locals_dict, machine_pin_locals_dict_table);
273353

274-
275354
MP_DEFINE_CONST_OBJ_TYPE(
276355
machine_pin_type,
277356
MP_QSTR_Pin,

0 commit comments

Comments
 (0)