Knight1/VanMooof-Module
GitHub: Knight1/VanMooof-Module
对 VanMoof S3/X3/S4/X4 电动自行车通信模块进行逆向工程,提供固件提取、BLE 密钥读写、UART 调试控制台访问和固件刷写等完整工具链,帮助用户在公司破产后自主维护和修复车辆。
Stars: 14 | Forks: 0
# VanMooof-Module ES3
目前,这主要涵盖 SX3 和 SX4(如果你碰巧拥有极少数之一)上的 MX25L51245GMI-08G-TR SPI Flash 芯片。
欢迎提交 Pull Request!
该芯片具有 512 兆位(64 兆字节)的 Flash 容量。
[https://github.com/Omegaice/go-xmodem/blob/master/ymodem/ymodem.go](https://github.com/Omegaice/go-xmodem/blob/master/ymodem/ymodem.go)
[https://pkg.go.dev/github.com/sandacn/ymodem/ymodem](https://pkg.go.dev/github.com/sandacn/ymodem/ymodem)
[https://unix.stackexchange.com/questions/273178/file-transfer-using-ymodem-sz](https://unix.stackexchange.com/questions/273178/file-transfer-using-ymodem-sz)
[硬件图片](https://github.com/ciborg971/VanmoofX3RE/tree/master/OG)
[电池图片](https://github.com/dtngx/VMBattery)
如果你需要固件、BMS 工具或常规帮助,请在 Discord 或 Telegram 上联系我
如果你需要关于固件的深入信息(例如:启用越野 aka. :) 模式),我推荐 [chwdt/vanmoof-tools](https://github.com/chwdt/vanmoof-tools)
[固件信息](FIRMWARE.md)
[BLE UUIDs](BLEUUID.md)
[声音分析](SOUND.md)
[使用示例](EXAMPLES.md)
[错误列表](ERRORS.md)
[修复技巧](REPAIRS.md)
### 功能
- ble 密钥(读/写)
- bike comm
- bike Sharing
- Workshop
- bikecomm.vanmoof.com / ublox1.vanmoof.com
- /upload
- /ping-response
- 'guid':'%s','statistics':{'batt':%d,'mac':'%s','swv':'%s','dist':%d}
- /bike-message
- fmna 密钥
- fmna-rework(如果你碰巧有 Apple FMNA API 的访问权限)
- 所有固件
- [STM32F413VGT6 LQFP100](https://www.mouser.de/datasheet/2/389/stm32f413cg-1851205.pdf)
- mucoboot(Bootloader)
- Mainware
- [CC2642R1F](https://www.ti.com/lit/ds/symlink/cc2642r.pdf)
- bleboot(Bootloader)
- bleware
- [STM32L072CZT6 LQFP48](https://www.mouser.de/datasheet/2/389/stm32l072v8-1851235.pdf)
- bmsboot(Bootloader)
- Batteryware
- Shifterware [MM32F031F6U6](https://crossic.com/wp-content/uploads/2021/12/DS_MM32F031xx_EN.pdf)
- Motorware [TMS320F28054F](https://www.ti.com/lit/ds/symlink/tms320f28054f.pdf)
- GSMWare [SARA-G350](https://www.mouser.de/datasheet/3/3699/1/SARA-G3_DataSheet_UBX-13000993.pdf)
- 日志
- Shell (UART) 用于
- 模块
- BLE (bledebug)
- GSM (gsmdebug)
- Tag Connect 端口(至少一个 6 针和一个 10 针)
### Golang 工具的功能
- 读取 SPI Flash 转储文件并显示身份验证密钥
- 将转储文件中的 pack 提取到单独的文件中
- 将 pack 提取为各个固件文件
- 读取日志
- 解密/加密 Pack 文件
- 从 SPI 转储文件中导出、转换为 wav 格式并分析 VM_SOUND“铃声”文件
- 检测失败的 VM_SOUND 上传(损坏的文件通常为 14434 字节)
- 熵分析与 ECB 模式检测
- 通过 y-modem 上传固件/ Pack 文件
- 密钥提取与校验和
- 制造密钥提取与验证
- SPI 转储后自动提取 BLE 身份验证密钥
- 带有 MOOF 签名的 MAC 地址验证
- 用于转储完整性的 SHA512 校验和生成
- 未测试:将新的 ble 身份验证密钥写入 Flash
- 未实现:上传声音文件
有关详细的使用示例,请参见 [EXAMPLES.md](EXAMPLES.md)。
### 那 Cartridge 呢?
VanMoof 内部及 Fixie App 中使用的正确名称是 Module。
### 模块死机了?
你可以通过普通充电端口上的 DC 插头施加 12Vdc,即使连接了主电池(无论好坏),它也只会为模块电池充电。
### 失败的 VM_SOUND 更新
失败的固件更新可能会损坏 VM_SOUND 条目。这些损坏的文件:
- 通常正好是 **14434 字节**大小
- 包含固件二进制文件而不是音频数据(例如 ASCII,“source/tasks/audiotask.c”)
### 模块在自行车外部进入运输模式?
连接随车附赠工具箱中的 42Vdc 充电器。在普通充电插头上使用 12Vdc 也可以唤醒模块。
### 模块在自行车外部显示骷髅头
这表示在模块被移除时自行车处于锁定状态,或者启用了 remote_lock。
最简单的修复方法:将模块放入车架中,解锁自行车,然后再移除模块。
### 没有激活码的模块
激活码绑定的是车架而不是模块。如果你好好商量,合作伙伴甚至可以远程为你更换模块。
### 使用寿命
#### 电池
首先确认你的 BMS 实际运行的版本是 V1.17.1!
限制你的自行车充电量。
由于充电在物理上基本上只是平衡电压的结果。如果你将充电器上的电压限制到最低,自行车在没有外部插头的情况下只能充到 85-90%。一些人(包括我)通过监控充电器使用的功率来停止充电过程。这甚至更好,因为它仍然会为模块中的电池充电。唯一的缺点是你总是会遇到 Error 21,因为自行车将这种操作检测为错误。当你断开充电器时,错误就会消失。
- 像平常一样将自行车连接到充电器。
- 断开充电器输入端,然后再断开自行车。
- 等到第二天,让充电器完全放电。
- 取下橡胶脚垫并拧下螺丝。你需要一把特殊的螺丝批头。iFixit 工具包中包含它。
- 当你打开充电器时,顶部 LED 所在的位置有一个切口。
- 在那里你会找到一个电位器。使用普通螺丝刀将电位器一直向右旋转。
- 将所有东西重新关闭并拧紧。确保连接的电缆正确放置在塑料外壳中。
## 如何开始?
### 从 SPI Flash 获取固件、自行车密钥和日志
你需要模块 PCB 的背面才能转储 SPI Flash。
所需工具:梅花螺丝刀套装。我使用了我的 iFixit 工具包。
1. 解锁自行车并从车架中取出模块
2. 如果你不解锁自行车,警报会一直开启并让你感到烦恼。如果我忘了,我会用胶带把扬声器盖住。
2. 打开模块并拧下 PCB 的所有内部螺丝以移除 PCB。确保小心地拔下 Matrix LCD 电缆!如果你弄断了它,你可以更换它。
3. 在 PCB 的背面,靠近背光端口处是 Macronix 16 针 SPI Flash 芯片。
4. 使用 16 针!SPI Flash 芯片夹和 Raspberry Pi 转储该 Flash
1. 我使用了 Raspberry Pi Zero v1.1。你需要使用 raspi-config 启用 SPI 接口
5. 当你将其重新组装时,务必使用 99% 的酒精清洁触点,并使用如 Loctite 之类的螺纹锁固剂。来自/去向电池的(初始)浪涌电流以及流向电机的交流电压都很高,尤其是当电池电量低从而导致电压低时。如果在你骑行时有螺丝松动,就会产生小火花。
使用 flashrom 转储 SPI Flash 芯片。有关详细的命令示例,请参见 [EXAMPLES.md](EXAMPLES.md)。
### 其他重要硬件
```
5C604L (6x mosfet)
AK4430ET (audio controller)
MAX9768 (class-D audio amp)
DRV8301 (gate driver)
TXS0108E (level shifter)
```
### 获取我的自行车的控制台访问权限
你可以使用 Pi Debug Probe、一个 Pi,或者为了便携访问使用 Pi Pico 1/2 (WH)、便宜或昂贵的 USB 转 UART 适配器。
我更喜欢 Pico Probe,因为我可以轻松地用我的 Mac 上传固件。
[https://github.com/raspberrypi/debugprobe](https://github.com/raspberrypi/debugprobe/releases/tag/debugprobe-v2.2.3)
JTAG 115200 波特率
黑色 - GND
绿色 - TX
橙色 - RX
黄色 - NC(未连接)
### 重要注意事项
这一切都基于逆向工程。因此,不同固件之间可能存在一些版本差异。
因此,请备份你的 Flash 转储文件,并将其保存在如 1Password 这样的安全地方。如果你压缩该转储文件,文件会变得非常小。
## 修复一些错误
### Err 缺少 Display
"DiSPlay"
```
I2C1 Error
01/00:07:02 ERR dsp freeze
```
你无法真正登录..
### Err 54(无/坏 SIM 卡)
模块正在寻找具有特定 ICCID(集成电路卡标识符)的 SIM 卡。
其前缀为
```
89 31 44 0400
MM CC II N{12} C
MM = 89 (Mobile Networks)
CC = 31 (Netherlands, The)
II = 4X Vodafone
N{12} = Account ID
C = Checksum
```
### 固件
我们正在寻找
```
50 41 43 4B BC 16 09 00 40 01 00 00 4F 41 44 20 (PACK¼ �@��OAD)
```
OAD PACK 类似,字符串在 108A5C 中
bleware.bin(FMI 版本有所不同。旧自行车支持 FMI,只是固件中没有。测试一下就知道了。)
mainware.bin
motorware.bin
shifterware.bin
batteryware.bin
```
0x0002000 ?
0x005A000 BLE Secrets (60)
0x005af80 M-ID/M-KEY (60)
0x007c000
0x0280000 VM_SOUND
0x0300000 VM_SOUND
0x0380000 VM_SOUND
0x2621440 VM_SOUND
0x3145728 VM_SOUND
0x4194304 VM_SOUND
0x4718592 VM_SOUND
0x5242880 VM_SOUND
0x5767168 VM_SOUND
0x6291456 VM_SOUND
0x640XXXX unknown
0x6815744 VM_SOUND
0x7340032 VM_SOUND
0x7864336 VM_SOUND
0x8388608 VM_SOUND
0x8912896 VM_SOUND
0x9437184 VM_SOUND
0x9961472 VM_SOUND
0x10485760 VM_SOUND
0x11010064 VM_SOUND
0x11534336 VM_SOUND
0x12058624 VM_SOUND
0x12582912 VM_SOUND
0x13107200 VM_SOUND
0x13631488 VM_SOUND
0x14155776 VM_SOUND
0x14680064 VM_SOUND
0x15204352 VM_SOUND
0x15728640 VM_SOUND
0x16252928 VM_SOUND
0x16777216 VM_SOUND
0x17301504 VM_SOUND
0x17825792 VM_SOUND
0x66965504 LOGS?
// WRONG?
0x3fdd000 LOGS
READ AND DECODE LOGS
6 GSM power ok
1723060256 Info ask tracking
1723060256 GSM_CMD_SMS_INIT
1723060256 GSM: sms= 0
1723060256 GSM_CMD_POWEROFF
1723060256 Poweroff g350..
1723060261 Poweroff g350 ok
1723060261 ES3.1 Main 1.08.02
1723060261 ES3 boot 1.09
1723060261 Motorware S.0.00.22
1723060261 BMSWare 1.14 RSOC 100 Cycles 64 HW 3.10
1723060261 Shifterware 0.237 stored: 0.237
1723060261 BLEWare 2.4.01
1723060261 GSMWare 08.90
1723060261 CMD_BLE_MAC 24:9F:89:FF:FF:FF
1723060261 PDOCP 0
1723060261 PDSCP 1
1723060261 iccid 89314404000913371337
1723060261 Modem ready
1723060261 GSM_CMD_IDLE
```
### IDA
这是 IDA 的入口点 (0x080030ec)!
### UART
#### Bootloader
在 UART(调试)端口上按 ESC 键,直到 MCU(微控制器)重启并停留在 Bootloader 中。它将显示:
```
STM32 bootloader <1.09> Muco Technologies (c)2019
```
```
For more information on a specific command, type HELP command-name
help This tekst
ver Software version
reboot reboot CPU
stm32 STM32 internal bootlaoder
crc CRC32 check
ea Erase application
es Erase shadow app
em Erase motor app
eb Erase battery app
ec Erase shifter app
ua Upload app (Y-modem)
us Upload shadow app (Y-modem)
um Upload motor app (Y-modem)
ub Upload battery app (Y-modem)
uc Upload shifter app (Y-modem)
st Start application
vi Version information
```
```
ver
STM32 bootloader <1.09> Muco Technologies (c)2019
```
```
vi
STM32 bootloader v1.09 (Feb 21 2020 14:50:53)
Loaded Application: v1.08.02 (May 9 2022 10:58:01) size 220144 bytes
Shadow Application: v1.08.02 (May 9 2022 10:58:01) size 220144 bytes
Shifter Application: v0.ed.02 (Oct 23 2020 14:09:11) size 11944 bytes
Motor Application: v0.00.16 ( 03 2021 00:48:35) size 61720 bytes
No Battery Application
```
```
crc
APP CRC ok
SHADOW CRC error
MotorPcb CRC ok
No Battery application
Shifter CRC ok
```
```
st
Wake Reason: WAKE_KICKLOCK
ES3 v1.08.02
ERR Led Display
ERR Light sensor
ERR ST3115 wake
01/00:07:01 SIM: PCB
RCC_FLAG_WWDGRST
RCC_FLAG_PINRST
01/00:07:01 GSM_CMD_IDLE
01/00:07:01 Set power state to PWR_NORMAL (Current limit: 20.0 A, SOC: -1 %)
01/00:07:01 BIKE_INIT
01/00:07:01 Restore power level 4
01/00:07:01 LiPo SoC 0% (first read)
01/00:07:01 Wake from shipping
I2C1 Error
01/00:07:01 BIKE_LIPOCHARGE
01/00:07:01 ERR dsp freeze
I2C1 Error
01/00:07:01 ERR dsp freeze
I2C1 Error
01/00:07:01 ERR dsp freeze
CMD_BLE_VERSION_INFO
CMD_BLE_MAC
```
#### 重置 Find My
按 5 次电源按钮以重置 Find My (fmna)。
```
fmna-unpair
```
#### 充电
只要闪电? 符号闪烁,就说明模块电池正在充电。
#### Mainware(调试端口)控制台
登录主密码:vEVjGF!paYsM2EBV8SoDT8*T0eBT6xevaoxCaO
```
Available commands:
help This tekst
reboot reboot CPU
login Login shell
logout Logout shell
ver Software version
distance Manual set dst
gear set gear
region Region 0..3
blereset hard reset BLE
bledebug redirect uart8
show Parameters
motorupdate Update F2806 CPU
vollow Audio volume
volmid Audio volume
volhigh Audio volume
wheelsize Wheel 24/28 inch
speed override speed
loop main loop time
shipping Shipping mode
factory-shipping Factory shipping mode (ignores BMS)
logprn Print log
logclr Clear log 6
logapp 1/ 0
powerchange 1/ 0
factory Load factory defaults
battery Show battery
batware Battery update
batreset Battery reset
shiftware Battery update
shifterstatus Show shifter
shiftdebug Show Modbus
shiftresetcounter Reset shift counter
motorstatus
gsminfo Info from Ublox
gsmstart start GSM function
gsmdebug redirect uart2
bmsdebug Show Modbus
sound sample,volume,times
adc read adc
bwritereg Modbus Bat write register
bwritedata Modbus Bat write data
breadreg Modbus Bat read register
swritereg Modbus Shift write register
swritedata Modbus Shift write data
sreadreg Modbus Shift read register
stc read lipo monitor
stcreset
setoad test
setgear save muco shifter
```
```
ver
ES3.0 Main 1.08.02
ES3 boot 1.09
Motorware BMSWare 0.00 RSOC 0 Cycles 0 HW 0.00
Shifterware 0.0 stored: 0.237
BLEWare 1.4.01
GSMWare
CMD_BLE_MAC F8:8A:5E:FF:FF:FF
```
```
show
< I/O >
Botton_Left 0
Botton_Right 0
Lock 1
Wheel 0
Charger 1
Off/rst 0
MEMS_WAKE 0
BLE_WAKE 0
BAT_FAULT 1
BAT_KEY_IN 0
Fb coil det 0
Simcard 1
LiPo STAT 1
LiPo Status LIPO_UNKNOWN
Serial 2043531337
Error Flags: 0x00000040 00000000
APP DISCON
Ibat 20.0A
No extbat
Dark 200 Lx now 591 Lx
backupcode set
Volume Low 20
Volume Medium 30
Volume High 38
Group low 00000000
Group medium 383F33FE
Group high 47C0CC00
Unit Metric
Wheel 28 inch
Transmission:AUTO
Light mode: LIGHT_ALWAYS_ON
0 MaxSpeed 0 hm/h 0 %
1 MaxSpeed 160 hm/h 30 %
2 MaxSpeed 220 hm/h 30 %
3 MaxSpeed 270 hm/h 30 %
4 MaxSpeed 320 hm/h 30 %
5 MaxSpeed 320 hm/h 101 %
Region: REGION_US
Moment 1 up:100 down:80 hm/h
Moment 2 up:190 down:170 hm/h
Moment 3 up:240 down:220 hm/h
Saved version: 10802F4
Alarm Enable
log_by_app Serial
Shipping Active
Alarm state STANDBY 11
remote_locked 0
Horn file 10
Distance 4119.5 Km
Play_lock 1
Shifter 0.237
epoch_horn 0
shftr tries 0
pedal_speed: 0
torque : 0
power level: 4
ride change: No
bike state 20
```
```
battery
BAT_ID 0x0
FAULT 0x0
BAT_TP1 -2731
BAT_TP2 -2731
MOS_TMP -2731
UBAT 0
RSOC -1
I 0
CHARGE 0
DSG_PRT 0
TST_DBG 0
HW_VER 0.00
FW_VER 0.00
DATE_1 0
DATE_2 0
NOM_CAP 0
FUL_CAP 0
REM_CAP 0
ABS_SOC 0
CYL_CNT 0
CHG_ON 0
U_1 0
U_2 0
U_3 0
U_4 0
U_5 0
U_6 0
U_7 0
U_8 0
U_9 0
U_A 0
U_MAX 0
U_MIN 0
FSR 0x0000
DOTP 0
DUTP 0
COTP 0
CUTP 0
DOCP1 0
DOCP2 0
COCP1 0
COCP2 0
OVP1 0
OVP2 0
UVP1 0
UVP2 0
PDOCP 0
PDSCP 0
MOTP 0
SCP 0
```
```
shipping
Set shipping mode
01/00:24:53 BIKE_SHIPPING
01/00:24:53 SOUND_SO vol 26
Lights P2c
CMD_AUDIO_STOPPED
01/00:25:02 BIKE_SET_SHIPPING
01/00:25:02 BIKE_CPU_STOP_MODE
01/00:25:02 BIKE_SPECIAL_GEAR_OPERATION
01/00:25:07 Shipping mode sets gear:2
01/00:25:07 BIKE_END_SPECIAL_OPERATION
01/00:25:09 BIKE_CPU_STOP_MODE
01/00:25:09 Wake counter 254 of 168, type 10
01/00:25:09 Force Lights Off
01/00:25:09 BMS off
01/00:25:09 BIKE_CPU_STOPPED
No MOTOR_SLEEP_MODE from motor 0x0404
01/00:25:09 EnterSTOPMode 0 min Wake:Shipping
```
```
factory-shipping
Set factory shipping mode
BLE remove id 112 nr 5C
01/00:27:36 EnterSTOPMode 0 min Wake:Shipping
```
### 蓝牙低功耗 Shell
输入 bledebug 进入 BLE 芯片 Shell,然后执行 reset 获取以下输出:
```
Connect to UART8
reset
Mon Feb 17 20:00:34 2025: Platform reset
Thu Dec 31 23:00:00 2020: This image is not provisioned
*** VANMOOF S3/X3 Monitor Program ***
BLE MAC Address: "f8:8a:5e:ff:ff:ff"
Device name ................ : ES3-F88A5EFFFFFF
Firmware version ........... : 1.04.01
Compile date / time ........ : Mar 29 2021 / 14:20:30
BIM firmware version ....... : 1.00.00
BIM compile date / time .... : Apr 23 2020 / 14:10:12
reset type ................. : pin reset
systick .................... : 30316279
Type 'help' for a list of all available commands.
```
```
> help
The following commands are available:
firmware-update - update a new image of firmware to the external flash
extflash-verify - verify the current flashchip
log-count - get log-count statistic
log-dump - print blocks starting at address
log-flush - flush all log-entries
log-inject - Create fake-logs
audio-play - play audio bound to the specified index
audio-stop - stop playing the current audio file
audio-dump - dump all audio files in external memory
audio-upload - upload audio binary using Y-Modem at the address linked to the specified index
audio-volume-set-all - set audio level of all audio-clips (0-3)
pack-upload - upload a PACK file by Y-Modem
pack-list - list the contents of a PACK file
pack-delete - delete a PACK file
pack-process - process pack files in external flash memory
ble-info - dump current BLE connection info / statistics
ble-disconnect - force a disconnect of all connected devices
ble-erase-all-bonds - erase all bonds
fmna-get-auth-uuid - Get the FMNA authentication UUID
fmna-get-serialnumber - Get the FMNA serialnumber
fmna-set-serialnumber - Set the serialnumber (hexstring, 8 bytes / 16 hexdigits)
fmna-erase-external - erases the external provisioned data (will be reset on reboot if internal exists)
ble-erase-fmna-bonds - will erase all fmna bonds
fmna-blob-upload-int - upload a FMNA factory blob
fmna-rework - Replace provisioning data using Y-Modem
fmna-enable-pairing - enables pairing (if unpaired)
fmna-unpair - Force FMNA unpair (i.e. 5x reset
shutdown - shutdown the system
rtos-statistics - dump memory stats every 500ms
rtos-nvm-compact - Compact the non-volatile storage
reset - perform software reset of the MCU
info/ver - show basic firmware info
exit - exit from shell
help - show all monitor commands
```
```
> extflash-verify
Flash type : MX25L51245G
Device size (Mbyte): 64
SW status register write protection: y
Block write-protection enabled : n
```
```
> pack-process
Sat Jan 1 00:55:04 2000: invalid pack content
Processing pakfs, expect a small startup delay because of mainware erasing its shadowflash, which blocks all serial I/O
> Cold boot
ES3 v1.08.02
```
```
> ble-info
number of connections: 0/3
Device address: cb:9e:4f:ff:ff:ff
```
```
> ble-erase-all-bonds
```
```
> pack-delete
Deleting PACK archive...
Erase pack progress <99%>
Done
```
```
> pack-upload
CCCCCCYModem successfully received 595968 bytes for file "pack.bin"
```
```
> pack-list
Scanning PACK archive..
217,884 bytes bleware.bin
220,144 bytes mainware.bin
61,720 bytes motorware.bin
11,944 bytes shifterware.bin
83,940 bytes batteryware.bin
```
```
> log-flush
Done erasing logs
```
```
> pack-process
Processing pakfs, expect a small startup delay because of mainware erasing its shadowflash, which blocks all serial I/O
> Sat Jan 1 02:18:53 2000: Platform reset
Thu Dec 31 23:00:00 2020: This image is not provisioned
Wake Reason: WAKE_KICKLOCK
ES3 v1.08.02
ERR ST3115 wake
01/02:15:43 SIM: Holder
RCC_FLAG_PINRST
01/02:15:43 GSM_CMD_IDLE
01/02:15:43 Set power state to PWR_NORMAL (Current limit: 20.0 A, SOC: -1 %)
01/02:15:43 BIKE_INIT
01/02:15:43 Restore power level 4
01/02:15:43 LiPo SoC 0% (first read)
01/02:15:43 Wake from shipping
Seq 2 Order 1 2 3 4 5
01/02:15:43 ERR dsp freeze
01/02:15:43 BIKE_OAD_UPDATE
CMD_BLE_VERSION_INFO
CMD_BLE_MAC
Disable Advertise
01/02:15:50 LiPo state changed to LIPO_ERROR
```
### GSM 调制解调器
参见 Chris 的仓库。你需要使用 AT 命令。调制解调器直接连接到 UART 输出。
### 理解控制台数值
有趣的是 LiPOSOC 和 BMSSOC
```
TIME; LiPOSOC; BMSSOC; BATTEMP; BATVOLTAGE; BATCURRENT; MOTORCURRENT; MOTORTMP; DRIVERTMP; SPEED; ODO; BOOST; LUX; BATDSG
01/00:11:04; 0.0; -1; -247.-6; 0.00; 0.00; 0.0; 0; 0; 0.0; 4119.5; 0; 0; 0
```
### 更新 mainware 固件
我在 Mac 上使用 minicom。最简单的方法是进入包含固件的文件夹,然后启动 minicom。
**确保模块已充了一定量的电,或者连接上充电器!**。
确保它是原始固件,或者如果已修改,则 CRC32 和 Magic 值是正确的。
要更新或降级 Mainware(即你在 App 中看到的固件版本),你需要更新 shadow 应用程序。
不要直接更新 Mainware(已加载的应用程序)。
1. 通过按 ESC 键直到重启进入 muco Bootloader。
2. 输入 "es"(擦除 shadow),回车
3. 输入 "us"(上传 shadow),回车
4. 在 minicom Shell 中按 CONTROL-A S(在 Mac 上),选择 mainware_XXX.bin
5. 输入 "vi"(版本),回车。确认显示的版本是你期望的版本。
6. 输入 "st"(启动),回车。Mainware 应该会启动。
7. 按 ESC 键,直到你再次进入 Bootloader。它会自动将 shadow 复制到 mainware 分区。
8. 它会自动重启。确认 ES3 v.X.XX.XX 之后的版本号是你所期望的!
```
'MT' (@) 2019 STM32F4, Stop
top
>es
Erasing shadow flash 256 Kb... Erase sector 7
Erase sector 8
OK
>us
Send .bin Ymodem
CCC
>vi
STM32 bootloader v1.09 (Feb 21 2020 14:50:53)
Loaded Application: v1.01.15 (Jun 7 2023 07:21:48) size 195784 bytes
Shadow Application: v1.01.0F (Jun 7 2023 07:21:48) size 195784 bytes
Shifter Application: v0.ed.02 (Oct 23 2020 14:09:11) size 11944 bytes
Motor Application: v0.00.16 ( 03 2021 00:48:35) size 61720 bytes
No Battery Application
>st
Wake Reason: WAKE_SRC_BUTTON_1 WAKE_SRC_MEMS WAKE_KICKLOCK
ES3 v1.01.21
ERR ST3115 wake
01/00:11:03 SIM: Holder
RCC_FLAG_WWDGRST
RCC_FLAG_PINRST
01/00:11:03 GSM_CMD_IDLE
01/00:11:03 Set power state to PWR_NORMAL (Current limit: 20.0 A, SOC: -1 %)
01/00:11:03 BIKE_INIT
01/00:11:03 Restore power level 4
01/00:11:03 LiPo SoC 0% (first read)
01/00:11:03 Wake from shipping
01/00:11:03 BIKE_LIPOCHARGE
01/00:11:03 CMD_BLE_VERSION_INFO
CMD_BLE_MAC
ERR Read STC
TIME;LiPOSOC;BMSSOC;BATTEMP;BATVOLTAGE;BATCURRENT;MOTORCURRENT;MOTORTMP;DRIVERTMP;SPEED;ODO;BOOST;LUX;BATDSG
01/00:11:04 ;0.0;-1;-247.-6;0.00;0.00;0.0;0;0;0.0;4119.5;0;0;0
'MT' (@) 2019 STM32F4, Stop
Copy Shadow to App..Erase sector 5
Erase sector 6
Erasing shadow flash... Erase sector 7
Erase sector 8
OK
Jump
Wake Reason: WAKE_SRC_BUTTON_1 WAKE_SRC_MEMS WAKE_KICKLOCK
ES3 v1.01.15
```
### 将 Dynapack BMS 固件更新到 1.17(最新版本)
如果你想降级 BMS,也可以使用此方法。它没有降级检查。
我在 Mac 上使用 minicom。最简单的方法是进入包含固件的文件夹,然后启动 minicom。
**确保电池和模块都有一定的电量,并且没有与电池相关的任何错误**。
拜托。当保险丝处于 OL(开路)状态时,不要尝试更新 BMS。它不会修复你遇到的任何电池错误!
所有错误都保存到 EEPROM 中(它同时保存了序列号、循环次数、校准数据),因此正常的更新例程不会更新/擦除它。
1. 通过按 ESC 键进入 muco Bootloader
2. 输入 "vi"(版本),回车。如果未安装 v1.17.1 版本,我们需要先上传它。
1. 输入 "eb"(擦除 batteryware),回车
2. 输入 "ub"(上传 batteryware),回车
3. 在 minicom Shell 中按 CONTROL-A S(在 Mac 上),选择 batteryware_1.17.1.bin
4. 输入 "vi"(版本),回车。确认显示的版本是 v1.17。
3. 输入 "st"(),回车。Mainware 应该会启动。
4. 输入 "batware",回车。
5. 更新后使用 "battery" 命令验证 BMS 是否已成功更新。
### 为了保存里程,我将自行车设为了运输模式。这会将里程保存到 EEPROM 中。
**这不会更新后台中的里程**,但它会在 App 中显示,因此在购买二手时要小心!
这对于 BMS 循环次数也是可能的!
```
> distance 0
Set 0.0 Km
```
标签:BLE, BMS, CC2642, EVTX分析, IoT安全, MUC, SPI Flash, STM32, VanMoof, YMODEM, 云资产清单, 固件分析, 固件提取, 嵌入式系统, 微控制器, 日志审计, 智能硬件, 智能自行车, 物联网, 电动自行车, 电池管理系统, 硬件分析, 硬件改装, 硬件黑客, 蓝牙低功耗, 逆向工程, 通信协议