在线时间87 小时
UID3310295
注册时间2016-11-25
NXP金币0
TA的每日心情 | 开心 2022-11-9 15:32 |
---|
签到天数: 188 天 [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 ,好了,以上就是全部内容了。
|
|