2011年2月10日木曜日

ODROID-7のU-BOOT、Kernel、Androidを書き換える

さて前回まででビルドは完了しました。お次はOdroid-7の中身をビルドしたもので置き換える方法です。

http://dev.odroid.com/projects/odroid-t/wiki/UbootPage#s-6
http://dev.odroid.com/projects/odroid-t/wiki/KernelPage#s-5
http://dev.odroid.com/projects/odroid-t/wiki/AndroidPage#s-7
書いてある通りです。

いくつか方法はありますが、Ubuntu上でビルドしてありますので、Odroid-7への転送と書き換えも全てUbuntu上でやってしまいましょう。(使用したのはUbuntu 10.04です。)

まずは環境の準備ですが、
接続に必要なので(及び付属されていないので)以下を用意しましょう。
  • RS232Cポート(シリアルポート, Dサブ9ピン)
    ・・・PCに付いていない場合はUSB-Serial変換ポートを購入して用意しましょう。「USB-RS232Cコンバータ」などという名前で売られています。
  • RS232Cストレートケーブル
    ・・・末端がDサブ9ピンのオスとメスになっているケーブルです。

それから、Ubuntuに追加でパッケージのインストールが必要です。
まずは
$ sudo apt-get install libusb-dev
また、
http://dev.odroid.com/frs/download.php/22/Linux-dltool.tar.gz
からOdroid-7へのファイル転送用ツールをダウンロードして以下のように展開します。
$ tar xvzf Linux-dltool.tar.gz
(dltoolに展開される。)
$ cd dltool
$ sudo cp smdk-usbdl /usr/local/bin
(私の環境ではsmdk-usbdlはそのまま実行可能でした。環境によっては再ビルドが必要になるかもしれません。)
あとはシリアル通信用のツールが必要です。とりあえずPuTTYでいいか。
$ sudo apt-get install putty
以上で準備は完了。

続いてはODROID-7との接続です。下の写真のようにODROID-7にデバッグボードと電源ケーブルを接続し、デバックボードからPCへ、RS232Cストレートケーブルと、専用USBケーブルを接続します。
※Androidが起動している状態では通常通りadbが利用できます。

Ubuntu側のPuTTYでの接続ですが、Speedを「115200」に指定するぐらいです。
私の環境(USB-RS232Cコンバータが"/dev/ttyUSB0"と認識されている)では、以下のような設定で接続できました。
ちなみにPuTTYは、「アプリケーション」→「インターネット」→「PuTTY SSH Client」から起動できます。


接続の確認方法としては、ODROID-7の電源が入っている状態であれば、接続後に開くPuTTYのコンソールで「Enter」を一回叩きます。
[Enterキーを入力]
#
(プロンプトが表示される)
"#"のプロンプトが表示されれば接続は成功です。

接続後、次の作業に進むためにODROID-7をパワーオフしておきましょう。

デバッグボードの「JIGON」ボタンを1秒ぐらい押すとODROID-7が起動します。(電源スライド操作で通常通り電源ONさせても良いです)
このときPuTTYのコンソールを見て、何か文字が表示されたらすばやく「Enter」キーを押してAndroidの起動をキャンセルしなければなりません。

PuTTYのコンソール
(電源OFFした状態で、デバッグボードの「JIGON」ボタンを押す)
U-Boot 1.3.4-dirty (May 18 2010 - 23:33:57) for HKDKC110 D Type

CPU: S5PC110@1000MHz(OK)
...
(略)
...
Hit any key to stop autoboot: 0
※このとき(これが表示される前に)Enterキーを叩いてautobootを止める
HKDKC110 #
(このプロンプトが表示されれば成功!)
タイミングが結構シビアですので失敗してAndroidが起動してしまった場合はもう一度電源をOFFしてやり直しましょう。

では個別に書き換え方法及び確認方法を見ていきましょう。

u-boot.binの書き換え
まずはu-bootの書き換えですが、これは上記の"HKDKC110#"というプロンプトが表示されている状態からはじめます。

PuTTYのコンソールにて
HKDKC110 # run dnwu
OTG cable Connected!
Now, Waiting for DNW to transmit data
(このように表示されファイル転送受け入れ待ち状態となります。)

この状態で上の準備編で展開したdltoolを使用してファイルを転送するわけですが、ちゃんと専用USBケーブルが転送用に認識されているか、以下のコマンドを打ってを確認してみます。
Ubuntuコンソールにて
$ lsusb
...
BUS 001 Device 007: ID 04e8:1234 Samsung Electronics Co., Ltd
...
上記のように"Samsung"の何かが認識されていれば準備OKです。
u-boot.binの転送を行いましょう。

