树莓派提取固件
准备工作
工具
树莓派 4B(OS:Raspberry Pi OS)
- flashrom
双母头杜邦线
测试钩
开启树莓派SPI(串行外设接口)
默认情况下禁用 SPI ,需要手动开启:
1 | sudo raspi-config |
打开树莓派设置 -> Interface Options -> SPI -> enable 。配置完整后 /boot/config.txt 会取消注释 dtparam=spi=on
,代表是启用 SPI0 ,默认情况下使用 2 条芯片选择线(片选通道)。
如果正常开启会在 /dev 下会有两个驱动对应两个片选:
1 | ls /dev/spi* |
Rapsberry Pi Zero、1、2 和 3 具有三个 SPI 控制器:
- SPI0 具有两个芯片片选,在 Pi 都可用;还有一个仅在计算模块上的备用替代映射。
- SPI1 具有三个芯片片选,除 Pi 1 以外的都能用。
- SPI2 具有三个芯片片选,仅在 Pi 1、3 和 3+ 上可用。
在 Pi 4 上,有额外四个的 SPI 总线:SPI3-SPI6,每个都有 2 个芯片片选。额外的 SPI 总线通过特定 GPIO 引脚上的备用映射分配。关于 SPI 更详细信息查阅官方文档SPI硬件、官方文档开启其他SPI配置。
内核也会加载对应 mod ,默认的 Linux 驱动程序是spi-bcm2835
。这个驱动文件与上面开启 SPI3-SPI6 总线有关,开启这部分总线需要更换驱动程序为 spi-bcm2711
,具体查阅官方文档
1 | lsmod | grep spi |
树莓派引脚定义
代号含义
1 | SCLK - Serial CLocK | 时钟 |
SPI功能引脚定义
主要使用 SPI0、SPI1 ,其他 SPI 总线引脚映射。
SPI0
SPI Function | Header Pin | Broadcom Pin Name | Broadcom Pin Function |
---|---|---|---|
MOSI | 19 | GPIO10 | SPI0_MOSI |
MISO | 21 | GPIO09 | SPI0_MISO |
SCLK | 23 | GPIO11 | SPI0_SCLK |
CE0 | 24 | GPIO08 | SPI0_CE0_N |
CE1 | 26 | GPIO07 | SPI0_CE1_N |
SPI1
SPI Function | Header Pin | Broadcom Pin Name | Broadcom Pin Function |
---|---|---|---|
MOSI | 38 | GPIO20 | SPI1_MOSI |
MISO | 35 | GPIO19 | SPI1_MISO |
SCLK | 40 | GPIO21 | SPI1_SCLK |
CE0 | 12 | GPIO18 | SPI1_CE0_N |
CE1 | 11 | GPIO17 | SPI1_CE1_N |
CE2 | 36 | GPIO16 | SPI1_CE2_N |
从Flash中提取
寻找
针对 SOP8/16 封装的 SPI Flash 芯片。寻找到主板上 flash 后到**半导小芯**查询芯片手册,描述会有说明芯片通信协议。
SOP 8/16 封装引脚定义图:
接线
flashrom document 接线说明:https://www.flashrom.org/RaspberryPi
用的是 Pi 4B 文档提及 3.3V 不能大于 50mA 问题不存在,就不用管
SPI0 片选0 接线方式,片选 1 区别就是将 24 脚换成 26 脚
RPi header | Broadcom Pin Function | SPI flash |
---|---|---|
25 | GND | GND |
24 | SPI0_CE0_N | /CS |
23 | SPI0_SCLK | CLK |
21 | SPI0_MISO | DO |
19 | SPI0_MOSI | DI |
17 | 3v3 Power | VCC 3.3V (/HOLD, /WP) |
In general the other pins (usually pin 3 is /WP and pin 7 is /HOLD) should be connected to Vcc unless they are required to be floating or connected to GND (both extremely uncommon for SPI flash chips).
一般 /WP 和 /HOLD 应该接 3.3V,除非是需要这两引脚需要悬空或者接地,具体查一下芯片手册
对于 SOP8 封装芯片就按照上面引脚接线,如果是 SOP16 封装芯片忽略 NC 引脚,剩余 8 个引脚和 SOP8 一样接线方法。
提取
1 | flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=1000 -r rasp.bin |
-p
:指定 SPI 总线,注意片选接要对应,SPI0 接 24 脚对应是片选 0spispeed
:读写速率-r
:输出文件名-c
:选择芯片型号。自动识别可能会识别出多个型号,需要根据提示选择合适型号