2025-02-14 00:51:39 -04:00
|
|
|
#!/usr/bin/env python
|
|
|
|
'''
|
|
|
|
setup board.h for Linux
|
|
|
|
|
|
|
|
AP_FLAKE8_CLEAN
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
import argparse
|
2025-02-14 09:31:52 -04:00
|
|
|
import shlex
|
2025-02-14 00:51:39 -04:00
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
|
|
|
|
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../../../libraries/AP_HAL/hwdef/scripts'))
|
|
|
|
import hwdef # noqa:E402
|
|
|
|
|
|
|
|
|
|
|
|
class LinuxHWDef(hwdef.HWDef):
|
|
|
|
|
|
|
|
def __init__(self, quiet=False, outdir=None, hwdef=[]):
|
|
|
|
super(LinuxHWDef, self).__init__(quiet=quiet, outdir=outdir, hwdef=hwdef)
|
2025-02-14 09:31:52 -04:00
|
|
|
# a list of LINUX_SPIDEV devices
|
|
|
|
self.linux_spidev = []
|
2025-02-14 00:51:39 -04:00
|
|
|
|
|
|
|
def write_hwdef_header_content(self, f):
|
|
|
|
for d in self.alllines:
|
|
|
|
if d.startswith('define '):
|
|
|
|
f.write('#define %s\n' % d[7:])
|
|
|
|
|
2025-02-14 09:31:52 -04:00
|
|
|
self.write_SPI_config(f)
|
|
|
|
|
2025-02-14 00:51:57 -04:00
|
|
|
def process_line(self, line, depth):
|
|
|
|
'''process one line of pin definition file'''
|
|
|
|
# keep all config lines for later use
|
|
|
|
self.all_lines.append(line)
|
|
|
|
self.alllines.append(line)
|
2025-02-14 09:31:52 -04:00
|
|
|
|
|
|
|
a = shlex.split(line, posix=False)
|
|
|
|
if a[0] == 'LINUX_SPIDEV':
|
|
|
|
self.process_line_linux_spidev(line, depth, a)
|
|
|
|
|
2025-02-14 00:51:57 -04:00
|
|
|
super(LinuxHWDef, self).process_line(line, depth)
|
|
|
|
|
2025-02-14 09:31:52 -04:00
|
|
|
def process_line_undef(self, line, depth, a):
|
|
|
|
for u in a[1:]:
|
|
|
|
for dev in self.spidev:
|
|
|
|
if u == dev[0]:
|
|
|
|
self.linux_spidev.remove(dev)
|
|
|
|
|
|
|
|
super(LinuxHWDef, self).process_line_undef(line, depth, a)
|
|
|
|
|
|
|
|
def process_line_linux_spidev(self, line, depth, a):
|
|
|
|
self.linux_spidev.append(a[1:])
|
|
|
|
|
|
|
|
def write_SPI_config_define_line_for_dev(self, define_name, dev, n):
|
|
|
|
'''return a #define line for a SPI config line used in a SPI device table'''
|
|
|
|
(name, bus, subdev, mode, bits_per_word, cs_pin, lowspeed, highspeed) = dev
|
|
|
|
|
|
|
|
# return f'#define {define_name} SPIDesc("name")\n'
|
|
|
|
|
|
|
|
# sck_pin = self.bylabel['SPI%s_SCK' % n]
|
|
|
|
# sck_line = 'PAL_LINE(GPIO%s,%uU)' % (sck_pin.port, sck_pin.pin)
|
|
|
|
# return f'#define {define_name} {{ &SPID{n}, {n}, STM32_SPI_SPI{n}_DMA_STREAMS, {sck_line} }}\n'
|
|
|
|
|
|
|
|
def write_SPI_device_table(self, f):
|
|
|
|
'''write SPI device table'''
|
|
|
|
if len(self.linux_spidev) == 0:
|
|
|
|
# until all are converted
|
|
|
|
return
|
|
|
|
|
|
|
|
f.write('\n// SPI device table\n')
|
|
|
|
devlist = []
|
|
|
|
for dev in self.linux_spidev:
|
|
|
|
if len(dev) != 8:
|
|
|
|
self.error(f"Badly formed LINUX_SPIDEV line {dev} {len(dev)=}")
|
|
|
|
(name, bus, subdev, mode, bits_per_word, cs_pin, lowspeed, highspeed) = dev
|
|
|
|
# if not bus.startswith('SPI') or bus not in self.spi_list:
|
|
|
|
# self.error(f"Bad SPI {bus=} in SPIDEV line {dev}")
|
|
|
|
# if mode not in ['MODE0', 'MODE1', 'MODE2', 'MODE3']:
|
|
|
|
# self.error("Bad MODE in SPIDEV line %s" % dev)
|
|
|
|
if not lowspeed.endswith('*MHZ') and not lowspeed.endswith('*KHZ'):
|
|
|
|
self.error("Bad lowspeed value %s in SPIDEV line %s" % (lowspeed, dev))
|
|
|
|
if not highspeed.endswith('*MHZ') and not highspeed.endswith('*KHZ'):
|
|
|
|
self.error("Bad highspeed value %s in SPIDEV line %s" %
|
|
|
|
(highspeed, dev))
|
|
|
|
f.write(
|
|
|
|
f'#define HAL_SPI_DEVICE{len(devlist)+1} SPIDesc({name:12s}, {bus}, {subdev}, {mode}, {bits_per_word}, {cs_pin}, {lowspeed:6s}, {highspeed:6s})\n' # noqa
|
|
|
|
)
|
|
|
|
devlist.append('HAL_SPI_DEVICE%u' % (len(devlist)+1))
|
|
|
|
f.write('#define HAL_SPI_DEVICE_LIST %s\n\n' % ','.join(devlist))
|
|
|
|
f.write("\n")
|
|
|
|
|
|
|
|
def write_SPI_config(self, f):
|
|
|
|
'''write SPI config defines'''
|
|
|
|
|
|
|
|
if len(self.linux_spidev) == 0:
|
|
|
|
return
|
|
|
|
|
|
|
|
self.write_SPI_device_table(f)
|
|
|
|
|
2025-02-14 00:51:39 -04:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser("linux_hwdef.py")
|
|
|
|
parser.add_argument(
|
|
|
|
'-D', '--outdir', type=str, default="/tmp", help='Output directory')
|
|
|
|
parser.add_argument(
|
|
|
|
'hwdef', type=str, nargs='+', default=None, help='hardware definition file')
|
|
|
|
parser.add_argument(
|
|
|
|
'--quiet', action='store_true', default=False, help='quiet running')
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
c = LinuxHWDef(
|
|
|
|
outdir=args.outdir,
|
|
|
|
hwdef=args.hwdef,
|
|
|
|
quiet=args.quiet,
|
|
|
|
)
|
|
|
|
c.run()
|