nyacom.net

ほとんど自分向けの外部記憶装置。

Arduino UNOをSPIフラッシャーにする

      2015/08/10

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の中身を読みだしてみたいと思います。

 - electronics