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 installRasbian Stretch(Debian9)でSPIが安定しない(変な値が返る)ので、
1つ前のJessie(Debian8)を入れなおして使う
読み出しコマンド
flashrom -V -p linux_spi:dev=/dev/spidev0.0 -c "GD25Q128C" -r rom.binrom.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
0 件のコメント:
コメントを投稿