在Windows上有与ch341a配套的软件和驱动,那么理论上来说,Linux也应该有对应的软件,而且由于嵌入式领域相关还可能是先有的Linux版本然后再有的Windows移植版本。经过搜索,找到了一个软件flashrom,大概的原理应该是使用usb库,对不同的编程器做了适配,然后可以通过编程器读取到芯片类型、读写芯片内容等。
树莓派上安装flashrom:sudo apt-get install flashrom
,在我的树莓派上默认安装的是v1.2版本。
同样我在Mac上也安装了:brew install flashrom
,版本是v1.3.
初始使用flashrom
树莓派(失败)
将编程器夹子夹上K2P的内存芯片,并将编程器连接到树莓派的USB接口上。编程器的夹子让红线对准SPI flash圆孔处的引脚。SPI flash的芯片类型是:25Q127CSIG。
在树莓派上运行flashrom,使用-p参数指定编程器为ch341a_spi。如下,检测到了两种spi芯片类型。
后续需要使用-c命令指定spi芯片的型号,然后才能对芯片进行读、写、校验的操作。
我选择了两种芯片类型都读取失败了:经过搜索,可能是libusb库的问题,需要重新安装。然后重新安装了库之后还是失败,怀疑是不是因为硬件的问题或者是flashrom软件的问题,于是在Mac上重新尝试了。
Mac(成功)
可能是因为flashrom版本的问题?树莓派上是v1.2.0,而Mac上是v1.3.0
读取出来的固件也可以使用binwalk查看相关信息。那么可以确定是flashrom版本的问题,决定重新在树莓派上从源码编译安装最新版本的flashrom v1.3.0
树莓派重新编译v1.3.0
在树莓派上重新编译flashrom,编译所需要的依赖可以根据官方库ReadMe文档安装,也可以在make的时候看检测安装。
1 | wget https://github.com/flashrom/flashrom/archive/refs/tags/v1.3.0.tar.gz |
解决报错:/bin/sh: 1: sphinx-build: not found
1 | sudo apt-get install python3-pip |
解决报错:make: ./util/getrevision.sh: No such file or directory
这是因为在tag v1.3.0下载的源码没有./util/getrevision.sh这个文件,从官方库中下载到源码目录或者手动创建一个。我是手动创建了该文件,然后从./util/getreversion.sh复制内容。
安装的时候可以先卸载掉原来的flashrom,因为apt-get安装的在/usr/sbin目录,编译默认在/usr/local/sbin
1 | sudo apt-get purge flashrom |
重新编译后的flashrom需要使用sudo权限才能正常运行:
现在可以成功读取K2P的SPI flash了。
使用binwalk也可以检测读取出来的内容,读取成功
小结
最开始在树莓派上使用apt-get安装的v1.2版本的flashrom来读取K2P的SPI flash,失败了。通过和Mac上使用flashrom成功读取对比,判断可能是flashrom版本问题,于是在树莓派上重新下载源码编译安装了v1.3的flashrom,最后读取成功。