| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #!/usr/bin/env python3
- import argparse
- import xml.etree.ElementTree as XML
- import sys
- def getArgs():
- parser = argparse.ArgumentParser(
- description="chiplist.xml to C array converter",
- )
- parser.add_argument("file", help="chiplist.xml file")
- return parser.parse_args()
- def getXML(file):
- tree = XML.parse(file)
- root = tree.getroot()
- return root
- def parseChip(cur, arr, vendor, vendorCodeArr):
- chip = {}
- chipAttr = cur.attrib
- if "page" not in chipAttr: # chip without page size not supported
- return
- if "id" not in chipAttr: # I2C not supported yet
- return
- if len(chipAttr["id"]) < 6: # ID wihout capacity id not supported yet
- return
- chip["modelName"] = cur.tag
- chip["vendorEnum"] = "SPIMemChipVendor" + vendor
- chip["vendorID"] = "0x" + chipAttr["id"][0] + chipAttr["id"][1]
- chip["typeID"] = chipAttr["id"][2] + chipAttr["id"][3]
- chip["capacityID"] = chipAttr["id"][4] + chipAttr["id"][5]
- chip["size"] = chipAttr["size"]
- if chipAttr["page"] == "SSTW":
- chip["writeMode"] = "SPIMemChipWriteModeAAIWord"
- chip["pageSize"] = "1"
- elif chipAttr["page"] == "SSTB":
- chip["writeMode"] = "SPIMemChipWriteModeAAIByte"
- chip["pageSize"] = "1"
- else:
- chip["writeMode"] = "SPIMemChipWriteModePage"
- chip["pageSize"] = chipAttr["page"]
- arr.append(chip)
- vendorCodeArr[vendor].add(chip["vendorID"])
- def cleanEmptyVendors(vendors):
- for cur in list(vendors):
- if not vendors[cur]:
- vendors.pop(cur)
- def getVendors(xml, interface):
- arr = {}
- for cur in xml.find(interface):
- arr[cur.tag] = set()
- return arr
- def parseXML(xml, interface, vendorCodeArr):
- arr = []
- for vendor in xml.find(interface):
- for cur in vendor:
- parseChip(cur, arr, vendor.tag, vendorCodeArr)
- return arr
- def getVendorNameEnum(vendorID):
- try:
- return vendors[vendorID]
- except:
- print("Unknown vendor: " + vendorID)
- sys.exit(1)
- def generateCArr(arr, filename):
- with open(filename, "w") as out:
- print('#include "spi_mem_chip_i.h"', file=out)
- print("const SPIMemChip SPIMemChips[] = {", file=out)
- for cur in arr:
- print(" {" + cur["vendorID"] + ",", file=out, end="")
- print(" 0x" + cur["typeID"] + ",", file=out, end="")
- print(" 0x" + cur["capacityID"] + ",", file=out, end="")
- print(' "' + cur["modelName"] + '",', file=out, end="")
- print(" " + cur["size"] + ",", file=out, end="")
- print(" " + cur["pageSize"] + ",", file=out, end="")
- print(" " + cur["vendorEnum"] + ",", file=out, end="")
- if cur == arr[-1]:
- print(" " + cur["writeMode"] + "}};", file=out)
- else:
- print(" " + cur["writeMode"] + "},", file=out)
- def main():
- filename = "spi_mem_chip_arr.c"
- args = getArgs()
- xml = getXML(args.file)
- vendors = getVendors(xml, "SPI")
- chipArr = parseXML(xml, "SPI", vendors)
- cleanEmptyVendors(vendors)
- for cur in vendors:
- print(' {"' + cur + '", SPIMemChipVendor' + cur + "},")
- generateCArr(chipArr, filename)
- if __name__ == "__main__":
- main()
|