APC8750にNetBSD/evbarmを移植するための記録 8/19
2014/01/12(日) 25:43 NetBSD はてブ情報 はてブに登録 はてブ数

シリアルポートがぶっ壊れたので、販売元に修理できないかなぁ、とメールしてみた。けど、まぁ、台湾に送って、修理してもらって、送り返されて、などとやっているうちに、きっとすごい時間がかかるだろうし、今のモチベーションを保てる自信もないなぁ。

ということで、もう一台購入してしまいました。

これで、今より何も進まなかったら、すごい無駄遣いになるぞぉ。

動いてもいないハードウェアの2台目を買うなんて、自分でもどうかしてるんじゃないかと思います。

APC8750にNetBSD/evbarmを移植するための記録 8/17
2014/01/09(木) 27:46 NetBSD はてブ情報 はてブに登録 はてブ数

昨日の段階でシリアルコンソールの出力が眼で追える程度に遅いことをTwitterでつぶやいていたところ、清水さんがエスパー力を発揮して、何らかの理由でcomドライバのタイムアウト待ちをしているからじゃないかというアドバイスをもらいました。

アドバイスのとおりsrc/sys/dev/ic/com.c#com_common_putctimo = 150000;という部分を1/100の1500にしてみました。

すると、劇的に表示が早くなり、これまでとは別世界というか、本来の速度でシリアルコンソール出力が可能になりました!

依然として入力はできないもののシリアルコンソール出力もちゃんと動くようになって、root deivceを聞くところまでkernelは起動して、気分もよいので秋葉原に買い物に行ってしまいました。

秋葉原に出かけたのは気分転換もあったのですが、実はAPC8750のシリアルポートのピンヘッダにリード線を無造作につないでいるのが見苦しくて、ちゃんとしたコネクタできれいにつなぎたいなぁという思いがあり、コネクタ等の部品を調達しに行ったのでした。

しかし、これが大きな間違いで、コネクタを買ってきたのはよいのですが、誤った結線で動作確認をしてしまったため、シリアルの入力が物理的に壊れてしまったのです (なぜか出力は動く)。

シリアルの入力ができないとu-bootの操作もできませんし、なにより動いていないシリアルコンソールからの入力を実装することができません。

USBシリアルケーブルを疑ってみたり、リード線を疑ってみたりと試行錯誤をしましたが、やはり故障しているという事実は覆りませんでした。

APC8750にNetBSD/evbarmを移植するための記録 8/16
2014/01/08(水) 27:34 NetBSD はてブ情報 はてブに登録 はてブ数

NetBSDのバナーが表示されたので、その後もごそごそと作業を続け、comドライバがtimerドライバを読んでpanicするという事象にぶち当たりました。

これはcomドライバがdeleyを呼び、それがtimerドライバにあるのですが、その時点ではtimerドライバが初期化されておらず、softcがnullであることからKASSERTでpanicするというものでした。

それを解決するために、Twitterで教えを乞いながら、delayでsoftcがnullだったらすぐにreturnするようにして、なんとかroot deviceを聞いてくるところまで進みました。

ところが、シリアルコンソールから入力ができない状況です。

なぜかなぁと思い、起動時のメッセージを見てみると、割り込みコントローラよりも先にcomドライバが先にattachされています。root deviceを聞いてくるところでは割り込みモードでcomドライバが動いているはずなので、comドライバの初期化と割り込みコントローラの初期化の順番がまずいんじゃないかと思い、割り込みコントローラ、comドライバ、タイマの順にattachされるようにすればいいんじゃないかと考えました。

実は、これはいろんな意味で間違っていて、ずいぶん後に気付くのですが、そんなことも知らず、ドライバのattachの順番を変えるためにオンボードI/O (obio) ドライバでobio_attach_criticalなどという関数を作って頑張ってしまいました。

その時の様子は、http://www.tokuda.net/diary/0799に書いたとおりです。

まぁ、勘違いしているので当たり前なのですが、頑張って思いどおりのデバイスのattach順序になったものの、comドライバからの入力はまるで動かなかったのでした。

しかしまぁ、そういうところを読んだり実際に動かしたおかげで勉強になったこともたくさんあったので良しとしましょう。

