11月の技術講座

2015-11-09

テーマ: Orange Pi PCを使ってみる

開催日時 2015年11月27日(金曜日)18:30 ~ 19:30

場所:東京体育館第四会議室

なお今後の開催日時は以下を予定しています。

  • 12/11(金曜日) 18:30-19:30

(場所はいずれも東京体育館第四会議室です)

概要

9月の月例会でChopstxをCortex-A7に移植するという話が小島さんから発表されました。この会でRaspberry Pi 2は、(目的によっては良い製品ですが)自由ソフトウェア運動の観点では残念ながら、ブートローダ、(カーネルやブートローダを作るに必要な)技術情報、一部の必須のドライバの点において「プロプライエタリ・プラットフォーム」と言わざるをえない、と論議されました。

関連して、FSIJでは、かつてKurobox/ProのCPUのバグを突き止めたり、玄柴の配布を発売当時(主に会員に)斡旋したりしてきました。最近ではwandboardとFreescaleのCPUはいいのではないか、と議論しています。

今回はCortex-A7ということでハードルが高いのですが、Orange Pi PCとAllwinner H3が、完璧からは程遠いですが、比較優位として、まぁマシなプラットフォームでしょう、という話をします。

JTAG debuggerをつないで4つのコアをデバッグしてみる、また、間に合えば、Chopstxを動かすデモが見られるでしょう。

話題提供

  • g新部 裕

まだ充分ではなく残念な点

  • Allwinner H3の技術情報開示は必ずしも充分ではない。
    • linux-sunxi.org に解明された情報、マニュアルなどはある。
    • u-bootのsource codeがある。
    • Linux 3.4のsource codeがある。
    • bootの仕組みも(必ずしもベンダから積極的に開示されているわけではないが)解明されている。
  • 回路図の取得にはユーザ登録が必要。
  • Allwinner H3のMMCのハードウェアは高速な転送モード(UHS)をサポートしていない模様。

良い点

  • www.orangepi.org からたどると有用な情報にたどり着ける。
  • 上記から、すぐ使える u-boot, Linux kernel, Debian のimageが提供されている。
  • JTAG debuggerをつなげて動かすことができる。
  • Allwinnerからは(他の半導体ベンダのように)意地悪をするという感じはない。

注意点

  • Cortex-M3などを使っていると半導体ベンダからのマニュアルにドライバを書くのに充分な情報とサンプルコードが提供される、と思いがち。
  • Cortex-A7のSoCでは、それは期待しても無駄。u-boot, Linux kernelがsourceであれば御の字。マニュアルは詳細は記述されずレジスタのアドレスと概念図程度である(それでもあればマシ)。
  • Cortex-M3などを使っているとJTAG debuggerは当たり前と考えるが、そもそもCortex-A7のSoCではデフォルトで使えなくなっているものもある。
  • Cortex-A7(など)のSoCでは、ベンダ(の周辺)がブートローダ、カーネルなどを提供するからユーザは黙って使えという向きもある。ユーザが別のカーネルを用意することは前提とされてなかったり。

Orange Pi PCのJTAG接続

手持ちのOlimexのARM-USB-TINYをつないでOpenOCD 0.9.0で動きました。

Allwinner H3の設定で PA0, PA1, PA2, PA3をJTAGに使う(デフォルトはMMCと重なっている)。 PA0:JTAG_MS, PA1:JTAG_CK, PA2:JTAG_DO, PA3:JTAG_DI の役割。

接続は下記のとおり。

Orange Pi PC extention pins

Vcc3V3    1 2
          3 4
          5 6
          7 8
GND       9 10
JTAG_CK  11 12
JTAG_MS  13 14
JTAG_DI  15 16
         17 18
         19 20
         21 22 JTAG_DO
         ...

ARM-USB-TINY pins

           1 2  Vapp
           3 4  GND
Target DI  5 6
JTAG_MS    7 8
JTAG_CK    9 10
          11 12
Target DO 13 14
          ...

接続の様子。

Orange Pi PC with ARM-USB-TINY

scriptは sun8iw7.cfg として下記のとおり:

# Orange Pi PC

telnet_port 4444
gdb_port 3333

adapter_khz 300

if { [info exists CHIPNAME] } {
   set  _CHIPNAME $CHIPNAME
} else {
   set  _CHIPNAME sun8iw7
}

if { [info exists DAP_TAPID] } {
    set _DAP_TAPID $DAP_TAPID
} else {
    set _DAP_TAPID 0x5ba00477
}

jtag newtap $_CHIPNAME dap -expected-id $_DAP_TAPID -irlen 4 -ircapture 0x01 -irmask 0x0f

set _TARGETNAME0 $_CHIPNAME.cpu0
set _TARGETNAME1 $_CHIPNAME.cpu1
set _TARGETNAME2 $_CHIPNAME.cpu2
set _TARGETNAME3 $_CHIPNAME.cpu3

target create $_TARGETNAME0 cortex_a -chain-position $_CHIPNAME.dap -coreid 0
target create $_TARGETNAME1 cortex_a -chain-position $_CHIPNAME.dap -coreid 1
target create $_TARGETNAME2 cortex_a -chain-position $_CHIPNAME.dap -coreid 2
target create $_TARGETNAME3 cortex_a -chain-position $_CHIPNAME.dap -coreid 3
target smp $_TARGETNAME0 $_TARGETNAME1 $_TARGETNAME2 $_TARGETNAME3

$_TARGETNAME0 configure -event gdb-attach {
    cortex_a dbginit
}
$_TARGETNAME1 configure -event gdb-attach {
    cortex_a dbginit
}
$_TARGETNAME2 configure -event gdb-attach {
    cortex_a dbginit
}
$_TARGETNAME3 configure -event gdb-attach {
    cortex_a dbginit
}

コマンド起動は、こうします。

$ openocd -f interface/ftdi/olimex-jtag-tiny.cfg -f sun8iw7.cfg