Sfoglia il codice sorgente

Добавил скрипт для объединения прошивок

Anatoliy Chigirinskiy 6 mesi fa
parent
commit
47f86a822d
3 ha cambiato i file con 306 aggiunte e 1 eliminazioni
  1. 34 0
      .gitignore
  2. 270 0
      MergingScript/BinsMerge.py
  3. 2 1
      src/src/Top/TopCp2444v1.v

+ 34 - 0
.gitignore

@@ -0,0 +1,34 @@
+
+#Ignore thumbnails created by Windows
+Thumbs.db
+#Ignore files built by Visual Studio
+*.obj
+*.exe
+*.pdb
+*.user
+*.aps
+*.pch
+*.vspscc
+*_i.c
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.cache
+*.ilk
+*.log
+[Bb]in
+[Dd]ebug*/
+*.lib
+*.sbr
+obj/
+[Rr]elease*/
+_ReSharper*/
+[Tt]est[Rr]esult*
+.vs/
+.idea/
+#Nuget packages folder
+packages/
+*.bin

+ 270 - 0
MergingScript/BinsMerge.py

@@ -0,0 +1,270 @@
+import os
+import argparse
+import shutil
+
+GIT_HASH = "e3e4e86fdf3bb66747436c485453fd07"
+GIT_HASH_BIN = bytes.fromhex(GIT_HASH)
+INITIAL_DIR = os.path.dirname(os.path.abspath(__file__))
+
+APP_VER_ADDRESS = 0x6D000
+GOLDEN_APP_VER_ADDRESS = 0xDE000
+GOLDEN_ADDRESS = 0x0071000
+GOLDEN_APP_VERSION_SHIFTED = GOLDEN_APP_VER_ADDRESS-GOLDEN_ADDRESS
+
+
+def get_git_hash():
+    # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
+    print(f"Текущая директория: {os.getcwd()}")
+    print(f"Исходная директория: {INITIAL_DIR}")
+    if os.getcwd() != INITIAL_DIR:
+        os.chdir(INITIAL_DIR)
+    # Переходим в директорию с git репозиторием
+    git_dir = find_git_repository()
+    if git_dir is None:
+        print("Не удалось найти git репозиторий.")
+        return None
+    os.chdir(git_dir)
+    # Получаем git hash --short
+    try:
+        git_hash = os.popen('git rev-parse --short HEAD').read().strip()
+    except Exception as e:
+        print(f"Ошибка при получении git hash: {e}")
+        git_hash = None
+    # Возвращаемся в исходную директорию
+    os.chdir(os.path.dirname(INITIAL_DIR))
+    return git_hash
+
+def get_git_tag():
+      # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
+    if os.getcwd() != INITIAL_DIR:
+        os.chdir(INITIAL_DIR)
+    # Переходим в директорию с git репозиторием
+    git_dir = find_git_repository()
+    if git_dir is None:
+        print("Не удалось найти git репозиторий.")
+        return None
+    os.chdir(git_dir)
+    # Получаем git tag
+    try:
+        git_tag = os.popen('git describe --tags').read().strip()
+    except Exception as e:
+        print(f"Ошибка при получении git tag: {e}")
+        git_tag = None
+    # Возвращаемся в исходную директорию
+    os.chdir(os.path.dirname(INITIAL_DIR))
+    return git_tag
+
+def find_git_repository():
+    current_dir = INITIAL_DIR
+    
+    try:
+        # Выходим выше по дереву каталогов, пока не найдем .git
+        while True:
+            if os.path.isdir(os.path.join(current_dir, '.git')):
+                git_dir = os.path.abspath(os.path.join(current_dir, '.git'))
+                print(f"Найден git репозиторий: {git_dir}")
+                return git_dir
+                
+            parent_dir = os.path.dirname(current_dir)
+            if parent_dir == current_dir:  # Достигли корня файловой системы
+                print("Не удалось найти git репозиторий.")
+                return None
+                
+            current_dir = parent_dir
+            print(f"Проверяем директорию: {current_dir}")
+            
+    except Exception as e:
+        print(f"Ошибка при поиске git репозитория: {e}")
+        return None
+    finally:
+        # Возвращаемся в исходную директорию
+        os.chdir(INITIAL_DIR)
+
+def find_tag(tag_pattern):
+    # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
+    if os.getcwd() != INITIAL_DIR:
+        os.chdir(INITIAL_DIR)
+    # Переходим в директорию с git репозиторием
+    git_dir = find_git_repository()
+    if git_dir is None:
+        print("Не удалось найти git репозиторий.")
+        return None
+    os.chdir(git_dir)
+    # Получаем все теги в git репозитории
+    all_tags = os.popen('git tag').read().strip().split('\n')
+    if not all_tags:
+        print("Не найдено ни одного тега в git репозитории.")
+        return None
+    # Фильтруем теги по заданному шаблону
+    matching_tags = [tag for tag in all_tags if tag_pattern in tag]
+    if not matching_tags:
+        print(f"Не найдено тегов, соответствующих шаблону: {tag_pattern}")
+        return None
+    # Получаем последний тег из списка совпадений
+    latest_tag = matching_tags[-1]
+    print(f"Найден тег: {latest_tag}")
+    # Возвращаемся в исходную директорию
+    os.chdir(os.path.dirname(INITIAL_DIR))
+    return latest_tag
+
+def merge_bins ():
+    #  Пути к файлам
+    os.chdir(INITIAL_DIR)
+    pwd = os.getcwd()
+    file_path_working = os.path.join(INITIAL_DIR, "CP2444V1_WORKING_FPGA.bin")
+    file_path_golden = os.path.join(INITIAL_DIR, "CP2444V1_GOLD_FPGA.bin")
+    file_path_output = os.path.join(INITIAL_DIR, "CP2444V1_TEST_MERGE_FPGA.bin")
+    #  Размеры файлов
+    file_size_working   = os.path.getsize(file_path_working)
+    file_size_golden    = os.path.getsize(file_path_golden)
+    #  Размер выходного файла - 8 Мбит
+    file_size_output    = 0x1000000  
+    # Записываем первый файл
+    with open(file_path_output,'wb') as outfile:
+        with open(file_path_working, 'rb') as f1:
+            shutil.copyfileobj(f1, outfile)
+        # Перемещаемся к адресу для второго файла
+        outfile.seek(GOLDEN_ADDRESS)
+        with open(file_path_golden, 'rb') as f2:
+            shutil.copyfileobj(f2, outfile)
+        # Перемещаемся к адресу для пользовательских данных
+        outfile.seek(APP_VER_ADDRESS)
+        current_git_tag=find_tag("_WORKING")
+        print(f"Текущий git tag: {current_git_tag}")
+        # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
+        encoded_git_tag = current_git_tag.encode('utf-8')
+        if len(encoded_git_tag) < 32:
+            encoded_git_tag = encoded_git_tag.ljust(32, b'\x00')
+
+        # Записываем тег в файл
+        outfile.write(encoded_git_tag)
+        # Перемещаемся к адресу для GOLDEN данных
+        outfile.seek(GOLDEN_APP_VER_ADDRESS)
+        golden_tag = find_tag("_GOLDEN")
+        print(f"Текущий golden git tag: {golden_tag}")
+        # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
+        encoded_golden_tag = golden_tag.encode('utf-8')
+        if len(encoded_golden_tag) < 32:
+            encoded_golden_tag = encoded_golden_tag.ljust(32, b'\x00')
+        outfile.write(encoded_golden_tag)
+    final_size = os.path.getsize(file_path_output)
+    # Проверка итогового размера
+    if final_size > file_size_output:
+        os.remove(file_path_output)  # Удаляем некорректный файл
+        raise ValueError(f"Итоговый размер файла ({final_size} байт) превысил максимально допустимый ({file_size_output} байт)")
+    print(f"Размер файла 1: {file_size_working} байт")
+    print(f"Размер файла 2: {file_size_golden} байт")
+    print(f"Итоговый размер: {final_size} байт")
+    return final_size
+
+def merge_working_only():
+    #  Пути к файлам
+    os.chdir(INITIAL_DIR)
+    pwd = os.getcwd()
+    file_path_working = os.path.join(INITIAL_DIR, "CP2444V1_WORKING_FPGA.bin")
+    file_path_output = os.path.join(INITIAL_DIR, "CP2444V1_TEST_WORKING_FPGA.bin")
+    #  Размеры файлов
+    file_size_working   = os.path.getsize(file_path_working)
+    #  Размер выходного файла - 8 Мбит
+    file_size_output    = 0x1000000  
+    # Записываем первый файл
+    with open(file_path_output,'wb') as outfile:
+        with open(file_path_working, 'rb') as f1:
+            shutil.copyfileobj(f1, outfile)
+        # Перемещаемся к адресу для пользовательских данных
+        outfile.seek(APP_VER_ADDRESS)
+        current_git_tag=find_tag("_WORKING")
+        print(f"Текущий git tag: {current_git_tag}")
+        # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
+        encoded_git_tag = current_git_tag.encode('utf-8')
+        if len(encoded_git_tag) < 32:
+            encoded_git_tag = encoded_git_tag.ljust(32, b'\x00')
+
+        # Записываем тег в файл
+        outfile.write(encoded_git_tag)
+    final_size = os.path.getsize(file_path_output)
+    # Проверка итогового размера
+    if final_size > file_size_output:
+        os.remove(file_path_output)  # Удаляем некорректный файл
+        raise ValueError(f"Итоговый размер файла ({final_size} байт) превысил максимально допустимый ({file_size_output} байт)")
+    print(f"Размер файла: {file_size_working} байт")
+    print(f"Итоговый размер: {final_size} байт")
+    return final_size
+
+def merge_golden_only():
+    #  Пути к файлам
+    os.chdir(INITIAL_DIR)
+    pwd = os.getcwd()
+    file_path_golden = os.path.join(INITIAL_DIR, "CP2444V1_GOLD_FPGA.bin")
+    file_path_output = os.path.join(INITIAL_DIR, "CP2444V1_TEST_GOLDEN_FPGA.bin")
+    #  Размеры файлов
+    file_size_golden   = os.path.getsize(file_path_golden)
+    #  Размер выходного файла - 8 Мбит
+    file_size_output    = 0x1000000  
+    # Записываем первый файл
+    with open(file_path_output,'wb') as outfile:
+        with open(file_path_golden, 'rb') as f2:
+            shutil.copyfileobj(f2, outfile)
+        # Перемещаемся к адресу для пользовательских данных
+        outfile.seek(GOLDEN_APP_VERSION_SHIFTED)
+        golden_tag = find_tag("_GOLDEN")
+        print(f"Текущий golden git tag: {golden_tag}")
+        # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
+        encoded_golden_tag = golden_tag.encode('utf-8')
+        if len(encoded_golden_tag) < 32:
+            encoded_golden_tag = encoded_golden_tag.ljust(32, b'\x00')
+        outfile.write(encoded_golden_tag)
+    final_size = os.path.getsize(file_path_output)
+    # Проверка итогового размера
+    if final_size > file_size_output:
+        os.remove(file_path_output)  # Удаляем некорректный файл
+        raise ValueError(f"Итоговый размер файла ({final_size} байт) превысил максимально допустимый ({file_size_output} байт)")
+    print(f"Размер файла: {file_size_golden} байт")
+    print(f"Итоговый размер: {final_size} байт")
+    return final_size
+
+
+def main():
+
+    parser = argparse.ArgumentParser(description='Скрипт для объединения бинарных файлов прошивок')
+    parser.add_argument('--mode', choices=['merge', 'working', 'golden'], 
+                        help='Режим работы: merge - объединить Working и Golden, working - только Working и  Working версию, golden - только Golden и Golden версию',
+                        required=False)
+    
+    args = parser.parse_args()
+    
+    # Если режим не задан через аргумент, запрашиваем у пользователя
+    if args.mode is None:
+        print("Выберите режим работы:")
+        print("1. merge   - объединить Working и Golden прошивки")
+        print("2. working - объединить только Working прошивку с её версией")
+        print("3. golden  - объединить только Golden прошивку с её версией")
+        
+        choice = ""
+        while choice not in ["1", "2", "3", "merge", "working", "golden"]:
+            choice = input("Введите номер (1-3) или название режима: ").strip().lower()
+            if choice == "1":
+                choice = "merge"
+            elif choice == "2":
+                choice = "working"
+            elif choice == "3":
+                choice = "golden"
+        
+        mode = choice
+    else:
+        mode = args.mode
+    
+    if mode == 'merge':
+        print("Объединение Working и Golden прошивок...")
+        merge_bins()
+    elif mode == 'working':
+        print("Объединение только Working прошивки с её версией...")
+        merge_working_only()
+    elif mode == 'golden':
+        print("Объединение только Golden прошивки с её версией...")
+        merge_golden_only()
+
+
+
+if __name__ == '__main__':
+    main()

+ 2 - 1
src/src/Top/TopCp2444v1.v

@@ -133,8 +133,9 @@ assign FpgaCfP3_o       = gpio1CtrlData[10];
 assign FpgaCfP4_o       = gpio1CtrlData[11];
 
 /* Led */
+// assign Led_o            = 1'b0;//Golden-Image
 assign Led_o            = ledReg;
-assign Fpga24v_o        = 1'b0;
+assign Fpga24v_o        = 1'b1;
 
 //***********************************************
 //	                CODING