用Raspberry pi做SPI Flash编程器



  • 利用raspberry pi的GPIO我们能做很多事情,当然也可以用它的SPI接口配合相应的软件读写SPI Flash起到编程器的作用
    连接

    rsp引脚定义

    按照图示连接SPI Flash和raspberry pi
    开机进入raspbian系统,输入

    $ sudo raspi-config
    

    选择5 Interfacing Options
    再选择P4 SPI,回车,按Tab键把光标移到Yes上,回车,SPI就打开了。
    这里有个详细教程

    回到控制台,输入

    $ ls /dev/*spi*
    

    能看到两个设备,就算成功了。

    编程器软件,有一个叫flashrom的很不错。您可能想自己编译最新版本的flashrom,那么请先确认您的软件源已经配置好,并且软件仓库已经更新到最新版本,此时依次输入以下指令

    $ sudo apt install git libpci-dev libusb-1.0 libusb-dev
    $ git clone https://github.com/flashrom/flashrom.git

    $ cd flashrom
    
$ make && sudo make install
    

    如无意外,应该就安装成功了。

    $ flashrom --programmer linux_spi:dev=/dev/spidev0.0
    

    如果指令正确,软件配置无误,会看到一堆回显,包含flashrom软件的版权信息。如果设备连接正确,应该可以看到软件读取到了你的Flash的Device name和相关信息
    比如我这里就显示找到了Winbond flash chip "W25Q128.V" (16384 kB, SPI) on linux_spi

    能回显设备名和属性,您已经无限接近成功了。让我们读一个Flash出来看看

    $ flashrom --programmer linux_spi:dev=/dev/spidev0.0 --chip "W25Q128.V" --read original.rom
    

    上面的显示和之前一模一样,最后一行会显示个Reading flash...读取需要一点时间
    等到显示Done的时候,就读取好了。
    如果不放心,再读一遍

    $ flashrom --programmer linux_spi:dev=/dev/spidev0.0 --chip "W25Q128.V" --read original1.rom
    

    用diff验证一下两个文件的差别

    $ diff original.rom original1.rom
    

    如无意外,应该是毫无差别的,就是比较完了什么输出都没有。

    备份完了ROM原本的内容并且确认无误之后,我们就可以写新内容了

    $ flashrom --programmer linux_spi:dev=/dev/spidev0.0 --chip "W25Q128.V" --write ./new.rom
    

    程序会自动完成擦写校验的过程,写16M Flash需要几分钟的时间,需要有一点点耐心
    等到程序提示VERIFIED.的时候,就证明整个擦写校验的过程全部完成了,您已经正确的写入了您想要的内容,恭喜。

    flashrom的参数传递方法当然不是一成不变的,而且还有很多有趣的参数,可以用flashrom --help来了解。比如spispeed,您可以用它控制操作的时钟频率从而加速通讯或者减少错误发生的几率,如无此参数,默认速度为2000kHz
    例如您可以简单的用

    $ flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=512 -r flash.rom
    

    完成Flash的读取,spi时钟频率为512kHz。
    或者用

    $ flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=4000 -w flash.rom
    

    完成写入,时钟频率为4000kHz