diff options
| author | Dave Hylands | 2014-07-22 07:57:36 -0700 |
|---|---|---|
| committer | Dave Hylands | 2014-08-07 23:15:41 -0700 |
| commit | 6f418fc1b068c1a41113bb2b019a5803765e1deb (patch) | |
| tree | 79477835459eb424012f58d77a150bdf9a80eed5 /stmhal/boards | |
| parent | 3ef911345c94a6d612ab50c1e912e81cb2cc3f71 (diff) | |
Add support for selecting pin alternate functions from python.
Converts generted pins to use qstrs instead of string pointers.
This patch also adds the following functions:
pyb.Pin.names()
pyb.Pin.af_list()
pyb.Pin.gpio()
dir(pyb.Pin.board) and dir(pyb.Pin.cpu) also produce useful results.
pyb.Pin now takes kw args.
pyb.Pin.__str__ now prints more useful information about the pin
configuration.
I found the following functions in my boot.py to be useful:
```python
def pins():
for pin_name in dir(pyb.Pin.board):
pin = pyb.Pin(pin_name)
print('{:10s} {:s}'.format(pin_name, str(pin)))
def af():
for pin_name in dir(pyb.Pin.board):
pin = pyb.Pin(pin_name)
print('{:10s} {:s}'.format(pin_name, str(pin.af_list())))
```
Diffstat (limited to 'stmhal/boards')
| -rwxr-xr-x | stmhal/boards/make-pins.py | 66 | ||||
| -rw-r--r-- | stmhal/boards/stm32f4xx-prefix.c | 3 |
2 files changed, 65 insertions, 4 deletions
diff --git a/stmhal/boards/make-pins.py b/stmhal/boards/make-pins.py index e3a3f583a..f3d1dee48 100755 --- a/stmhal/boards/make-pins.py +++ b/stmhal/boards/make-pins.py @@ -72,6 +72,9 @@ class AlternateFunction(object): return self.func return '{:s}{:d}'.format(self.func, self.fn_num) + def mux_name(self): + return 'AF{:d}_{:s}'.format(self.idx, self.ptr()) + def print(self): """Prints the C representation of this AF.""" if self.supported: @@ -84,6 +87,9 @@ class AlternateFunction(object): print('({:2d}, {:8s}, {:2d}, {:10s}, {:8s}), // {:s}'.format(self.idx, self.func, fn_num, self.pin_type, self.ptr(), self.af_str)) + def qstr_list(self): + return [self.mux_name()] + class Pin(object): """Holds the information associated with a pin.""" @@ -170,6 +176,14 @@ class Pin(object): hdr_file.write('extern const pin_af_obj_t pin_{:s}_af[];\n'. format(self.cpu_pin_name())) + def qstr_list(self): + result = [] + for alt_fn in self.alt_fn: + if alt_fn.is_supported(): + result += alt_fn.qstr_list() + return result + + class NamedPin(object): def __init__(self, name, pin): @@ -225,13 +239,13 @@ class Pins(object): self.board_pins.append(NamedPin(row[0], pin)) def print_named(self, label, named_pins): - print('const pin_named_pin_t pin_{:s}_pins[] = {{'.format(label)) + print('STATIC const mp_map_elem_t pin_{:s}_pins_locals_dict_table[] = {{'.format(label)) for named_pin in named_pins: pin = named_pin.pin() if pin.is_board_pin(): - print(' {{ "{:s}", &pin_{:s} }},'.format(named_pin.name(), pin.cpu_pin_name())) - print(' { NULL, NULL }') + print(' {{ MP_OBJ_NEW_QSTR(MP_QSTR_{:s}), (mp_obj_t)&pin_{:s} }},'.format(named_pin.name(), pin.cpu_pin_name())) print('};') + print('MP_DEFINE_CONST_DICT(pin_{:s}_pins_locals_dict, pin_{:s}_pins_locals_dict_table);'.format(label, label)); def print(self): for named_pin in self.cpu_pins: @@ -269,6 +283,38 @@ class Pins(object): hdr_file.write('extern const pin_obj_t * const pin_adc2[];\n') hdr_file.write('extern const pin_obj_t * const pin_adc3[];\n') + def print_qstr(self, qstr_filename): + with open(qstr_filename, 'wt') as qstr_file: + qstr_set = set([]) + for named_pin in self.cpu_pins: + pin = named_pin.pin() + if pin.is_board_pin(): + qstr_set |= set(pin.qstr_list()) + qstr_set |= set([named_pin.name()]) + for named_pin in self.board_pins: + qstr_set |= set([named_pin.name()]) + for qstr in sorted(qstr_set): + print('Q({})'.format(qstr), file=qstr_file) + + def print_af_hdr(self, af_const_filename): + with open(af_const_filename, 'wt') as af_const_file: + af_hdr_set = set([]) + mux_name_width = 0 + for named_pin in self.cpu_pins: + pin = named_pin.pin() + if pin.is_board_pin(): + for af in pin.alt_fn: + if af.is_supported(): + mux_name = af.mux_name() + af_hdr_set |= set([mux_name]) + if len(mux_name) > mux_name_width: + mux_name_width = len(mux_name) + for mux_name in sorted(af_hdr_set): + key = 'MP_OBJ_NEW_QSTR(MP_QSTR_{}),'.format(mux_name) + val = 'MP_OBJ_NEW_SMALL_INT(GPIO_{})'.format(mux_name) + print(' { %-*s %s },' % (mux_name_width + 26, key, val), + file=af_const_file) + def main(): parser = argparse.ArgumentParser( @@ -283,6 +329,12 @@ def main(): default="stm32f4xx-af.csv" ) parser.add_argument( + "--af-const", + dest="af_const_filename", + help="Specifies header file for alternate function constants.", + default="build/pins-af-const.h" + ) + parser.add_argument( "-b", "--board", dest="board_filename", help="Specifies the board file", @@ -294,6 +346,12 @@ def main(): default="stm32f4xx-prefix.c" ) parser.add_argument( + "-q", "--qstr", + dest="qstr_filename", + help="Specifies name of generated qstr header file", + default="build/pins-qstr.h" + ) + parser.add_argument( "-r", "--hdr", dest="hdr_filename", help="Specifies name of generated pin header file", @@ -323,6 +381,8 @@ def main(): pins.print_adc(2) pins.print_adc(3) pins.print_header(args.hdr_filename) + pins.print_qstr(args.qstr_filename) + pins.print_af_hdr(args.af_const_filename) if __name__ == "__main__": diff --git a/stmhal/boards/stm32f4xx-prefix.c b/stmhal/boards/stm32f4xx-prefix.c index 3bbb6bda0..45bcc0b65 100644 --- a/stmhal/boards/stm32f4xx-prefix.c +++ b/stmhal/boards/stm32f4xx-prefix.c @@ -14,6 +14,7 @@ #define AF(af_idx, af_fn, af_unit, af_type, af_ptr) \ { \ { &pin_af_type }, \ + .name = MP_QSTR_AF ## af_idx ## _ ## af_fn ## af_unit, \ .idx = (af_idx), \ .fn = AF_FN_ ## af_fn, \ .unit = (af_unit), \ @@ -24,7 +25,7 @@ #define PIN(p_port, p_pin, p_num_af, p_af, p_adc_num, p_adc_channel) \ { \ { &pin_type }, \ - .name = #p_port #p_pin, \ + .name = MP_QSTR_ ## p_port ## p_pin, \ .port = PORT_ ## p_port, \ .pin = (p_pin), \ .num_af = (p_num_af), \ |
