makesoc.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #!/usr/bin/python3
  2. # -*- coding: UTF-8 -*-
  3. import os
  4. import shutil
  5. import re
  6. import json
  7. import csv
  8. import zipfile
  9. import argparse
  10. parser = argparse.ArgumentParser()
  11. parser.add_argument('config_json', type=str, help='the config_json of idf')
  12. # 打包路径
  13. out_path = os.path.dirname(os.path.abspath(__file__))
  14. pack_path = os.path.join(out_path,"pack")
  15. # bin路径
  16. bootloader_bin = os.path.join(out_path,"build","bootloader","bootloader.bin")
  17. partition_table_bin = os.path.join(out_path,"build","partition_table","partition-table.bin")
  18. luatos_bin = os.path.join(out_path,"build","luatos.bin")
  19. luat_conf_bsp = os.path.join(out_path,"include","luat_conf_bsp.h")
  20. info_json = os.path.join(pack_path,"info.json")
  21. soc_download_exe = os.path.join(pack_path,"soc_download.exe")
  22. def zip_dir(dirname,zipfilename):
  23. filelist = []
  24. for root, dirs, files in os.walk(dirname):
  25. for name in files:
  26. filelist.append(os.path.join(root, name))
  27. zf = zipfile.ZipFile(zipfilename, "w", compression=zipfile.ZIP_LZMA)
  28. for tar in filelist:
  29. arcname = tar[len(dirname):]
  30. zf.write(tar,arcname)
  31. zf.close()
  32. if __name__=='__main__':
  33. args = parser.parse_args()
  34. config_json = args.config_json
  35. with open(config_json) as f :
  36. config_json_data = json.load(f)
  37. bsp = config_json_data["IDF_TARGET"].upper()
  38. partition_table_name = config_json_data["PARTITION_TABLE_FILENAME"]
  39. partition_table_csv = os.path.join(out_path,partition_table_name)
  40. script_size = "0x20000"
  41. with open(partition_table_csv) as f :
  42. reader = csv.DictReader(f)
  43. for row in reader:
  44. if row['# Name']=="app0":
  45. core_addr = row[' Offset']
  46. elif row['# Name']=="script":
  47. script_addr = row[' Offset']
  48. script_size = row[' Size']
  49. elif row['# Name']=="spiffs":
  50. fs_addr = row[' Offset']
  51. try :
  52. script_size = str(script_size).strip()
  53. if script_size.endswith("k"):
  54. script_size = int(script_size[:-2])
  55. else :
  56. script_size = int(script_size, 16) / 1024
  57. except:
  58. script_size = 128
  59. import traceback
  60. traceback.print_exc()
  61. print("rom size " + str(script_size) + "k")
  62. print("rom addr " + str(script_addr))
  63. vm_64bit = False
  64. with open(os.path.join(out_path,"include","luat_conf_bsp.h"), "r", encoding="UTF-8") as f :
  65. for line in f.readlines(): #依次读取每行
  66. version_data = re.findall(r'#define LUAT_BSP_VERSION "(.+?)"', line)#[0]
  67. if version_data:
  68. bsp_version = version_data[0]
  69. if line == "#define LUAT_CONF_VM_64bit\r" or line == "#define LUAT_CONF_VM_64bit\n":
  70. vm_64bit = True
  71. out_file_name="LuatOS-SoC_{}_{}".format(bsp_version, bsp)
  72. out_file = os.path.join(out_path,out_file_name)
  73. temp = os.path.join(pack_path,"temp")
  74. if os.path.exists(temp):
  75. shutil.rmtree(temp)
  76. os.mkdir(temp)
  77. shutil.copy(bootloader_bin, temp)
  78. shutil.copy(partition_table_bin, temp)
  79. shutil.copy(luatos_bin, temp)
  80. shutil.copy(luat_conf_bsp, temp)
  81. shutil.copy(info_json, temp)
  82. shutil.copy(soc_download_exe, temp)
  83. info_json_temp = os.path.join(temp,"info.json")
  84. with open(info_json_temp, "r") as f :
  85. info_json_data = json.load(f)
  86. with open(info_json_temp, "w") as f :
  87. print("script_size", script_size)
  88. info_json_data["rom"]["fs"]["script"]["size"] = script_size
  89. info_json_data["download"]["core_addr"] = core_addr.replace("0x", "00").strip()
  90. info_json_data["download"]["script_addr"] = script_addr.replace("0x", "00").strip()
  91. info_json_data["download"]["fs_addr"] = fs_addr.replace("0x", "00").strip()
  92. if bsp == "ESP32C3":
  93. info_json_data["download"]["extra_param"] = "00ff0200"
  94. elif bsp == "ESP32S3":
  95. info_json_data["download"]["extra_param"] = "01ff0200"
  96. elif bsp == "ESP32":
  97. info_json_data["download"]["extra_param"] = "02ff0200"
  98. elif bsp == "ESP32C2":
  99. info_json_data["download"]["extra_param"] = "03ff0200"
  100. if vm_64bit:
  101. info_json_data["script"]["bitw"] = 64
  102. json.dump(info_json_data, f)
  103. print(json.dumps(info_json_data))
  104. if os.path.exists(out_file+'.soc'):
  105. os.remove(out_file+'.soc')
  106. if os.path.exists(out_file+'_USB.soc'):
  107. os.remove(out_file+'_USB.soc')
  108. # 首先, 生成不带USB后缀的soc文件
  109. zip_dir(temp, out_file+'.soc')
  110. if bsp == "ESP32C3":
  111. # 然后生成USB版本的soc文件
  112. with open(info_json_temp, "w") as f :
  113. info_json_data["download"]["force_br"] = "0"
  114. json.dump(info_json_data, f)
  115. zip_dir(temp, out_file+'_USB.soc')
  116. shutil.rmtree(temp)
  117. print(__file__,'done')