makesoc.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. sdkconfig_path = os.path.join(pack_path,"..", "sdkconfig")
  23. def zip_dir(dirname,zipfilename):
  24. filelist = []
  25. for root, dirs, files in os.walk(dirname):
  26. for name in files:
  27. filelist.append(os.path.join(root, name))
  28. zf = zipfile.ZipFile(zipfilename, "w", compression=zipfile.ZIP_LZMA)
  29. for tar in filelist:
  30. arcname = tar[len(dirname):]
  31. zf.write(tar,arcname)
  32. zf.close()
  33. if __name__=='__main__':
  34. args = parser.parse_args()
  35. config_json = args.config_json
  36. with open(config_json) as f :
  37. config_json_data = json.load(f)
  38. bsp = config_json_data["IDF_TARGET"].upper()
  39. partition_table_name = config_json_data["PARTITION_TABLE_FILENAME"]
  40. partition_table_csv = os.path.join(out_path,partition_table_name)
  41. script_size = "0x20000"
  42. with open(partition_table_csv) as f :
  43. reader = csv.DictReader(f)
  44. for row in reader:
  45. if row['# Name']=="app0":
  46. core_addr = row[' Offset']
  47. elif row['# Name']=="script":
  48. script_addr = row[' Offset']
  49. script_size = row[' Size']
  50. elif row['# Name']=="spiffs":
  51. fs_addr = row[' Offset']
  52. try :
  53. script_size = str(script_size).strip()
  54. if script_size.endswith("k"):
  55. script_size = int(script_size[:-2])
  56. else :
  57. script_size = int(script_size, 16) / 1024
  58. except:
  59. script_size = 128
  60. import traceback
  61. traceback.print_exc()
  62. print("rom size " + str(script_size) + "k")
  63. print("rom addr " + str(script_addr))
  64. vm_64bit = False
  65. with open(os.path.join(out_path,"include","luat_conf_bsp.h"), "r", encoding="UTF-8") as f :
  66. for line in f.readlines(): #依次读取每行
  67. version_data = re.findall(r'#define LUAT_BSP_VERSION "(.+?)"', line)#[0]
  68. if version_data:
  69. bsp_version = version_data[0]
  70. if line.startswith("#define LUAT_CONF_VM_64bit"):
  71. vm_64bit = True
  72. print("固件是64bit的VM")
  73. out_file_name="LuatOS-SoC_{}_{}".format(bsp_version, bsp)
  74. out_file = os.path.join(out_path,out_file_name)
  75. temp = os.path.join(pack_path,"temp")
  76. if os.path.exists(temp):
  77. shutil.rmtree(temp)
  78. os.mkdir(temp)
  79. shutil.copy(bootloader_bin, temp)
  80. shutil.copy(partition_table_bin, temp)
  81. shutil.copy(luatos_bin, temp)
  82. shutil.copy(luat_conf_bsp, temp)
  83. shutil.copy(info_json, temp)
  84. shutil.copy(soc_download_exe, temp)
  85. shutil.copy(sdkconfig_path, temp)
  86. info_json_temp = os.path.join(temp,"info.json")
  87. with open(info_json_temp, "r") as f :
  88. info_json_data = json.load(f)
  89. with open(info_json_temp, "w") as f :
  90. print("script_size", script_size)
  91. if script_size > 256 and bsp == "ESP32S3": # 大于256k,自动启用romfs
  92. print("=================================================================================")
  93. print("====================== USE ROMFS for script. Pls use LuaTools 2.2.3 + ===========")
  94. print("=================================================================================")
  95. info_json_data["rom"]["fs"]["script"]["type"] = "romfs"
  96. info_json_data["rom"]["fs"]["script"]["size"] = script_size
  97. info_json_data["download"]["core_addr"] = core_addr.replace("0x", "00").strip()
  98. info_json_data["download"]["script_addr"] = script_addr.replace("0x", "00").strip()
  99. info_json_data["download"]["fs_addr"] = fs_addr.replace("0x", "00").strip()
  100. if bsp == "ESP32C3":
  101. info_json_data["download"]["extra_param"] = "00ff0200"
  102. elif bsp == "ESP32S3":
  103. info_json_data["download"]["extra_param"] = "01ff0200"
  104. elif bsp == "ESP32":
  105. info_json_data["download"]["extra_param"] = "02ff0200"
  106. elif bsp == "ESP32C2":
  107. info_json_data["download"]["extra_param"] = "03ff0200"
  108. if vm_64bit:
  109. info_json_data["script"]["bitw"] = 64
  110. json.dump(info_json_data, f)
  111. print(json.dumps(info_json_data))
  112. if os.path.exists(out_file+'.soc'):
  113. os.remove(out_file+'.soc')
  114. if os.path.exists(out_file+'_USB.soc'):
  115. os.remove(out_file+'_USB.soc')
  116. # 首先, 生成不带USB后缀的soc文件
  117. zip_dir(temp, out_file+'.soc')
  118. if bsp == "ESP32C3":
  119. # 然后生成USB版本的soc文件
  120. with open(info_json_temp, "w") as f :
  121. info_json_data["download"]["force_br"] = "0"
  122. json.dump(info_json_data, f)
  123. zip_dir(temp, out_file+'_USB.soc')
  124. shutil.rmtree(temp)
  125. print(__file__,'done')