Ubuntuコンソールにて
$ sudo smdk-usbdl -f u-boot.bin
※"u-boot.bin"はu-boot.binへのファイルパスを入力します。
=> found device: bus 001, dev 013
=> loaded 278528 bytes from u-boot.bin
=> Downloading 278538 byte to 0x30000000
=> Data checksum fba9
=> usb bulk write() returned 278538
$
(上のように表示されてプロンプトに戻れば成功です。)

また、PuTTYコンソールの方では
Download Done!! Download Address: 0x30008000, Download Filesize:0x44000
Checksum is being calculated.
Checksum O.K.
writing BL1.. 9, 16
MMC write: dev # 0, block # 9, count 16 ... 16 blocks written: OK
completed
writing bootloader.. 57, 1024
MMC write: dev # 0, block # 57, count 1024 ... 1024 blocks written: OK
completed
HKDKC110 #
(プロンプトに戻れば書き換え終了)

書き換わったことを確認するには、u-bootの起動時ログを見るとわかります。
例えば今の続きでPuTTYコンソールにて
HKDKC110 # reset
(u-bootが再起動するので、すぐにEnterキーを叩く)
reset...

OK

U-Boot 1.3.4 (Feb 10 2011 - 11:26:37) for HKDKC110 D Type
...
というようにu-bootをビルドした日時に変わっていることで確認できます。

Kernel(zImage)の書き換え
zImageの書き換えもu-bootと同様にPuTTYコンソールで接続して"HKDKC110 #"プロンプトが表示されている状態からはじめます。コマンドが異なりますが、流れはほぼ一緒です。

PuTTYコンソールにて
HDKC110 # run dnwk
OTG cable Connected!
Now, Waiting for DNW to transmit data

Ubuntuコンソールにて
$ sudo smdk-usbdl -f zImage -a 0x30008000
※"zImage"はzImageへのパスを入力する。通常はkernelをビルドしたディレクトリのarch/arm/boot/にできています。
=> found device: bus 001, dev 016
=> loaded 3229632 bytes from zImage
=> Downloading 3229642 bytes to 0x30008000
=> Data checksum 9630
=> usb_bulk_write() returned 3229642
$

これに伴いPuTTYコンソールでは
Download Done!! Download Addres: 0x30008000, Download Filesize:0x3147c0
Checksum is being calculated....
Checksum O.K.
writing kernel.. 1081, 8192
MMC write: dev # 0, block # 1081, count 8192 ... 8192 blocks written: OK
completed
HKDKC110 #
これで書き換えは完了です。

書き換えられたことを確認するには、一度Androidを立ち上げる必要があります。
PuTTYコンソールにて
HKDKC110 # boot
(Androidの起動シーケンスに入ります。)

Androidが起動したら「Settingsアプリ」→「About phone」の『Kernel version』を確認してみてください。ビルドした際のユーザ名@マシン名に変わっていると思います。

Android(systemとramdisk)の書き換え
最後はAndroidのsystem(Androidのコアとなる部分)とramdisk(ルートファイルシステム)を書き換えます。

まずsystemの書き換えです。これはODROID-7の電源を切ってMicroSDを抜いて、UbuntuのPCに挿して中身を書き換えます。

Ubuntuコンソールにて通常のファイルコピーコマンドで中身を上書きします。
$ sudo cp -a android/odroid7-img/system/* /media/[Ubuntuに認識されているAndroidのsystemパーティション]
※ MicroSDを挿したときに認識される3つのパーティションの内、272MBの容量を持つ方です。

続いてはramdisk-uboot.imgです。これは再びPuTTYで接続し"HKDKC110 #"のプロンプトが出ているところからはじめます。
PuTTYコンソールにて
HKDKC110 # run dnwr
OTG cable Connected!
Now, Waiting for DNW to transmit data

Ubuntuコンソールで
$ sudo smdk-usbdl -f android/odroid7-img/ramdisk-uboot.img
=> found device: bus 001, dev 049
=> loaded 1299776 bytes from android/odroid7-img/ramdisk-uboot.img
=> Downloading 1299786 bytes to 0x30000000
=> Data checksum 6e2f
=> usb bulk write() returned 1299786
$

PuTTYコンソールは、
Download Done!! Download Address: 0x30008000, Download Filesize:0x13d540
Checksum is being calculated..
Checksum O.K.
writing RFS.. 9273, 6144
MMC write: dev # 0, block # 9273, count 6144 ... 6144 blocks written: OK
completed
HKDKC110 #

書き換わったことを確認するにはAndroidを起動させます。

Androidが起動したらやはり「Settingsアプリ」→「About phone」の『Build number』を確認しましょう。
ビルド環境に応じて書き換わっていることが確認できます。

0 件のコメント:

コメントを投稿