BinsMerge.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import os
  2. import argparse
  3. import shutil
  4. GIT_HASH = "e3e4e86fdf3bb66747436c485453fd07"
  5. GIT_HASH_BIN = bytes.fromhex(GIT_HASH)
  6. INITIAL_DIR = os.path.dirname(os.path.abspath(__file__))
  7. APP_VER_ADDRESS = 0x6D000
  8. GOLDEN_APP_VER_ADDRESS = 0xDE000
  9. GOLDEN_ADDRESS = 0x0071000
  10. def get_git_hash():
  11. # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
  12. print(f"Текущая директория: {os.getcwd()}")
  13. print(f"Исходная директория: {INITIAL_DIR}")
  14. if os.getcwd() != INITIAL_DIR:
  15. os.chdir(INITIAL_DIR)
  16. # Переходим в директорию с git репозиторием
  17. git_dir = find_git_repository()
  18. if git_dir is None:
  19. print("Не удалось найти git репозиторий.")
  20. return None
  21. os.chdir(git_dir)
  22. # Получаем git hash --short
  23. try:
  24. git_hash = os.popen('git rev-parse --short HEAD').read().strip()
  25. except Exception as e:
  26. print(f"Ошибка при получении git hash: {e}")
  27. git_hash = None
  28. # Возвращаемся в исходную директорию
  29. os.chdir(os.path.dirname(INITIAL_DIR))
  30. return git_hash
  31. def get_git_tag():
  32. # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
  33. if os.getcwd() != INITIAL_DIR:
  34. os.chdir(INITIAL_DIR)
  35. # Переходим в директорию с git репозиторием
  36. git_dir = find_git_repository()
  37. if git_dir is None:
  38. print("Не удалось найти git репозиторий.")
  39. return None
  40. os.chdir(git_dir)
  41. # Получаем git tag
  42. try:
  43. git_tag = os.popen('git describe --tags').read().strip()
  44. except Exception as e:
  45. print(f"Ошибка при получении git tag: {e}")
  46. git_tag = None
  47. # Возвращаемся в исходную директорию
  48. os.chdir(os.path.dirname(INITIAL_DIR))
  49. return git_tag
  50. def find_git_repository():
  51. current_dir = INITIAL_DIR
  52. try:
  53. # Выходим выше по дереву каталогов, пока не найдем .git
  54. while True:
  55. if os.path.isdir(os.path.join(current_dir, '.git')):
  56. git_dir = os.path.abspath(os.path.join(current_dir, '.git'))
  57. print(f"Найден git репозиторий: {git_dir}")
  58. return git_dir
  59. parent_dir = os.path.dirname(current_dir)
  60. if parent_dir == current_dir: # Достигли корня файловой системы
  61. print("Не удалось найти git репозиторий.")
  62. return None
  63. current_dir = parent_dir
  64. print(f"Проверяем директорию: {current_dir}")
  65. except Exception as e:
  66. print(f"Ошибка при поиске git репозитория: {e}")
  67. return None
  68. finally:
  69. # Возвращаемся в исходную директорию
  70. os.chdir(INITIAL_DIR)
  71. def find_tag(tag_pattern):
  72. # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
  73. if os.getcwd() != INITIAL_DIR:
  74. os.chdir(INITIAL_DIR)
  75. # Переходим в директорию с git репозиторием
  76. git_dir = find_git_repository()
  77. if git_dir is None:
  78. print("Не удалось найти git репозиторий.")
  79. return None
  80. os.chdir(git_dir)
  81. # Получаем все теги в git репозитории
  82. all_tags = os.popen('git tag').read().strip().split('\n')
  83. if not all_tags:
  84. print("Не найдено ни одного тега в git репозитории.")
  85. return None
  86. # Фильтруем теги по заданному шаблону
  87. matching_tags = [tag for tag in all_tags if tag_pattern in tag]
  88. if not matching_tags:
  89. print(f"Не найдено тегов, соответствующих шаблону: {tag_pattern}")
  90. return None
  91. # Получаем последний тег из списка совпадений
  92. latest_tag = matching_tags[-1]
  93. print(f"Найден тег: {latest_tag}")
  94. # Возвращаемся в исходную директорию
  95. os.chdir(os.path.dirname(INITIAL_DIR))
  96. return latest_tag
  97. def merge_bins ():
  98. # Пути к файлам
  99. os.chdir(INITIAL_DIR)
  100. pwd = os.getcwd()
  101. file_path_working = os.path.join(INITIAL_DIR, "SB_TMSG44V1_WORKING_FPGA.bin")
  102. file_path_golden = os.path.join(INITIAL_DIR, "SB_TMSG44V1_GOLD_FPGA.bin")
  103. file_path_output = os.path.join(INITIAL_DIR, "SB_TMSG44V1_TEST_MERGE_FPGA.bin")
  104. # Размеры файлов
  105. file_size_working = os.path.getsize(file_path_working)
  106. file_size_golden = os.path.getsize(file_path_golden)
  107. # Размер выходного файла - 8 Мбит
  108. file_size_output = 0x1000000
  109. # Записываем первый файл
  110. with open(file_path_output,'wb') as outfile:
  111. with open(file_path_working, 'rb') as f1:
  112. shutil.copyfileobj(f1, outfile)
  113. # Перемещаемся к адресу для второго файла
  114. outfile.seek(GOLDEN_ADDRESS)
  115. with open(file_path_golden, 'rb') as f2:
  116. shutil.copyfileobj(f2, outfile)
  117. # Перемещаемся к адресу для пользовательских данных
  118. outfile.seek(APP_VER_ADDRESS)
  119. current_git_tag=find_tag("_WORKING")
  120. print(f"Текущий git tag: {current_git_tag}")
  121. # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
  122. encoded_git_tag = current_git_tag.encode('utf-8')
  123. if len(encoded_git_tag) < 32:
  124. encoded_git_tag = encoded_git_tag.ljust(32, b'\x00')
  125. # Записываем тег в файл
  126. outfile.write(encoded_git_tag)
  127. # Перемещаемся к адресу для GOLDEN данных
  128. outfile.seek(GOLDEN_APP_VER_ADDRESS)
  129. golden_tag = find_tag("_GOLDEN")
  130. print(f"Текущий golden git tag: {golden_tag}")
  131. # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
  132. encoded_golden_tag = golden_tag.encode('utf-8')
  133. if len(encoded_golden_tag) < 32:
  134. encoded_golden_tag = encoded_golden_tag.ljust(32, b'\x00')
  135. outfile.write(encoded_golden_tag)
  136. final_size = os.path.getsize(file_path_output)
  137. # Проверка итогового размера
  138. if final_size > file_size_output:
  139. os.remove(file_path_output) # Удаляем некорректный файл
  140. raise ValueError(f"Итоговый размер файла ({final_size} байт) превысил максимально допустимый ({file_size_output} байт)")
  141. print(f"Размер файла 1: {file_size_working} байт")
  142. print(f"Размер файла 2: {file_size_golden} байт")
  143. print(f"Итоговый размер: {final_size} байт")
  144. return final_size
  145. def main():
  146. merge_bins()
  147. if __name__ == '__main__':
  148. main()