メーリングリストなどで提供された情報を定期的にまとめて掲載する予定です。
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にロード&ジャンプをしてしまいます。
解決方法として考えられるのは、
- hermitを改造して0xc0200000にする
- もっと細かいpteを作ってp0xc0018000=v0xc0200000になるようにする
- 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] より)
各種カードについて報告されたものは次のとおりです。
- OK : CFカード, SanDisk SDCFB 128MB
- OK : CFカード, SanDisk SDCFB 512MB
- NG : CFカード, GreenHouse GH-CF256MA
- NG : Air-EDGE, NEC Infrontia CFE-02
- NG : 無線LAN, Buffalo WLI2-CF-S11
各カードの詳細は次のとおりです。
- read のみテストし OK (都合により write は実施せず)
- read/write ともに OK (短い text ファイルの読み書き)
- pcmcia0: card appears to have bogus CIS となり使えず
- com0 at pcmcia0 function 0: とデバイス検出後にフリーズ
- pcmcia0: card appears to have bogus CIS となり使えず
([armadillo-dev 39] より)
動作確認の報告結果から
- ストレージ系のカードのみ動作し、通信系は動作しない
- CFにも動作するものとしないものがあり、安心なのはSanDiskのSDCFBシリーズ
という傾向があるようです。ただし、この傾向は今後のドライバへの改良で変わる可能性があります。
コンソールの出力先の選択
コンソールの出力先はconfigファイルのoptions CONUNITで制御できます。デフォルトでは次のようになっています (COM1になっている)。
options CONUNIT=0
これを変更することでCOM1とCOM2を切り替えることができるようになっています。Armadillo-210はケースに格納してしまうとCOM2は使いづらいのでCOM1を使うとよいでしょう。([armadillo-dev 50] より)
Armadillo-210のLEDの色
Armadillo-Jの後継機であるArmadillo-210は互換性を考慮してLEDの色を決めているそうです。([armadillo-dev 53] より)
Armadillo-9とArmadillo-210との判別方法
DeviceCfgレジスタ(0x8093_0080)で見分けることが可能なようです。Armadillo-9は0x08140000、Armadillo-210は0x0a140d00と見えるようです。
([Armadillo 844], [armadillo-dev 55] より)