Merge branch 'refactoring-v0.3' into upload-driver-v0.3

This commit is contained in:
Sergey Shchelkanov 2024-09-11 11:36:34 +03:00
commit a68b2eedb7
7 changed files with 103 additions and 20 deletions

View File

@ -19,6 +19,17 @@
### Изменено ### Изменено
### Исправлено ### Исправлено
## [0.2.1] - 2024-09-10
В версии 0.2.1 исправлены пути конфигурационных файлов по умолчанию, файлов лога OpenOCD и добавлен скрипт сборки
исполняемого файла
### Добавлено
- Добавлен скрипт сборки исполняемого файла
### Исправлено
- Исправлены пути конфигурационных файлов по умолчанию, файлов лога OpenOCD
## [0.2.0] - 2024-08-13 ## [0.2.0] - 2024-08-13

View File

@ -75,3 +75,25 @@ optional arguments:
Программа принимает образы программы в формате hex и записывает данные в память МК через контроллер SPIFI, путем записи команд и настроек в регистры блока. Тип памяти и способ записи выбирается по адресу байт в hex файле, поэтому требуется правильное расположение секций, заданное в ld скрипте. Программа принимает образы программы в формате hex и записывает данные в память МК через контроллер SPIFI, путем записи команд и настроек в регистры блока. Тип памяти и способ записи выбирается по адресу байт в hex файле, поэтому требуется правильное расположение секций, заданное в ld скрипте.
Скрипт работает через OpenOCD, подключаясь через tcl сервер к уже запущенному openocd, подключенному к МК. Скрипт может запустить openocd самостоятельно. Скрипт работает через 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`. При редактировании файла следует сохранять форматирование!

1
_version.py Normal file
View File

@ -0,0 +1 @@
applicaton_version = 'v0.2.1'

View File

@ -7,7 +7,7 @@ import time
from typing import List, Union from typing import List, Union
from mik32_debug_hal.power_manager import pm_init from mik32_debug_hal.power_manager 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_debug_hal.gpio import MIK32_Version, gpio_init, gpio_deinit from mik32_debug_hal.gpio import MIK32_Version, gpio_init, gpio_deinit
import mik32_debug_hal.eeprom as eeprom import mik32_debug_hal.eeprom as eeprom
import mik32_debug_hal.spifi as spifi import mik32_debug_hal.spifi as spifi
@ -29,7 +29,7 @@ def upload_file(
adapter_speed=adapter_default_speed, adapter_speed=adapter_default_speed,
is_open_console=False, is_open_console=False,
boot_mode=BootMode.UNDEFINED, boot_mode=BootMode.UNDEFINED,
log_path=DEFAULT_WORKPATH, log_path=default_log_path,
post_action=default_post_action, post_action=default_post_action,
mik_version=MIK32_Version.MIK32V2 mik_version=MIK32_Version.MIK32V2
) -> int: ) -> int:
@ -47,7 +47,7 @@ def upload_file(
print(f"ERROR: File {filename} does not exist") print(f"ERROR: File {filename} does not exist")
exit(1) exit(1)
file = FirmwareFile(filename, mik32v0_sections) file = FirmwareFile(filename, mik32_sections)
segments: List[Segment] = file.get_segments() segments: List[Segment] = file.get_segments()
pages: Pages = form_pages(segments, boot_mode) pages: Pages = form_pages(segments, boot_mode)

View File

@ -13,10 +13,12 @@ import mik32_debug_hal.eeprom as eeprom
import mik32_debug_hal.spifi as spifi import mik32_debug_hal.spifi as spifi
import mik32_debug_hal.ram as ram import mik32_debug_hal.ram as ram
import mik32_debug_hal.power_manager as power_manager import mik32_debug_hal.power_manager as power_manager
from _version import applicaton_version
from parsers import * from parsers import *
import logging import logging
import sys import sys
program_name = f'mik32-uploader-{applicaton_version}'
# class bcolors(Enum): # class bcolors(Enum):
# OK = '\033[92m' # OK = '\033[92m'
@ -26,19 +28,21 @@ import sys
# BOLD = '\033[1m' # BOLD = '\033[1m'
# UNDERLINE = '\033[4m' # UNDERLINE = '\033[4m'
openocd_exec = "openocd"
if os.name == 'nt': if os.name == 'nt':
openocd_exec = "openocd.exe" openocd_exec = "openocd.exe"
else:
openocd_exec = "openocd"
default_openocd_host = '127.0.0.1' default_openocd_host = '127.0.0.1'
openocd_exec_path = os.path.join("openocd", "bin", openocd_exec) openocd_exec_path = os.path.join("openocd", "bin", openocd_exec)
openocd_scripts_path = os.path.join("openocd", "share", "openocd", "scripts") openocd_scripts_path = os.path.join("openocd-scripts")
openocd_interface_path = os.path.join("interface", "ftdi", "m-link.cfg") openocd_interface_path = os.path.join("interface", "ftdi", "mikron-link.cfg")
openocd_target_path = os.path.join("target", "mik32.cfg") openocd_target_path = os.path.join("target", "mik32.cfg")
default_log_path = "nul"
default_post_action = "reset run" default_post_action = "reset run"
default_log_path = "/dev/null"
if os.name == 'nt':
default_log_path = "nul"
adapter_default_speed = 500 adapter_default_speed = 500
@ -81,7 +85,7 @@ class BootMode(Enum):
return MemoryType.UNKNOWN return MemoryType.UNKNOWN
mik32v0_sections: List[MemorySection] = [ mik32_sections: List[MemorySection] = [
MemorySection(MemoryType.BOOT, 0x0, 16 * 1024), MemorySection(MemoryType.BOOT, 0x0, 16 * 1024),
MemorySection(MemoryType.EEPROM, 0x01000000, 8 * 1024), MemorySection(MemoryType.EEPROM, 0x01000000, 8 * 1024),
MemorySection(MemoryType.RAM, 0x02000000, 16 * 1024), MemorySection(MemoryType.RAM, 0x02000000, 16 * 1024),
@ -215,7 +219,7 @@ def upload_file(
print(f"ERROR: File {filename} does not exist") print(f"ERROR: File {filename} does not exist")
exit(1) exit(1)
file = FirmwareFile(filename, mik32v0_sections) file = FirmwareFile(filename, mik32_sections)
segments: List[Segment] = file.get_segments() segments: List[Segment] = file.get_segments()
pages: Pages = form_pages(segments, boot_mode) pages: Pages = form_pages(segments, boot_mode)
@ -296,8 +300,9 @@ def upload_file(
def createParser(): def createParser():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
prog='mik32_upload.py', prog='mik32_upload.py',
usage='python mik32_upload.py firmware_name.hex',
description='''Скрипт предназначен для записи программы в ОЗУ, EEPROM и внешнюю flash память, description='''Скрипт предназначен для записи программы в ОЗУ, EEPROM и внешнюю flash память,
подключенную по интерфейсу SPIFI''' подключенную по интерфейсу SPIFI. Поддерживаемые форматы прошивок: *.hex, *.bin'''
) )
parser.add_argument( parser.add_argument(
'filepath', 'filepath',
@ -370,7 +375,6 @@ def createParser():
help='Открывать OpenOCD в отдельной консоли' help='Открывать OpenOCD в отдельной консоли'
) )
parser.add_argument( parser.add_argument(
'-b',
'--boot-mode', '--boot-mode',
dest='boot_mode', dest='boot_mode',
type=BootMode, type=BootMode,
@ -407,7 +411,6 @@ def createParser():
help='Вывод без последовательностей управления терминалом. Временно не используется' help='Вывод без последовательностей управления терминалом. Временно не используется'
) )
parser.add_argument( parser.add_argument(
'-t',
'--mcu-type', '--mcu-type',
dest='mcu_type', dest='mcu_type',
type=MIK32_Version, type=MIK32_Version,
@ -425,7 +428,7 @@ if __name__ == '__main__':
parser = createParser() parser = createParser()
namespace = parser.parse_args() namespace = parser.parse_args()
print("mik32-uploader v0.2.0") print(program_name)
if namespace.filepath: if namespace.filepath:
upload_file( upload_file(

View File

@ -1,5 +1,16 @@
# -*- mode: python ; coding: utf-8 -*- # -*- 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( a = Analysis(
['mik32_upload.py'], ['mik32_upload.py'],
@ -12,22 +23,20 @@ a = Analysis(
runtime_hooks=[], runtime_hooks=[],
excludes=[], excludes=[],
noarchive=False, noarchive=False,
optimize=0,
) )
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
exe = EXE( exe = EXE(
pyz, pyz,
a.scripts, a.scripts,
a.binaries,
a.datas,
[], [],
name='mik32_upload', exclude_binaries=True,
name=program_name,
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=False,
upx=True, upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True, console=True,
disable_windowed_traceback=False, disable_windowed_traceback=False,
argv_emulation=False, argv_emulation=False,
@ -35,3 +44,41 @@ exe = EXE(
codesign_identity=None, codesign_identity=None,
entitlements_file=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')

View File

@ -1 +0,0 @@
pyinstaller mik32_upload.spec