Skip to content

Commit

Permalink
ports/psoc6: WIP - Latest changes for pin generation.
Browse files Browse the repository at this point in the history
Signed-off-by: NikhitaR-IFX <Nikhita.Rajasekhar@infineon.com>
  • Loading branch information
NikhitaR-IFX committed Sep 23, 2023
1 parent 6df9a8d commit bf77d89
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 18 deletions.
4 changes: 2 additions & 2 deletions ports/psoc6/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,8 @@ test_multi:

$(Q) cd ../../tests ; ./run-multitests.py -i pyb:$(DEV0) -i pyb:$(DEV1) $(MULTI_TESTS)

$(GEN_PINS_SRC:.c=.o): $(GEN_PINS_SRC)
$(call compile_c)
#$(GEN_PINS_SRC:.c=.o): $(GEN_PINS_SRC)
# $(call compile_c)

#make_pins:
# @echo "HERE!!!"
Expand Down
2 changes: 1 addition & 1 deletion ports/psoc6/boards/CY8CPROTO-062-4343W/mpconfigboard.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Board and hardware specific configuration
#define MICROPY_HW_MCU_NAME "PSoC62"
#define MICROPY_HW_MCU_NAME "PSoC62"
#define MICROPY_HW_BOARD_NAME "CY8CPROTO-062-4343W"

#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "CY8C-062-4343W"
7 changes: 5 additions & 2 deletions ports/psoc6/boards/make-pins-csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,12 @@ def generate_pins_csv(pin_package_filename, pins_csv_filename):

# Extract enum values using regex
enum_values = re.findall(r"\b(\w+)\s*=", enum_content)

# Write enum values to a CSV file
with open("./" + pins_csv_filename, "w", newline="") as csv_file:
csv_writer = csv.writer(csv_file)
csv_writer.writerows([[value, value] for value in enum_values])
csv_writer.writerows(
[[value, value] for value in enum_values if value.startswith("P")]
)
print("// pins.csv generated successfully")
else:
print("// Error: pins.csv generation failed")
Expand Down Expand Up @@ -80,6 +81,8 @@ def generate_af_pins_csv(pin_package_filename, pins_af_csv_filename):
with open("./" + pins_af_csv_filename, "w", newline="") as csv_file:
csv_writer = csv.writer(csv_file)
for pname, pdef in zip(pin_name, pin_def):
print(pname, pdef)
# if pin_name[pname].startswith('P'):
val = get_pin_addr_helper(pdef)
csv_writer.writerow([pname, val])

Expand Down
45 changes: 38 additions & 7 deletions ports/psoc6/boards/make-pins.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class Pin(object):
def __init__(self, name, pin_addr):
self._name = name
self._pin_addr = pin_addr
# self._board_pin = False
self._board_pin = False

def cpu_pin_name(self):
return self._name
Expand All @@ -33,24 +33,35 @@ def is_board_pin(self):
def set_is_board_pin(self):
self._board_pin = True

def set_board_index(self, index):
self.board_index = index

