ODROID-GO AdvanceでU-Boot Standalone Applicationsを動かしてみた。

ODROID-GO AdvanceのU-BootでU-Boot Standalone Applicationsを動かしてみました。

公式ドキュメント：http://www.denx.de/wiki/view/DULG/UBootStandalone

# 準備

ハードウェア

* ODROID-GO Advance の基板 にシリアル４ピンコネクタをハンダ付けした。
* hardkernelのUSBシリアル変換基板 + 4pin ケーブル + micro USBケーブル

ODROID-GO Advanceは基板の状態で動作確認しました。

hardkernelのUSBシリアル変換基板には cp2101nが載っているのでsilabs.comからダウンロードしてインストール。



# U-Boot のシリアルコンソール

ODROID-GO Advance はあらかじめ基板上のSPI FLASHにU-Bootが書き込まれています。ターミナルソフトを115200bps 8/N/1 にして電源ケーブルを入れるとブートメッセージが表示されます。Ctrl+Cを押すとコマンド入力を受け付ける状態になります。

```
U-Boot 2017.09-g37d16474aa-dirty (Jan 02 2020 - 15:14:28 +0900)

Model: Rockchip RK3326 ODROID-GO2
PreSerial: 2
DRAM:  992 MiB
Sysmem: init
Relocation Offset is: 3dbc0000
Using default environment

dwmmc@ff370000: 1, dwmmc@ff390000: 0
sfc nor id: b 40 18
GUID Partition Table Header signature is wrong: 0xFFFFFFFFFFFFFFFF != 0x5452415020494645
Repair the backup gpt table OK!
Bootdev(atags): spinor 1
PartType: EFI
init_resource_list: failed to get resource part, ret=-1
dtb in resource read fail, try dtb in spi flash

Device 1: Vendor: 0x0308 Rev: V1.00 Prod: rkflash-SpiNor
            Type: Hard Disk
            Capacity: 16.0 MB = 0.0 GB (32768 x 512)
... is now current device

spinor read: device 1 block # 8192, count 200 ... 200 blocks read: OK
I2c speed: 400000Hz
PMIC:  RK8170 (on=0x40, off=0x00)
vdd_logic 1100000 uV
vdd_arm 1100000 uV
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Model: ODROID-GO2 for linux based on Rockchip rk3326
rockchip_get_boot_mode: Could not found misc partition
boot mode: None
CLK: (sync kernel. arm: enter 600000 KHz, init 600000 KHz, kernel 600000 KHz)
  apll 600000 KHz
  dpll 664000 KHz
  cpll 24000 KHz
  npll 1188000 KHz
  gpll 1200000 KHz
  aclk_bus 200000 KHz
  hclk_bus 150000 KHz
  pclk_bus 100000 KHz
  aclk_peri 200000 KHz
  hclk_peri 150000 KHz
  pclk_pmu 100000 KHz
Rockchip UBOOT DRM driver version: v1.0.1
Using display timing dts
Detailed mode clock 17000 kHz, flags[a]
    H: 0320 0450 0454 0584
    V: 0480 0482 0483 0485
bus_format: 100e
final DSI-Link bandwidth: 450 Mbps x 1
Card did not respond to voltage select!
mmc_init: -95, time 9
** Bad device mmc 1 **
logo.bmp file not found! filesize = 0

spinor read: device 1 block # 8392, count 400 ... 400 blocks read: OK
Uncompressed size: 460854 = 0x70836
Card did not respond to voltage select!
mmc_init: -95, time 9
Card did not respond to voltage select!
mmc_init: -95, time 9

spinor read: device 1 block # 9992, count 400 ... 400 blocks read: OK
Uncompressed size: 460854 = 0x70836
Wait power key
Hit ctrl+c key to enter uboot console
ctrl+c key pressed - drop to console
Net:   Net Initialization Skipped
No ethernet found.
=>
```

# U-Boot スタンドアローンアプリケーションのコンパイル

U-Bootのソースにはhello worldのU-Boot スタンドアローンアプリケーションが含まれています。

ODROID-GO Advance用のU-Bootは https://github.com/hardkernel/u-boot/tree/odroidgoA-v2017.09 にあります。

ODROID-GO Advanceのコンフィグファイル名はodroidgo2_defconfigです。

```
$ make odroidgo2_defconfig
$ CROSS_COMPILE=aarch64-linux-gnu- make
```

とするとビルドができます。

```examples/standalone/hello_world.srec ```にS-Record形式のオブジェクトが生成されます。

ELF形式からS-Record形式にはobjcopyを使って変換できます。

```
$ objcopy -O srec hello_world  hello_world.srec
```

# U-Boot スタンドアローンアプリケーションの実行

アプリはシリアル経由で転送します。S-Record形式をロードするコマンドはloads アドレス、実行するコマンドはgo アドレスです。

```
loads   - load S-Record file over serial line
go      - start application at address 'addr'
```

アプリをロードするアドレスは  CONFIG_STANDALONE_LOAD_ADDR で定義されています。 ODROID-GO Advance の場合は 0xc100000 です。


以下が実行例です、loadsコマンドを実行後にターミナルソフトでhello_world.srecを転送しています。

```
=> loads 0xc100000
## Ready for S-Record download ...

## First Load Addr = 0x0C100000
## Last  Load Addr = 0x0C100319
## Total Size      = 0x0000031A = 794 Bytes
## Start Addr      = 0x00000000
```
```
=> go 0xc100000
## Starting application at 0x0C100000 ...
Example expects ABI version 9
Actual U-Boot ABI version 9
Hello World
argc = 1
argv[0] = "0xc100000"
argv[1] = "<NULL>"
Hit any key to exit ...

## Application terminated, rc = 0x0
```