Initial commit
This commit is contained in:
147
sys/M1_CAN_FW.ld
Normal file
147
sys/M1_CAN_FW.ld
Normal file
@@ -0,0 +1,147 @@
|
||||
/*************************************************
|
||||
* linker script for STM32F10xCL
|
||||
************************************************/
|
||||
|
||||
ENTRY (CanFuctTable)
|
||||
|
||||
|
||||
MEMORY
|
||||
{
|
||||
/* оперативку не используем! */
|
||||
/* RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0 */
|
||||
|
||||
/* используем флеш 112K .. 128K */
|
||||
FLASH (rx) : ORIGIN = (0x08000000 + 112K), LENGTH = 16K
|
||||
}
|
||||
|
||||
/* higher address of the user mode stack */
|
||||
PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) );
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
.entrance_vector :
|
||||
{
|
||||
_stext = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.entrance_vector))
|
||||
. = ALIGN(4);
|
||||
} > FLASH =0xFFFFFFFF
|
||||
|
||||
.text :
|
||||
{
|
||||
__ctors_start__ = .;
|
||||
KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */
|
||||
__ctors_end__ = .;
|
||||
|
||||
__dtors_start__ = .;
|
||||
__dtors_end__ = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
*(.text) /* remaining code */
|
||||
*(.text.*)
|
||||
*(.rodata) /* read-only data (constants) */
|
||||
*(.rodata*)
|
||||
|
||||
*(.eh_frame_hdr)
|
||||
*(.eh_frame)
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
*(.gcc_except_table)
|
||||
*(.eh_frame_hdr)
|
||||
*(.eh_frame)
|
||||
|
||||
*(.glue_7)
|
||||
*(.glue_7t)
|
||||
. = ALIGN(4);
|
||||
} > FLASH =0xFFFFFFFF
|
||||
|
||||
/* .ARM.exidx is sorted, so has to go in its own output section. */
|
||||
__exidx_start = .;
|
||||
.ARM.exidx :
|
||||
{
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
} > FLASH =0xFFFFFFFF
|
||||
__exidx_end = .;
|
||||
|
||||
.text.align :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
_etext = .;
|
||||
_sidata = _etext; /* start of initialized data label */
|
||||
} > FLASH =0xFFFFFFFF
|
||||
|
||||
/* конец данных во флеш - кладём сюда таблицу с настройками и контрольную сумму */
|
||||
.text.SettingsCanName :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.SettingsCanName))
|
||||
} > FLASH
|
||||
.text.SettingsVarName :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.SettingsVarName))
|
||||
} > FLASH
|
||||
.text.SettingsTable :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.SettingsTable))
|
||||
} > FLASH
|
||||
.text.CheckSum :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.CheckSum))
|
||||
} > FLASH
|
||||
|
||||
|
||||
/**************************************************************
|
||||
* Remove the debugging information from the standard libraries
|
||||
***************************************************************/
|
||||
|
||||
/* remove the debugging information from the standard libraries */
|
||||
DISCARD :
|
||||
{
|
||||
libc.a ( * )
|
||||
libm.a ( * )
|
||||
libgcc.a ( * )
|
||||
}
|
||||
|
||||
/* Stabs debugging sections. */
|
||||
.stab 0 : { *(.stab) }
|
||||
.stabstr 0 : { *(.stabstr) }
|
||||
.stab.excl 0 : { *(.stab.excl) }
|
||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||
.stab.index 0 : { *(.stab.index) }
|
||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||
.comment 0 : { *(.comment) }
|
||||
/*
|
||||
* DWARF debug sections.
|
||||
* Symbols in the DWARF debugging sections are relative to the beginning
|
||||
* of the section so we begin them at 0.
|
||||
*/
|
||||
|
||||
/* DWARF 1 */
|
||||
.debug 0 : { *(.debug) }
|
||||
.line 0 : { *(.line) }
|
||||
/* GNU DWARF 1 extensions */
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
/* DWARF 1.1 and DWARF 2 */
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
/* DWARF 2 */
|
||||
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame) }
|
||||
.debug_str 0 : { *(.debug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames) }
|
||||
|
||||
|
||||
}
|
||||
147
sys/M3_CAN_FW.ld
Normal file
147
sys/M3_CAN_FW.ld
Normal file
@@ -0,0 +1,147 @@
|
||||
/*************************************************
|
||||
* linker script for STM32F4xx
|
||||
************************************************/
|
||||
|
||||
ENTRY (CanFuctTable)
|
||||
|
||||
|
||||
MEMORY
|
||||
{
|
||||
/* оперативку не используем! */
|
||||
/* RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0 */
|
||||
|
||||
/* используем флеш 48K .. 64K */
|
||||
FLASH (rx) : ORIGIN = (0x08000000 + 48K), LENGTH = 16K
|
||||
}
|
||||
|
||||
/* higher address of the user mode stack */
|
||||
PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) );
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
.entrance_vector :
|
||||
{
|
||||
_stext = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.entrance_vector))
|
||||
. = ALIGN(4);
|
||||
} > FLASH =0xFFFFFFFF
|
||||
|
||||
.text :
|
||||
{
|
||||
__ctors_start__ = .;
|
||||
KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */
|
||||
__ctors_end__ = .;
|
||||
|
||||
__dtors_start__ = .;
|
||||
__dtors_end__ = .;
|
||||
|
||||
. = ALIGN(4);
|
||||
*(.text) /* remaining code */
|
||||
*(.text.*)
|
||||
*(.rodata) /* read-only data (constants) */
|
||||
*(.rodata*)
|
||||
|
||||
*(.eh_frame_hdr)
|
||||
*(.eh_frame)
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
*(.gcc_except_table)
|
||||
*(.eh_frame_hdr)
|
||||
*(.eh_frame)
|
||||
|
||||
*(.glue_7)
|
||||
*(.glue_7t)
|
||||
. = ALIGN(4);
|
||||
} > FLASH =0xFFFFFFFF
|
||||
|
||||
/* .ARM.exidx is sorted, so has to go in its own output section. */
|
||||
__exidx_start = .;
|
||||
.ARM.exidx :
|
||||
{
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
} > FLASH =0xFFFFFFFF
|
||||
__exidx_end = .;
|
||||
|
||||
.text.align :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
_etext = .;
|
||||
_sidata = _etext; /* start of initialized data label */
|
||||
} > FLASH =0xFFFFFFFF
|
||||
|
||||
/* конец данных во флеш - кладём сюда таблицу с настройками и контрольную сумму */
|
||||
.text.SettingsCanName :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.SettingsCanName))
|
||||
} > FLASH
|
||||
.text.SettingsVarName :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.SettingsVarName))
|
||||
} > FLASH
|
||||
.text.SettingsTable :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.SettingsTable))
|
||||
} > FLASH
|
||||
.text.CheckSum :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.CheckSum))
|
||||
} > FLASH
|
||||
|
||||
|
||||
/**************************************************************
|
||||
* Remove the debugging information from the standard libraries
|
||||
***************************************************************/
|
||||
|
||||
/* remove the debugging information from the standard libraries */
|
||||
DISCARD :
|
||||
{
|
||||
libc.a ( * )
|
||||
libm.a ( * )
|
||||
libgcc.a ( * )
|
||||
}
|
||||
|
||||
/* Stabs debugging sections. */
|
||||
.stab 0 : { *(.stab) }
|
||||
.stabstr 0 : { *(.stabstr) }
|
||||
.stab.excl 0 : { *(.stab.excl) }
|
||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||
.stab.index 0 : { *(.stab.index) }
|
||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||
.comment 0 : { *(.comment) }
|
||||
/*
|
||||
* DWARF debug sections.
|
||||
* Symbols in the DWARF debugging sections are relative to the beginning
|
||||
* of the section so we begin them at 0.
|
||||
*/
|
||||
|
||||
/* DWARF 1 */
|
||||
.debug 0 : { *(.debug) }
|
||||
.line 0 : { *(.line) }
|
||||
/* GNU DWARF 1 extensions */
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
/* DWARF 1.1 and DWARF 2 */
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
/* DWARF 2 */
|
||||
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame) }
|
||||
.debug_str 0 : { *(.debug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames) }
|
||||
|
||||
|
||||
}
|
||||
42416
sys/STM32F107.svd
Normal file
42416
sys/STM32F107.svd
Normal file
File diff suppressed because it is too large
Load Diff
56913
sys/STM32F446.svd
Normal file
56913
sys/STM32F446.svd
Normal file
File diff suppressed because it is too large
Load Diff
70
sys/allowed_signers.sh
Executable file
70
sys/allowed_signers.sh
Executable file
@@ -0,0 +1,70 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Скрипт для обновления ключей для проверки подписей коммитов
|
||||
|
||||
if ! git --version > /dev/null 2>&1; then
|
||||
printf "\n\033[0;31mGIT is not found!\033[0m\n"; exit 1;
|
||||
fi
|
||||
|
||||
if ! git status > /dev/null 2>&1; then
|
||||
printf "\n\033[0;31mThis is not a git repo!\033[0m\n"; exit 1;
|
||||
fi
|
||||
|
||||
domain=$(git remote -v | head -n 1 | tr '\t' ' ' | cut -d ' ' -f2)
|
||||
domain=$(echo "$domain" | sed 's/.*@//' | sed 's/:.*//')
|
||||
|
||||
echo "Repo domain: $domain"
|
||||
|
||||
login=$1
|
||||
password=$2
|
||||
|
||||
if [ -z "$login" ]; then
|
||||
printf "Enter login: "
|
||||
read -r login
|
||||
fi
|
||||
|
||||
if [ -z "$password" ]; then
|
||||
stty -echo
|
||||
printf "Enter password: "
|
||||
read -r password
|
||||
stty echo
|
||||
printf "\n"
|
||||
fi
|
||||
|
||||
apitest=$(curl -s -u "$login:$password" "https://$domain/api/v1/user")
|
||||
# echo "apitest: $apitest"
|
||||
|
||||
if echo "$apitest" | grep -- 'user does not exist' >/dev/null 2>&1; then
|
||||
printf "\033[0;31mERROR: User \"%s\" does not exist on %s\033[0m\n" "$login" "$domain"; exit 1;
|
||||
fi
|
||||
|
||||
if echo "$apitest" | grep -- 'password is invalid' >/dev/null 2>&1; then
|
||||
printf "\033[0;31mERROR: Invalid password\033[0m\n"; exit 1;
|
||||
fi
|
||||
|
||||
allowed_signers_file=~/.ssh/allowed_signers
|
||||
|
||||
if [ ! -f "$allowed_signers_file" ]; then
|
||||
echo "Create $allowed_signers_file"
|
||||
touch $allowed_signers_file
|
||||
fi
|
||||
|
||||
users=$(git shortlog -snc --all | tr '\t' ' ' | sed 's/^ *//' | cut -d ' ' -f2)
|
||||
echo "Repo users: $users" | tr "\n" ' '; echo
|
||||
|
||||
echo "" > test.txt
|
||||
for user in $users; do
|
||||
keys=$(curl -s -u "$login:$password" "https://$domain/api/v1/users/$user/keys")
|
||||
keys=$(echo "$keys" | tr , '\n' | grep -E -- '^"key":".*' | sed 's/^"key"://' | tr -d '\n')
|
||||
|
||||
IFS='"'
|
||||
for key in $keys; do
|
||||
if [ "$key" = "" ]; then continue; fi
|
||||
if grep -Fq "$key" "$allowed_signers_file"; then continue; fi
|
||||
echo "New key for $user"
|
||||
printf "%s %s\n" "$user" "$key" >> $allowed_signers_file
|
||||
done
|
||||
unset IFS
|
||||
done
|
||||
|
||||
echo "$allowed_signers_file updated"
|
||||
38
sys/changelog.sh
Executable file
38
sys/changelog.sh
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Скрипт генерирует changelog от последнего релиза.
|
||||
|
||||
CHANGELOG=CHANGELOG.md
|
||||
|
||||
printf "\033[0;32m~~~ %s generation ~~~\033[0m\n" "$CHANGELOG";
|
||||
|
||||
if ! git --version > /dev/null 2>&1; then
|
||||
printf "\n\033[0;31mGIT is not found!\033[0m\n"; exit 1;
|
||||
fi
|
||||
|
||||
if ! git status > /dev/null 2>&1; then
|
||||
printf "\n\033[0;31mThis is not a git repo!\033[0m\n"; exit 1;
|
||||
fi
|
||||
|
||||
# Get all tags that points to the HEAD
|
||||
CURRENT_TAG=$(git tag --points-at HEAD)
|
||||
echo "Current tag: $CURRENT_TAG"
|
||||
|
||||
LAST_TAG=$(git describe --tags --abbrev=0 HEAD^ 2> /dev/null)
|
||||
echo "Last tag: $LAST_TAG"
|
||||
|
||||
if [ -n "$CURRENT_TAG" ]; then
|
||||
printf "<details><summary>changelog:</summary>\n\n" > $CHANGELOG
|
||||
else
|
||||
printf "Current commit does not have a release tag.\n\n" > $CHANGELOG
|
||||
fi
|
||||
|
||||
if [ -n "$LAST_TAG" ]; then
|
||||
git log --pretty="- %h %s" "$LAST_TAG..HEAD" >> $CHANGELOG
|
||||
else
|
||||
git log --pretty="- %h %s" >> $CHANGELOG
|
||||
fi
|
||||
|
||||
if [ -n "$CURRENT_TAG" ]; then
|
||||
printf "</details>" >> $CHANGELOG
|
||||
fi
|
||||
4
sys/export.bat
Normal file
4
sys/export.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
chcp 65001 > nul
|
||||
set "PATH=%USERPROFILE%\.xpack-dev-tools\xpack-windows-build-tools-4.4.1-2\bin;%PATH%"
|
||||
set "PATH=%USERPROFILE%\.xpack-dev-tools\xpack-arm-none-eabi-gcc-12.3.1-1.2\bin;%PATH%"
|
||||
3
sys/export.ps1
Normal file
3
sys/export.ps1
Normal file
@@ -0,0 +1,3 @@
|
||||
chcp 65001 > $null
|
||||
$env:PATH = "$env:UserProfile\.xpack-dev-tools\xpack-windows-build-tools-4.4.1-2\bin;" + $env:PATH
|
||||
$env:PATH = "$env:UserProfile\.xpack-dev-tools\xpack-arm-none-eabi-gcc-12.3.1-1.2\bin;" + $env:PATH
|
||||
17
sys/export.sh
Normal file
17
sys/export.sh
Normal file
@@ -0,0 +1,17 @@
|
||||
# This script should be sourced, not executed.
|
||||
# shellcheck disable=SC2148,SC1091,SC3010
|
||||
|
||||
if echo "$0" | grep -- "bash" >/dev/null; then
|
||||
if [ -f "$HOME/.bash_profile" ]; then . "$HOME/.bash_profile"; fi
|
||||
fi
|
||||
|
||||
if uname | grep -- "MINGW64" >/dev/null 2>&1; then
|
||||
chcp.com 65001 > /dev/null
|
||||
PATH=~/.xpack-dev-tools/xpack-windows-build-tools-4.4.1-2/bin:$PATH
|
||||
fi
|
||||
|
||||
if uname | grep -- "Darwin" >/dev/null 2>&1; then
|
||||
PATH=/opt/homebrew/opt/make/libexec/gnubin:$PATH
|
||||
fi
|
||||
|
||||
PATH=~/.xpack-dev-tools/xpack-arm-none-eabi-gcc-12.3.1-1.2/bin:$PATH
|
||||
4
sys/export.zsh
Normal file
4
sys/export.zsh
Normal file
@@ -0,0 +1,4 @@
|
||||
# This script should be sourced, not executed.
|
||||
|
||||
export PATH=/opt/homebrew/opt/make/libexec/gnubin:$PATH
|
||||
export PATH=~/.xpack-dev-tools/xpack-arm-none-eabi-gcc-12.3.1-1.2/bin:$PATH
|
||||
184
sys/hex2fw.sh
Executable file
184
sys/hex2fw.sh
Executable file
@@ -0,0 +1,184 @@
|
||||
#!/bin/sh
|
||||
# shellcheck disable=SC2034,SC2317
|
||||
# Скрипт преобразования hex в fw.
|
||||
# В качестве параметра принимает путь к файлу hex.
|
||||
|
||||
# https://srecord.sourceforge.net/
|
||||
# https://manpages.ubuntu.com/manpages/xenial/man1/srec_cat.1.html
|
||||
# https://manpages.ubuntu.com/manpages/xenial/man1/srec_examples.1.html
|
||||
|
||||
|
||||
# echo -e "\033[0;32m~~~ Hex to FW ~~~\033[0m";
|
||||
|
||||
PATH=$(pwd)/$(dirname "$0")/srecord:$PATH
|
||||
PATH="C:/Program Files/Git/usr/bin/":$PATH
|
||||
|
||||
#========================== Functions ==========================
|
||||
# ByteString - ascii string with bytes separated by spaces like "00 11 22 33"
|
||||
|
||||
HexStringToByteString() { printf "%s" "$1" | od -An -t x1 | tr -d '\n' | tr 'a-f' 'A-F' | awk '{$1=$1};1' | tr -d '\n'; }
|
||||
|
||||
GetRandomByteString() { openssl rand "$1" | od -An -t x1 | tr -d '\n' | tr 'a-f' 'A-F' | awk '{$1=$1};1' | tr -d '\n'; }
|
||||
|
||||
IntelHexFileToByteString()
|
||||
{
|
||||
T=$(srec_cat "$1" -intel -fill 0xFF -over "$1" -intel -address-length=4 -o - -ascii_hex)
|
||||
res1=0x$(echo "$T" | head -n 1 | cut -f1 -d , | sed "s/.*\$A//") # Output: start addr
|
||||
T=$(echo "$T" | tr -d '\r' | tr '\n' ' ' | tr '\002\003' ',')
|
||||
T=$(echo "$T" | cut -f3 -d , | awk '{$1=$1};1') # (awk '{$1=$1};1' - remove leading, trailing and extra spaces between fields)
|
||||
res2=$(echo "$T" | wc -w) # Output: size in bytes
|
||||
res3=$T # Output: byte string
|
||||
}
|
||||
|
||||
# parmeters: addr fieldsnum string
|
||||
GetFieldsFromByteString() { echo "$3" | cut -d ' ' -f "$1"-$(($1 + $2 - 1)); }
|
||||
|
||||
# parmeters: addr fieldsnum string
|
||||
GetHexFromByteString() { printf 0x; GetFieldsFromByteString "$1" "$2" "$3" | awk '{print $4,$3,$2,$1}' | tr -d ' '; }
|
||||
|
||||
# parmeters: addr fieldsnum string
|
||||
GetStringFromByteString() { GetFieldsFromByteString "$1" "$2" "$3" | xxd -r -p | tr -d '\000'; }
|
||||
|
||||
ByteStringToAsciiHex()
|
||||
{
|
||||
printf "\002 \$A%08X,\n" "$1" # Start and Address
|
||||
echo "$2" | fold -s -w48 | awk '{$1=$1};1' # Data (awk '{$1=$1};1' - remove leading, trailing and extra spaces between fields)
|
||||
printf "\003" # The End
|
||||
}
|
||||
|
||||
CRC32_FromByteString()
|
||||
{
|
||||
# CAN прошивка использует кривой MPEG2 CRC32 по историческим причинам
|
||||
# В будущем надо исправить на нормальный CRC32 от STM32
|
||||
T=$(ByteStringToAsciiHex 0x10000000 "$1")
|
||||
T=$(echo "$T" | srec_cat - -ascii_hex -Bit_Reverse 4 -stm32 0 -Bit_Reverse 4 -xor 0xFF -o -ascii_hex)
|
||||
echo "$T" | tr -d '\002\003' | head -n 2 | tail -n 1 | cut -d ' ' -f1-4
|
||||
}
|
||||
|
||||
HexToByteString() { echo "$1" | sed 's/^0x//' | fold -w2 | tac | tr '\n' ' ' | sed 's/ $//'; }
|
||||
|
||||
#========================== Main code ==========================
|
||||
|
||||
IntelHexFileToByteString "$1"
|
||||
fw_start_addr=$res1
|
||||
# echo "fw_start_addr $fw_start_addr"
|
||||
fw_size=$res2
|
||||
# echo "fw_size $fw_size"
|
||||
fw_data=$res3
|
||||
# echo "fw_data: $fw_data"
|
||||
|
||||
# выкидываем последние 4 байта и дописываем наше CRC
|
||||
fw_data=$(GetFieldsFromByteString 1 $((fw_size - 4)) "$fw_data")
|
||||
crc=$(CRC32_FromByteString "$fw_data")
|
||||
fw_data="$fw_data $crc"
|
||||
# echo "fw_data: $fw_data"
|
||||
|
||||
struct_addr=$(GetHexFromByteString 1 4 "$fw_data")
|
||||
# echo "struct_addr $struct_addr"
|
||||
struct_offset=$(( struct_addr - fw_start_addr ))
|
||||
# echo "struct_offset $struct_offset"
|
||||
|
||||
# // Структура массива информации о CAN-прошивке
|
||||
# struct TCanFwInfo {
|
||||
# TVersion Version; // Версия ПО
|
||||
# uint32_t Build; // Хеш коммита в репозитории git
|
||||
# uint32_t const * pCRC32; // Адрес, где расположена CRC32
|
||||
# uint32_t reserved2;
|
||||
# uint8_t TextInfo[64]; // Текстовая информация
|
||||
# } __attribute__((packed, aligned(4)));
|
||||
|
||||
# // описание прошивки
|
||||
# const TCanFwInfo gCanFwInfo =
|
||||
# {
|
||||
# (CAN_FW_VERSION << 24) | BUILD_DATE, // Version - Версия ПО
|
||||
# GIT_BUILD, // Хеш коммита в репозитории git
|
||||
# &CanChksum, // *pCRC32 - Адрес, где расположена CRC32
|
||||
# 0, // reserved2
|
||||
# M_NAME CAN_FW_DESCRIPTION "_" GIT_VERSION // TextInfo[64] - Текстовая информация
|
||||
# };
|
||||
|
||||
index=$(( struct_offset + 1 ))
|
||||
day=$(GetFieldsFromByteString "$index" 1 "$fw_data")
|
||||
# echo "day: $day"
|
||||
|
||||
index=$(( index + 1 ))
|
||||
mounth=$(GetFieldsFromByteString "$index" 1 "$fw_data")
|
||||
# echo "mounth: $mounth"
|
||||
|
||||
index=$(( index + 1 ))
|
||||
year=$(GetFieldsFromByteString "$index" 1 "$fw_data")
|
||||
# echo "year: $year"
|
||||
|
||||
index=$(( index + 1 ))
|
||||
can_fw_version=$(GetFieldsFromByteString "$index" 1 "$fw_data")
|
||||
# echo "can_fw_version: $can_fw_version"
|
||||
|
||||
index=$(( index + 1 ))
|
||||
git_build=$(GetFieldsFromByteString "$index" 4 "$fw_data")
|
||||
# echo "git_build: $git_build"
|
||||
|
||||
index=$(( index + 4 ))
|
||||
CRC_addr=$(GetHexFromByteString "$index" 4 "$fw_data")
|
||||
# echo "CRC_addr: $CRC_addr"
|
||||
|
||||
index=$(( index + 8 ))
|
||||
text_info=$(GetStringFromByteString "$index" 64 "$fw_data")
|
||||
# echo "text_info: $text_info"
|
||||
|
||||
# Версия git в последнем поле после '_'
|
||||
git_version=$(echo "$text_info" | awk -F '_' '{print $NF}')
|
||||
# echo "git_version: $git_version"
|
||||
|
||||
# struct TFirmwareHdr {
|
||||
# uint32_t ChckSum; // вычисляется по всем нижеследующим полям и данным
|
||||
# uint32_t Type; // тип прошивки
|
||||
# uint32_t Version; // версия/дата
|
||||
# uint32_t Build; // Билд прошивки
|
||||
# uint32_t Len; // длина данных
|
||||
# uint32_t Offset; // смещение прошивки во flash
|
||||
# uint8_t InitVect[8]; // Случайное число, используется при дешифровании
|
||||
# }; // sizeof() = 32
|
||||
|
||||
# struct TFirmwareFileHdr {
|
||||
# uint8_t Sign[8]; // fixed to 'MOBICAR '
|
||||
# uint8_t Desc[64]; // текстовое описание
|
||||
# uint8_t pad1[24]; // дополнение до 96 байт
|
||||
# TFirmwareHdr bin_hdr;
|
||||
# }; // sizeof() = 128
|
||||
|
||||
# hdr1 - заголовок до CRC
|
||||
hdr1="MOBICAR version $can_fw_version$year$mounth$day, $day.$mounth.$year, GIT = $git_version"
|
||||
# echo "hdr1: $hdr1"
|
||||
length=$(( ${#hdr1} ))
|
||||
# echo "length: $length"
|
||||
hdr1=$(HexStringToByteString "$hdr1")
|
||||
|
||||
# Добиваем остаток до TFirmwarehdr (8+64+24=96)
|
||||
for i in $(seq $(( length + 1 )) 96); do
|
||||
hdr1="$hdr1 00"
|
||||
done
|
||||
# printf "hdr1:\n%s\n" "$hdr1"
|
||||
|
||||
# hdr2 - заголовок после CRC
|
||||
hdr2="02 00 00 00" # тип прошивки (CAN)
|
||||
hdr2="$hdr2 $day $mounth $year $can_fw_version" # версия/дата
|
||||
hdr2="$hdr2 $git_build" # Хеш коммита в репозитории git
|
||||
len=$(printf "%08X" "$fw_size") # Len (Длина данных)
|
||||
len=$(HexToByteString "$len")
|
||||
hdr2="$hdr2 $len"
|
||||
offset=$(printf "%08X" "$fw_start_addr") # offset (смещение прошивки во flash)
|
||||
offset=$(HexToByteString "$offset")
|
||||
hdr2="$hdr2 $offset"
|
||||
rand=$(GetRandomByteString 8)
|
||||
# echo "rand: $rand"
|
||||
hdr2="$hdr2 $rand"
|
||||
# printf "hdr2:\n%s\n" "$hdr2"
|
||||
|
||||
crc=$(CRC32_FromByteString "$hdr2 $fw_data")
|
||||
# printf "crc:\n%s\n" "$crc"
|
||||
fw="$hdr1 $crc $hdr2 $fw_data"
|
||||
# printf "fw:\n%s\n" "$fw" | fold -w48
|
||||
|
||||
fw_path="$(dirname "$1")/$text_info.fw"
|
||||
printf "Generate \033[0;32m%s\033[0m\n" "$fw_path"
|
||||
ByteStringToAsciiHex 0 "$fw" | srec_cat - -ascii_hex -o "$fw_path" -binary
|
||||
BIN
sys/info/JLink_drivers_install.png
Normal file
BIN
sys/info/JLink_drivers_install.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.0 KiB |
108
sys/info/install.md
Normal file
108
sys/info/install.md
Normal file
@@ -0,0 +1,108 @@
|
||||
## Подготовка к работе
|
||||
|
||||
Предварительно должен быть установлен и настроен [Git for Windows 64-bit](https://git-scm.com/download/win).
|
||||
|
||||
Также должны быть установлены 64-bit драйверы J-Link в папку `C:/Program Files/SEGGER/JLink/`
|
||||
* Update existing installation
|
||||
* Install for all users
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### Установка Dev Tools
|
||||
Запускаем скрипт [sys/install.sh](../../sys/install.sh)
|
||||
|
||||
Произойдет скачивание и распаковка архивов с build tools и toolchain в папку `С:/xpack-dev-tools`. Никакие переменные среды не меняются, установка полностью независима (портативная) и не затрагивает никакие другие программы.
|
||||
|
||||
После установки Dev Tools необходимо перезапустить VSCode если он был запущен.
|
||||
|
||||
---
|
||||
|
||||
### Установка VSCode
|
||||
|
||||
Скачиваем и устанавливаем [стабильную версию](https://code.visualstudio.com/).
|
||||
- Открываем папку с нашим проектом в VSCode.
|
||||
- Открываем расширения `Ctrl+Shift+X`.
|
||||
- Устанавливаем расширения рекомендованные нашим `workspace`. Они помечены текстом `This extension is recommended by users of the current workspace.`
|
||||
- [C/C++](vscode:extension/ms-vscode.cpptools) и [Cortex-Debug](vscode:extension/marus25.cortex-debug) обязательны к установке, остальные по желанию.
|
||||
|
||||
Дополнительные расширения:
|
||||
- [Git Graph](vscode:extension/mhutchie.git-graph) - рекомендую для работы с git.
|
||||
- [LinkerScript](vscode:extension/ZixuanWang.linkerscript) - Linker Script files syntax.
|
||||
- [GNU Linker Map files](vscode:extension/trond-snekvik.gnu-mapfiles) - Linker Map files syntax.
|
||||
- [Intel HEX format](vscode:extension/keroc.hex-fmt) - Intel Hex files syntax.
|
||||
- [Hex Editor](vscode:extension/ms-vscode.hexeditor) - Hex editor for binary files.
|
||||
- [Arm Assembly](vscode:extension/dan-c-underwood.arm) - ARM Assembly files syntax.
|
||||
- [Material Icon Theme](vscode:extension/pkief.material-icon-theme) - Симпатичные иконки файлов и папок в Explorer слева.
|
||||
- [EditorConfig for VS Code](vscode:extension/EditorConfig.EditorConfig) - Следит за табами/пробелами/отступами/кодировкой для всех файлов проекта.
|
||||
- [Open in External App](vscode:extension/YuTengjing.open-in-external-app) - Позволяет открывать файлы проекта в системных приложениях прямо из VSCode.
|
||||
- [Task Buttons](vscode:extension/spencerwmiles.vscode-task-buttons) - Отображает кнопки для запуска тасков в статусбаре.
|
||||
|
||||
Рекомендации всех расширений находятся в файле [.vscode/extensions.json](../../.vscode/extensions.json).
|
||||
|
||||
---
|
||||
|
||||
### Сборка проекта в консоли
|
||||
Сборка осуществяется с помощью `make`.
|
||||
|
||||
В папке `settings` находятся скрипты экспорта переменных окружения:
|
||||
- [sys/export.sh](../../sys/export.sh) - для bash
|
||||
- [sys/export.bat](../../sys/export.bat) - для cmd
|
||||
- [sys/export.ps1](../../sys/export.ps1) - для powershell
|
||||
|
||||
Чтобы все наши компиляторы/линкеры/утилиты да и сам `make` стали доступными, вначале необходимо запустить соответствующий скрипт экспорта.
|
||||
|
||||
Для bash запускаем через точку `. sys/export.sh`. Для остальных достаточно просто запустить скрипт.
|
||||
|
||||
Далее просто запускаем нужный `make` таргет.
|
||||
|
||||
#### Команды `make`
|
||||
- `make -e MODEL=M2 debug` - сборка дебага M2
|
||||
- `make -e MODEL=M3 debug` - сборка дебага M3
|
||||
- `make -e MODEL=M2 release` - сборка релиза M2
|
||||
- `make -e MODEL=M3 release` - сборка релиза M3
|
||||
|
||||
Релизные сборки отличаются отключеным дефайном `DEBUG` и оптимизацией кода по размеру.
|
||||
|
||||
---
|
||||
|
||||
### Сборка проекта в консоли VSCode
|
||||
Тут проще:
|
||||
- Открываем папку с нашим проектом в VSCode.
|
||||
- Открываем консоль `Ctrl+~`. (запустится терминал по молчанию)
|
||||
- Можете выбрать свой любимый терминал. Я предпочитаю `Git Bash`.
|
||||
- И сразу можем набирать команды `make`.
|
||||
|
||||
В файле [.vscode/settings.json](../../.vscode/settings.json) находятся конфигурации встроенных терминалов которые автоматически подгружают скрипты экспорта при открытии.
|
||||
|
||||
---
|
||||
|
||||
### Сборка проекта с помощью VSCode Tasks.
|
||||
- Открываем папку с нашим проектом в VSCode.
|
||||
- Нажимаем `Ctrl+Shift+B` и выбираем нужный Task.
|
||||
|
||||
Таски находятся в файле [.vscode/tasks.json](../../.vscode/tasks.json). Они автоматически загружают экспорт окружения и запускают нужные команды `make`.
|
||||
|
||||
Если установлено расширение [Task Buttons](vscode:extension/spencerwmiles.vscode-task-buttons), то в строке статуса появятся кнопки для удобного запуска тасков `M2 Release`, `M3 Release`, `M2 Debug`, `M3 Debug`, `Clean`.
|
||||
|
||||
---
|
||||
|
||||
### Отладка VSCode
|
||||
В разделе `Run and Debug` слева выбираем конфигурацию отладки `Debug M2` или `Debug M3` и нажимаем зеленую стрелочку `Start Debugging` или `F5`.
|
||||
|
||||
Проект автоматически соберется (preLaunchTask), прошьется МК и запустится отладка.
|
||||
|
||||
Вывод логов доступен в терминале `SWO:ITM`.
|
||||
|
||||
В дальнейшем если конфигурация ранее уже была выбрана, то для запуска компиляции и отладки достаточно просто нажимать `F5`.
|
||||
|
||||
---
|
||||
|
||||
### PowerShell (если возникает ошибка)
|
||||
В PowerShell по умолчанию отключено выполнение скриптов. Для исправления:
|
||||
- Открываем PowerShell от имени администратора.
|
||||
- Пишем и запускаем: `Set-ExecutionPolicy RemoteSigned`
|
||||
- На вопрос отвечаем: A (Да для всех)
|
||||
|
||||
---
|
||||
103
sys/install.sh
Executable file
103
sys/install.sh
Executable file
@@ -0,0 +1,103 @@
|
||||
#!/bin/sh
|
||||
# shellcheck disable=SC2034
|
||||
|
||||
# This script installs dev tools (build tools & toolchain)
|
||||
|
||||
# https://github.com/xpack-dev-tools/windows-build-tools-xpack/releases
|
||||
# https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases
|
||||
|
||||
|
||||
build_tools_version="4.4.1-2" # For Windows only
|
||||
toolchain_version="12.3.1-1.2" # For all OS
|
||||
|
||||
###############################################################################################
|
||||
|
||||
install_path=~/.xpack-dev-tools # For all OS
|
||||
api_build_tools_url=https://api.github.com/repos/xpack-dev-tools/windows-build-tools-xpack/releases
|
||||
api_toolchain_url=https://api.github.com/repos/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases
|
||||
|
||||
Extract() {
|
||||
archive="$1"
|
||||
|
||||
if echo "$archive" | grep -E -- ".zip$" >/dev/null 2>&1; then
|
||||
unzip -o "$archive"
|
||||
fi
|
||||
|
||||
if echo "$archive" | grep -E -- ".tar.gz$" >/dev/null 2>&1; then
|
||||
tar xvf "$archive"
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage: Install [api_url] [version] [file_ending]
|
||||
Install() {
|
||||
api_url="$1"
|
||||
version="$2"
|
||||
file_ending="$3"
|
||||
|
||||
install_folder="xpack-"$(echo "$api_url" | cut -d '/' -f6 | sed "s/xpack/$version/")
|
||||
# echo "Install folder: $install_folder"
|
||||
|
||||
if [ -d "$install_path/$install_folder" ]; then
|
||||
echo "Use: $install_folder"
|
||||
return
|
||||
fi
|
||||
|
||||
url=$(curl --ssl-no-revoke -s -L "$api_url" | grep -- "browser_download_url" | grep -- "$version" | grep -- "$file_ending\"" | cut -d '"' -f4)
|
||||
# echo "Download URL: $url"
|
||||
archive=$(basename "$url")
|
||||
# echo "Archive: $archive"
|
||||
|
||||
mkdir -p "$install_path"
|
||||
cd "$install_path" || exit 1
|
||||
|
||||
curl --ssl-no-revoke -L -O "$url"
|
||||
Extract "$archive"
|
||||
rm "$archive"
|
||||
}
|
||||
|
||||
# Windows
|
||||
if uname | grep -- "MINGW64" >/dev/null 2>&1; then
|
||||
Install "$api_build_tools_url" "$build_tools_version" "win32-x64.zip"
|
||||
Install "$api_toolchain_url" "$toolchain_version" "win32-x64.zip"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Linux
|
||||
if uname | grep -- "Linux" >/dev/null 2>&1; then
|
||||
if uname -a | grep -- "x86_64" >/dev/null 2>&1; then
|
||||
Install "$api_toolchain_url" "$toolchain_version" "linux-x64.tar.gz"
|
||||
elif uname -a | grep -- "aarch64" >/dev/null 2>&1; then
|
||||
Install "$api_toolchain_url" "$toolchain_version" "linux-arm64.tar.gz"
|
||||
elif uname -a | grep -- "arm" >/dev/null 2>&1; then
|
||||
Install "$api_toolchain_url" "$toolchain_version" "linux-arm.tar.gz"
|
||||
else
|
||||
echo "Unknown Linux architecture"; exit 1
|
||||
fi
|
||||
if ( ! xxd --version > /dev/null 2>&1 ) || ( ! srec_cat --version > /dev/null 2>&1 ); then
|
||||
sudo apt update
|
||||
fi
|
||||
if ! xxd --version > /dev/null 2>&1; then
|
||||
sudo apt install -y xxd
|
||||
else
|
||||
echo "Use: xxd"
|
||||
fi
|
||||
if ! srec_cat --version > /dev/null 2>&1; then
|
||||
sudo apt install -y srecord
|
||||
else
|
||||
echo "Use: srecord"
|
||||
fi
|
||||
exit
|
||||
fi
|
||||
|
||||
# MAC
|
||||
if uname | grep -- "Darwin" >/dev/null 2>&1; then
|
||||
if uname -a | grep -- "arm64" >/dev/null 2>&1; then
|
||||
Install "$api_toolchain_url" "$toolchain_version" "darwin-arm64.tar.gz"
|
||||
elif uname -a | grep -- "x86_64" >/dev/null 2>&1; then
|
||||
Install "$api_toolchain_url" "$toolchain_version" "darwin-x64.tar.gz"
|
||||
else
|
||||
echo "Unknown Darwin architecture"; exit 1
|
||||
fi
|
||||
brew install make srecord coreutils
|
||||
exit
|
||||
fi
|
||||
BIN
sys/srecord/libgcrypt-20.dll
Normal file
BIN
sys/srecord/libgcrypt-20.dll
Normal file
Binary file not shown.
BIN
sys/srecord/libgpg-error-0.dll
Normal file
BIN
sys/srecord/libgpg-error-0.dll
Normal file
Binary file not shown.
BIN
sys/srecord/srec_cat.exe
Normal file
BIN
sys/srecord/srec_cat.exe
Normal file
Binary file not shown.
53
sys/version.sh
Executable file
53
sys/version.sh
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Скрипт генерирует версию сборки в файл version.h
|
||||
|
||||
OUTFILE=libs/Version.h
|
||||
|
||||
# rm $OUTFILE > /dev/null 2>&1
|
||||
|
||||
# echo -e "\033[0;32m~~~ Version generation ~~~\033[0m";
|
||||
printf "version: "
|
||||
|
||||
if ! git --version > /dev/null 2>&1; then
|
||||
printf "\n\033[0;31mGIT is not found!\033[0m\n"; exit 1;
|
||||
fi
|
||||
|
||||
if ! git status > /dev/null 2>&1; then
|
||||
printf "\n\033[0;31mThis is not a git repo!\033[0m\n"; exit 1;
|
||||
fi
|
||||
|
||||
version=$(git describe --tags --always --dirty --abbrev=8 || echo unknown);
|
||||
# Remove tag prefix from version
|
||||
# Версия git в последнем поле после '_'
|
||||
if echo "$version" | grep -q "_"; then
|
||||
printf "%s => " "$version"
|
||||
version=$(echo "$version" | awk -F '_' '{print $NF}')
|
||||
fi
|
||||
version=$(echo "$version" | sed "s/-g/-/") # Remove 'g' from git hash
|
||||
echo "$version"
|
||||
|
||||
git_build="0x$(git rev-parse --short=8 HEAD | tr 'a-f' 'A-F')"
|
||||
date="$(date +0x00%y%m%d)"
|
||||
|
||||
# Пишем в файл.
|
||||
cat << --- > $OUTFILE
|
||||
#ifndef __VERSION_H_
|
||||
#define __VERSION_H_
|
||||
|
||||
// Данный файл обновляется автоматически из скрипта version.sh
|
||||
|
||||
// Хеш коммита в репозитории GIT.
|
||||
#define GIT_BUILD $git_build
|
||||
|
||||
// Дата компиляции, YYMMDD, всё в bcd.
|
||||
#define BUILD_DATE $date
|
||||
|
||||
// Версия CAN-прошивки.
|
||||
#define CAN_FW_VERSION 1
|
||||
|
||||
// Версия из GIT.
|
||||
#define GIT_VERSION "$version"
|
||||
|
||||
#endif /* __VERSION_H_ */
|
||||
---
|
||||
3
sys/zdotdir/.gitignore
vendored
Normal file
3
sys/zdotdir/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
*
|
||||
!.gitignore
|
||||
!.zshrc
|
||||
6
sys/zdotdir/.zshrc
Normal file
6
sys/zdotdir/.zshrc
Normal file
@@ -0,0 +1,6 @@
|
||||
# This script should be sourced, not executed.
|
||||
|
||||
unset ZDOTDIR
|
||||
|
||||
. ~/.zshrc
|
||||
. sys/export.zsh
|
||||
Reference in New Issue
Block a user