SSブログ

BBBのU-BootでHello, World実行

U-BootでBBB上にファイルをロードして実行させてみる。
u-boot/examples/standalone/ ディレクトリに hello_world.cがある。
こいつは、u-bootそのものをビルドする時に、ついでにビルドされている。

ディレクトリには
 hello_world*
  hello_world.bin
  hello_world.srec
バイナリが生成されているが、hello_world*はELFファイル形式で、
これに余分なものをとっぱらったのが、hello_world.bin。
今回はu-boot側でloadbでファイル転送するので、これを使う。
(U-bootでloadsで、*.srecも転送できるようだが試していない)

■U-Boot on BBBでの手順

(1) ファイルダウンロード
U-Boot# loadb 80300000

※ロード先メモリアドレスは、0x80300000じゃないとNG。
 hello_world 側のコンパイル時に-Ttext で上記アドレス指定しているから。

(2) 実行
U-Boot# go 80300000
## Starting application at 0x80300000 ...
Example expects ABI version 6
Actual U-Boot ABI version 6
Hello World
argc = 1
argv[0] = "80300000"
argv[1] = ""
Hit any key to exit ... 

よしっと。


(※補足)
*U-Boot <-> minicomでファイル転送する方法
http://oodiarydiary.blog.so-net.ne.jp/2014-03-23


以上。

minicomでBBBのU-Bootにファイル転送を行う (Mac OS X)

BBBとMac Book AirとをUSB-TTLシリアルコンバータで繋げて、
minicomで端末通信はできているのだけれど、ファイル転送がうまく行かない。

せっかくのU-Bootなので、シリアル経由でバイナリファイルを転送して、
そのままプログラムを実行してみたい。

U-Bootでは、loadb, loadx, loady などいくつかファイル転送コマンドが用意されている。
Minicom側も Alt-Z → S でファイル転送モードに入って、xmodem, ymodem, kermitと選べるが、どれを試してもうまく行かなかった。

調べると、xmodem, ymodemは minicomとU-Bootのしゃべるプロトコルが食い違ってるっぽい。
で、kermit の方はどうやら設定が違っていたようだ。(そもそもインストールしてなかった・・・)

■Kermitのインストール
Macの場合homebrewのパッケージにあった。

  $ brew install c-kermit

■minicomのkermitの設定
参照:
   http://comments.gmane.org/gmane.comp.boot-loaders.u-boot/9233
   上記サイトの最後のxianghuaさんの回答を参照。

手順:
(1) minicom -s で設定モードに入る
(2) [File Transfer protocols] を選ぶといろいろ出てくるが、kermit の設定ラインが2つ出てくる。
(3) 以下の設定になればよい。

  kermit /usr/local/bin/kermit -i -l %f -b %b -s YUYNN
  kermit /usr/local/bin/kermit -i -l %f -b %b -r NDYNN

上記設定をした後、minicomでつなげて、U-Boot側で

 $ loadb

と打ったあとに、Alt-Z S とうち、minicomのファイル転送モードに入って
kermitを選んで、さらにファイルを選べばOK。


以上。

BBB(am335x)のブートシーケンス調べる(MLOのロード先アドレス)

BBBのブートシーケンスを調べるのつづき。
am335xは起動時に内蔵ROMのBoot Codeから、
何かしら外部めもり(eMMC, SD)上のMLOイメージを探してRAM上にコピーするらしい。

■内蔵RAM Map
----------------------0x402F0400 
|                    |
|  Downloaded image  |
|                    |
|                    |
|--------------------|0x4030B800
|  6KB Public stack  |
|--------------------|0x4030CE00
|   RAM Exc. Vectors |
|--------------------|
|   Tracing Data     |
|--------------------|
|   Static Variables |
----------------------0x4040FFFF 

■u-boot-spl.bin
     1	130000ea 14f09fe5 14f09fe5 14f09fe5 
     2	14f09fe5 14f09fe5 14f09fe5 14f09fe5 
     3	20042f40 24042f40 28042f40 2c042f40 
     4	30042f40 34042f40 38042f40 78563412 

