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

ひとまずコンパイルを通す作業を始めたが、wm8750と打つのが面倒なのでwmtに全部変えることに。なんとなくuartもcomに名前を変更。

evbarm側にwmtcom_apc.cなるcom用のエントリを作成。
conf/APCもそれに合わせて修正。コンパイルが通るまで一苦労。結局、ixp12x0ベースに直しまくることに。

wmtcomcnputcさえ動いてくれれば、もとのレベルに戻せるということで、ぽつぽ
つと実装を始める。

しかし、文字は出ない。
困ったので、apc_machdep.cにあった文字出力ルーチンを復活させる。

consinitは通っているけど、putcが動いていない模様。無限ループでTX busyを見ているのがいけないのかと思い、comドライバにならってタイムアウト用timo変数を追加してループを抜けるようにしてみたら、ちょろっと文字が出た。

やはりputcが正しく動いていないようだ。状況としては、文字が抜けたりしながら表示を続け、root deviceを聞くところまで進んでいるみたい。表示はぐちゃぐちゃだけど。

u-bootのメモリダンプを眺めつつ、TXONというのもチェックしたほうがいいかなー、ってことでTX BusyとTX Onの両方がOKならループを抜けるというロジックに変更したところ、これがビンゴだったらしく、ちゃんと表示されるようになった。

むしろ、以前よりも高速な気がするぐらいだ。ここまでくれば、入力も動かしたい。

getcのロジックは、実はいいところまで行っていたのだけど、戻り値をもどさず、スケルトンで書いていたreturn 0;をreturn c;にしてやると動くことがわかった。

ということで、めでたく入力と出力ができるようになりました。
WMT # set serverip 192.168.0.10
WMT # tftpboot 8000; go 8000
EEP-less strapping = TRUE
*** Warning: no boot file name; using 'C0A80002.img'
TFTP from server 192.168.0.10; our IP address is 192.168.0.2
Filename 'C0A80002.img'.
Load address: 0x8000
Loading: #################################################################
         ###############################T ##################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ####################T ##################
done
Bytes transferred = 2520192 (267480 hex)
## Starting application at 0x00008000 ...
00008328
NetBSD
00000000 00000000 004808cb 00000412
00000000 00000412 00000004 00000412
c0000000 00000000 004808cb 0000041e
00003000 0000041e 00000004 0000041e
fe000000 d8000000 010fffff 00000412
00003f80 d8000412 00000010 00000412
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
NS
NetBSD/evbarm (APC) booting ...
initarm: Configuring system ...
arm32_bootmem_init: memstart=0, memsize=0x20000000, kernelstart=0x8000
arm32_bootmem_init: kernelend=0x281000
arm32_bootmem_init: adding 130431 free pages: [0x281000..0x1fffffff] (VA 0xc0281000)
arm32_bootmem_init: adding 8 free pages: [0..0x7fff] (VA 0xc0000000)
arm32_kernel_vm_init: 1 L2 pages are needed to map 0x2ac000 kernel bytes
arm32_kernel_vm_init: allocating page tables for vectoradd_pages: adding pv 0xc026fba8 (pa 0x281000, va 0xc0281000, 1 pages) at tail
 kerneladd_pages: appending pv 0xc026fe30 (0x282000..0x282fff) to 0x281000..0x281fff
 vmadd_pages: appending pv 0xc026fe44 (0x283000..0x283fff) to 0x281000..0x282fff
