| 
在线时间87 小时
UID3310295
注册时间2016-11-25
NXP金币0 
 TA的每日心情|  | 开心 2022-11-9 15:32
 | 
|---|
 签到天数: 188 天 连续签到: 1 天 [LV.7]常住居民III 高级会员 
 
 
	积分820 
最后登录2023-8-23 | 
 
| 本帖最后由 li--wei--hao 于 2021-5-21 20:51 编辑 
 很久之前从社区活动中拿到一块lpc54114-lite开发板,这两年来工作原因很久没有写单片机代码了,最近恰好看到一篇Linux 下离线烧写 SPI 闪存 的博文,这篇博文中比较详细的介绍了该工具的原理,下面摘录一段:
 
 
 无意中发现了 coreboot (原 LinuxBIOS )项目开发的 flashrom 工具居然带有离线编程功能,除了支持一票比较贵的专用编程器/基于 FTDIxxxxH 的编程器外,还支持一种叫做 serprog 的协议,可以通过串口操作单片机来给 SPI 闪存编程。这样一来就方便了。看完该博文后,仔细阅读了该博主的代码和flashrom的wiki,心血来潮,便决定在lpc54114-lite上实现一下,正好板载的mcu既有USB全速设备还有一片spi flash,完全满足所有实验条件。
 
 由于目前我主要使用Linux操作系统,因此本项目基于make和gcc进行构建,项目中涉及到的Makefile规则比较简单,想必大家也很容易看懂,就不赘述了,下面对涉及的一些模块进行一些简单说明。
 
 spi主机配置及使用十分简单,这里便不做过多介绍了;usb部分,我没有使用nxp官方sdk提供的协议栈,而是使用了tinyusb这个开源项目,因为tinyusb使用起来比官方库简单许多;os方面我使用了freertos,这样可以使代码编写更加简单灵活;除此之外便是对serporg协议的实现了,这个难度也不大,只要照着flashrom的文档,参考上文博主github中代码,很快便可以完成了。
 
 下面是我简单的测试的读写速率:
 
 
 复制代码# 读flash, W25X80, 1MiB
$ time sudo flashrom -p serprog:dev=/dev/ttyACM0:4000000 -c W25X80 -r /tmp/test.bin
flashrom  on Linux 4.19.0-16-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
serprog: Programmer name is "lpc-serprog"
Found Winbond flash chip "W25X80" (1024 kB, SPI) on serprog.
Reading flash... done.
real    0m3.106s
user    0m1.163s
sys     0m0.055s
# 擦除flash, W25X80, 1MiB
$ time sudo flashrom -p serprog:dev=/dev/ttyACM0:4000000 -c W25X80 -E
flashrom  on Linux 4.19.0-16-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
serprog: Programmer name is "lpc-serprog"
Found Winbond flash chip "W25X80" (1024 kB, SPI) on serprog.
Erasing and writing flash chip... Erase/write done.
real    0m25.594s
user    0m23.017s
sys     0m0.065s
# 写flash, W25X80, 1MiB
$ time sudo flashrom -p serprog:dev=/dev/ttyACM0:4000000 -c W25X80 -w /tmp/test.bin 
flashrom  on Linux 4.19.0-16-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
serprog: Programmer name is "lpc-serprog"
Found Winbond flash chip "W25X80" (1024 kB, SPI) on serprog.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
real    0m17.041s
user    0m2.757s
sys     0m0.717s
 flashrom在数据流程之前还会有1秒时间消耗在同步阶段,减去该时间来看的话读写速率还是不错的,虽然相较于原博主的实现还略有不及。
 
 目前本项目的代码均托管在码云,链接为 https://gitee.com/ieiao/serprog-lpc54114-lite ,好了,以上就是全部内容了。
 
 
 
 | 
 |