NetBSD/evbarm (Armadillo-9, Armadillo-210)

Wikiに引越し中です。最新情報はWikiにあります。http://www.tokuda.net/cgi-bin/fswiki/

以下の情報は古いです。上に示したWikiページを御覧ください。

アットマークテクノ社Armadillo-9, Armadillo-210NetBSD/evbarm (日本語) を動作させるページ。

2005-11-12から2005-11-13にかけて本家のソースツリーにArmadillo-9対応コードが取り込まれました。今後はパッチなしにArmadillo-9が動作するようになります。またArmadillo-210についても動作しているようです (Embedded Techonology 2005にて確認)。

現在のステータス

マルチユーザモードで動作しています。ブートログ (boot_sd0a.txt)。比較的安定して動作していると思います (それほど強烈な負荷をかけて運用していないもので)。

動いているもの (デバイスドライバがあるもの)

まだ動かないもの

root fs (ルートファイルシステム) としては次の三つのやりかたがあります。

動作しないデバイスのデバイスドライバや各種情報など、皆様の御協力をお願いします。

開発用メーリングリスト

メーリングリストサーバが復活しました。(2005-11-26現在)。

アットマークテクノ社にもArmadillo製品の汎用的な話題を扱うメーリングリストがありますが、Armadillo-9でNetBSDを動かす話題に特化したarmadillo-devというメーリングリストがあります。

この開発用メーリングリストに参加したい場合には、次のようなメールを送信してください。

購読にあたっての注意事項は次のとおりです。

迷惑メールを避けるために上に示したメールアドレスは@を[at]で置き換えています。実際にメールを送信する際には@で読み換えてください。

購読にあたっては、次のようなやり方でも (うまくいく人には) よいでしょう。

% echo "subscribe armadillo-dev" | mail majordomo[at]nagoya.bug.gr.jp

ダウンロード

各種バイナリファイル、ソース差分、NetBSDに移植された開発ツールを掲載しています。

kernelバイナリ

20050809-UTCでcheckoutしたソースに2005-08-10にMLで流れたソース差分を適用したkernelバイナリです。

ソース差分

Armadillo-9を動作させるためのソースが本家のソースツリーに取り込まれました。関連するsource-changesのメールを次に示します。

以下のファイルは古いものです (参考としての残してあるだけです)。最新の-currentに全て取り込まれています。

バイナリ一式

以下のファイルは古いものです。最新のソースツリーでbuildすれば最新のバイナリが得られるはずです。他にはreleng.netbsd.orgからバイナリを取得する方法があります。

バイナリ一式をhttp://tokuda.ddo.jp/NetBSD/2005/09/20050924/で公開しています。

NetBSD向けに移植されたhermitとshoehorn

カーネルのアップデートやファームウェアの書き換えに使用するツール群はArmadillo-9の標準添付品や本家のダウンロードサイトにはWindowsとLinux版しかありません。これらのツールをNetBSDに移植したものが公開されています。

([armadillo-dev 10] より)

インストール

インストールに関する情報です。

開発に関する情報

メーリングリストなどで提供された情報を定期的にまとめて掲載する予定です。

kernelのロード方法

本体内蔵のフラッシュのkernel領域にhermitを使って直接書き込む方法とコンパクトフラッシュ (以下CFとする) の特定の場所に配置する方法の二通りがあります。

kernel作成の注意点

kernelはELF形式ではなくbinary形式である必要があります。

具体的には、objdump -S -O binary netbsd netbsd.binなどとする必要があります。

また、hermitはkernelが0xc0018000に配置されることを前提としているため、kernelを0xc001800にロードするように設定する必要があります。

実際には、evbarm/conf/mk.armadillo9でこの記述をしてやります。

SYSTEM_FIRST_OBJ=       armadillo9_start.o
SYSTEM_FIRST_SFILE=     ${THISARM}/armadillo9/armadillo9_start.S

KERNEL_BASE_PHYS=0xc0018000
KERNEL_BASE_VIRT=0xc0200000