■MLOの中身
     1  40000000 0c000000 00000000 00000000 
     2  00000000 43485345 5454494e 47530000 
     3  ffffffff ffffffff ffffffff ffffffff 
     4  ffffffff ffffffff ffffffff ffffffff 
     5  c1c0c0c0 00010000 00000000 00000000 
     6  00000000 00000000 00000000 00000000 
     7  00000000 00000000 00000000 00000000 
     8  00000000 00000000 00000000 00000000 
     9  00000000 00000000 00000000 00000000 
    10  00000000 00000000 00000000 00000000 
    11  00000000 00000000 00000000 00000000 
    12  00000000 00000000 00000000 00000000 
    13  00000000 00000000 00000000 00000000 
    14  00000000 00000000 00000000 00000000 
    15  00000000 00000000 00000000 00000000 
    16  00000000 00000000 00000000 00000000 
    17  00000000 00000000 00000000 00000000 
    18  00000000 00000000 00000000 00000000 
    19  00000000 00000000 00000000 00000000 
    20  00000000 00000000 00000000 00000000 
    21  00000000 00000000 00000000 00000000 
    22  00000000 00000000 00000000 00000000 
    23  00000000 00000000 00000000 00000000 
    24  00000000 00000000 00000000 00000000 
    25  00000000 00000000 00000000 00000000 
    26  00000000 00000000 00000000 00000000 
    27  00000000 00000000 00000000 00000000 
    28  00000000 00000000 00000000 00000000 
    29  00000000 00000000 00000000 00000000 
    30  00000000 00000000 00000000 00000000 
    31  00000000 00000000 00000000 00000000 
    32  00000000 00000000 00000000 00000000 
    33  2c9a0100 00042f40 130000ea 14f09fe5 
    34  14f09fe5 14f09fe5 14f09fe5 14f09fe5 
    35  14f09fe5 14f09fe5 20042f40 24042f40 
    36  28042f40 2c042f40 30042f40 34042f40 
    37  38042f40 78563412 00042f40 00fc7040 

■さて
u-boot-spl.bin は先頭から実行コードが入っている。
以下のサイトによると、MLOは、これに8バイトの情報を先頭に付加する。とある。
(http://beagle1.blog.so-net.ne.jp/2011-07-26)

  (1) ファイルサイズ:4 bytes
  (2) ロードアドレス:4 bytes

データはファイルの中でリトルエンディアンで配置されてるようだ。

しかし、手元でU-Bootをビルドして作ったMLOは、
なぜか上記8バイト以外に、512バイトのデータが先頭にくっついている。
(どうやらu-bootではtools/mkimageでu-boot用イメージをつくるが、
これ上記サイトのx-loaderとは違うものらしい))

でもまあ、とりあえず、x-loaderのサイズと配置させる先頭アドレスは下記のとおり。
 
  ファイルサイズ:019a2c   -> 105004 bytes
  ロードアドレス:402f0400 -> 内蔵RAMアドレスの先頭

105004はu-boot-spl.binのファイルサイズと一致。
一応整合性は確認できた。

以上。

BBB(am335x) のROM exception vectorの中身を調べる

■ROM MAP
以下TIのam335xの技術リファレンスマニュアルを参照。

---------------------- 0x20000
|  ROM Exc. Vectors  |
|--------------------| 0x20020
|  Public ROM CRC    |
|--------------------| 0x20080
|     Dead loops     |
|--------------------| 0x20100
|                    |
|      Code          |
|                    |
|                    |
|--------------------| 0x2BFFC
|    ROM Version     |
---------------------- 0x28fff

上記のROM Exc. Vectorsの配置は以下の通り。

----------------------------
| 20000h |  Reset          | Branch to the Public ROM Code startup
|--------------------------|
| 20004h | Undefined       | PC = 4030CE04h
|--------------------------|
| 20008h | SWI             | PC = 4030CE08h  
|--------------------------|
| 2000Ch | Pre-fetch abort | PC = 4030CE0Ch
|--------------------------|
| 20010h | Data abort      | PC = 4030CE10h
|--------------------------|
| 20014h | Unused          | PC = 4030CE14h
|--------------------------|
| 20018h | IRQ             | PC = 4030CE18h
|--------------------------|
| 2001Ch | FIQ             | PC = 4030CE1Ch
---------------------------