def print(self):
print(
"""print(
"const machine_pin_obj_t pin_{:s}_obj = PIN({:s}, {:s});".format(
self._name,
self._name,
self._pin_addr,
)
)
print("")
)"""
# print("")

def print_header(self, hdr_file):
n = self.cpu_pin_name()
hdr_file.write("extern const machine_pin_obj_t pin_{:s}_obj;\n".format(n))
hdr_file.write("#define pin_{:s} (&pin_{:s}_obj)\n".format(n, n))
# hdr_file.write("#define pin_{:s} (&pin_{:s}_obj)\n".format(n, n))

def qstr_list(self):
return [self._name]

def print_const_table_entry(self):
print(
# " {{{{&machine_pin_type}}, PIN({:s}, {:s}), \"{:s}\" }},".format(
# self._name, self._pin_addr, self._name
# )
'{{{{ &machine_pin_type}}, PIN_{:s}, "{:s}"}},'.format(self._name, self._name)
)


class Pins(object):
def __init__(self):
Expand All @@ -64,6 +75,23 @@ def find_pin(self, cpu_pin_name):
if pin.cpu_pin_name() == cpu_pin_name:
return pin

def print_const_table(self):
num_cpu_pins = 0
for named_pin in self.cpu_pins:
pin = named_pin.pin()
if pin.is_board_pin():
pin.set_board_index(num_cpu_pins)
num_cpu_pins += 1
print("")
print("const uint8_t machine_pin_num_of_cpu_pins = {:d};".format(num_cpu_pins))
print("")
print("const machine_pin_obj_t machine_pin_obj[{:d}] = {{".format(num_cpu_pins))
for named_pin in self.cpu_pins:
pin = named_pin.pin()
if pin.is_board_pin():
pin.print_const_table_entry()
print("};")

# ToDo: Complete for alternate functions
def parse_af_file(self):
with open("./pins_af.csv", "r") as csvfile:
Expand Down Expand Up @@ -97,14 +125,16 @@ def print_named(self, label, named_pins):
print(
"STATIC const mp_rom_map_elem_t pin_{:s}_pins_locals_dict_table[] = {{".format(label)
)
num_cpu_pins = 0
for named_pin in named_pins:
pin = named_pin.pin()
if pin.is_board_pin():
print(
" {{ MP_ROM_QSTR(MP_QSTR_{:s}), MP_ROM_PTR(&pin_{:s}_obj) }},".format(
named_pin.name(), pin.cpu_pin_name()
" {{ MP_ROM_QSTR(MP_QSTR_{:s}), MP_ROM_PTR(&machine_pin_obj[{:d}]) }},".format(
named_pin.name(), num_cpu_pins
)
)
num_cpu_pins += 1
print("};")
print(
"MP_DEFINE_CONST_DICT(pin_{:s}_pins_locals_dict, pin_{:s}_pins_locals_dict_table);".format(
Expand Down Expand Up @@ -191,6 +221,7 @@ def main():

if args.hdr_filename and args.qstr_filename:
pins.parse_board_file()
pins.print_const_table()
pins.print()
pins.print_header(args.hdr_filename)
pins.print_qstr(args.qstr_filename)
Expand Down
41 changes: 39 additions & 2 deletions ports/psoc6/modules/machine/pins.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,36 @@

#include "pins.h"

extern const uint8_t machine_pin_num_of_cpu_pins;

const machine_pin_obj_t *pin_find_named_pin(const mp_obj_dict_t *named_pins, mp_obj_t name) {
const mp_map_t *named_map = &named_pins->map;
mp_map_elem_t *named_elem = mp_map_lookup((mp_map_t *)named_map, name, MP_MAP_LOOKUP);
if (named_elem != NULL && named_elem->value != MP_OBJ_NULL) {
return MP_OBJ_TO_PTR(named_elem->value);
}
return NULL;
}

// C API used to convert a user-supplied pin name into an ordinal pin number.
/*const machine_pin_obj_t *pin_find(mp_obj_t user_obj) {
const machine_pin_obj_t *pin_obj;
// If a pin was provided, then use it
if (mp_obj_is_type(user_obj, &machine_pin_type)) {
pin_obj = MP_OBJ_TO_PTR(user_obj);
return pin_obj;
}
// See if the pin name matches a cpu pin
pin_obj = pin_find_named_pin(&pin_cpu_pins_locals_dict, user_obj);
if (pin_obj) {
return pin_obj;
}
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("Pin(%s) doesn't exist"), mp_obj_str_get_str(user_obj));
}*/

// Function definitions
// helper function to translate pin_name(string) into machine_pin_obj_t index.
int pin_find(mp_obj_t pin) {
Expand All @@ -17,15 +47,15 @@ int pin_find(mp_obj_t 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++) {
for (int i = 0; i < machine_pin_num_of_cpu_pins; 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))) {
if (!(0 <= wanted_pin && wanted_pin < machine_pin_num_of_cpu_pins)) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid pin: Pin not defined!"));
}

Expand Down Expand Up @@ -163,3 +193,10 @@ int pin_addr_by_name(mp_obj_t pin) {
{{&machine_pin_type}, PIN_USBDP, "USBDP"},
{{&machine_pin_type}, PIN_USBDM, "USBDM"},
};*/

MP_DEFINE_CONST_OBJ_TYPE(
pin_cpu_pins_obj_type,
MP_QSTR_cpu,
MP_TYPE_FLAG_NONE,
locals_dict, &pin_cpu_pins_locals_dict
);
13 changes: 9 additions & 4 deletions ports/psoc6/modules/machine/pins.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,29 +129,34 @@
#define PIN_P13_5 CYHAL_GET_GPIO(CYHAL_PORT_13, 5)// !< Port 13 Pin 5
#define PIN_P13_6 CYHAL_GET_GPIO(CYHAL_PORT_13, 6)// !< Port 13 Pin 6
#define PIN_P13_7 CYHAL_GET_GPIO(CYHAL_PORT_13, 7)// !< Port 13 Pin 7

#define PIN_USBDP CYHAL_GET_GPIO(CYHAL_PORT_14, 0)// !< Port 14 Pin 0
#define PIN_P14_0 CYHAL_GET_GPIO(CYHAL_PORT_14, 0) // !< Port 14 Pin 0
#define PIN_USBDM CYHAL_GET_GPIO(CYHAL_PORT_14, 1)// !< Port 14 Pin 1
#define PIN_P14_1 CYHAL_GET_GPIO(CYHAL_PORT_14, 1) // !< Port 14 Pin 1


// Add all machine pin objects - GPIO , I2C, ADC etc.
typedef struct _machine_pin_obj_t {
mp_obj_base_t base;
qstr pin_name;
// char *pin_name;
qstr pname;
char *pin_name;
uint32_t pin_addr;
} machine_pin_obj_t;

#include "genhdr/pins.h"
// Function Prototypes to support interaction between c<->py
int pin_find(mp_obj_t obj);
// const machine_pin_obj_t *pin_find(mp_obj_t user_obj);
int pin_addr_by_name(mp_obj_t obj);

extern const mp_obj_type_t pin_cpu_pins_obj_type;
extern const mp_obj_dict_t pin_cpu_pins_locals_dict;

/* TODO: to auto-generate the pin instances in the pin_obj array
and thereby capture the obj count. It cannot be declared without a defined size,
since there are sizeof() and other functions in machine_pin which act on this array
and need a deterministic size of the array to compile. */
extern const machine_pin_obj_t machine_pin_obj[102];
extern const machine_pin_obj_t machine_pin_obj[];


#endif // MICROPY_INCLUDED_PSOC6_PINS_H

0 comments on commit bf77d89

Please sign in to comment.