add_pages: appending pv 0xc027886c (0x284000..0x287fff) to 0x281000..0x283fff
add_pages: appending pv 0xc026fe58 (0x288000..0x288fff) to 0x281000..0x287fff
add_pages: appending pv 0xc026fe6c (0x289000..0x289fff) to 0x281000..0x288fff
add_pages: appending pv 0xc026fe80 (0x28a000..0x28afff) to 0x281000..0x289fff
add_pages: appending pv 0xc026fe94 (0x28b000..0x28bfff) to 0x281000..0x28afff
add_pages: appending pv 0xc026fea8 (0x28c000..0x28cfff) to 0x281000..0x28bfff
add_pages: appending pv 0xc026febc (0x28d000..0x28dfff) to 0x281000..0x28cfff
add_pages: appending pv 0xc026fed0 (0x28e000..0x28efff) to 0x281000..0x28dfff
add_pages: appending pv 0xc027012c (0x28f000..0x28ffff) to 0x281000..0x28efff
add_pages: appending pv 0xc0270140 (0x290000..0x290fff) to 0x281000..0x28ffff
add_pages: appending pv 0xc0270154 (0x291000..0x291fff) to 0x281000..0x290fff
add_pages: appending pv 0xc0270168 (0x292000..0x292fff) to 0x281000..0x291fff
add_pages: appending pv 0xc027017c (0x293000..0x294fff) to 0x281000..0x292fff
add_pages: appending pv 0xc0270118 (0x295000..0x296fff) to 0x281000..0x294fff
add_pages: appending pv 0xc026fc24 (0x297000..0x29afff) to 0x281000..0x296fff
Creating L1 page table at 0x00284000
arm32_kernel_vm_init: adding L2 pt (VA 0xc0281000, PA 0x281000) for VA 0xffff0000
 (vectors)arm32_kernel_vm_init: adding L2 pt (VA 0xc0282000, PA 0x282000) for VA 0xc0000000 (kernel)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0283000, PA 0x283000) for VA 0xc1000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0288000, PA 0x288000) for VA 0xc1400000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0289000, PA 0x289000) for VA 0xc1800000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc028a000, PA 0x28a000) for VA 0xc1c00000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc028b000, PA 0x28b000) for VA 0xc2000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc028c000, PA 0x28c000) for VA 0xc2400000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc028d000, PA 0x28d000) for VA 0xc2800000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc028e000, PA 0x28e000) for VA 0xc2c00000 (vm)
Mapping kernel
arm32_kernel_vm_init: adding chunk for kernel text 0x8000..0x1adfff (VA 0xc0008000)
add_pages: adding pv 0xc026fb94 (pa 0x8000, va 0xc0008000, 422 pages) before pa 0x281000
arm32_kernel_vm_init: adding chunk for kernel data/bss 0x1ae000..0x280fff (VA 0xc01ae000)
add_pages: appending pv 0xc026fbfc (0x1ae000..0x280fff) to 0x8000..0x1adfff
add_pages: merging pv 0xc026fba8 (0x281000..0x29afff) to 0x8000..0x280fff
Listing Chunks
arm32_kernel_vm_init: pv 0xc026fb94: chunk VA 0xc0008000..0xc029afff (PA 0x8000, prot 3, cache 1)

Mapping Chunks
arm32_kernel_vm_init: mapping last chunk VA 0xc0008000..0xc029afff (PA 0x8000, prot 3, cache 1)
pmap_map_chunk: pa=0x8000 va=0xc0008000 size=0x293000 resid=0x293000 prot=0x3 cache=1
PPPPPPPPLLLLLLLLLLLLLLLSLLLLLLLLLPPPPPPPPPPP
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 0x1fffffff 0xc0000000 0xdfffffff 131072
        text section: 0x00008000 0x001adfff 0xc0008000 0xc01adfff 422
        data section: 0x001b0000 0x0026f480 0xc01b0000 0xc026f480 192
         bss section: 0x0026f480 0x002808cc 0xc026f480 0xc02808cc 18
   L1 page directory: 0x00284000 0x00287fff 0xc0284000 0xc0287fff 4
   ABT stack (CPU 0): 0x0028f000 0x0028ffff 0xc028f000 0xc028ffff 1
   FIQ stack (CPU 0): 0x00290000 0x00290fff 0xc0290000 0xc0290fff 1
   IRQ stack (CPU 0): 0x00291000 0x00291fff 0xc0291000 0xc0291fff 1
   UND stack (CPU 0): 0x00292000 0x00292fff 0xc0292000 0xc0292fff 1
  IDLE stack (CPU 0): 0x00293000 0x00294fff 0xc0293000 0xc0294fff 2
           SVC stack: 0x00295000 0x00296fff 0xc0295000 0xc0296fff 2
      Message Buffer: 0x00297000 0x0029afff 0xc0297000 0xc029afff 4
   Exception Vectors: 0x0029b000 0x0029bfff 0xffff0000 0xffff0fff 1
         Free Memory: 0x0029c000 0x1fffffff                       130404
         Free Memory: 0x00000000 0x00007fff                       8
