add dvf2svd
This commit is contained in:
parent
748b88e71e
commit
356d4841b3
|
@ -0,0 +1,103 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import argparse, sys, os
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__))+"/svd")
|
||||
from dvf import dvfparse
|
||||
#from svd import svd, svdparse, svdgen
|
||||
import svd, svdparse, svdgen
|
||||
from typing import *
|
||||
|
||||
WIDTHS = {
|
||||
dvfparse.Dvf.MCU_78K0: 16,
|
||||
dvfparse.Dvf.MCU_78K0R: 20,
|
||||
dvfparse.Dvf.MCU_RL78x1y: 20,
|
||||
dvfparse.Dvf.MCU_RL78x2y: 20,
|
||||
}
|
||||
SERIES = {
|
||||
# TODO: better categorization in subtypes and stuff
|
||||
dvfparse.Dvf.MCU_78K0: "78K0(S)",
|
||||
dvfparse.Dvf.MCU_78K0R: "78K0R",
|
||||
dvfparse.Dvf.MCU_RL78x1y: "RL78/x1y",
|
||||
dvfparse.Dvf.MCU_RL78x2y: "RL78/x2y",
|
||||
}
|
||||
CPUS = {
|
||||
# TODO: better categorization in subtypes and stuff
|
||||
dvfparse.Dvf.MCU_78K0: "78K0(S)",
|
||||
dvfparse.Dvf.MCU_78K0R: "78K0R",
|
||||
dvfparse.Dvf.MCU_RL78x1y: "RL78/S[13]",
|
||||
dvfparse.Dvf.MCU_RL78x2y: "RL78/S3",
|
||||
}
|
||||
|
||||
def conv_per(dvf: dvfparse.Dvf) -> List[svd.SvdPeripheral]:
|
||||
r=[]
|
||||
base = 0xFFF00 & ((1<<WIDTHS[dvf.mcutype])-1)
|
||||
r.append(svd.SvdPeripheral(
|
||||
name="SFR",
|
||||
description="Special Function Register space",
|
||||
baseAddress=base,
|
||||
registers=[
|
||||
# fields, properties, widths, etc etc etc are still to be reversed...
|
||||
svd.SvdRegister(
|
||||
name=r.name,
|
||||
addressOffset=(r.address|base)-base
|
||||
) for r in dvf.sections[dvfparse.DvfSect.SN]
|
||||
]
|
||||
))
|
||||
if dvfparse.DvfSect.ES in dvf.sections: # 78K0 has none
|
||||
base = 0xF0000
|
||||
r.append(svd.SvdPeripheral(
|
||||
name="SFR2",
|
||||
description="Extended Special Function Register space",
|
||||
baseAddress=base,
|
||||
registers=[
|
||||
svd.SvdRegister(
|
||||
name=r.name,
|
||||
addressOffset=(r.address|base)-base
|
||||
) for r in dvf.sections[dvfparse.DvfSect.ES]
|
||||
]
|
||||
))
|
||||
return r
|
||||
|
||||
def conv(dvf: dvfparse.Dvf) -> svd.SvdDevice:
|
||||
md = dvf.sections[dvfparse.DvfSect.MD][0]
|
||||
return svd.SvdDevice(
|
||||
vendor="Renesas",
|
||||
vendorID="Renesas",
|
||||
name=dvf.chipname_disp,
|
||||
series=SERIES[dvf.mcutype],
|
||||
description=md.version + " " + md.timestamp,
|
||||
licenseText=dvf.copyright_notice,
|
||||
addressUnitBits=8,
|
||||
width=16,#WIDTHS[dvf.mcutype],
|
||||
cpu=svd.SvdCpu(
|
||||
name=CPUS[dvf.mcutype],
|
||||
endian='little',
|
||||
deviceNumInterrupts=len(dvf.sections[dvfparse.DvfSect.VN]),
|
||||
),
|
||||
peripherals=conv_per(dvf),
|
||||
# TODO: MI to memory map somehow?
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(prog="dvf2h",
|
||||
description="Convert NEC/Renesas Device "+\
|
||||
"Files to CMSIS-SVD files")
|
||||
|
||||
parser.add_argument('input', type=argparse.FileType('rb'))
|
||||
#parser.add_argument('output', type=argparse.FileType('w'))
|
||||
parser.add_argument('output', type=str, default=None)
|
||||
|
||||
|
||||
args = parser.parse_args()
|
||||
output = sys.stdout if args.output is None else open(args.output, 'w')
|
||||
|
||||
try:
|
||||
dvffile = dvfparse.Dvf.parse(args.input.read())
|
||||
svdc = conv(dvffile)
|
||||
svdgen.generate(output, svdc)
|
||||
finally:
|
||||
if args.output is not None:
|
||||
output.close()
|
||||
|
Loading…
Reference in New Issue