Skip to content

Commit

Permalink
ports/psoc6/machine: Moving pin_phy functions to its module.
Browse files Browse the repository at this point in the history
Signed-off-by: enriquezgarc <enriquezgarcia.external@infineon.com>
  • Loading branch information
jaenrig-ifx committed Oct 6, 2023
1 parent 5926f19 commit bfa7ad2
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 184 deletions.
214 changes: 33 additions & 181 deletions ports/psoc6/modules/machine/machine_pin.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#include "py/mphal.h"
#include "py/runtime.h"


// port-specific includes
#include "modmachine.h"
#include "machine_pin.h"
Expand All @@ -16,168 +15,12 @@ enum {GPIO_PULL_NONE = 0, GPIO_PULL_UP, GPIO_PULL_DOWN};

typedef struct _machine_pin_io_obj_t {
mp_obj_base_t base;
uint32_t pin_addr;
char *pin_name;
machine_pin_phy_obj_t *pin_phy;
uint8_t mode;
uint8_t drive;
uint8_t pull;
} machine_pin_io_obj_t;

machine_pin_io_obj_t machine_pin_obj[] = {
{{&machine_pin_type}, PIN_P0_0, "P0_0"},
{{&machine_pin_type}, PIN_P0_1, "P0_1"},
{{&machine_pin_type}, PIN_P0_2, "P0_2"},
{{&machine_pin_type}, PIN_P0_3, "P0_3"},
{{&machine_pin_type}, PIN_P0_4, "P0_4"},
{{&machine_pin_type}, PIN_P0_5, "P0_5"},

{{&machine_pin_type}, PIN_P1_0, "P1_0"},
{{&machine_pin_type}, PIN_P1_1, "P1_1"},
{{&machine_pin_type}, PIN_P1_2, "P1_2"},
{{&machine_pin_type}, PIN_P1_3, "P1_3"},
{{&machine_pin_type}, PIN_P1_4, "P1_4"},
{{&machine_pin_type}, PIN_P1_5, "P1_5"},

{{&machine_pin_type}, PIN_P2_0, "P2_0"},
{{&machine_pin_type}, PIN_P2_1, "P2_1"},
{{&machine_pin_type}, PIN_P2_2, "P2_2"},
{{&machine_pin_type}, PIN_P2_3, "P2_3"},
{{&machine_pin_type}, PIN_P2_4, "P2_4"},
{{&machine_pin_type}, PIN_P2_5, "P2_5"},
{{&machine_pin_type}, PIN_P2_6, "P2_6"},
{{&machine_pin_type}, PIN_P2_7, "P2_7"},

{{&machine_pin_type}, PIN_P3_0, "P3_0"},
{{&machine_pin_type}, PIN_P3_1, "P3_1"},
{{&machine_pin_type}, PIN_P3_2, "P3_2"},
{{&machine_pin_type}, PIN_P3_3, "P3_3"},
{{&machine_pin_type}, PIN_P3_4, "P3_4"},
{{&machine_pin_type}, PIN_P3_5, "P3_5"},

{{&machine_pin_type}, PIN_P4_0, "P4_0"},
{{&machine_pin_type}, PIN_P4_1, "P4_1"},

{{&machine_pin_type}, PIN_P5_0, "P5_0"},
{{&machine_pin_type}, PIN_P5_1, "P5_1"},
{{&machine_pin_type}, PIN_P5_2, "P5_2"},
{{&machine_pin_type}, PIN_P5_3, "P5_3"},
{{&machine_pin_type}, PIN_P5_4, "P5_4"},
{{&machine_pin_type}, PIN_P5_5, "P5_5"},
{{&machine_pin_type}, PIN_P5_6, "P5_6"},
{{&machine_pin_type}, PIN_P5_7, "P5_7"},

{{&machine_pin_type}, PIN_P6_0, "P6_0"},
{{&machine_pin_type}, PIN_P6_1, "P6_1"},
{{&machine_pin_type}, PIN_P6_2, "P6_2"},
{{&machine_pin_type}, PIN_P6_3, "P6_3"},
{{&machine_pin_type}, PIN_P6_4, "P6_4"},
{{&machine_pin_type}, PIN_P6_5, "P6_5"},
{{&machine_pin_type}, PIN_P6_6, "P6_6"},
{{&machine_pin_type}, PIN_P6_7, "P6_7"},

{{&machine_pin_type}, PIN_P7_0, "P7_0"},
{{&machine_pin_type}, PIN_P7_1, "P7_1"},
{{&machine_pin_type}, PIN_P7_2, "P7_2"},
{{&machine_pin_type}, PIN_P7_3, "P7_3"},
{{&machine_pin_type}, PIN_P7_4, "P7_4"},
{{&machine_pin_type}, PIN_P7_5, "P7_5"},
{{&machine_pin_type}, PIN_P7_6, "P7_6"},
{{&machine_pin_type}, PIN_P7_7, "P7_7"},

{{&machine_pin_type}, PIN_P8_0, "P8_0"},
{{&machine_pin_type}, PIN_P8_1, "P8_1"},
{{&machine_pin_type}, PIN_P8_2, "P8_2"},
{{&machine_pin_type}, PIN_P8_3, "P8_3"},
{{&machine_pin_type}, PIN_P8_4, "P8_4"},
{{&machine_pin_type}, PIN_P8_5, "P8_5"},
{{&machine_pin_type}, PIN_P8_6, "P8_6"},
{{&machine_pin_type}, PIN_P8_7, "P8_7"},

{{&machine_pin_type}, PIN_P9_0, "P9_0"},
{{&machine_pin_type}, PIN_P9_1, "P9_1"},
{{&machine_pin_type}, PIN_P9_2, "P9_2"},
{{&machine_pin_type}, PIN_P9_3, "P9_3"},
{{&machine_pin_type}, PIN_P9_4, "P9_4"},
{{&machine_pin_type}, PIN_P9_5, "P9_5"},
{{&machine_pin_type}, PIN_P9_6, "P9_6"},
{{&machine_pin_type}, PIN_P9_7, "P9_7"},

{{&machine_pin_type}, PIN_P10_0, "P10_0"},
{{&machine_pin_type}, PIN_P10_1, "P10_1"},
{{&machine_pin_type}, PIN_P10_2, "P10_2"},
{{&machine_pin_type}, PIN_P10_3, "P10_3"},
{{&machine_pin_type}, PIN_P10_4, "P10_4"},
{{&machine_pin_type}, PIN_P10_5, "P10_5"},
{{&machine_pin_type}, PIN_P10_6, "P10_6"},
{{&machine_pin_type}, PIN_P10_7, "P10_7"},

{{&machine_pin_type}, PIN_P11_0, "P11_0"},
{{&machine_pin_type}, PIN_P11_1, "P11_1"},
{{&machine_pin_type}, PIN_P11_2, "P11_2"},
{{&machine_pin_type}, PIN_P11_3, "P11_3"},
{{&machine_pin_type}, PIN_P11_4, "P11_4"},
{{&machine_pin_type}, PIN_P11_5, "P11_5"},
{{&machine_pin_type}, PIN_P11_6, "P11_6"},
{{&machine_pin_type}, PIN_P11_7, "P11_7"},

{{&machine_pin_type}, PIN_P12_0, "P12_0"},
{{&machine_pin_type}, PIN_P12_1, "P12_1"},
{{&machine_pin_type}, PIN_P12_2, "P12_2"},
{{&machine_pin_type}, PIN_P12_3, "P12_3"},
{{&machine_pin_type}, PIN_P12_4, "P12_4"},
{{&machine_pin_type}, PIN_P12_5, "P12_5"},
{{&machine_pin_type}, PIN_P12_6, "P12_6"},
{{&machine_pin_type}, PIN_P12_7, "P12_7"},

{{&machine_pin_type}, PIN_P13_0, "P13_0"},
{{&machine_pin_type}, PIN_P13_1, "P13_1"},
{{&machine_pin_type}, PIN_P13_2, "P13_2"},
{{&machine_pin_type}, PIN_P13_3, "P13_3"},
{{&machine_pin_type}, PIN_P13_4, "P13_4"},
{{&machine_pin_type}, PIN_P13_5, "P13_5"},
{{&machine_pin_type}, PIN_P13_6, "P13_6"},
{{&machine_pin_type}, PIN_P13_7, "P13_7"},

{{&machine_pin_type}, PIN_USBDP, "USBDP"},
{{&machine_pin_type}, PIN_USBDM, "USBDM"},
};