■使用ツール
(1) U-Boot
(2) オンライン逆アセンブラ(http://www.onlinedisassembler.com/odaweb/)

■U-Bootのmdで0x20000をdump

U-Boot# md 20000
00020000: ea000232 e59ff018 e59ff018 e59ff018    2...............
00020010: e59ff018 e59ff018 e59ff018 e59ff018    ................

ARMのVector tableはアドレスではなくて、マシン語命令が入ってるようだから、
これだけだと分からん。調べるとオンラインの逆アセンブラがあった!
(http://www.onlinedisassembler.com/odaweb/)

逆アセンブラ結果。

.data:0x00020000	ea000232	b      0x000208d0	
.data:0x00020004	e59ff018	ldr	pc, [pc, #24]	; 0x00020024	
.data:0x00020008	e59ff018	ldr	pc, [pc, #24]	; 0x00020028	
.data:0x0002000c	e59ff018	ldr	pc, [pc, #24]	; 0x0002002c

なるほど、reset あとは、0x208d0に飛んでいるのか!
ここに am335x の Boot Codeが入っている訳ね。


以上。

Beagle Bone Blackのシリアルデバッグポート(UART0)まわり (u-bootの実装調べる)


■BBBのシリアルデバッグポート
BBB_SRM.pdfを読むと、AM3359A のUART0につながっている。

---
5.6 Serial Debug Port
Serial debug is provided via UART0 on the processor via a single 1x6 pin header. In order to use the interface a USB to TTL adapter will be required. The header is compatible with the one provided by FTDI and can be purchased for about $12 to $20 from various sources. Signals supported are TX and RX. None of the handshake signals are supported.
—-

■AM3359AのUART0のアドレス
アドレスは、0x44e0_9000

これはu-bootのソースでも指定されていた。

am335x_evm.h :
/* NS16550 Configuration */
#define CONFIG_SYS_NS16550_COM1 0x44e09000 /* Base EVM has UART0 */
#define CONFIG_SYS_NS16550_COM2 0x48022000 /* UART1 */
#define CONFIG_SYS_NS16550_COM3 0x48024000 /* UART2 */
#define CONFIG_SYS_NS16550_COM4 0x481a6000 /* UART3 */
#define CONFIG_SYS_NS16550_COM5 0x481a8000 /* UART4 */
#define CONFIG_SYS_NS16550_COM6 0x481aa000 /* UART5 */

■U-Bootのシリアルドライバの実装
BBB向けのu-bootはtargetは am335x_evm でビルドするが、これはどうやら、
ns16550 関連のドライバで実装されているようだ。

それにしても、U-Bootって結構でかいな。ドライバ自体はそれほどでもないが、
実装が階層化され過ぎてて読みにくい。いろんなボードに対応してるからしょうがないのだろうけど。



Beagle Bone Back でμSD card ブートさせる(Mac OS X環境で作成)

BBBでSDブート、やっとうまく行った。
一番つまづいたのは、u-bootのビルドだが…、
最初クロスコンパイル環境が arm-none-eabiだったら素直に行ってたな。(でも勉強になった)

■MLO, U-Bootビルド
MLOはu-bootのソースに入っている。

(1) u-boot ソース取得
$ git clone git://git.denx.de/u-boot.git/

(2) ビルド
$ CROSS_COMPILE=/usr/local/arm-none-eabi/bin/arm-none-eabi- make am335x_evm

上記で、MLO、u-boot.img が出来る。
これを μSD CardのBoot partitionに書き込めばいい訳だ。

■μSD Cardのパーティション作成
MacのfdiskはLinuxのものと違うので、ネットの情報があまりない。
最初にパーティションを切るのに、diskutil を使った。

$ diskutil partitionDisk /dev/disk1 2 MBR "MS-DOS FAT16" BOOT 64M "MS-DOS FAT32" DISK R

で、これだとブートフラグがつかないのでfdisk を使った。
fdisk -e とやると、コマンドプロンプトが出て対話式になる。

---
$ sudo fdisk -e /dev/disk1
fdisk: could not open MBR file /usr/standalone/i386/boot0: No such file or directory
Enter 'help' for information
fdisk: 1> flag 1
Partition 1 marked active.
fdisk: 1> p
Disk: /dev/disk1 geometry: 1936/255/63 [31116288 sectors]
Offset: 0 Signature: 0xAA55
         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
*1: 06 1023 254  63 - 1023 254  63 [         2 -     125000] DOS > 32MB  
 2: 0B 1023 254  63 - 1023 254  63 [    125003 -   30991285] Win95 FAT-32
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
---

Macのfdiskだけでもパーティンション作成はできるかもしれんが、
まあとりあえず上記手順でできたので、fdiskは後でいろいろ動かしてみるとしよう。


■BBBでμSDブート
S2ボタンを押しながら電源を入れる。
もちろんシリアルケーブル繋げないとMac側に情報はでないが、ここら辺は、以下参照。


以上。


ARMクロスコンパイル環境構築(Mac OS X 10.9)

Mac OS X 10.9 上で、ARMクロスコンパイル環境を構築した。
以前H8用に構築した手順をベースにしている。

(※注)
'--target=arm-none-eabi' で構築。
以前 arm-elf で構築したが、これだと U-Bootがうまくビルドできない。(FP instructionうんぬんでこける。)ハマった…。
eabiはHard FP/Soft FP両対応リンク可能なので問題ないようだ。

■必要なパッケージの入手

それぞれ展開したあと、以下ビルド手順。

■binutils
$ cd binutils-2.24
$ mkdir build
$ cd build
$ CFLAGS=-Wno-error=deprecated-declarations ../configure --target=arm-none-eabi  --disable-nls --prefix=/usr/local/arm-none-eabi
$ make
$ sudo make install

■gmpライブラリ
$ cd gmp-4.3.2 
$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local/gmp
$ make
$ make check
$ sudo make install

■mpfrライブラリ
$ cd mpfr-2.4.2
$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp
$ make
$ make check
$ sudo make install

■mpcライブラリ
$ cd mpc-0.8.2
$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr
$ make
$ make check
$ sudo make install

■gcc
$ cd gcc-4.5.2
$ mkdir build
$ cd build
$ ../configure --target=arm-none-eabi --disable-nls --disable-threads --disable-shared   --disable-libssp --enable-languages=c --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --with-mpc=/usr/local/mpc --prefix=/usr/local/arm-none-eabi
$ make
$ sudo make install


以上。

Matzインタビュー記事を読む

ちょっとMatzの古い記事を読んだが、面白い。

http://slashdot.jp/story/03/03/14/0258247/まつもとゆきひろ-答える

特に
  • プログラミング言語は人間のためにあるコンピュータとのインタフェースである
は至言だな。

LarryがRubyを評して、”初心者にとっての驚き最小の原則」の侵害”だと言っている点は
分からなくもない。
例えば、Cの for 文に慣れると、Rubyには同じものないところが少々もどかしかったりする。
(Rubyのfor分がOOP的にきれいだが)

一方で、パラダイムって結局慣れだし、最初からそういうものだと分かれば、
初心者も何もない気がする。
BASICから入った人がCに出会ったときに驚くだろうけど、
Cを最初から学んだ人は、とまどうこともない。しょっぱならからそういうものだと学んでしまう。
for文の使い方と同じで、要は慣れた考え方からは、なかなか離れられないってだけだな。



タグ:Matz Ruby

エンジニアの投資

最近「情熱プログラマー」の原書を読みはじめているが、
著者のChad Fowlerを調べたら、なかなか面白い記事が出た。

http://magazine.rubyist.net/?0033-ChadFowlerOnRuby

Rubyがまだ無名の頃のアメリカでの受け入れられ方と、
Railsが出てブレークしたするまでの話が書かれてて、実に興味深い。

「情熱プログラマー」のはじめの方では、技術の勉強に時間を投資する話が出ていて、
Rubyはそういう意味でハイリスク・ハイリターンの投資だったということだ。

技術者が特定の分野で最前線に躍り出るためには、
世間はおろか専門家の間でも、その技術が海のものとも山のものとも分からない時期に、
リスクを承知で自分の時間を費やして勉強する。そういう判断をする必要がある。
(まだ読み始めたばかりだが、そういう戦略的の話が「情熱プログラマー」に書かれているようだ)

どうなんだろう。
大きな流れを作ってしまえるほどのインパクトをもたらす実力者なら、
そういう戦略は考えなくても済むかもしれない。(Kernighan、Martin Fowler、Linusとか)

でも、たいていは、そういう特別な存在じゃない人は、
全体の大きな流れを意識して、どう流れを読み、どう乗っかるか、
乗っかりつつ楽しむか。を考えて行動した方がよさそう。ということだな。



タグ:技術 投資 勉強

Mac OS X でSDのパーティションを切る

BBBの起動SDを作りたくて、Mac Boot Air (10.9)でfdiskを使おうとしたが、うまくいかず、
代わりにdiskutil が使えることがわかった。

参照:

実際には、以下のようにパーティションをきった。
USBカードリーダーでSDマウントしたら、/dev/disk1 だったので、これを指定した。

  $ diskutil partitionDisk /dev/disk1 2 MBR "MS-DOS FAT16" BOOT 64M "MS-DOS FAT32" DISK R


FAT16のパーティション1を64MB用意した感じ。

ブートフラグの設定の仕方がよくわからんが、まあいいや。


以上。




この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。