switching to new L1 page table @0x284000...TTBR0=0x284000 OK
done.
nfreeblocks = 2, free_pages = 130412 (0x1fd6c)
bootstrap done.
vectorsvectors = ffff0000, vectors_data = ffff011c
vectors[0] = e59ff114, vectors_data[0] = c001d610
vectors[1] = e59ff114, vectors_data[1] = c001d878
vectors[2] = e59ff114, vectors_data[2] = c001d640
vectors[3] = e59ff114, vectors_data[3] = c001d6d4
vectors[4] = e59ff114, vectors_data[4] = c001d74c
vectors[5] = e59ff114, vectors_data[5] = c001d7c0
vectors[6] = e59ff114, vectors_data[6] = c0049560
vectors[7] = e25ef004, vectors_data[7] = 00000000
 0xffff0000
init subsystems: stacks vectors undefined page pmap_physload pmap [ Kernel symbol table missing! ]
done.
Loaded initial symtab at 0xc01b431c, strtab at 0xc01d319c, # entries 7897
pmap_postinit: Allocated 35 static L1 descriptor tables
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 6.99.23 (APC) #17: Sat Sep 28 14:46:19 UTC 2013
        root@builder.localdomain:/usr/obj/sys/arch/evbarm/compile/APC
total memory = 512 MB
avail memory = 499 MB
mainbus0 (root)
cpu0 at mainbus0 core 0: ARM1176JZ-S r0p7 (ARM11J V6ZK core)
cpu0: DC enabled IC enabled WB enabled LABT
cpu0: 16KB/32B 4-way L1 Instruction cache
cpu0: 16KB/32B 4-way write-back-locking-C L1 Data cache
vfp0 at cpu0: VFP11
obio0 at mainbus0
wmicu0 at obio0 addr 0xd8140000-0xd814ffff
icu-debug:
d8140040: 00000000 -> 00000000
d8140044: 00000000 -> 00000000
d8140048: 00000000 -> 00000000
d814004c: 00000000 -> 00000000
d8140050: 00000000 -> 00000000
d8140054: 00000000 -> 00000000
d8140058: 00000000 -> 00000000
d814005c: 00000000 -> 00000000
d8140060: 00000000 -> 00000000
d8140064: 00000000 -> 00000000
d8140068: 00000000 -> 00000000
d814006c: 00000000 -> 00000000
d8140070: 00000000 -> 00000000
d8140074: 00000000 -> 00000000
d8140078: 00000000 -> 00000000
d814007c: 00000000 -> 00000000
wmtmr0 at obio0 addr 0xd8100000-0xd810ffff intr 48 : WMT System Timer
wmtcom0 at obio0 addr 0xd8200000-0xd820ffff intr 32 : WMT UART
icu: establish_irq: is->is_irq=0x20
icu: unblock: irqbase=0x00000020, irqmask=0x00000001, irq_num=32, reg=0x00000008
icu: establish_irq: is->is_irq=0x30
icu: unblock: irqbase=0x00000020, irqmask=0x00010000, irq_num=48, reg=0x00000008
rn_init: radix functions require max_keylen be set
boot device: <unknown>
root device:
use one of: ddb halt reboot
root device: reboot
syncing disks... done
unmounting file systems...
unmounting done
rebooting...
ただし、まだ割り込みモードでは動いていないので、それはゆくゆく動かせばいいかと。

ということで、ixp12x0_com.cで割り込みがどのように制御されているかを調べた。

CR_RIE, CR_XIEが割り込みのビットなので、これをON/OFFしているところを探した。関数ごとにOn/Offを見てみると次のような関係になっている。
open : RX On
comintr : TX Off, RX Off
rxsoft RX on
start TX on
comintrでなんらか割り込みが上がってきたら、割り込みをOffにして、ソフトウェア割込みに処理を委譲。

ソフトウェア割込みは処理を終わらせたら割り込みをOn、ということのようだ。txsoftがOnにするのではなく、startでOnにしているのは、txsoftで*tp->linesw->l_start)(tp);という行があるので、間接的ではあるがstartが呼ばれるのではないかなぁと思っている。

しかし謎なのは、openでRXだけOnにしているところだ。もしかしたら、ほかの場所でもstartが呼ばれるということなのかもしれない。
ixpcomparamからもstartが呼ばれているし、きっとそのあたりが割り込みをOnにしてくれているのですかね。

ということで、割込みの有効化はmatchやattachなどでやるのではなく、openされた時にやるものだ、ということがわかった。/dev/consoleがopenされるのはいつなのだろう。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0836/tb/