// Function definitions
// helper function to translate pin_name(string) into machine_pin_io_obj_t index.
int pin_find(mp_obj_t pin) {
int wanted_pin = -1;
if (mp_obj_is_small_int(pin)) {
// Pin defined by the index of pin table
wanted_pin = mp_obj_get_int(pin);
} else if (mp_obj_is_str(pin)) {
// Search by name
size_t slen;
const char *s = mp_obj_str_get_data(pin, &slen);
for (int i = 0; i < MP_ARRAY_SIZE(machine_pin_obj); i++) {
if (slen == strlen(machine_pin_obj[i].pin_name) && strncmp(s, machine_pin_obj[i].pin_name, slen) == 0) {
wanted_pin = i;
break;
}
}
}

if (!(0 <= wanted_pin && wanted_pin < MP_ARRAY_SIZE(machine_pin_obj))) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid pin: Pin not defined!"));
}

return wanted_pin;
}

// helper function to translate pin_name(string) into machine_pin_io_obj_t->pin_addr
int pin_addr_by_name(mp_obj_t pin) {
if (mp_obj_is_str(pin)) {
return machine_pin_obj[pin_find(pin)].pin_addr;
} else {
return -1; // expecting a str as input
}
}

#define MAX_PIN_IO MP_ARRAY_SIZE(machine_pin_phy_obj)
machine_pin_io_obj_t *pin_io[MAX_PIN_IO] = {NULL};

