From c22c12c82c633260dabe9be685cd94cf94e445e9 Mon Sep 17 00:00:00 2001 From: Sergey Shchelkanov Date: Tue, 10 Sep 2024 18:36:24 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A1=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20?= =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++++++++++++++++ _version.py | 1 + mik32_upload.py | 3 +++ mik32_upload.spec | 57 ++++++++++++++++++++++++++++++++++++++---- mik32_upload_build.bat | 1 - 5 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 _version.py delete mode 100644 mik32_upload_build.bat diff --git a/README.md b/README.md index c6bd245..84d164a 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,25 @@ optional arguments: Программа принимает образы программы в формате hex и записывает данные в память МК через контроллер SPIFI, путем записи команд и настроек в регистры блока. Тип памяти и способ записи выбирается по адресу байт в hex файле, поэтому требуется правильное расположение секций, заданное в ld скрипте. Скрипт работает через OpenOCD, подключаясь через tcl сервер к уже запущенному openocd, подключенному к МК. Скрипт может запустить openocd самостоятельно. + +## Сборка в исполняемый файл + +Для сборки в исполняемый файл и подготовки релиза используется модуль PyInstaller. +Для его установки выполните команду: + +``` +pip install -U pyinstaller +``` + +Затем соберите программу с использованием файла с настройками mik32_upload.spec: + +``` +pyinstaller mik32_upload.spec +``` + +В папке `./dist` будет создана папка `mik32_upload`, содержащая исполняемый файл `mik32_upload` +и папка со служебными файлами `_internal`, а также архив с названием `mik32-uploader-{версия}.zip` +или `mik32-uploader-{версия}.tar.gz`. + +Для указания версии программы следует изменить значение переменной `applicaton_version` в файле +`_version.py`. При редактировании файла следует сохранять форматирование! diff --git a/_version.py b/_version.py new file mode 100644 index 0000000..5c0ccce --- /dev/null +++ b/_version.py @@ -0,0 +1 @@ +applicaton_version = 'v0.2.1' diff --git a/mik32_upload.py b/mik32_upload.py index ca05bff..bac6c02 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -9,6 +9,7 @@ from typing import List, Dict, NamedTuple, Union from hex_parser import FirmwareFile, MemorySection, MemoryType, Segment from tclrpc import OpenOcdTclRpc, TclException from mik32_gpio import MIK32_Version, gpio_init, gpio_deinit +from _version import applicaton_version import mik32_eeprom import mik32_spifi import mik32_ram @@ -17,6 +18,7 @@ from parsers import * import logging import sys +program_name = f'mik32-uploader-{applicaton_version}' # class bcolors(Enum): # OK = '\033[92m' @@ -426,6 +428,7 @@ if __name__ == '__main__': namespace = parser.parse_args() print("mik32-uploader v0.2.0") + print(program_name) if namespace.filepath: upload_file( diff --git a/mik32_upload.spec b/mik32_upload.spec index f88166e..f1c9136 100644 --- a/mik32_upload.spec +++ b/mik32_upload.spec @@ -1,5 +1,16 @@ # -*- mode: python ; coding: utf-8 -*- +import os +import shutil +import zipfile +import tarfile + +program_name = 'mik32_upload' + +with open('_version.py', 'r') as f: + applicaton_version_line = f.read().strip() + applicaton_version_line = applicaton_version_line[len( + 'applicaton_version = '):].strip('\'') a = Analysis( ['mik32_upload.py'], @@ -12,22 +23,20 @@ a = Analysis( runtime_hooks=[], excludes=[], noarchive=False, + optimize=0, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, - a.binaries, - a.datas, [], - name='mik32_upload', + exclude_binaries=True, + name=program_name, debug=False, bootloader_ignore_signals=False, strip=False, upx=True, - upx_exclude=[], - runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, @@ -35,3 +44,41 @@ exe = EXE( codesign_identity=None, entitlements_file=None, ) + +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='mik32_upload', +) + + +def zip_directory(directory_path, zip_path): + with zipfile.ZipFile(zip_path, 'w') as zipf: + for root, dirs, files in os.walk(directory_path): + for file in files: + zipf.write(os.path.join(root, file), + os.path.relpath(os.path.join(root, file), + os.path.join(directory_path, '..'))) + + +def tar_gz_directory(directory_path, tar_gz_path): + with tarfile.open(tar_gz_path, "w:gz") as tar: + for root, dirs, files in os.walk(directory_path): + for file in files: + tar.add(os.path.join(root, file), + os.path.relpath(os.path.join(root, file), + os.path.join(directory_path, '..'))) + + +shutil.copytree('./openocd-scripts/', + f'./dist/{program_name}/openocd-scripts/') +if os.name == 'nt': + zip_directory(f'./dist/{program_name}/', + f'./dist/mik32-uploader-{applicaton_version_line}.zip') +else: + tar_gz_directory(f'./dist/{program_name}/', + f'./dist/mik32-uploader-{applicaton_version_line}.tar.gz') diff --git a/mik32_upload_build.bat b/mik32_upload_build.bat deleted file mode 100644 index b1f9159..0000000 --- a/mik32_upload_build.bat +++ /dev/null @@ -1 +0,0 @@ -pyinstaller mik32_upload.spec \ No newline at end of file From 6282d3ef8e0613b3cc0d6acb401180d5f1fa4a8a Mon Sep 17 00:00:00 2001 From: Sergey Shchelkanov Date: Tue, 10 Sep 2024 18:50:54 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D1=82=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=BE=D0=B2=20=D0=B8=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B0=20openocd=20=D0=BF=D0=BE=20=D1=83?= =?UTF-8?q?=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 11 +++++++++++ mik32_check.py | 4 ++-- mik32_upload.py | 19 ++++++++++--------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c607180..7268b9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,17 @@ ### Изменено ### Исправлено + +## [0.2.1] - 2024-09-10 + +В версии 0.2.1 исправлены пути конфигурационных файлов по умолчанию, файлов лога OpenOCD и добавлен скрипт сборки +исполняемого файла + +### Добавлено +- Добавлен скрипт сборки исполняемого файла + +### Исправлено +- Исправлены пути конфигурационных файлов по умолчанию, файлов лога OpenOCD ## [0.2.0] - 2024-08-13 diff --git a/mik32_check.py b/mik32_check.py index 5096b1d..0380941 100644 --- a/mik32_check.py +++ b/mik32_check.py @@ -7,7 +7,7 @@ import time from typing import List, Union from mik32_pm import pm_init -from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32v0_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size +from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size from mik32_gpio import MIK32_Version, gpio_init, gpio_deinit import mik32_eeprom import mik32_spifi @@ -47,7 +47,7 @@ def upload_file( print(f"ERROR: File {filename} does not exist") exit(1) - file = FirmwareFile(filename, mik32v0_sections) + file = FirmwareFile(filename, mik32_sections) segments: List[Segment] = file.get_segments() pages: Pages = form_pages(segments, boot_mode) diff --git a/mik32_upload.py b/mik32_upload.py index bac6c02..bd6d21e 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -35,10 +35,13 @@ else: default_openocd_host = '127.0.0.1' openocd_exec_path = os.path.join("openocd", "bin", openocd_exec) -openocd_scripts_path = os.path.join("openocd", "share", "openocd", "scripts") -openocd_interface_path = os.path.join("interface", "ftdi", "m-link.cfg") +openocd_scripts_path = os.path.join("openocd-scripts") +openocd_interface_path = os.path.join("interface", "ftdi", "mikron-link.cfg") openocd_target_path = os.path.join("target", "mik32.cfg") -default_log_path = "nul" +if os.name == 'nt': + default_log_path = "nul" +else: + default_log_path = "/dev/null" default_post_action = "reset run" adapter_default_speed = 500 @@ -83,7 +86,7 @@ class BootMode(Enum): return MemoryType.UNKNOWN -mik32v0_sections: List[MemorySection] = [ +mik32_sections: List[MemorySection] = [ MemorySection(MemoryType.BOOT, 0x0, 16 * 1024), MemorySection(MemoryType.EEPROM, 0x01000000, 8 * 1024), MemorySection(MemoryType.RAM, 0x02000000, 16 * 1024), @@ -217,7 +220,7 @@ def upload_file( print(f"ERROR: File {filename} does not exist") exit(1) - file = FirmwareFile(filename, mik32v0_sections) + file = FirmwareFile(filename, mik32_sections) segments: List[Segment] = file.get_segments() pages: Pages = form_pages(segments, boot_mode) @@ -298,8 +301,9 @@ def upload_file( def createParser(): parser = argparse.ArgumentParser( prog='mik32_upload.py', + usage='python mik32_upload.py firmware_name.hex', description='''Скрипт предназначен для записи программы в ОЗУ, EEPROM и внешнюю flash память, - подключенную по интерфейсу SPIFI''' + подключенную по интерфейсу SPIFI. Поддерживаемые форматы прошивок: *.hex, *.bin''' ) parser.add_argument( 'filepath', @@ -372,7 +376,6 @@ def createParser(): help='Открывать OpenOCD в отдельной консоли' ) parser.add_argument( - '-b', '--boot-mode', dest='boot_mode', type=BootMode, @@ -409,7 +412,6 @@ def createParser(): help='Вывод без последовательностей управления терминалом. Временно не используется' ) parser.add_argument( - '-t', '--mcu-type', dest='mcu_type', type=MIK32_Version, @@ -427,7 +429,6 @@ if __name__ == '__main__': parser = createParser() namespace = parser.parse_args() - print("mik32-uploader v0.2.0") print(program_name) if namespace.filepath: