Raspberry-piのSPIに3.3vSPIタイプのFlashromを直結し吸出しを行う
SPIインターフェイスは、MOSI,MISO,SCLKの3線Busに各デバイスをぶらさげ
デバイスセレクトを各個に接続する。raspiはCE0,CE1があるので2つのデバイスを接続可能。
/dev/spidev0.0 /dev/spidev0.1 に割付られる
結線は以下の通り
■ raspi側 P1コネクタ (1番ピンに印あり)
1= 3.3V POWER 2= 5.0V POWER
3= GPIO0 / SDA(I2C) 4= 5.0V POWER
5= GPIO1 / SCL(I2C) 6= GND
7= GPIO4 / GPCLK0 8= GPIO14 / TXD(SCI)
9= GND 10= GPIO15 / RXD
11= GPIO17 12= GPIO18 / PCM_CLK
13= GPIO21 / PGM_DOUT 14= GND
15= GPIO22 16= GPIO23
17= 3.3V POWER 18= GPIO24
19= GPIO10 / MOSI(SPI) 20= GND
21= GPIO9 / MISO(SPI) 22= GPIO25
23= GPIO11 / SCLK(SPI) 24= GPIO8 / CE0(SP1)
25= GND 26= GPIO7 / CE1(SPI)
pin1-26は全機種共通(pin27-40は省略)
■ FlashROM側 (1番ピンに印あり)
1=CS 8=Vcc(3.3v)
2=DO 7=/HOLD
3=/WP 6=CLK
4=Gnd 5=DI
■結線
raspi側 FlashROM側
24= GPIO8 / CE0 ------ 1=CS
19= GPIO10 / MOSI ----- 5=DI
21= GPIO9 / MISO ----- 2=DO
23= GPIO11 / SCLK ----- 6=CLK
25= GND --------------- 4=Gnd
17= 3.3V POWER ----+--- 8=Vcc(3.3v)
+--- 3=/WP
+--- 7=/HOLD
WP,HOLDはpullupする。
flashromのインストール
sudo apt-get -y install build-essential pciutils usbutils libpci-dev libusb-dev libusb-1.0-0 libusb-1.0-0-dev libftdi1 libftdi-dev zlib1g-dev subversion
svn co https://code.coreboot.org/svn/flashrom/trunk flashrom
cd flashrom
sudo make
sudo make install
Rasbian Stretch(Debian9)でSPIが安定しない(変な値が返る)ので、
1つ前のJessie(Debian8)を入れなおして使う
読み出しコマンド
flashrom -V -p linux_spi:dev=/dev/spidev0.0 -c "GD25Q128C" -r rom.bin
rom.binが作成され128Mbit(16MB)の読み出しが10分程度で完了する
FlashROMは製品によってコマンドなど異なる為、チップネームをパラメーターとして与える。
チップタイプは3byteのマニュファクチャIDで判別する。
chip ID1 ID2
MX25L12845E C2 2018
MD25Q128SIG C8 4018 < 未対応だったがGD25Q128Cで読めた
W25Q128FVSG EF 4018
エンディアン変換
FlashROM readerにもバイトオーダー指定はあるが、short/long指定が無く常に2byte wordでの変換になるようなので、4byte word変換を行う簡単なツールを書いてこれを行った。
以下のように順番を入れ替える
ABCD|ABCD|ABCD|ABCD|ABCD|...
↓
DCBA|DCBA|DCBA|DCBA|DCBA...
ubootのconfigと思われるubootenv
生ROM
_mraqerf0x0=2110 230duabetar511= 002toob=dmc nurobfsb todtooyaleb 2=ftoo=eliamIzb egisbs2=ezoc Mlosnvedeytt=0KGShte =tca17kge 10daht3=rd79:C:E0:E:2241:1lif ddae1C=r0000f...
エンディアン変換
arm_freq=0x10112032 baudrate=115200 bootcmd=run sfboot bootdelay=2 bootfile=zImage bsbsize=2M consoledev=ttySGK0 ethact=gk7101 ethaddr=3C:97:0E:22:E1:14 fileaddr=C100000...
ブロックに分割
ROMのパーテーションブロックは起動メッセージに表示されるので、これを頼りに分割をおこなう
[ 0.640000] 0x000000000000-0x000000040000 : "uboot" 256k 0x40000
[ 0.640000] 0x000000040000-0x000000050000 : "ubootenv" 64k 0x10000
[ 0.650000] 0x000000050000-0x000000200000 : "kernel" 1728k 0x1B0000
[ 0.660000] 0x000000200000-0x000001000000 : "rootfs" 14336k 0xE00000
[ 0.670000] 0x000000000000-0x000001000000 : "all" 16384k 0x1000000
DDコマンドで切り出し
dd if=rom.bin bs=1024 skip=0 count=256 of=uboot.bin
dd if=rom.bin bs=1024 skip=256 count=64 of=ubootenv.bin
dd if=rom.bin bs=1024 skip=320 count=1728 of=kernel.bin
dd if=rom.bin bs=1024 skip=2048 count=14336 of=rootfs.bin