Expand All @@ -192,27 +35,6 @@ static inline machine_pin_io_obj_t *pin_io_allocate(void) {
return pin_io[i];
}

STATIC mp_obj_t machine_pin_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {

mp_arg_check_num(n_args, n_kw, 0, 1, false);
machine_pin_io_obj_t *self = self_in;

if (n_args == 0) {
if (self->mode == GPIO_MODE_IN) {
return MP_OBJ_NEW_SMALL_INT(cyhal_gpio_read(self->pin_phy->addr));
} else {
return mp_const_none;
}
} else {
if (self->mode != GPIO_MODE_IN) {
bool value = mp_obj_is_true(args[0]);
cyhal_gpio_write(self->pin_phy->addr, value);
}
}

return mp_const_none;
}

// Pin.print()
STATIC void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
mplogger_print("machine pin print\n");
Expand Down Expand Up @@ -378,7 +200,6 @@ STATIC mp_obj_t machine_pin_obj_init_helper(machine_pin_io_obj_t *self, size_t n
if (pin_already_inited) {
result = cyhal_gpio_configure(self->pin_phy->addr, direction, drive);
} else {
cyhal_gpio_free(self->pin_addr); // TODO: remove
result = cyhal_gpio_init(self->pin_phy->addr, direction, drive, value);
}
mplogger_print("Direction: %d, Drive:%d, Value:%d\n", direction, drive, value);
Expand Down Expand Up @@ -415,6 +236,27 @@ mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
return MP_OBJ_FROM_PTR(self);
}

STATIC mp_obj_t machine_pin_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {

mp_arg_check_num(n_args, n_kw, 0, 1, false);
machine_pin_io_obj_t *self = self_in;

if (n_args == 0) {
if (self->mode == GPIO_MODE_IN) {
return MP_OBJ_NEW_SMALL_INT(cyhal_gpio_read(self->pin_phy->addr));
} else {
return mp_const_none;
}
} else {
if (self->mode != GPIO_MODE_IN) {
bool value = mp_obj_is_true(args[0]);
cyhal_gpio_write(self->pin_phy->addr, value);
}
}

return mp_const_none;
}