APC8750にNetBSD/evbarmを移植するための記録 8/15
2014/01/04(土) 27:56 NetBSD はてブ情報 はてブに登録 はてブ数

initarmをトライアンドエラーで動かそうと試みるも、うまく動かず、またまた諦めそうになる。

そもそも母体にしたのはNetBSD6系のソースだったので、気分転換に最新のソースを見てみました。すると、initarm_commonというinitarmで行う共通の処理をまとめた関数を使っていて、initarm本体はコンパクトに書かれていることに気づきました。

よくわからない自分があてずっぽうでいじるより、共通部分は任せてしまったほうが動きそうな気がするので、急きょ-currentでコンパイルできるように書き換えてしまいました。

すると、initarmでやることは対してなくなってしまい、最低限いじる部分はDRAMの容量とその開始アドレスぐらいになってしまいました。SDRAMがどこにあるのかはapc_start.Sでも悩んだのですが、とりあえず0x0から始めるようにしてしまっているので、ここでも0x0で始めることにしてしまいました。

すると、NetBSDのバナーまでたどり着くことができました!

その時の様子はhttp://www.tokuda.net/diary/0798に書いたとおりです。

APC8750にNetBSD/evbarmを移植するための記録 8/9
2014/01/04(土) 27:01 NetBSD はてブ情報 はてブに登録 はてブ数

BeagleBone Blackを買って遊んだり、JNUG総会&BoFを欠席して懇親会だけ参加してみたり、納涼もんご祭りに遊びに行ったり、OSC京都でLuna見たり、そんなこんなで3か月ほど間が空きました。

さて、initarmまで来たら、次はprintfを動かすのが大きなマイルストンです。
そのための第一歩として、コンソールの初期化ルーチンであるconsinitを実装しなければなりません。

この時点でなぜかシリアルインタフェースが16550互換だと信じ込んでおり、evbarm/armの下にある16550関連のソースを読み比べて、シンプルなhdlg_machdep.cのconsinitをまねてcomドライバを呼ぶ処理を書いてみました。

そして...
U-Boot 1.1.4 (Dec  5 2012 - 19:23:59)
WonderMedia Technologies, Inc.
U-Boot Version : 0.28.00.00
U-Boot code: 03F80000 -> 03FCEE38  BSS: -> 03FF0A88
boot from spi flash.
SF0: ManufID = C2, DeviceID = 2013 (Missing or Unknown FLASH)
     Use Default - Total size = 8MB, Sector size = 64KB
SF1: ManufID = FF, DeviceID = FFFF (Missing or Unknown FLASH)
     Use Default - Total size = 8MB, Sector size = 64KB
flash:
     Bank1: FF800000 -- FFFFFFFF
     Bank2: FF000000 -- FF7FFFFF