SYSTEM_LD_TAIL_EXTRA+=; \
        echo ${OBJCOPY} -S -O binary $@ $@.bin; \
        ${OBJCOPY} -S -O binary $@ $@.bin; \
        echo /usr/bin/gzip $@.bin; \
        /usr/bin/gzip $@.bin

EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.bin@}

([armadillo-dev 1] より)

シリアルコンソールへの文字出力

armadillo9_machdep.cのinitarm()でシリアルの初期化 (consinit()) が実行され、シリアルコンソールへの文字出力が可能になりますが、initarm()以前のarmadillo9_start.Sの中でもシリアルコンソールへの文字出力が可能のようです。hermitによってシリアルが初期化されているのが幸いしているそうです。

具体的な実装例はarmadillo_start.Sの先頭で次のようにします。

        /* set temporary stack pointer */
        adr     sp, Ltable
        ldr     sp, [sp]

        /* initialize UART1 */
        bl      init_UART1

(中略)

        mov     r5, #0x4e       /* N */
        bl      write_UART1

(中略)

init_UART1:
        stmfd   sp!, {r4-r5, lr}
        mov     r4, #0x80000000
        add     r4, r4, #0x008c0000
        ldr     r5, [r4, #0x08]
        orr     r5, r5, #0x10
        str     r5, [r4, #0x08] /* enable FIFO */
        mov     r5, #0x01
        str     r5, [r4, #0x14] /* disable interrupt */
        ldmfd   sp!, {r4-r5, pc}

write_UART1:
        stmfd   sp!, {r4, lr}
        mov     r4, #0x80000000
        add     r4, r4, #0x008c0000
        str     r5, [r4, #0x00]
        ldmfd   sp!, {r4, pc}

([armadillo-dev 4] より)

0xc0018000へロードするということ

現在のNetBSD/evbarmではKERNEL_BASE_PHYSとKERNEL_BASE_VIRTの下位20bitが等しいことを前提として固有の初期化部分 (*_start.S) が実装されているようです。

下位20bitということは1MbytesなのでpteはL1を1Mbytes単位のセクションで作れば大丈夫なのですが、Armadillo-9の場合はhermitが0xc001800にロード&ジャンプをしてしまいます。

解決方法として考えられるのは、

  1. hermitを改造して0xc0200000にする
  2. もっと細かいpteを作ってp0xc0018000=v0xc0200000になるようにする
  3. armadillo9_start.Sの中で0xc001800から0xc0200000に自分をコピーする

の三つの方法が考えられ、現在の実装では3の方法 (自分をコピー) をしています。

([armadillo-dev 16] より)

しかしこれでは大きなサイズのkernelを使用した場合に問題があります。

たとえば2Mbytesのkernelをロードした場合、kernelの後半部分は0xc0200000に重なってしまい、何も考えずに0xc001800のコードをコピーするとkernel後半部分を破壊してしまいます。

そこで、上位バンクの0xc4200000にコピーしてから0xc0200000に再コピーするようにする方法をとることで、大きなサイズのkernelを利用可能にしています。

([armadillo-dev 19] より)

内蔵CFスロットの制限事項

PCMCIAドライバ (eppcic) によって内蔵CFスロットをサポートされました。

([armadillo-dev 38] より)

各種カードについて報告されたものは次のとおりです。

  1. OK : CFカード, SanDisk SDCFB 128MB
  2. OK : CFカード, SanDisk SDCFB 512MB
  3. NG : CFカード, GreenHouse GH-CF256MA
  4. NG : Air-EDGE, NEC Infrontia CFE-02
  5. NG : 無線LAN, Buffalo WLI2-CF-S11

各カードの詳細は次のとおりです。

  1. read のみテストし OK (都合により write は実施せず)
  2. read/write ともに OK (短い text ファイルの読み書き)
  3. pcmcia0: card appears to have bogus CIS となり使えず
  4. com0 at pcmcia0 function 0: とデバイス検出後にフリーズ
  5. pcmcia0: card appears to have bogus CIS となり使えず

([armadillo-dev 39] より)

動作確認の報告結果から

という傾向があるようです。ただし、この傾向は今後のドライバへの改良で変わる可能性があります。