// pin.value([value])
STATIC mp_obj_t machine_pin_value(size_t n_args, const mp_obj_t *args) {
return machine_pin_call(args[0], n_args - 1, 0, args + 1);
Expand All @@ -428,6 +270,15 @@ STATIC mp_obj_t machine_pin_obj_init(size_t n_args, const mp_obj_t *args, mp_map
}
MP_DEFINE_CONST_FUN_OBJ_KW(machine_pin_obj_init_obj, 1, machine_pin_obj_init);

// Pin.deinit()
STATIC mp_obj_t machine_pin_obj_deinit(mp_obj_t self_in) {
machine_pin_io_obj_t *self = MP_OBJ_TO_PTR(self_in);
cyhal_gpio_free(self->pin_phy->addr);

return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_deinit_obj, machine_pin_obj_deinit);


// Pin.toggle()
STATIC mp_obj_t machine_pin_toggle(mp_obj_t self_in) {
Expand Down Expand Up @@ -466,6 +317,7 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
// Instance methods
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine) },
{ MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_pin_obj_init_obj) },
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_pin_deinit_obj) },
{ MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&machine_pin_toggle_obj) },
{ MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&machine_pin_value_obj) },
{ MP_ROM_QSTR(MP_QSTR_low), MP_ROM_PTR(&machine_pin_low_obj) },
Expand All @@ -488,10 +340,10 @@ STATIC mp_uint_t pin_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, i
machine_pin_io_obj_t *self = self_in;
switch (request) {
case MP_PIN_READ: {
return cyhal_gpio_read(self->pin_addr);
return cyhal_gpio_read(self->pin_phy->addr);
}
case MP_PIN_WRITE: {
cyhal_gpio_write(self->pin_addr, arg);
cyhal_gpio_write(self->pin_phy->addr, arg);
return 0;
}
}
Expand Down
3 changes: 0 additions & 3 deletions ports/psoc6/modules/machine/machine_pin.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,5 @@
#include <stdint.h>
#include "machine_pin_phy.h"

// Function Prototypes to support interaction between c<->py
int pin_find(mp_obj_t obj);
int pin_addr_by_name(mp_obj_t obj);

#endif // MICROPY_INCLUDED_MACHINE_PIN_H
35 changes: 35 additions & 0 deletions ports/psoc6/modules/machine/machine_pin_phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,41 @@ machine_pin_phy_obj_t machine_pin_phy_obj[] = {
{PIN_USBDM, "USBDM", PIN_PHY_FUNC_NONE}
};

// Function definitions
// helper function to translate pin_name(string) into machine_pin_io_obj_t index.
int pin_find(mp_obj_t pin) {
int wanted_pin = -1;
if (mp_obj_is_small_int(pin)) {
// Pin defined by the index of pin table
wanted_pin = mp_obj_get_int(pin);
} else if (mp_obj_is_str(pin)) {
// Search by name
size_t slen;
const char *s = mp_obj_str_get_data(pin, &slen);
for (int i = 0; i < MP_ARRAY_SIZE(machine_pin_phy_obj); i++) {
if (slen == strlen(machine_pin_phy_obj[i].name) && strncmp(s, machine_pin_phy_obj[i].name, slen) == 0) {
wanted_pin = i;
break;
}
}
}

if (!(0 <= wanted_pin && wanted_pin < MP_ARRAY_SIZE(machine_pin_phy_obj))) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid pin: Pin not defined!"));
}

return wanted_pin;
}

// helper function to translate pin_name(string) into machine_pin_io_obj_t->pin_addr
int pin_addr_by_name(mp_obj_t pin) {
if (mp_obj_is_str(pin)) {
return machine_pin_phy_obj[pin_find(pin)].addr;
} else {
return -1; // expecting a str as input
}
}

#define pin_phy_assert_null(x) { if (x == NULL) { return NULL; } }

machine_pin_phy_obj_t *pin_phy_find_by_name(mp_obj_t pin_name) {
Expand Down
4 changes: 4 additions & 0 deletions ports/psoc6/modules/machine/machine_pin_phy.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ machine_pin_phy_obj_t *pin_phy_alloc(mp_obj_t addr, machine_pin_phy_func_t func)
machine_pin_phy_obj_t *pin_phy_realloc(mp_obj_t addr, machine_pin_phy_func_t func);
void pin_phy_free(machine_pin_phy_obj_t *obj);

// Function Prototypes to support interaction between c<->py
int pin_find(mp_obj_t obj);
int pin_addr_by_name(mp_obj_t obj);

#define PIN_P0_0 CYHAL_GET_GPIO(CYHAL_PORT_0, 0)// !< Port 0 Pin 0
#define PIN_P0_1 CYHAL_GET_GPIO(CYHAL_PORT_0, 1)// !< Port 0 Pin 1
#define PIN_P0_2 CYHAL_GET_GPIO(CYHAL_PORT_0, 2)// !< Port 0 Pin 2
Expand Down

0 comments on commit bfa7ad2

Please sign in to comment.