Flash: 16 MB
sfboot: NAND init:env nand config fail, use default flash id list info
pllb=0x2270001, spec_clk=0x140a0cff
T1=2, clk1=18, div1=9, Thold=1, tREA=20+delay(9)
T2=1, clk2=36, div2=18, Thold2=1, comp=1
Tim1=442368 , Tim2=589824
T2 is greater and not use
T=2, clk=18, divisor=9, Thold=0x601
divisor is set 0x9, NFC_timing=0x2424
USE_HW_ECC ECC12bit
2048 MB
In:    serial
Out:   serial
Err:   serial
Abort WMT Display Logo Function
WMT #
WMT #
WMT #
WMT #
WMT # set serverip 192.168.0.10
WMT # tftpboot 1000000 netbsd.bin
EEP-less strapping = TRUE
TFTP from server 192.168.0.10; our IP address is 192.168.0.2
Filename 'netbsd.bin'.
Load address: 0x1000000
Loading: ####################################T #############################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ################################
done
Bytes transferred = 2489792 (25fdc0 hex)
WMT # go 1000000
## Starting application at 0x01000000 ...
01000328
NetBSD
00000000 00000000 01473863 00000412
00000000 00000412 00000014 00000412
c0000000 00000000 01473863 0000041e
00003000 0000041e 00000014 0000041e
fe000000 d8000000 010fffff 00000412
00003f80 d8000412 00000010 00000412
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
NetB1S
NetBSD/evbarm (APC) booting ...
initarm: Configuring system ...
physmemory: 0 pages at 0x00000000 -> 0xffffffff
Allocating page tables
Creating L1 page table at 0x01274000
Mapping kernel
pmap_map_chunk: pa=0x0 va=0xc0000000 size=0x119b000 resid=0x119b000 prot=0x3 cache=1
SSSSSSSSSSSSSSSSSLLLLLLLLLPPPPPPPPPPP
pmap_map_chunk: pa=0x119b000 va=0xc119b000 size=0xd9000 resid=0xd9000 prot=0x3 cache=1
PPPPPLLLLLLLLLLLLLPPPP
Constructing L2 page tables
pmap_map_chunk: pa=0x1282000 va=0xc1282000 size=0x1000 resid=0x1000 prot=0x3 cache=1
P
pmap_map_chunk: pa=0x1283000 va=0xc1283000 size=0x1000 resid=0x1000 prot=0x3 cache=1
P
pmap_map_chunk: pa=0x1284000 va=0xc1284000 size=0x1000 resid=0x1000 prot=0x3 cache=1
P
pmap_map_chunk: pa=0x1285000 va=0xc1285000 size=0x1000 resid=0x1000 prot=0x3 cache=1
P
pmap_map_chunk: pa=0x1286000 va=0xc1286000 size=0x2000 resid=0x2000 prot=0x3 cache=1
PP
pmap_map_chunk: pa=0x1274000 va=0xc1274000 size=0x4000 resid=0x4000 prot=0x3 cache=2
PPPP
pmap_map_chunk: pa=0x1278000 va=0xc1278000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x1279000 va=0xc1279000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x127a000 va=0xc127a000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x127b000 va=0xc127b000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x127c000 va=0xc127c000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x127d000 va=0xc127d000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x127e000 va=0xc127e000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x127f000 va=0xc127f000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
pmap_map_chunk: pa=0x1280000 va=0xc1280000 size=0x1000 resid=0x1000 prot=0x3 cache=2
P
devmap: d8000000 -> d8ffffff @ fe000000
pmap_map_chunk: pa=0xd8000000 va=0xfe000000 size=0x1000000 resid=0x1000000 prot=0x3 cache=0
SSSSSSSSSSSSSSSS
                             Physical              Virtual        Num
                       Starting    Ending    Starting    Ending   Pages
               SDRAM: 0x00000000 0xffffffff 0xc0000000 0xbfffffff 0
        text section: 0x00000000 0x0119a473 0xc0000000 0xc119a473 4507
        data section: 0x011a0000 0x0125fdc0 0xc11a0000 0xc125fdc0 192
         bss section: 0x0125fdc0 0x01273864 0xc125fdc0 0xc1273864 21
   L1 page directory: 0x01274000 0x01277fff 0xc1274000 0xc1277fff 4
   Exception Vectors: 0x01281000 0x01281fff 0xffff0000 0xffff0fff 1
           FIQ stack: 0x01282000 0x01282fff 0xc1282000 0xc1282fff 1
           IRQ stack: 0x01283000 0x01283fff 0xc1283000 0xc1283fff 1
           ABT stack: 0x01284000 0x01284fff 0xc1284000 0xc1284fff 1
           UND stack: 0x01285000 0x01285fff 0xc1285000 0xc1285fff 1
           SVC stack: 0x01286000 0x01287fff 0xc1286000 0xc1287fff 2
      Message Buffer: 0x01288000 0x01288fff                       1
         Free Memory: 0x01289000 0xffffffff 0xc1289000 0xbfffffff 1043831
switching to new L1 page table  @0x1274000...OK.
freestart = 0x01289000, free_pages = 1043831 (0x000fed77)
bootstrap done.
init subsystems: stacks vectors undefined page panic: uvm_page_physload: start >= end
Undefined instruction in kernel
Stopped in pid 0.1 (system) at  c100e5b8:
うぉーっ、printfが動いた!
NetBSD/evbarm (APC) booting ...からはprintfで出力されております。

printfが動いた感動を味わう。