Arduino UNOをSPIフラッシャーにする
Linuxで動くflashromツールで使えるSPIフラッシャーをArduinoで作ります。
Arduinoで作ったインタフェースでflashromを使ってSPI接続のFlashを読んだり,
書き込んだりすることができます。
別にArduinoで作らなくてもflashromで使えるインタフェースボードは,
秋月のFTD2232とかが乗った完成品買っても千円くらいなんですが,
今回は手持ちのArduinoUNOがあったので,これでやってみました。
とりあえずここを参考にやってみます。
まず,Arduino用のビルド環境を作ります。
Debianの場合はarduinoっていう名前の仮想パッケージがあるので,これを導入します。
$ sudo apt-get arduino
超簡単ですね。これでavr-gccとか一式全部入ります。(すげー
次にArduinoのフラッシャープログラムは公開されてるので,gitでもらってきます。
git clone --recursive git://github.com/urjaman/frser-duino
上のサイトにも書いてありますが,
今回はArduinoUNOを対象にしているのでUSBシリアルインタフェースがAtmega16u2を使ってるので
次のようにmakeします。
$ cd frser-duino $ make u2 DFLAGS= FRBAUD=115200 make clean all make[1]: Entering directory '/home/xxxx/src/frser-duino' rm -f frser-duino.bin rm -f frser-duino.out rm -f frser-duino.hex rm -f frser-duino.s rm -f *.o avr-gcc -mmcu=atmega328p -DBAUD=115200 -Os -Wl,--relax -fno-inline-small-functions -fno-tree-switch-conversion -frename-registers -g -Wall -W -pipe -flto -fwhole-program -std=gnu99 -Ilibfrser -I. -o frser-duino.out main.c uart.c spihw.c libfrser/frser.c libfrser/udelay.c libfrser/spilib.c libfrser/spihw_avrspi.c In function ‘__vector_18’: uart.c:31:1: warning: ‘_vector_18’ appears to be a misspelled signal handler [enabled by default] ISR(USART_RX_vect) { ^ avr-size frser-duino.out text data bss dec hex filename 1378 0 1036 2414 96e frser-duino.out make[1]: Leaving directory '/home/xxxx/src/frser-duino'
とりあえずビルドできたようです。
次にできたバイナリをArduinoに焼きこみます。
ArduinoUNOをPCに接続してやると /dev/ttyACM0 として見えるはずなので,
まずは確認します。
$:~/src/frser-duino$ ls /dev/tty*
/dev/tty /dev/tty15 /dev/tty22 /dev/tty3 /dev/tty37 /dev/tty44 /dev/tty51 /dev/tty59 /dev/tty9
/dev/tty0 /dev/tty16 /dev/tty23 /dev/tty30 /dev/tty38 /dev/tty45 /dev/tty52 /dev/tty6 /dev/ttyACM0
/dev/tty1 /dev/tty17 /dev/tty24 /dev/tty31 /dev/tty39 /dev/tty46 /dev/tty53 /dev/tty60 /dev/ttyS0
/dev/tty10 /dev/tty18 /dev/tty25 /dev/tty32 /dev/tty4 /dev/tty47 /dev/tty54 /dev/tty61 /dev/ttyS1
/dev/tty11 /dev/tty19 /dev/tty26 /dev/tty33 /dev/tty40 /dev/tty48 /dev/tty55 /dev/tty62 /dev/ttyS2
/dev/tty12 /dev/tty2 /dev/tty27 /dev/tty34 /dev/tty41 /dev/tty49 /dev/tty56 /dev/tty63 /dev/ttyS3
/dev/tty13 /dev/tty20 /dev/tty28 /dev/tty35 /dev/tty42 /dev/tty5 /dev/tty57 /dev/tty7
/dev/tty14 /dev/tty21 /dev/tty29 /dev/tty36 /dev/tty43 /dev/tty50 /dev/tty58 /dev/tty8
で,PCから認識されたら早速焼いてみます。
$:~/src/frser-duino$ sudo make u2-flash make: *** No rule to make target 'u2-flash'. Stop. evilmaster@baraquiel:~/src/frser-duino$ sudo make flash-u2 BLBAUD=115200 SERIAL_DEV=/dev/ttyACM0 make program make[1]: Entering directory '/home/xxxx/src/frser-duino' avr-objcopy -j .text -j .data -O ihex frser-duino.out frser-duino.hex avrdude -c arduino -p m328p -P /dev/ttyACM0 -b 115200 -U flash:w:frser-duino.hex avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e950f avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "frser-duino.hex" avrdude: input file frser-duino.hex auto detected as Intel Hex avrdude: writing flash (1378 bytes): Writing | ################################################## | 100% 0.23s avrdude: 1378 bytes of flash written avrdude: verifying flash memory against frser-duino.hex: avrdude: load data flash data from input file frser-duino.hex: avrdude: input file frser-duino.hex auto detected as Intel Hex avrdude: input file frser-duino.hex contains 1378 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.18s avrdude: verifying ... avrdude: 1378 bytes of flash verified avrdude: safemode: Fuses OK (E:00, H:00, L:00) avrdude done. Thank you. make[1]: Leaving directory '/home/xxxx/src/frser-duino'
お,焼けたようですね。
これでArduinoUNOはflashromで認識できるSPIフラッシャーになりました。
次回はこれで実際にSPI Flashの中身を読みだしてみたいと思います。