无Flash方案(串口启动)*
1. 概述*
8008/8008c支持无flash,通过每次芯片上电后从串口加载固件启动,国芯提供基于Linux/Windows加载8008/8008c的c程序,用户只需把相关代码移植到对应的host平台
Tip
硬件设计的时候host端注意需要控制芯片端的电源或者复位
2. 程序下载*
3. 可以直接在linux/windows平台上运行(实测ubuntu16/18/20,windows10)*
3.1 编译*
linux平台:
make
windows平台:(一般windows平台是没有gcc编译工具的,可以使用压缩包中的mingw-get-setup.tar.gz进行安装)
mingw32-make
3.2 运行程序后,给芯片上电或者复位*
linux平台:
sudo ./main.elf /dev/ttyUSBx -m leo //for leo(8008)
sudo ./main.elf /dev/ttyUSBx -m leo_mini //for leo mini(8008c)
windows平台:
main.exe COMx -m leo //for leo(8008)
main.exe COMx -m leo_mini //for leo mini(8008b/c)
其中/dev/ttyUSBx和COMx,根据连接到pc端的串口号进行修改即可
3.3 以leo_mini为例,加载成功如下*
3.4 如果mcu固件打开了printf,可以从对应串口看到正常上电日志*
Tip
编译mcu的时候需要把printf功能关闭,或者映射到和串口加载不同的串口。
3.5 代码说明*
- 高亮部分为移植需要关注的代码,工程师需要适配host端port.h中的接口
.
├── dsp.fw ----- DSP固件
├── mcu_nor.bin ----- MCU固件
├── porting.c ----- linux/windows平台上实现的对应接口
├── main.c ----- 串口加载函数 (**UartSendFirmwareForLEO()/UartSendFirmwareForLEOMINI()**)
├── main.elf/main.exe ----- linux/windows平台编译出来的可执行程序
├── makefile
├── port.h ----- 如果需要移植到其他平台,需要在其他平台上实现的接口
├── mingw-get-setup.tar.gz ----- windows平台编译工具链,解压后双击即可安装
└── README.md
4. MCU端的修改(不做8008/8008c开发的请忽略)*
4.1 默认配置*
-
sdk默认使用UART0与host通讯(8008只有UART0),所以默认也使用串口0做串口加载启动
-
sdk默认使用3000000波特率(握手波特率统一57600)做串口加载,8008/8008c波特率最高支持到3000000
4.2 修改串口*
-
作为加载启动的串口,在加载启动中不能作为其他通讯用,成功加载启动后可以。 例如:作为printf输出
-
vsp_sdk/mcu/vsp/common/vsp_vpa.c
206 static int serial_port = UART_PORT0;
4.3 修改波特率*
4.3.1 修改mcu加载波特率*
- 板级配置代码 board_config.h
#define CONFIG_DW_UART0_CLK 192000000
#define CONFIG_SPL_DESIGNWARE_UART_CLKDIV 4 /* (CONFIG_DW_UART_CLK + (8 * baudrate)) / (16 * baudrate) */
#define CONFIG_SPL_DESIGNWARE_UART_CLKDLF 0 /* (CONFIG_DW_UART_CLK % (16 * baudrate) * 1.0) / (16 * baudrate) * (1 << 4) */
-
例如配置3000000
- CONFIG_SPL_DESIGNWARE_UART_CLKDIV = (192000000 + (8 * 3000000)) / (16 * 3000000) = 4
- CONFIG_SPL_DESIGNWARE_UART_CLKDLF = (192000000 % (16 * 3000000) * 1.0) / (16 * 3000000) * (1 << 4) = 0
4.3.2 修改dsp加载波特率*
-
vsp_sdk/mcu/vsp/common/vsp_vpa.c
289 // Init serial port for vpa loading 290 UartInit(serial_port, 3000000);