|
|
|
@ -17,7 +17,13 @@ parser.add_argument(
@@ -17,7 +17,13 @@ parser.add_argument(
|
|
|
|
|
args = parser.parse_args() |
|
|
|
|
|
|
|
|
|
# output variables for each pin |
|
|
|
|
vtypes = ['MODER', 'OTYPER', 'OSPEEDR', 'PUPDR', 'ODR', 'AFRL', 'AFRH'] |
|
|
|
|
f4f7_vtypes = ['MODER', 'OTYPER', 'OSPEEDR', 'PUPDR', 'ODR', 'AFRL', 'AFRH'] |
|
|
|
|
f1_vtypes = ['CRL', 'CRH', 'ODR'] |
|
|
|
|
f1_input_sigs = ['RX', 'MISO', 'CTS'] |
|
|
|
|
f1_output_sigs = ['TX', 'MOSI', 'SCK', 'RTS', 'CH1', 'CH2', 'CH3', 'CH4'] |
|
|
|
|
af_labels = ['USART', 'UART', 'SPI', 'I2C', 'SDIO', 'SDMMC', 'OTG', 'JT', 'TIM', 'CAN'] |
|
|
|
|
|
|
|
|
|
vtypes = [] |
|
|
|
|
|
|
|
|
|
# number of pins in each port |
|
|
|
|
pincount = { |
|
|
|
@ -96,10 +102,14 @@ def get_mcu_lib(mcu):
@@ -96,10 +102,14 @@ def get_mcu_lib(mcu):
|
|
|
|
|
|
|
|
|
|
def setup_mcu_type_defaults(): |
|
|
|
|
'''setup defaults for given mcu type''' |
|
|
|
|
global pincount, ports, portmap |
|
|
|
|
global pincount, ports, portmap, vtypes |
|
|
|
|
lib = get_mcu_lib(mcu_type) |
|
|
|
|
if hasattr(lib, 'pincount'): |
|
|
|
|
pincount = lib.pincount |
|
|
|
|
if mcu_series == "STM32F100": |
|
|
|
|
vtypes = f1_vtypes |
|
|
|
|
else: |
|
|
|
|
vtypes = f4f7_vtypes |
|
|
|
|
ports = pincount.keys() |
|
|
|
|
# setup default as input pins |
|
|
|
|
for port in ports: |
|
|
|
@ -110,14 +120,21 @@ def setup_mcu_type_defaults():
@@ -110,14 +120,21 @@ def setup_mcu_type_defaults():
|
|
|
|
|
def get_alt_function(mcu, pin, function): |
|
|
|
|
'''return alternative function number for a pin''' |
|
|
|
|
lib = get_mcu_lib(mcu) |
|
|
|
|
alt_map = lib.AltFunction_map |
|
|
|
|
|
|
|
|
|
if hasattr(lib, "AltFunction_map"): |
|
|
|
|
alt_map = lib.AltFunction_map |
|
|
|
|
else: |
|
|
|
|
# just check if Alt Func is available or not |
|
|
|
|
for l in af_labels: |
|
|
|
|
if function.startswith(l): |
|
|
|
|
return 0 |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
if function and function.endswith("_RTS") and ( |
|
|
|
|
function.startswith('USART') or function.startswith('UART')): |
|
|
|
|
# we do software RTS |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
af_labels = ['USART', 'UART', 'SPI', 'I2C', 'SDIO', 'SDMMC', 'OTG', 'JT', 'TIM', 'CAN'] |
|
|
|
|
for l in af_labels: |
|
|
|
|
if function.startswith(l): |
|
|
|
|
s = pin + ":" + function |
|
|
|
@ -152,6 +169,7 @@ class generic_pin(object):
@@ -152,6 +169,7 @@ class generic_pin(object):
|
|
|
|
|
'''class to hold pin definition''' |
|
|
|
|
|
|
|
|
|
def __init__(self, port, pin, label, type, extra): |
|
|
|
|
global mcu_series |
|
|
|
|
self.portpin = "P%s%u" % (port, pin) |
|
|
|
|
self.port = port |
|
|
|
|
self.pin = pin |
|
|
|
@ -159,6 +177,20 @@ class generic_pin(object):
@@ -159,6 +177,20 @@ class generic_pin(object):
|
|
|
|
|
self.type = type |
|
|
|
|
self.extra = extra |
|
|
|
|
self.af = None |
|
|
|
|
self.sig_dir = 'INPUT' |
|
|
|
|
if mcu_series == "STM32F100" and self.label is not None: |
|
|
|
|
self.f1_pin_setup() |
|
|
|
|
|
|
|
|
|
def f1_pin_setup(self): |
|
|
|
|
for l in af_labels: |
|
|
|
|
if self.label.startswith(l): |
|
|
|
|
if self.label.endswith(tuple(f1_input_sigs)): |
|
|
|
|
self.sig_dir = 'INPUT' |
|
|
|
|
self.extra.append('FLOATING') |
|
|
|
|
elif self.label.endswith(tuple(f1_output_sigs)): |
|
|
|
|
self.sig_dir = 'OUTPUT' |
|
|
|
|
else: |
|
|
|
|
error("Unknown signal type %s:%s for %s!" % (self.portpin, self.label, mcu_type)) |
|
|
|
|
|
|
|
|
|
def has_extra(self, v): |
|
|
|
|
'''return true if we have the given extra token''' |
|
|
|
@ -281,6 +313,67 @@ class generic_pin(object):
@@ -281,6 +313,67 @@ class generic_pin(object):
|
|
|
|
|
return None |
|
|
|
|
return self.get_AFIO() |
|
|
|
|
|
|
|
|
|
#F1 series GPIO Cfg methods |
|
|
|
|
|
|
|
|
|
def get_ODR(self): |
|
|
|
|
'''return one of LOW, HIGH''' |
|
|
|
|
values = ['LOW', 'HIGH'] |
|
|
|
|
v = 'HIGH' |
|
|
|
|
if self.type == 'OUTPUT': |
|
|
|
|
v = 'LOW' |
|
|
|
|
for e in self.extra: |
|
|
|
|
if e in values: |
|
|
|
|
v = e |
|
|
|
|
#for some controllers input pull up down is selected by ODR |
|
|
|
|
if self.type == "INPUT": |
|
|
|
|
v = 'LOW' |
|
|
|
|
if 'PULLUP' in self.extra: |
|
|
|
|
v = "HIGH" |
|
|
|
|
return "PIN_ODR_%s(%uU)" % (v, self.pin) |
|
|
|
|
|
|
|
|
|
def get_CR(self): |
|
|
|
|
'''return CR FLAGS''' |
|
|
|
|
#Check Speed |
|
|
|
|
if self.sig_dir != "INPUT": |
|
|
|
|
speed_values = ['SPEED_LOW', 'SPEED_MEDIUM', 'SPEED_HIGH'] |
|
|
|
|
v = 'SPEED_MEDIUM' |
|
|
|
|
for e in self.extra: |
|
|
|
|
if e in speed_values: |
|
|
|
|
v = e |
|
|
|
|
speed_str = "PIN_%s(%uU) |" % (v, self.pin) |
|
|
|
|
else: |
|
|
|
|
speed_str = "" |
|
|
|
|
#Check Alternate function |
|
|
|
|
if self.type.startswith('I2C'): |
|
|
|
|
v = "AF_OD" |
|
|
|
|
elif self.sig_dir == 'OUTPUT': |
|
|
|
|
if self.af is not None: |
|
|
|
|
v = "AF_PP" |
|
|
|
|
else: |
|
|
|
|
v = "OUTPUT_PP" |
|
|
|
|
elif self.type.startswith('ADC'): |
|
|
|
|
v = "ANALOG" |
|
|
|
|
elif self.is_CS(): |
|
|
|
|
v = "OUTPUT_PP" |
|
|
|
|
elif self.is_RTS(): |
|
|
|
|
v = "OUTPUT_PP" |
|
|
|
|
else: |
|
|
|
|
v = "PUD" |
|
|
|
|
if 'FLOATING' in self.extra: |
|
|
|
|
v = "NOPULL" |
|
|
|
|
mode_str = "PIN_MODE_%s(%uU)" % (v, self.pin) |
|
|
|
|
return "%s %s" % (speed_str, mode_str) |
|
|
|
|
|
|
|
|
|
def get_CRH(self): |
|
|
|
|
if self.pin < 8: |
|
|
|
|
return None |
|
|
|
|
return self.get_CR() |
|
|
|
|
|
|
|
|
|
def get_CRL(self): |
|
|
|
|
if self.pin >= 8: |
|
|
|
|
return None |
|
|
|
|
return self.get_CR() |
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
|
str = '' |
|
|
|
|
if self.af is not None: |
|
|
|
@ -384,6 +477,17 @@ def write_mcu_config(f):
@@ -384,6 +477,17 @@ def write_mcu_config(f):
|
|
|
|
|
f.write('#define STM32_USB_USE_OTG2 TRUE\n') |
|
|
|
|
if have_type_prefix('CAN'): |
|
|
|
|
enable_can(f) |
|
|
|
|
|
|
|
|
|
if get_config('PROCESS_STACK', required=False): |
|
|
|
|
env_vars['PROCESS_STACK'] = get_config('PROCESS_STACK') |
|
|
|
|
else: |
|
|
|
|
env_vars['PROCESS_STACK'] = "0x2000" |
|
|
|
|
|
|
|
|
|
if get_config('MAIN_STACK', required=False): |
|
|
|
|
env_vars['MAIN_STACK'] = get_config('MAIN_STACK') |
|
|
|
|
else: |
|
|
|
|
env_vars['MAIN_STACK'] = "0x400" |
|
|
|
|
|
|
|
|
|
# write any custom STM32 defines |
|
|
|
|
for d in alllines: |
|
|
|
|
if d.startswith('STM32_'): |
|
|
|
@ -428,6 +532,16 @@ def write_mcu_config(f):
@@ -428,6 +532,16 @@ def write_mcu_config(f):
|
|
|
|
|
|
|
|
|
|
lib = get_mcu_lib(mcu_type) |
|
|
|
|
build_info = lib.build |
|
|
|
|
|
|
|
|
|
if mcu_series == "STM32F100": |
|
|
|
|
cortex = "cortex-m3" |
|
|
|
|
env_vars['CPU_FLAGS'] = ["-mcpu=%s" % cortex] |
|
|
|
|
build_info['MCU'] = cortex |
|
|
|
|
else: |
|
|
|
|
cortex = "cortex-m4" |
|
|
|
|
env_vars['CPU_FLAGS'] = ['-u_printf_float', "-mcpu=%s" % cortex, "-mfpu=fpv4-sp-d16", "-mfloat-abi=hard"] |
|
|
|
|
build_info['MCU'] = cortex |
|
|
|
|
build_info['ENV_UDEFS'] = "-DCHPRINTF_USE_FLOAT=1" |
|
|
|
|
# setup build variables |
|
|
|
|
for v in build_info.keys(): |
|
|
|
|
build_flags.append('%s=%s' % (v, build_info[v])) |
|
|
|
@ -508,7 +622,7 @@ def copy_common_linkerscript(outdir, hwdef):
@@ -508,7 +622,7 @@ def copy_common_linkerscript(outdir, hwdef):
|
|
|
|
|
def write_USB_config(f): |
|
|
|
|
'''write USB config defines''' |
|
|
|
|
if not have_type_prefix('OTG'): |
|
|
|
|
return; |
|
|
|
|
return |
|
|
|
|
f.write('// USB configuration\n') |
|
|
|
|
f.write('#define HAL_USB_VENDOR_ID %s\n' % get_config('USB_VENDOR', default=0x0483)) # default to ST |
|
|
|
|
f.write('#define HAL_USB_PRODUCT_ID %s\n' % get_config('USB_PRODUCT', default=0x5740)) |
|
|
|
@ -1061,12 +1175,36 @@ def write_hwdef_header(outfilename):
@@ -1061,12 +1175,36 @@ def write_hwdef_header(outfilename):
|
|
|
|
|
if len(romfs) > 0: |
|
|
|
|
f.write('#define HAL_HAVE_AP_ROMFS_EMBEDDED_H 1\n') |
|
|
|
|
|
|
|
|
|
f.write(''' |
|
|
|
|
if mcu_series == 'STM32F100': |
|
|
|
|
f.write(''' |
|
|
|
|
/* |
|
|
|
|
* I/O ports initial setup, this configuration is established soon after reset |
|
|
|
|
* in the initialization code. |
|
|
|
|
* Please refer to the STM32 Reference Manual for details. |
|
|
|
|
*/ |
|
|
|
|
#define PIN_MODE_OUTPUT_PP(n) (0 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_MODE_OUTPUT_OD(n) (4 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_MODE_AF_PP(n) (8 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_MODE_AF_OD(n) (12 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_MODE_ANALOG(n) (0 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_MODE_NOPULL(n) (4 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_MODE_PUD(n) (8 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_SPEED_MEDIUM(n) (1 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_SPEED_LOW(n) (2 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_SPEED_HIGH(n) (3 << (((n) & 7) * 4)) |
|
|
|
|
#define PIN_ODR_HIGH(n) (1 << (((n) & 15))) |
|
|
|
|
#define PIN_ODR_LOW(n) (0 << (((n) & 15))) |
|
|
|
|
#define PIN_PULLUP(n) (1 << (((n) & 15))) |
|
|
|
|
#define PIN_PULLDOWN(n) (0 << (((n) & 15))) |
|
|
|
|
#define PIN_UNDEFINED(n) PIN_INPUT_PUD(n) |
|
|
|
|
''') |
|
|
|
|
else: |
|
|
|
|
f.write(''' |
|
|
|
|
/* |
|
|
|
|
* I/O ports initial setup, this configuration is established soon after reset |
|
|
|
|
* in the initialization code. |
|
|
|
|
* Please refer to the STM32 Reference Manual for details. |
|
|
|
|
*/ |
|
|
|
|
#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) |
|
|
|
|
#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) |
|
|
|
|
#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) |
|
|
|
@ -1168,9 +1306,10 @@ def write_env_py(filename):
@@ -1168,9 +1306,10 @@ def write_env_py(filename):
|
|
|
|
|
if os.path.exists(defaults_filename) and not args.bootloader: |
|
|
|
|
print("Adding defaults.parm") |
|
|
|
|
env_vars['DEFAULT_PARAMETERS'] = os.path.abspath(defaults_filename) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# CHIBIOS_BUILD_FLAGS is passed to the ChibiOS makefile |
|
|
|
|
env_vars['CHIBIOS_BUILD_FLAGS'] = ' '.join(build_flags) |
|
|
|
|
print env_vars['CPU_FLAGS'] |
|
|
|
|
pickle.dump(env_vars, open(filename, "wb")) |
|
|
|
|
|
|
|
|
|
def romfs_add(romfs_filename, filename): |
|
|
|
@ -1197,8 +1336,9 @@ def process_line(line):
@@ -1197,8 +1336,9 @@ def process_line(line):
|
|
|
|
|
|
|
|
|
|
config[a[0]] = a[1:] |
|
|
|
|
if a[0] == 'MCU': |
|
|
|
|
global mcu_type |
|
|
|
|
global mcu_type, mcu_series |
|
|
|
|
mcu_type = a[2] |
|
|
|
|
mcu_series = a[1] |
|
|
|
|
setup_mcu_type_defaults() |
|
|
|
|
if a[0].startswith('P') and a[0][1] in ports: |
|
|
|
|
# it is a port/pin definition |
|
|
|
|