K210 kflash ISP 下载程序流程
K210详细的的程序下载流程,包括芯片侧和kflash侧
版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://neucrack.com/p/312 有改动
术语
- ISP: In System Programming, 在系统编程
kflash 下载流程
带 || 开头的是芯片侧的操作
|| 芯片拷贝
boot rom
(特定的硬件,一次性写入)中的 boot 程序到内存末尾1(),并调用运行这个 boot 程序|| boot 程序运行后, 从 otp 读取信息来判断是否需要从 top 中读取新的 boot,因为 boot rom 区域是一次性写入的,如果 boot 写出了 bug,可以用 otp 中写入新的 boot 来挽救,相当于芯片出厂有两次写入 boot 的机会。而事实是 k210 确实用上了这个功能
|| 如果需要使用 otp 中的新 boot,则读取到内存末尾,但是需要在现在正在运行的 boot 前面,比如之前的末尾1是倒数16k,那么这个 otp 的 boot 就需要写到之前,比如倒数32k到倒数16k位置,然后跳转执行这个新的 boot
|| boot 程序判断 boot 引脚是否被拉低,没被拉低则进入正常启动模式,读取整个固件到内存,然后启动,否则进入ISP模式
上位机打开串口
上位机通过串口的 dtr rts 来设置 boot 和 reset 引脚,保持拉低 boot引脚,然后拉低reset引脚再拉高reset引脚, 即让芯片重启的时候保持boot引脚为低电平
|| 芯片boot程序检测,如果boot引脚被拉低了,则进入 ISP 模式(输入boot程序的一部分)
上位机向芯片发送握手信号(b'\xc0\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0'),然后等待响应信号
默认芯片是115200波特率,如果需要更高波特率,发送修改波特率命令给芯片,芯片程序(boot)修改通信波特率
向芯片发送写 ramrum 程序的命令,并将需要 RAMRUM 的程序或者新的 ISP 程序发过去,写到芯片内存的起始地址
注意到,这里没有直接发送要写入到flash的程序过去让boot里面的ISP程序去写入到Flash,而是重新发送了一份ISP程序过去,后面会运行这份新的ISP程序来从串口获取固件并烧录到flash,这可以说是为了更灵活,可以自定义ISP程序,而且ISP程序的大小只要小于前面的 boot 和 otp 的新boot的大小之和就行,boot里面做这些事可能面临boot程序过大或者有bug后期更新的问题。但是代价就是每次下载程序都要花费几秒钟下载新的ISP程序,这样用户每次下载的时间会变长,所以最好的肯定是一次性把boot程序写完美,没有bug。其实也可以在boot的ISP程序中加入写如程序到flash的命令,这样是否使用新的ISP就可选
向芯片发送启动 ramrum 命令
如果是想在ram中运行程序,到这一步为止即可,程序已经在ram中运行了,否则往下一步
接下来就是运行发送过去的新ISP程序了
上位机和ISP程序握手
isp程序默认波特率115200,如果需要更高,这里发送更改命令让isp程序修改串口波特率
通过串口发送程序文件到isp程序,isp程序写入到 flash
通过串口的 dtr 和 rts 控制芯片的reset和boot引脚来正常启动,不进入 ramrum 模式,而是正常从flash加载程序启动