::log.2009
[ TOP | Recently ]
NetWalker / STR9102その7 / itojun / STR9105その6.5 - have a *BREAK* / STR9105その6 - PCI config register / STR9105その5 / STR9105その4 / STR9105その3 / STR9105その2 / i.MX memo / MZK-W04G / STR9105その1 / STR8132その9 - GPIO と watchdog / STR8132その8 - mac address と flash と SPI / STR8132その7 - RTC / STR8132その6 / STR8132その5 / Sheeva Plug Serial / Sheeva Plug / STR8100/STR9100デバイスまとめ / Eye-Fi / 00:aa:bb:cc:dd:10 / ICMP6 / Embedded PHY / gcc -fno-delete-null-pointer-checks / cpu_initclocks / TWR-350 / mountroot / copyright / pmap / panic / STR8132その4 / STR8132 その3 / STR8132 その2 / AIR BONE ZT-351 / NetBSD src/usr.sbin/inetd / simple twitter client / /usr/bin/top: show full commandline patch / Hashed and Hierarchical Timing Wheels / canvasで遊ぶ / timetable queue
2009-12-28 NetWalker
発売日に買ってたんだけど普通にX端末として使っていたNetWalker。
i.MX51 の pdf も既に公開されているので、 RedBoot(Linuxのdmesgでわかる)に落ちることさえできれば任意バイナリbootできるようになって、あとはNetBSD移植は単なる作業かなぁと思ってたんだけど、 数ヶ月経ってもORCA愉快日記氏とこ以上の分解を誰もやってくれないようなので、しょうがなく自分で開腹。
基板表





基板裏





基板SDカードスロットおよび電源まわり


基板裏、SDカードスロット横の4つのランドがシリアルだった。写真ではコネクタ取り付け改造済。
SDスロットに近い順から
(配線間違っていたので修正しました! Thanks to @h_kenken)
しかし通常状態だと電源ONしてもいきなり flash から Linux kernel の inflate が始まってしまってシリアルからは何もできない。
こんな感じ。
基板表のディップスイッチを UART-1 HHLLLLHH にしたらbootloaderに落ちるかなと思ったら、そもそもブートしなくなった。なんじゃそりゃ。
というかそもそも UART-1 も USB-OTG も HHLLLLHH になっててよくわからないなぁ。
左右ボタン両押し状態でのリカバリSDからのブートだと何か変わるかと思って試してみたが、 SDからbootしてるっぽいだけでほとんど変わらず…。うーむ。
2009-12-02 STR9102その7
微妙に忙しくてサボっていたがちょっとだけ復活。
STR9105のCWR-635Mがぶっこわれたので、STR9102のPLANEX MZK-W04Gを使って作業を続けようとしていた所でSuspendしていた。
MZK-W04GはSTR9102の内蔵PHYではなくスイッチを別に積んでいるのでそのへんに対応。
これはあっさりできた。内蔵PHYの設定をすっとばす程度でほとんど動いた。
MZK-W04G で作業するようになってから、謎のメモリ壊れる問題がまったく再現しなくなった。やっぱりハードかよ…
ral (RT2561C) を付けて PCI を動かそうとしているが、どうもPCIの割り込みが入らない。
ifconfig ral0 up すると ral0: device timeout となる。どうも up した直後から beacon を送信するが、送信完了割り込みが入ってこずに ifnet が device timeout してるようだ。
割り込みが入らないのは star_pci 側の問題かと思って一ヶ月くらい試行錯誤していたのだが、if_ral の中で ral 自信の割り込みステータスレジスタを表示するようにしても、一向に割り込みがかかっている様子がない。
PCI device が割り込みを出していないんじゃしょうがないなぁ、と思いつつ、ふと ifconfig ral0 mediaopt adhoc とすると割り込みが入った。豪謎。
つまり star_pci 側は問題なかったようだ。ral のせい??? そんなバカな。
別のデバイスではどうかと思って、秋葉原で1000円で買ってきた iwi で試すが、こちらは firmware load の所で timeout となってエラーになる。
同じく割り込みが入ってないんだろう。
なんかよくわからないなぁ…。一度適当なマシンで ral や iwi の正常な動作を把握しないとダメっぽい。
というわけで、こんなこともあろうかと買っておいたALIXが役に立つ日がやっと来たのだった
(つづく)
2009-10-18 STR9105その6.5 - have a *BREAK*
TWR-350 が突然ブートしなくなった。電源を入れなおすと一瞬LEDが付くが、その後完全に沈黙する。シリアルにも何も出ない。
ググると故障報告がチラホラ。故障率高いのか? どうもダメハードっぽい。
というわけで続きは、こんなこともあろうかと買っておいたW04G (CPU:STR9102) でやればいいのだが、 こいつはNICのPHYがCPU内蔵PHYではなくVitesseのvsc7385というphyを使っているので、 またドライバに手を入れないといけなかったのであった。諸行無常。
しかもVSC7385のpdfを拾おうと思ってレジストレーションしたら、さらにNDAがどうのこうので契約しないと読めなかった。個人情報返せfuck you!!!11
いろいろ探してたらLinuxのSTR9100のソースの中に初期化コードがあったのでこれを
どうでもいいけどLinuxのぜんぜん統合できてないマイナーなarchのソースの探しにくさはどうにかならないものか。
2009-10-16 STR9105その6 - PCI config register
PCI config base address register に write しても書けなかったのは、PCI tag の作り方が間違ってたからというアホなミスだった。
データシートに
31 | RW | Enable |
30:24 | RW | Reserved |
23:16 | RW | Bus number |
15:11 | RW | Device number |
10:8 | RW | Function number |
7:2 | RW | Register number |
1:0 | RW | Reserved |
と書いてあったので、思わず
bus_space_write_4(sc->sc_iot, sc->sc_ioh_addr, 0, 0x80000000 | tag | (reg << 2));
としてしまったのですよ。
本当はレジスタは4の倍数しか受けつけないというだけなので
bus_space_write_4(sc->sc_iot, sc->sc_ioh_addr, 0, 0x80000000 | tag | reg);
が正解。今は後悔している。
上のバグコードでも register 0 の PCI vendor/PCI product は正常に読めてしまうので気づくのに時間がかかった…
よく見たら以前の PCI_CONFIG_DUMP の値がめちゃくちゃだな。ここで気づけよ>俺
というわけで修正するとpci deviceのattachまで来た。
: starpci0 at star0 addr 0xa0000000-0xa0000003 irq 8: PCI Host Bridge pci0 at starpci0 unknown vendor 0xeeee product 0x0000 (undefined subclass 0x00) at pci0 dev 0 function 0: PCI configuration registers: Common header: 0x00: 0x0000eeee 0x04000147 0xff000000 0x0000ff04 Vendor ID: 0xeeee Device ID: 0x0000 Command register: 0x0147 I/O space accesses: on Memory space accesses: on Bus mastering: on Special cycles: off MWI transactions: off Palette snooping: off Parity error checking: on Address/data stepping: off System error (SERR): on Fast back-to-back transactions: off Interrupt disable: off Status register: 0x0400 Capability List support: off 66 MHz capable: off User Definable Features (UDF) support: off Fast back-to-back capable: off Data parity error detected: off DEVSEL timing: slow (0x2) Slave signaled Target Abort: off Master received Target Abort: off Master received Master Abort: off Asserted System Error (SERR): off Parity error detected: off Class Name: undefined (0xff) Subclass ID: 0x00 Interface: 0x00 Revision ID: 0x00 BIST: 0x00 Header Type: 0x00 (0x00) Latency Timer: 0xff Cache Line Size: 0x04 Type 0 ("normal" device) header: 0x10: 0x00000000 0xa8000001 0x00000000 0x00000000 0x20: 0x00000000 0x00000000 0x00000000 0x0000eeee 0x30: 0x00000000 0x00000000 0x00000000 0x00000000 Base address register at 0x10 not implemented(?) Base address register at 0x14 type: 32-bit i/o base: 0xa8000000, size: 0x01000000 Base address register at 0x18 not implemented(?) Base address register at 0x1c not implemented(?) Base address register at 0x20 not implemented(?) Base address register at 0x24 not implemented(?) Cardbus CIS Pointer: 0x00000000 Subsystem vendor ID: 0xeeee Subsystem ID: 0x0000 Expansion ROM Base Address: 0x00000000 Reserved @ 0x34: 0x00000000 Reserved @ 0x38: 0x00000000 Maximum Latency: 0x00 Minimum Grant: 0x00 Interrupt pin: 0x00 (none) Interrupt line: 0x00 Device-dependent header: 0x40: 0x00000000 0x00000000 0x00000000 0x00000000 0x50: 0x00000000 0x00000000 0x00000000 0x00000000 0x60: 0x00000000 0x00000000 0x00000000 0x00000000 0x70: 0x00000000 0x00000000 0x00000000 0x00000000 0x80: 0x00000000 0x00000000 0x00000000 0x00000000 0x90: 0x00000000 0x00000000 0x00000000 0x00000000 0xa0: 0x00000000 0x00000000 0x00000000 0x00000000 0xb0: 0x00000000 0x00000000 0x00000000 0x00000000 0xc0: 0x00000000 0x00000000 0x00000000 0x00000000 0xd0: 0x00000000 0x00000000 0x00000000 0x00000000 0xe0: 0x00000000 0x00000000 0x00000000 0x00000000 0xf0: 0x00000000 0x00000000 0x00000000 0x00000000 Don't know how to pretty-print device-dependent header. unknown vendor 0xeeee product 0x0000 (undefined subclass 0x00) at pci0 dev 0 function 0 (intrswiz 0, intrpin 0, i/o on, mem on, no quirks) not configured ral0 at pci0 dev 2 function 0: PCI configuration registers: Common header: 0x00: 0x03021814 0x04100147 0x02800000 0x0000ff04 Vendor Name: Ralink Technologies (0x1814) Device Name: RT2561 802.11b/g (0x0302) Command register: 0x0147 I/O space accesses: on Memory space accesses: on Bus mastering: on Special cycles: off MWI transactions: off Palette snooping: off Parity error checking: on Address/data stepping: off System error (SERR): on Fast back-to-back transactions: off Interrupt disable: off Status register: 0x0410 Capability List support: on 66 MHz capable: off User Definable Features (UDF) support: off Fast back-to-back capable: off Data parity error detected: off DEVSEL timing: slow (0x2) Slave signaled Target Abort: off Master received Target Abort: off Master received Master Abort: off Asserted System Error (SERR): off Parity error detected: off Class Name: network (0x02) Subclass Name: miscellaneous (0x80) Interface: 0x00 Revision ID: 0x00 BIST: 0x00 Header Type: 0x00 (0x00) Latency Timer: 0xff Cache Line Size: 0x04 Type 0 ("normal" device) header: 0x10: 0xb0000000 0x00000000 0x00000000 0x00000000 0x20: 0x00000000 0x00000000 0x00000601 0x922116ef 0x30: 0x00000000 0x00000040 0x00000000 0x00000100 Base address register at 0x10 type: 32-bit nonprefetchable memory base: 0xb0000000, size: 0x00008000 Base address register at 0x14 not implemented(?) Base address register at 0x18 not implemented(?) Base address register at 0x1c not implemented(?) Base address register at 0x20 not implemented(?) Base address register at 0x24 not implemented(?) Cardbus CIS Pointer: 0x00000601 Subsystem vendor ID: 0x16ef Subsystem ID: 0x9221 Expansion ROM Base Address: 0x00000000 Capability list pointer: 0x40 Reserved @ 0x38: 0x00000000 Maximum Latency: 0x00 Minimum Grant: 0x00 Interrupt pin: 0x01 (pin A) Interrupt line: 0x00 Capability register at 0x40 type: 0x01 (Power Management, rev. 1.0) PCI Power Management Capabilities Register Capabilities register: 0x0002 Version: 1.1 PME# clock: off Device specific initialization: off 3.3V auxiliary current: self-powered D1 power management state support: off D2 power management state support: off PME# support: 0x00 Control/status register: 0x0000 Power state: D0 PCI Express reserved: off No soft reset: off PME# assertion disabled PME# status: off Device-dependent header: 0x40: 0x00020001 0x00000000 0x00000000 0x00000000 0x50: 0x00000000 0x00000000 0x00000000 0x00000000 0x60: 0x00000000 0x00000000 0x00000000 0x00000000 0x70: 0x00000000 0x00000000 0x00000000 0x00000000 0x80: 0x00000000 0x00000000 0x00000000 0x00000000 0x90: 0x00000000 0x00000000 0x00000000 0x00000000 0xa0: 0x00000000 0x00000000 0x00000000 0x00000000 0xb0: 0x00000000 0x00000000 0x00000000 0x00000000 0xc0: 0x00000000 0x00000000 0x00000000 0x00000000 0xd0: 0x00000000 0x00000000 0x00000000 0x00000000 0xe0: 0x00000000 0x00000000 0x00000000 0x00000000 0xf0: 0x00000000 0x00000000 0x00000000 0x00000000 Don't know how to pretty-print device-dependent header. Ralink Technologies RT2561 802.11b/g (miscellaneous network) at ? dev 2 function 0 (intrswiz 0, intrpin 0x1, i/o on, mem on, no quirks): Ralink Technologies RT2561 802.11b/g (rev. 0x00) ral0: interrupting at pin 1 ral0: 802.11 address 00:d0:41:b0:ff:32 ral0: MAC/BBP RT2561C, RF RT2527 ral0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps ral0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps ~#Stopped in pid 0.1 (system) at netbsd:cpu_Debugger+0x4: mov r15, r14 db> bt netbsd:comintr+0x10 scp=0xc001bb94 rlv=0xc019f2dc (netbsd:star_intr_dispatch+0x134) rsp=0xc03d8f08 rfp=0xc03d8f34 r10=0xfffffbff r9=0xc03015e8 r8=0x00000400 r7=0x00000100 r6=0xc1114fe0 r5=0xc03d8f38 r4=0xa00000d3 netbsd:star_intr_dispatch+0x10 scp=0xc019f1b8 rlv=0xc00c6770 (netbsd:irq_entry+0x70) rsp=0xc03d8f38 rfp=0xc03d8f9c r10=0xc03015e8 r9=0x000368b8 r8=0x00000000 r7=0x000368b8 r6=0x00000000 r5=0x00000002 r4=0xc03015e8 netbsd:cpu_configure+0x10 scp=0xc000c3fc rlv=0xc00a9b9c (netbsd:main+0x180) rsp=0xc03d8fa0 rfp=0xc03d8fec r4=0x20008134 netbsd:main+0x10 scp=0xc00a9a2c rlv=0xc0008220 (netbsd:kernel_text+0x3c) rsp=0xc03d8ff0 rfp=0xc03d8ffc r10=0x00000000 r9=0x000368b8 r8=0x00000000 r7=0x000368b8 r6=0x0003661c r5=0x00000002 r4=0x20008134 netbsd:kernel_text+0x3c scp=0xc0008220 rlv=0xc019fc14 (netbsd:initarm+0x794) rsp=0xc03d9000 rfp=0x00000000 db>
ral0 を attach した直後で止まった。PCIの割り込みまわりっぽいな。
2009-10-11 STR9105その5
稀にメモリがぶっ壊れるのはどうもドライバのバグとかではなくて、そもそもTWR-350自体が不安定っぽい。 というのは、evbarm/gemini/gemini_machdep.c がやっているように、pmap_map_chunk(〜, VM_PROT_READ|VM_PROT_EXECUTE, 〜) で kernel text 領域を read only にしたのだが、それでもたまに化けることがあるのだ。write protect が機能しているのは確認済み。 DMA のせいかと思っていろいろ試してみたが、DMAを全く使っていない状態でもメモリが壊れることがあったので、やはりDMAでもないだろう。 と言っても最初から入っているLinuxはバカスカ落ちる訳でもなく安定して動いているので、やっぱりNetBSDが何かおかしいんだろうなぁ。 STR8100/9100はパワーマネージメントレジスタで各種クロックやレギュレータの電圧までソフトでコントロールできるので、そのへんの設定が足りないのではなかろうか。 とりあえずいろいろいじって今はそこそこ安定してるので後回し。
というわけで、いろいろ手間取っているがPCIを動かすのである。とりあえず pci config が読めるまで動いた。まだ mapping とか書いてないので pci device の attach が失敗してるけど。
とりあえず dmesg。あいかわらず PCI Vendor ID がふざけた値。
NetBSD/evbarm STR8100/9100 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.20 (STR91xx) #469: Sun Oct 11 04:25:29 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx total memory = 32768 KB avail memory = 27588 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 16KB/16B 2-way Instruction cache cpu0: 16KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Orion Family SoC: STR9100, 200MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 10: ns16550a, working fifo com0: console ohci0 at star0 addr 0xc4000000-0xc400005b irq 23: USB1.1 Host Controller ohci0: OHCI version 1.0, legacy support usb0 at ohci0: USB revision 1.0 ehci0 at star0 addr 0xcc000000-0xcc00006b irq 24: USB2.0 Host Controller ehci0: ohci or uhci probably not configured usb1 at ehci0: USB revision 2.0 starrtc0 at star0 addr 0x7b000000-0x7b000037 irq 14: Real-time Clock starwdog0 at star0 addr 0x7a000000-0x7a00001b irq 3: Watch Dog Timer stargpio0 at star0 addr 0x7c000000-0x7c000047 irq 4: GPIO gpio0 at stargpio0: 32 pins gsec0 at star0 addr 0x70000000-0x7000029b irq 18: Gigabit Switch Engine gse0 at gsec0 port0 gse0: Ethernet address 00:08:a1:c0:45:7e ukphy0 at gse0 phy 0: OUI 0x0009c3, model 0x0005, rev. 4 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gse1 at gsec0 port1 gse1: Ethernet address 00:08:a1:c0:45:7f ukphy1 at gse1 phy 1: OUI 0x0009c3, model 0x0005, rev. 4 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto starpci0 at star0 addr 0xa0000000-0xa0000003 irq 8: PCI Host Bridge pci0 at starpci0 unknown vendor 0xeeee product 0x0000 (miscellaneous prehistoric) at pci0 dev 0 function 0: PCI configuration registers: Common header: 0x00: 0x0000eeee 0xf0000000 0x00000000 0x00000000 Vendor ID: 0xeeee Device ID: 0x0000 Command register: 0x0000 I/O space accesses: off Memory space accesses: off Bus mastering: off Special cycles: off MWI transactions: off Palette snooping: off Parity error checking: off Address/data stepping: off System error (SERR): off Fast back-to-back transactions: off Interrupt disable: off Status register: 0xf000 Capability List support: off 66 MHz capable: off User Definable Features (UDF) support: off Fast back-to-back capable: off Data parity error detected: off DEVSEL timing: fast (0x0) Slave signaled Target Abort: off Master received Target Abort: on Master received Master Abort: on Asserted System Error (SERR): on Parity error detected: on Class Name: prehistoric (0x00) Subclass Name: miscellaneous (0x00) Interface: 0x00 Revision ID: 0x00 BIST: 0x00 Header Type: 0x00 (0x00) Latency Timer: 0x00 Cache Line Size: 0x00 Type 0 ("normal" device) header: 0x10: 0x00000000 0x00000000 0x00000000 0x00000000 0x20: 0x00000000 0x00000000 0x00000000 0x00000000 0x30: 0x00000000 0x00000000 0x00000000 0x00000000 Base address register at 0x10 not implemented(?) Base address register at 0x14 not implemented(?) Base address register at 0x18 not implemented(?) Base address register at 0x1c not implemented(?) Base address register at 0x20 not implemented(?) Base address register at 0x24 not implemented(?) Cardbus CIS Pointer: 0x00000000 Subsystem vendor ID: 0x0000 Subsystem ID: 0x0000 Expansion ROM Base Address: 0x00000000 Reserved @ 0x34: 0x00000000 Reserved @ 0x38: 0x00000000 Maximum Latency: 0x00 Minimum Grant: 0x00 Interrupt pin: 0x00 (none) Interrupt line: 0x00 Device-dependent header: 0x40: 0x0000eeee 0xf0000000 0x00000000 0x00000000 0x50: 0x00000000 0x00000000 0x00000000 0x00000000 0x60: 0x00000000 0x00000000 0x00000000 0x00000000 0x70: 0x00000000 0x00000000 0x00000000 0x00000000 0x80: 0x0000eeee 0xf0000000 0x00000000 0x00000000 0x90: 0x00000000 0x00000000 0x00000000 0x00000000 0xa0: 0x00000000 0x00000000 0x00000000 0x00000000 0xb0: 0x00000000 0x00000000 0x00000000 0x00000000 0xc0: 0x0000eeee 0xf0000000 0x00000000 0x00000000 0xd0: 0x00000000 0x00000000 0x00000000 0x00000000 0xe0: 0x00000000 0x00000000 0x00000000 0x00000000 0xf0: 0x00000000 0x00000000 0x00000000 0x00000000 Don't know how to pretty-print device-dependent header. unknown vendor 0xeeee product 0x0000 (miscellaneous prehistoric) at pci0 dev 0 function 0 (intrswiz 0, intrpin 0, i/o off, mem off, no quirks) not configured ral0 at pci0 dev 2 function 0: PCI configuration registers: Common header: 0x00: 0x03021814 0xffff8000 0x00000000 0x00000000 Vendor Name: Ralink Technologies (0x1814) Device Name: RT2561 802.11b/g (0x0302) Command register: 0x8000 I/O space accesses: off Memory space accesses: off Bus mastering: off Special cycles: off MWI transactions: off Palette snooping: off Parity error checking: off Address/data stepping: off System error (SERR): off Fast back-to-back transactions: off Interrupt disable: off Status register: 0xffff Capability List support: on 66 MHz capable: on User Definable Features (UDF) support: on Fast back-to-back capable: on Data parity error detected: on DEVSEL timing: unknown/reserved (0x3) Slave signaled Target Abort: on Master received Target Abort: on Master received Master Abort: on Asserted System Error (SERR): on Parity error detected: on Class Name: prehistoric (0x00) Subclass Name: miscellaneous (0x00) Interface: 0x00 Revision ID: 0x00 BIST: 0x00 Header Type: 0x00 (0x00) Latency Timer: 0x00 Cache Line Size: 0x00 Type 0 ("normal" device) header: 0x10: 0x00020001 0x00000000 0x00000000 0x00000000 0x20: 0x00000000 0x00000000 0x00000000 0x00000000 0x30: 0x00000000 0x00000000 0x00000000 0x00000000 Base address register at 0x10 type: 32-bit i/o base: 0x00020000, size: 0x00020000 Base address register at 0x14 not implemented(?) Base address register at 0x18 not implemented(?) Base address register at 0x1c not implemented(?) Base address register at 0x20 not implemented(?) Base address register at 0x24 not implemented(?) Cardbus CIS Pointer: 0x00000000 Subsystem vendor ID: 0x0000 Subsystem ID: 0x0000 Expansion ROM Base Address: 0x00000000 Capability list pointer: 0x00 Reserved @ 0x38: 0x00000000 Maximum Latency: 0x00 Minimum Grant: 0x00 Interrupt pin: 0x00 (none) Interrupt line: 0x00 Device-dependent header: 0x40: 0x03021814 0xffff8000 0x00000000 0x00000000 0x50: 0x00020001 0x00000000 0x00000000 0x00000000 0x60: 0x00000000 0x00000000 0x00000000 0x00000000 0x70: 0x00000000 0x00000000 0x00000000 0x00000000 0x80: 0x03021814 0xffff8000 0x00000000 0x00000000 0x90: 0x00020001 0x00000000 0x00000000 0x00000000 0xa0: 0x00000000 0x00000000 0x00000000 0x00000000 0xb0: 0x00000000 0x00000000 0x00000000 0x00000000 0xc0: 0x03021814 0xffff8000 0x00000000 0x00000000 0xd0: 0x00020001 0x00000000 0x00000000 0x00000000 0xe0: 0x00000000 0x00000000 0x00000000 0x00000000 0xf0: 0x00000000 0x00000000 0x00000000 0x00000000 Don't know how to pretty-print device-dependent header. Ralink Technologies RT2561 802.11b/g (miscellaneous prehistoric) at ? dev 2 function 0 (intrswiz 0, intrpin 0, i/o off, mem off, no quirks): Ralink Technologies RT2561 802.11b/g (rev. 0x00) pci_mem_find: expected type mem, found i/o : could not map memory space uhub0 at usb0: Star OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub1 at usb1: Star EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 umass0 at uhub1 port 2 configuration 1 interface 0 umass0: BUFFALO USB Flash Disk, rev 2.00/1.10, addr 2 scsibus0 at umass0: 2 targets, 1 lun per target sd0 at scsibus0 target 0 lun 0: <BUFFALO, USB Flash Disk, 3.10> disk removable sd0: 7648 MB, 15296 cyl, 32 head, 32 sec, 512 bytes/sect x 15663104 sectors boot device: <unknown>
どうでもいいが STR8100/9100 のデバイスの I/O アドレスへのマッピングは大名チックで、
A0000000 | PCI Config Data Reg |
A4000000 | PCI Config Address Reg |
みたいなメモリマップなのである。PCI Config Data Reg も PCI Config Address Reg も 4byte の I/O レジスタが1つあるだけだ。
これをそれぞれ仮想アドレスにmappingするので、TLBのエントリが無駄になってしょうがない。どうしてくれよう。
しかも I/O アドレスが離れているので kernel config に書く時も不便で、現状は
# On-chip PCI Interface starpci0 at star? addr1 0xa0000000 irq 8 pci0 at starpci0
として starpci_attach で address + 0x04000000 を PCI config address と見倣しているのだが、気分的には
# On-chip PCI Interface starpci0 at star? addr1 0xa0000000 addr2 0xa4000000 irq 8 pci0 at starpci0
こう書きたい所だ。しかしこれはこれでどうもなぁ。
つーか SoC なデバイスを kernel config file にずらずらとアドレスやIRQを書くのが間違ってる。 SoC なんだから CPU 側で持ってるデバイスを config_found() すべきだ。 そもそも evbarm/*/*_machdep.c の initarm() で pmap_devmap_register() する時に、全デバイスの I/O アドレスを知ってるんだから。
…と思うんだけど、他のarchはそうしてないんだよね。チキンだから周りに習ってしまいました。
やっぱりそのうち SoC のバスを attach する時に各デバイスを config_found() するように書き換えよう…
2009-10-02 STR9105その4
シリアルが刺さる問題は、割込みモードの設定の不備だった。UART割り込みをレベルトリガからエッジトリガにしたら正常に動くようになった。
しかもエッジトリガにしろ、ってのはよく見たらpdfに書いてあった…
その後いろいろ調べてたら9100用のイーサがぜんぜんダメなことに気がついたので、書きなおす。
かなり安定するようになる。が、CPU datacache enableだとたまに落ちる。しかも落ちる場所が icmp6_input とか ffs_balloc とかだ…。
なんでかなと思いつつ ddb でいろいろ見てたら、icmp6_input のコードがぶっ壊されてることが判明。メモリぶっこわしですか…イーサドライバのキャッシュというかDMAまわりがまだ変なのか。
netbsd.map をよく見たら icmp6.o と ffs_vnops.o はアドレス近くだったのでこのあたりの領域が壊されているのだろう。
週末はこのへんデバッグしつつPCIだな。
しかもエッジトリガにしろ、ってのはよく見たらpdfに書いてあった…
その後いろいろ調べてたら9100用のイーサがぜんぜんダメなことに気がついたので、書きなおす。
かなり安定するようになる。が、CPU datacache enableだとたまに落ちる。しかも落ちる場所が icmp6_input とか ffs_balloc とかだ…。
なんでかなと思いつつ ddb でいろいろ見てたら、icmp6_input のコードがぶっ壊されてることが判明。メモリぶっこわしですか…イーサドライバのキャッシュというかDMAまわりがまだ変なのか。
netbsd.map をよく見たら icmp6.o と ffs_vnops.o はアドレス近くだったのでこのあたりの領域が壊されているのだろう。
週末はこのへんデバッグしつつPCIだな。
2009-09-24 STR9105その3
どうも不安定なのはキャッシュまわりと思ったら、違うようだ。キャッシュも怪しいけど。
コンソールから何度も dmesg してると、たまにピタっと止まってしまう。一度この状態になるとBREAK信号も受けつけない。
イーサのドライバに仕込んでおいた特殊パケット受信でDebugger()を呼ぶ機能を使って ddb に落としてから c すると、何故か復活する。うーん。。。
どうも割込みまわりか、UARTの挙動が怪しい。
幸いこの状態になってもEtherやその他諸々はは生きていてpingにも答えるし、sshdを上げておけばリモートログインできるので、リモートで入って観測。
# gdb --write /netbsd (gdb) target kvm (gdb) p/x star_intr_enabled $1 = 0x19c041b (gdb) p/x star_intr_pending $2 = 0x0
0x19c041b = 0000_0001_1001_1100_0000_0100_0001_1011 (b) で、UART は IRQ10 なのでちゃんと enable になっている。
にもかかわらず star_intr_pending も 0 ってことはそもそも割込みが入ってきてない感じ。
UARTもSTR8100とSTR9100で微妙に制御ビットが追加されたりするので、そのへんの違いか。どちらにせよなんちゃって16550互換なので、また場合分けを入れなきゃならないのか…
いろいろ調べてると、現象が起きた状態で cnputc すると復活することがわかった。ddb に落とすと復活するのはこのせいか。どう考えてもcomだなぁ。
回避方法がわかったので特殊パケット受信でcnputcするように仕組んでおくと、止まりつつも(パケット投げれば)進むようになった。
なんかdev_mkdbが数分かかってて変だけど、とりあえずマルチユーザまで上がった。
NetBSD/evbarm STR8100/9100 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.18 (STR91xx) #184: Thu Sep 24 04:48:06 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx total memory = 32768 KB avail memory = 28164 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 16KB/16B 2-way Instruction cache cpu0: 16KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Orion Family SoC: STR9100, 200MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 10: ns16550a, working fifo com0: console ohci0 at star0 addr 0xc4000000-0xc400005b irq 23: USB1.1 Host Controller ohci0: OHCI version 1.0, legacy support usb0 at ohci0: USB revision 1.0 ehci0 at star0 addr 0xcc000000-0xcc00006b irq 24: USB2.0 Host Controller ehci0: ohci or uhci probably not configured usb1 at ehci0: USB revision 2.0 starrtc0 at star0 addr 0x7b000000-0x7b000037 irq 14: Real-time Clock starwdog0 at star0 addr 0x7a000000-0x7a00001b irq 3: Watch Dog Timer stargpio0 at star0 addr 0x7c000000-0x7c000047 irq 4: GPIO gpio0 at stargpio0: 32 pins gsec0 at star0 addr 0x70000000-0x7000029b irq 18: Gigabit Switch Engine gse0 at gsec0 port0 gse0: Ethernet address 00:08:a1:c0:45:7e ukphy0 at gse0 phy 0: OUI 0x0009c3, model 0x0005, rev. 4 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gse1 at gsec0 port1 gse1: Ethernet address 00:08:a1:c0:45:7f ukphy1 at gse1 phy 1: OUI 0x0009c3, model 0x0005, rev. 4 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto uhub0 at usb0: Star OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub1 at usb1: Star EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 boot device: <unknown> root on gse0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str9100 root on 192.168.185.65:/src/boot/str9100 WARNING: preposterous TOD clock time WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! WARNING: negative runtime; monotonic clock has gone backwards Thu Sep 24 05:13:54 JST 2009 Not checking /: nfs mounted Starting file system checks: Setting tty flags. Setting sysctl variables: Starting network. Hostname: str9100 IPv6 mode: host Configuring network interfaces:. Adding interface aliases:. Building databases: dev, utmp, utmpx done Starting syslogd. Setting date via ntp. Checking for core dump... savecore - - - no core dump (no dumpdev) Starting rpcbind. Mounting all filesystems... Clearing temporary files. Creating a.out runtime link editor directory cache. Starting statd. Starting lockd. swapctl: adding /var/swapfile as swap device at priority 0 Starting virecover. Starting local daemons:. Updating motd. Starting ntpd. Starting sshd. Starting inetd. Starting cron. Thu Sep 24 05:22:09 JST 2009 NetBSD/evbarm (str9100) (console) login: NetBSD/evbarm (str9100) (console) login: NetBSD/evbarm (str9100) (console) login: root Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.18 (STR91xx) #184: Thu Sep 24 04:48:06 JST 2009 STR9105 Terminal type is vt100. We recommend that you create a non-root account and use su(1) for root access. str9100# ifconfig -a gse0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:08:a1:c0:45:7e media: Ethernet autoselect (100baseTX full-duplex) status: active inet 192.168.185.87 netmask 0xfffffe00 broadcast 192.168.185.255 inet6 fe80::208:a1ff:fec0:457e%gse0 prefixlen 64 scopeid 0x1 gse1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 address: 00:08:a1:c0:45:7f media: Ethernet autoselect (none) status: no carrier lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 str9100# uname -a NetBSD str9100 5.99.18 NetBSD 5.99.18 (STR91xx) #184: Thu Sep 24 04:48:06 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx evbarm str9100# df Filesystem 1K-blocks Used Avail %Cap Mounted on 192.168.185.65:/src/boot/str9100 479777102 144965034 310823214 31% / mfs:150 7647 0 7265 0% /tmp procfs 4 4 0 100% /proc kernfs 1 1 0 100% /kern 192.168.185.65:/home 479777102 144965034 310823214 31% /home 192.168.185.65:/src 479777102 144965034 310823214 31% /src str9100#
遅いのはたぶんEtherが適当だからな気がする。もっとちゃんと作らなきゃダメだな。
あとはUARTの非互換部分を調べて止まらないようにしなければ。
STR9100対応程度サクサクできると思ったらそうもいかないな。
arm/starは終わらせて早くimx515をいじりたいものだ…
2009-09-23 STR9105その2
STR9100用のイーサはいわゆる2口イーサで、コントローラ1つでPHYが2つあるタイプ。
PHYの代わりにMIIBUS経由でスイッチなんかも繋げられる(MZK-W04Gがこのタイプ)なのだが、とりあえずややこしいのでリファレンス実装に近いTWR-350で動くようにする。
最初コントローラ1つで複数のPHYを持つドライバの書き方がよくわからなくて、いろいろ試行錯誤したのだが、 NetBSD の msk(4) のようにコントローラ用のドライバ上のバスに、PHY用のドライバが存在するように書けば良いようだ。
具体的にはこのようにする。
gsec0 at star? addr 0x70000000 irq 18 # STR9100 Gigabit Switch Engine Controller gse* at gsec? ukphy* at mii? phy ? # generic unknown PHYs
これで gsec0 の attach の時に gse0 と gse1 をconfig_found() してやれば、ifconfig -a で gse0 と gse1 が見えるようになる。
ハードウェアリングバッファなんかは gse0 と gse1 共通で1つしか持ってないので、結構色々裏で辻褄合わせをしなければならずめんどくさい。
§ § §
というわけで、イーサのドライバをざっくりと書いてnfsboot。
NetBSD/evbarm STR8100/9100 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.18 (STR91xx) #134: Sun Sep 20 03:52:42 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx total memory = 32768 KB avail memory = 28612 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 16KB/16B 2-way Instruction cache cpu0: 16KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Orion Family SoC: STR9100, 200MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console gsec0 at star0 addr 0x70000000-0x7000029b irq 18: Gigabit Switch Engine gse0 at gsec0 port0 gse0: Ethernet address 00:08:a1:c0:45:7e ukphy0 at gse0 phy 0: OUI 0x0009c3, model 0x0005, rev. 4 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gse1 at gsec0 port1 gse1: Ethernet address 00:08:a1:c0:45:7f ukphy1 at gse1 phy 1: OUI 0x0009c3, model 0x0005, rev. 4 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto boot device: <unknown> root on gse0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str9100 root on 192.168.185.65:/src/boot/str9100 WARNING: no TOD clock present WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! WARNING: negative runtime; monotonic clock has gone backwards Sun Sep 20 04:08
ここで固まった。完全に固まっているかというとそうでもなく、ping には答えるという…うーん?
一番最後の "Sun Sep 20 04:08" は /etc/rc の中の date コマンドの出力なのだが、全部出力し切れてない。
Context Switch でおかしくなってるのかなあと思って割込みまわりをざっと見直したり書き直したりするも、変化なし。
結局数日悩む。
§ § §
デバッガに落とそうとBREAK信号を送ってもデバッガに落ちない(ここで気づけば良かった)ので、タイマ割込みいじって起動後60秒後に Debugger() を呼んで強制的にデバッガに落とすようにする。
: root on gse0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str9100 <1><2><3>root on 192.168.185.65:/src/boot/str9100 WARNING: no TOD clock present WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! Wed Sep 23 05:26Stopped in pid 0.2 (system) at netbsd:cpu_Debugger+0x4: mov r15, r14 db> bt netbsd:star_timer1_intr+0x10 scp=0xc00ed81c rlv=0xc00ec4b4 (netbsd:star_intr_dispatch+0x138) rsp=0xc1ff7f08 rfp=0xc1ff7f34 r6=0xc1116d60 r5=0xc0298178 r4=0xa0000093 netbsd:star_intr_dispatch+0x10 scp=0xc00ec38c rlv=0xc006f7b0 (netbsd:irq_entry+0x70) rsp=0xc1ff7f38 rfp=0xc1ff7f94 r10=0x00000000 r9=0x00000000 r8=0x00000000 r7=0x00000000 r6=0x00000000 r5=0xc1c2fc80 r4=0xc01f0f3c netbsd:cpu_idle+0x10 scp=0xc004f1d4 rlv=0xc007d0c4 (netbsd:idle_loop+0x14c) rsp=0xc1ff7f98 rfp=0xc1ff7fb0 r4=0xc01f0f3c netbsd:idle_loop+0x10 scp=0xc007cf88 rlv=0xc001bb68 (netbsd:lwp_trampoline+0x14) rsp=0xc1ff7fb4 rfp=0x00000000 r6=0x00000000 r5=0xc1c2fc80 r4=0xc007cf78 db> show all procs PID LID S CPU FLAGS STRUCT LWP * NAME WAIT 2 1 3 0 84 c28f2d00 sh ttyout 1 1 3 0 84 c1c3ace0 init wait 0 32 3 0 204 c1c3a060 vmem_rehash vmem_rehash 0 31 3 0 204 c1c3a2e0 aiodoned aiodoned 0 30 3 0 204 c1c3a560 ioflush syncer 0 29 3 0 204 c1c3a7e0 pgdaemon pgdaemon 0 28 3 0 204 c1c39cc0 nfsio nfsiod 0 27 3 0 204 c1c39a40 nfsio nfsiod 0 26 3 0 204 c1c397c0 nfsio nfsiod 0 25 3 0 204 c1c39540 nfsio nfsiod 0 24 3 0 204 c1c392c0 swdmover swdmvr 0 23 3 0 204 c1c39040 cryptoret crypto_wait 0 22 3 0 204 c1c3aa60 unpgc unpgc 0 13 3 0 204 c1c32020 pmfsuspend pmfsuspend 0 12 3 0 204 c1c322a0 pmfevent pmfevent 0 11 3 0 204 c1c32520 nfssilly nfssilly 0 10 3 0 204 c1c327a0 cachegc cachegc 0 9 3 0 204 c1c32a20 vrele vrele 0 8 3 0 204 c1c32ca0 modunload modunload 0 7 3 0 204 c1c2f000 xcall/0 xcall 0 6 1 0 204 c1c2f280 softser/0 0 5 1 0 204 c1c2f500 softclk/0 0 4 1 0 204 c1c2f780 softbio/0 0 3 1 0 204 c1c2fa00 softnet/0 0 > 2 7 0 205 c1c2fc80 idle/0 0 1 3 0 204 c0261c60 swapper schedule db> show callout hardclock_ticks now: 1901 ticks wheel arg func 0 -1/-256 0 sched_pstats 0 -1/-256 c1c32a20 sleepq_timeout 0 -1/-256 c1c327a0 sleepq_timeout 1 0/110 0 if_slowtimo 13 0/122 0 rt_timer_timer 18 0/127 0 pffasttimo 19 0/128 c1c3a560 sleepq_timeout 48 0/157 0 pfslowtimo 419 1/265 0 vmem_rehash_all_kick 28217 1/373 0 arptimer db> show sched_qs Run-queue (CPU = 0): pid.lid = 0.2, r_count = 0, r_avgcount = 0, maxpri = 0, mlwp = 0x0 bitmap[6] => [ 0 (0x0) ] bitmap[5] => [ 0 (0x0) ] bitmap[4] => [ 0 (0x0) ] bitmap[3] => [ 0 (0x0) ] bitmap[2] => [ 0 (0x0) ] bitmap[1] => [ 0 (0x0) ] bitmap[0] => [ 0 (0x0) ] LID PRI EPRI FL ST LWP CPU TCI LRTICKS /- 2 (sh) | 1 43 85 0x00000084 SQ 0xc28f2d00 0 -1 1394 /- 1 (init) | 1 43 85 0x00000084 SQ 0xc1c3ace0 0 -1 1444 /- 0 (system) | 32 125 125 0x00000204 SQ 0xc1c3a060 0 -1 581 | 31 125 125 0x00000204 SQ 0xc1c3a2e0 0 -1 1581 | 30 124 124 0x00000204 SQ 0xc1c3a560 0 -1 81 | 29 126 126 0x00000204 SQ 0xc1c3a7e0 0 -1 1581 | 28 96 96 0x00000204 SQ 0xc1c39cc0 0 -1 1582 | 27 96 96 0x00000204 SQ 0xc1c39a40 0 -1 1582 | 26 96 96 0x00000204 SQ 0xc1c397c0 0 -1 1582 | 25 96 96 0x00000204 SQ 0xc1c39540 0 -1 1582 | 24 96 96 0x00000204 SQ 0xc1c392c0 0 -1 1883 | 23 96 96 0x00000204 SQ 0xc1c39040 0 -1 1883 | 22 96 96 0x00000204 SQ 0xc1c3aa60 0 -1 1883 | 13 96 96 0x00000204 SQ 0xc1c32020 0 -1 1900 | 12 96 96 0x00000204 SQ 0xc1c322a0 0 -1 1900 | 11 96 96 0x00000204 SQ 0xc1c32520 0 -1 1900 | 10 125 125 0x00000204 SQ 0xc1c327a0 0 -1 100 | 9 125 125 0x00000204 SQ 0xc1c32a20 0 -1 100 | 8 125 125 0x00000204 SQ 0xc1c32ca0 0 -1 1900 | 7 127 127 0x00000204 SQ 0xc1c2f000 0 -1 1887 | 6 223 223 0x00000204 - 0xc1c2f280 0 -1 1900 | 5 220 220 0x00000204 - 0xc1c2f500 0 -1 1900 | 4 221 221 0x00000204 - 0xc1c2f780 0 -1 1900 | 3 222 222 0x00000204 - 0xc1c2fa00 0 -1 1900 | 2 0 0 0x00000205 - 0xc1c2fc80 0 -1 1901 | 1 125 125 0x00000204 SQ 0xc0261c60 0 -1 500
うーんと悩みつつよく見たら、sh が ttyout で止まっている。
もしやと思ってPDFをよく見直すと
UART の IRQ が間違ってた。
ガーン。というか、これは STR8100 と STR9100 が悪いだろ…
STR8100はUARTを2つ持っていて
UART0 | 0x78000000 | IRQ 9 |
UART1 | 0x78800000 | IRQ 10 |
という構成である。一方STR9100はUARTが1つで、I/OアドレスはSTR8100のUART0と同じ0x78000000なのだが、
UART0 | 0x78000000 | IRQ 10 |
…IRQは10なのだ。なんて罠だ。
というわけで、confを書き直したらあっさりbootした。
STR9100>go 0x21000000 ## Starting application at 0x21000000 ... NetBSD/evbarm STR8100/9100 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.18 (STR91xx) #164: Wed Sep 23 05:14:29 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx total memory = 32768 KB avail memory = 28612 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 16KB/16B 2-way Instruction cache cpu0: 16KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Orion Family SoC: STR9100, 200MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 10: ns16550a, working fifo com0: console gsec0 at star0 addr 0x70000000-0x7000029b irq 18: Gigabit Switch Engine gse0 at gsec0 port0 gse0: Ethernet address 00:08:a1:c0:45:7e ukphy0 at gse0 phy 0: OUI 0x0009c3, model 0x0005, rev. 4 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gse1 at gsec0 port1 gse1: Ethernet address 00:08:a1:c0:45:7f ukphy1 at gse1 phy 1: OUI 0x0009c3, model 0x0005, rev. 4 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto boot device: <unknown> root on gse0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str9100 root on 192.168.185.65:/src/boot/str9100 WARNING: no TOD clock present WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! WARNING: negative runtime; monotonic clock has gone backwards /etc/rc.conf is not configured. Multiuser boot aborted. Enter pathname of shell or RETURN for /bin/sh: Terminal type is vt100. We recommend that you create a non-root account and use su(1) for root access. # df Filesystem 1K-blocks Used Avail %Cap Mounted on 192.168.185.65:/src/boot/str9100 479777102 144934380 310853868 31% / # ifconfig -a gse0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:08:a1:c0:45:7e media: Ethernet autoselect (100baseTX full-duplex) status: active inet 192.168.185.87 netmask 0xfffffe00 broadcast 192.168.185.255 gse1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 address: 00:08:a1:c0:45:7f media: Ethernet autoselect (none) status: no carrier lo0: flags=8048<LOOPBACK,RUNNING,MULTICAST> mtu 33192 # uname -a NetBSD 5.99.18 NetBSD 5.99.18 (STR91xx) #164: Wed Sep 23 05:14:29 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx evbarm #
マルチユーザにするとdev_mkdbが帰ってこなかったり変な個所で落ちたりする。
またCPUキャッシュっぽいなぁ。
でもまぁ、少しずつ進んでいるので良しとしよう。
2009-09-22 i.MX memo
i.MX515のprocessor referenceまだですか
年末追記。全部揃った。
2009-09-16 MZK-W04G
PLANEX DIRECTのガレージセールでMZK-W04Gが安かったので、先日ついIYHしてしまったものが届いた。当然STR91xxなCPUボード目当てです。


いつものように秋月のADM3202でシリアルケーブル作って38400bpsで接続。
ARMboot 1.1.0 (Sep 13 2007 - 14:41:53) Star maintain version 0.15.100000000 ARMboot code: 00000000 -> 0001b684 STR9100 CPU Clock: 250 Mhz 1.8V Regulator Regulated vdd Output : b101 2.5V Regulator Regulated vdd Output : b100 DDR Bank #0: 00000000 64 MB DDR Controller Data Bus Width: 32 bits flash type: EON_EN29LV640HL Flash Bank #1: 8 MB *** Using my specific environment Hit any key to stop autoboot: 0 STR9100> STR9100> STR9100>help go - start application at address 'addr' run - run commands in an environment variable bootm - boot application image from memory bootp - boot image via network using BootP/TFTP protocol tftpboot- boot image via network using TFTP protocol and env variables ipaddr and serverip rarpboot- boot image via network using RARP/TFTP protocol bootd - boot default, i.e., run 'bootcmd' loads - load S-Record file over serial line loadb - load binary file over serial line (kermit mode) autoscr - run script from memory md - memory display mm - memory modify (auto-incrementing) nm - memory modify (constant address) mw - memory write (fill) cp - memory copy cmp - memory compare crc32 - checksum calculation base - print or set address offset printenv- print environment variables setenv - set environment variables saveenv - save environment variables to persistent storage protect - enable or disable FLASH write protection erase - erase FLASH memory flinfo - print FLASH memory information bdinfo - print Board Info structure iminfo - print header information for application image loop - infinite loop on address range mtest - simple RAM test reset - Perform RESET of the CPU echo - echo args to console sleep - delay execution for some time version - print monitor version help - print online help ? - alias for 'help' adjust regulator STR9100>printenv bootcmd=go 10040000 bootdelay=2 baudrate=38400 ipaddr=192.168.1.254 serverip=192.168.1.230 netmask=255.255.255.0 ethaddr=00:90:cc:f3:ab:06 Environment size: 139/32764 bytes
U-Boot(ARMBoot)がsaveenvも対応していた。
LAN EVOLUTIONはsaveenvできたがCMR-350はsaveenvできなかったので不便だったのだ。
デフォルトでtftpbootにできる分、CMR-350よりこっちで開発したほうが楽っぽいな。
STR9100>boot ## Starting application at 0x10040000 ... Uncompressing Linux............................................................................................. done, booting the kernel. Linux version 2.6.16-star (root@localhost.localdomain) (gcc version 3.4.6) #25 Fri Jan 23 20:41:34 JST 2009 CPU: FA526id(wb) [66015261] revision 1 (ARMv4) Machine: STAR STR9100 Memory policy: ECC disabled, Data cache writeback CPU0: D VIVT write-back cache CPU0: I cache: 16384 bytes, associativity 2, 16 byte lines, 512 sets CPU0: D cache: 16384 bytes, associativity 2, 16 byte lines, 512 sets CPU clock at 250MHz AHB clock at 125MHz APB clock at 62MHz Enable I-ScratchPad Address Start : c0025000 Built 1 zonelists Kernel command line: root=/dev/ram0 PID hash table entries: 512 (order: 9, 8192 bytes) Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Memory: 64MB = 64MB total Memory: 55936KB available (2356K code, 564K data, 116K init) Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok checking if image is initramfs...it isn't (no cpio magic); looks like an initrd Freeing initrd memory: 5852K NET: Registered protocol family 16 PCI clock at 33M PCI: bus0: Fast back to back transfers disabled PCI Bridge found PCI: enabling device 0000:00:00.0 (0140 -> 0142) PCI map irq: 00:00.00 slot 0, pin 1, irq: 0 PCI map irq: 00:01.00 slot 1, pin 1, irq: 5 SCSI subsystem initialized usbcore: registered new driver usbfs usbcore: registered new driver hub JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc. Initializing Cryptographic API io scheduler noop registered io scheduler deadline registered (default) GPIO interrupt handler install ok. STR9100 Real Time Clock Driver v2.0.0 Serial: 8250/16550 driver $Revision: 1.61 $ 1 ports, IRQ sharing disabled serial8250: ttyS0 at MMIO 0x78000000 (irq = 10) is a 16550A RAMDISK driver initialized: 4 RAM disks of 18432K size 1024 blocksize Star GSW Driver(for Linux Kernel 2.6) - Star Semiconductor mac addr: 00:90:cc:f3:ab:06 mac len: 17 flash mac : 0:90:cc:f3:ab:6 VLAN0_VLAN_TAG: 1 configure VSC7385 Check MAC/PHY 0 Link Status : DOWN! INIT VSC8601 VSC8601: AN Completed. PPP generic driver version 2.4.2 PPP Deflate Compression module registered PPP BSD Compression module registered NET: Registered protocol family 24 Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx STR9100 NOR Flash: Found 1 x16 devices at 0x0 in 16-bit bank Amd/Fujitsu Extended Query Table at 0x0040 STR9100 NOR Flash: CFI does not contain boot bank location. Assuming top. number of CFI chips: 1 cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness. Creating 3 MTD partitions on "STR9100 NOR Flash": 0x00000000-0x00040000 : "ARMBOOT" 0x00040000-0x007e0000 : "Linux Kernel" 0x007e0000-0x00800000 : "Config" str9100-ehci str9100-ehci: str9100-ehci str9100-ehci str9100-ehci: new USB bus registered, assigned bus number 1 str9100-ehci str9100-ehci: irq 24, io mem 0xcc000000 str9100-ehci str9100-ehci: USB 0.0 started, EHCI 1.00, driver 10 Dec 2004 usb usb1: configuration #1 chosen from 1 choice hub 1-0:1.0: USB hub found hub 1-0:1.0: 2 ports detected ohci_hcd: 2005 April 22 USB 1.1 'Open' Host Controller (OHCI) Driver (STR9100) str9100-ohci str9100-ohci: str9100-ohci str9100-ohci str9100-ohci: new USB bus registered, assigned bus number 2 str9100-ohci str9100-ohci: irq 23, io mem 0xc4000000 usb usb2: configuration #1 chosen from 1 choice hub 2-0:1.0: USB hub found hub 2-0:1.0: 2 ports detected Netfilter messages via NETLINK v0.30. NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 4096 (order: 2, 16384 bytes) TCP bind hash table entries: 4096 (order: 2, 16384 bytes) TCP: Hash tables configured (established 4096 bind 4096) TCP reno registered ip_conntrack version 2.4 (512 buckets, 4096 max) - 240 bytes per conntrack ip_tables: (C) 2000-2006 Netfilter Core Team TCP bic registered NET: Registered protocol family 1 NET: Registered protocol family 17 NET: Registered protocol family 15 ieee80211: 802.11 data/management/control stack, git-1.1.7 ieee80211: Copyright (C) 2004-2005 Intel Corporation <jketreno@linux.intel.com> RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem) readonly. Freeing init memory: 116K Mounting root fs rw ... open mac port 0 port 0 already open Init router config ... str9100_shnat: module license 'Proprietary' taints kernel. [RLDBG] init_func_ptr: HOOK POINT INIT OK STAR9100 Software HNAT Driver Initialized star_ioctl: Unsupport command device eth0 entered promiscuous mode star_ioctl: Unsupport command br0: port 1(eth0) entering learning state br0: topology change detected, propagating br0: port 1(eth0) entering forwarding state PCI: enabling device 0000:00:01.0 (0140 -> 0142) === pAd = c5081000, size = 486108 === <-- RTMPAllocAdapterBlock, Status=0 Initializing USB Mass Storage driver... usbcore: registered new driver usb-storage USB Mass Storage support registered. # RX DESC ffc30000 size = 2048 <-- RTMPAllocTxRxRingMemory, Status=0 WPAPSK_KEY, key len (should be 8~64) incorrect!!!, your key len = 0 I/F(ra0) Key1Str is Invalid key length! KeyLen = 0! 1. Phy Mode = 0 2. Phy Mode = 0 RTMPSetPhyMode: channel is out of range, use first channel=0 3. Phy Mode = 0 RTMPSetPhyMode: channel is out of range, use first channel=0 MCS Set = 00 00 00 00 00 SYNC - BBP R4 to 20MHz.l Main bssid = 00:90:cc:f3:5d:12 The UUID Hex string is:bc329e001dd811b286010090ccf35d12 The UUID ASCII string is:bc329e00-1dd8-11b2-8601-0090ccf35d12! <==== RTMPInitialize, Status=0 0x1300 = 00064220 device ra0 entered promiscuous mode br0: port 2(ra0) entering learning state br0: topology change detected, propagating br0: port 2(ra0) entering forwarding state Open Orion Fast Path Tunnel Device # ? /bin/sh: ?: not found # ps auxw PID Uid VmSize Stat Command 1 root 344 S init 2 root SWN [ksoftirqd/0] 3 root SW< [events/0] 4 root SW< [khelper] 5 root SW< [kthread] 12 root SW< [kblockd/0] 15 root SW< [khubd] 49 root SW [pdflush] 50 root SW [pdflush] 52 root SW< [aio/0] 51 root SW [kswapd0] 570 root SW< [cqueue/0] 590 root SW [mtdblockd] 636 root 912 S /usr/local/sbin/router_config 666 root 440 S /usr/local/sbin/thttpd -C /etc/thttpd.conf 667 root 244 S /usr/local/sbin/wd 670 root 288 S /sbin/klogd 674 root SW [rtmpWscHandle] 676 root 300 S /sbin/syslogd -C 16 681 root 404 S /bin/sh 796 root 268 S udhcpd 805 root 256 S /usr/local/sbin/miniupnpd -f /var/miniupnpd.conf 808 root 324 R ps auxw # df Filesystem 1k-blocks Used Available Use% Mounted on /dev/root 17845 14122 3723 79% / # ls -la / drwxr-xr-x 15 root root 1024 Jan 23 2009 . drwxr-xr-x 15 root root 1024 Jan 23 2009 .. drwxr-xr-x 2 1000 1000 1024 Oct 7 2008 bin drwxrwxrwx 6 root root 1024 Jan 1 09:00 dev drwxr-xr-x 7 1000 1000 1024 Jan 1 09:00 etc drwxr-xr-x 4 1000 1000 2048 Jan 23 2009 lib lrwxrwxrwx 1 root root 11 Jan 23 2009 linuxrc -> bin/busybox drwx------ 2 root root 12288 Jan 23 2009 lost+found drwxr-xr-x 3 1000 1000 1024 Jun 7 2007 man drwxr-xr-x 5 1000 1000 1024 Sep 7 2007 mnt dr-xr-xr-x 36 root root 0 Jan 1 09:00 proc drwxr-xr-x 2 1000 1000 1024 Oct 1 2008 root drwxr-xr-x 2 1000 1000 1024 Oct 4 2007 sbin drwxr-xr-x 2 1000 1000 1024 Jan 1 09:00 tmp drwxr-xr-x 7 1000 1000 1024 Jun 12 2007 usr drwxr-xr-x 6 1000 1000 1024 Jan 1 09:00 var # cat /proc/cpuinfo Processor : FA526id(wb) rev 1 (v4l) BogoMIPS : 191.69 Features : swp half CPU implementer : 0x66 CPU architecture: 4 CPU variant : 0x0 CPU part : 0x526 CPU revision : 1 Cache type : write-back Cache clean : cp15 c7 ops Cache lockdown : format B Cache format : Harvard I size : 16384 I assoc : 2 I line length : 16 I sets : 512 D size : 16384 D assoc : 2 D line length : 16 D sets : 512 Hardware : STAR STR9100 Revision : 0000 Serial : 0000000000000000 #
おいおい。デフォルトでshellが上がってるよ。すげー。
CPUとクロックが判明したので表を更新
AREA LAN EVOLUTION | STR8132 250MHz | LAN,USB |
CNET CWR-635M(※) | STR9105 200MHz | LAN,USB,mini-pci(WiFi) |
COREGA CG-BARPROG | STR9102 200MHz | LAN |
PLANEX MZK-W04G | STR9102 250MHz | LAN,USB,mini-pci(WiFi) |
NetIndex クティオ | STR91?? ?MHz | LAN,USB,WiFi,CF |
2009-09-11 STR9105その1
以前買っておいたCMR-350でも動かしてみる。
STR9100でも動くようにいろいろ仕掛けをしておいたおかげで、ほとんど修正なしに動いた。
忘れてた所は、evbarm/star/star_start.S の中でSTR9100デバイス用のL2テーブルの登録個所くらいだったので、STR9100用のエントリも登録。
star_start.S で登録する MMU のテーブルは仮のものでちゃんとした L2 table は evbarm/star/star_machdep.c の中で登録されるので適当で問題なし。
CPU Clockがめちゃくちゃだな。I/Oレジスタ間違えたか。
NetBSD/evbarm STR8100/9100 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.16 (STR91xx) #37: Fri Sep 11 02:16:53 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx total memory = 32768 KB avail memory = 28164 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 16KB/16B 2-way Instruction cache cpu0: 16KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Orion Family SoC: STR9100, 1775MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console ohci0 at star0 addr 0xc4000000-0xc400005b irq 23: USB1.1 Host Controller ohci0: OHCI version 1.0, legacy support usb0 at ohci0: USB revision 1.0 ehci0 at star0 addr 0xcc000000-0xcc00006b irq 24: USB2.0 Host Controller ehci0: ohci or uhci probably not configured usb1 at ehci0: USB revision 2.0 starrtc0 at star0 addr 0x7b000000-0x7b000037 irq 14: Real-time Clock starwdog0 at star0 addr 0x7a000000-0x7a00001b irq 3: Watch Dog Timer stargpio0 at star0 addr 0x7c000000-0x7c000047 irq 4: GPIO gpio0 at stargpio0: 32 pins uhub0 at usb0: Star OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub1 at usb1: Star EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 boot device: <unknown> uvm_fault(0xc0306084, 0, 1) -> e Fatal kernel mode data abort: 'Translation Fault (S)' trapframe: 0xc0338db8 FSR=00000005, FAR=00000000, spsr=60000053 r0 =00000000, r1 =00000000, r2 =c0309ad0, r3 =ffffffff r4 =c025af28, r5 =00000000, r6 =00000000, r7 =c02d6ac0 r8 =00000000, r9 =c0309ac0, r10=c02615f8, r11=c0338f9c r12=00000000, ssp=c0338e04, slr=c00bdbe8, pc =c0133758 Stopped in pid 0.1 (system) at netbsd:device_class: ldr r0, [r0] db> bt netbsd:setroot+0x10 scp=0xc00bd3c4 rlv=0xc0079854 (netbsd:main+0x274) rsp=0xc0338fa0 rfp=0xc0338fec r10=0xc02615f8 r9=0xc0309ac0 r8=0xc030364c r7=0x00000000 r6=0xc0303648 r5=0x00000000 r4=0x00000001 netbsd:main+0x10 scp=0xc00795f0 rlv=0xc0008228 (netbsd:kernel_text+0x3c) rsp=0xc0338ff0 rfp=0xc0338ffc r10=0x00000001 r9=0x000368b8 r8=0x00000000 r7=0x000368b8 r6=0x0003661c r5=0x00000002 r4=0x2000813c netbsd:kernel_text+0x3c scp=0xc0008228 rlv=0xc0130314 (netbsd:initarm+0x7cc) rsp=0xc0339000 rfp=0x00000000 db>
STR9100のetherドライバを書く仕事が始まるお…
2009-08-30 STR8132その9 - GPIO と watchdog
GPIOとwatchdogを書いて、これでNetBSD/str8100のデバイス対応はほぼ終了。
作業はじめてから数えて二ヶ月半もかかったなぁ。
§ § §
STR8100のGPIOは割り込み設定とかもできるんだけど、NetBSDのgpioフレームワークはそこまで高機能ではないので未サポート。 気がむいたらddbボタンかsoft poweroffボタンくらいには割り当てられるかもしれない。
watchdogもこれといって特に癖もなく普通だった。
記念にデバイス全部入りのdmesgを。
spiはなぜか動かず、twiは何も繋がってないのでテストできておらず(たぶん動かない)、RTCはリセットでクリアされてしまうのでまるで激しく意味がない。
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.15 (STR81xx) #1419: Mon Aug 31 05:04:40 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28136 KB timecounter: Timecounters tick every 10.000 msec mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Equuleus Family SoC: STR8100, 250MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console ohci0 at star0 addr 0xc4000000-0xc400005b irq 23: USB1.1 Host Controller ohci0: OHCI version 1.0, legacy support usb0 at ohci0: USB revision 1.0 ehci0 at star0 addr 0xcc000000-0xcc00006b irq 24: USB2.0 Host Controller ehci0: EHCI version 1.0 ehci0: wrong number of companions (1 != 0) ehci0: ohci or uhci probably not configured usb1 at ehci0: USB revision 2.0 starrtc0 at star0 addr 0x7b000000-0x7b000037 irq 14: Real-time Clock starwdog0 at star0 addr 0x7a000000-0x7a00001b irq 3: Watch Dog Timer stargpio0 at star0 addr 0x7c000000-0x7c000047 irq 4: GPIOA gpio0 at stargpio0: 32 pins stargpio1 at star0 addr 0x7c800000-0x7c800047 irq 4: GPIOB gpio1 at stargpio1: 32 pins starspi0 at star0 addr 0x71000040-0x7100005f irq 26: Serial Peripheral Interface spi0 at starspi0: SPI bus m25p0 at spi0 slave 0: unknown or unsupported device startwi0 at star0 addr 0x71000020-0x7100003f irq 27: Two-Wire Serial Interface iic0 at startwi0: I2C bus gec0 at star0 addr 0x70000000-0x70000133 irq 18: Gigabit Ethernet Controller gec0: Ethernet address 00:aa:bb:cc:dd:10 ukphy0 at gec0 phy 0: OUI 0x000e4e, model 0x0025, rev. 1 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0 timecounter: Timecounter "starclk" frequency 62500000 Hz quality 100 uhub0 at usb0: Star OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub0: 2 ports with 2 removable, self powered uhub1 at usb1: Star EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 uhub1: 2 ports with 2 removable, self powered ehci0: strange port uhidev0 at uhub0 port 1 configuration 1 interface 0 uhidev0: Dell Dell USB Optical Mouse, rev 2.00/43.01, addr 2, iclass 3/1 ums0 at uhidev0: 3 buttons and Z dir. wsmouse0 at ums0 (mux ignored) umass0 at uhub1 port 2 configuration 1 interface 0: silicon -power, rev 2.00/1.10, addr 2 umass0: using SCSI over Bulk-Only scsibus0 at umass0: 2 targets, 1 lun per target sd0 at scsibus0 target 0 lun 0: <silicon, -power, 0.00> disk removable sd0: 1911 MB, 7644 cyl, 16 head, 32 sec, 512 bytes/sect x 3913728 sectors boot device: <unknown> root on gec0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str8132 root on 192.168.185.65:/src/boot/str8132 WARNING: preposterous TOD clock time WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! WARNING: negative runtime; monotonic clock has gone backwards star# uname -a NetBSD star 5.99.15 NetBSD 5.99.15 (STR81xx) #1419: Mon Aug 31 05:04:40 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx evbarm star#
USBメモリが普通に使えたので、EHCIも問題ないっぽい。他のUSBデバイスも使えると思われ。wrong number of companions とか strange port とか何か変なメッセージ出てるけど。
そういえばetherのmulticast対応を忘れてた…暇なとき書こう。
WARNING: negative runtime; monotonic clock has gone backwards だけひっかかる。
ps の出力が微妙に変なのはこのせいかなぁ。timerまわりが不完全?
2009-08-25 STR8132その8 - mac address と flash と SPI
flash の +0x0003ffe0 から 6byte に書いてあった。
: 3003ffd0: 31 32 33 34 35 36 37 38 39 2d 31 32 2d 34 37 33 123456789-12-473 3003ffe0: 00 22 ec 02 00 f3 00 00 00 00 00 00 00 00 00 00 .".............. 3003fff0: 01 01 00 00 02 02 00 00 73 75 70 65 72 63 6f 6d ........supercom :
LU2BOX の Linux を立ち上げた時の mac address は 00:22:ec:02:00:f3 なので、3003ffe0 から 6byte が mac address だろう。
"123456789-12-473" と "supercom" が謎だ。OEM元の名前じゃないな。OEM元はsondyo台湾の http://www.sondyo.com/ot_sld2u.htm だし。
その他はずっとSPIのドライバを書いてたけど一向にflashが読めません。割り込みも動くし loopback モードじゃちゃんと動いてるっぽいので、
石の叩き方は間違ってないと思うんだけどなぁ。M25P64 は 64Mbit serial flash なので CPU とは間違いなく SPI で繋がってるはずなのだが。
TWI(I2C) もドライバ書いたけど何もデバイスつながってなくてテストできない状態なので、SPI と TWI は放置して GPIO と WatchDog を書いてしまって、さっさと STR9105 始めよう。
2009-08-21 STR8132その7 - RTC
一日1デバイス。今日はRTC。
STR8100/9100 の RTC は電池も付けられない
年や月レジスタは存在しない。日レジスタが16bit分あるので65536日=180年分カウントできるので困らない。
何のために存在するかというと、おそらくSuspend/Resumeのためなんだろう。unix的にはどうでもいいデバイス度90%くらい。 でもまぁSoCだし、こんなものかと思ってチンタラとデバドラを書いてたのだが、
「秒分時日の設定もできない」
ことがわかった。おいおい。
で、どうするかというと、32bitのスクラッチ的なレジスタ(RTC_RECORDレジスタ)があって、ここに好きな値を書き込んでおくことができる。
好きな値とは、現在の実時刻とRTCの示す時刻との差分である。
読み出す時は、RTCの「秒+分*60+時*3600+日*86400」に、上で書き込んだ値を差分として(プログラムで)足して解釈する。
設定する時は、RTCの「秒+分*60+時*3600+日*86400」と現在時刻との差分をRTC_RECORDレジスタに保存しておくのだ。
なんという
なんという
なんという…
2009-08-19 STR8132その6
softintr の動作が変な件。
arch/arm/star/star_intr.c の割り込みの __HAVE_FAST_SOFTINTS 部分は、sys/arch/arm/xscale/ixp425_intr.[ch] あたりを参考にしていたのだが、 そもそも xscale を HAVE_FAST_SOFTINT で使っているものは存在しなかった。つまり腐ってやがる。早すぎたんですよ。
というわけで std.star からも __HAVE_FAST_SOFTINTS を削って、softintr 問題は解決。
USBはwrapperだけだから簡単だと思ってちゃっちゃと star_ohci と star_ehci を書く。
NetBSD 5.99.15 (STR81xx) #1138: Wed Aug 19 02:20:22 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28156 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Equuleus Family SoC: STR8100, 250MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console ohci0 at star0 addr 0xc4000000-0xc400005b irq 23: USB1.1 Host Controller ohci0: OHCI version 1.0, legacy support usb0 at ohci0: USB revision 1.0 ehci0 at star0 addr 0xcc000000-0xcc00006b irq 24: USB2.0 Host Controller ehci0: ohci or uhci probably not configured usb1 at ehci0: USB revision 2.0 gec0 at star0 addr 0x70000000-0x70000133 irq 18: Gigabit Ethernet Controller gec0: Ethernet address 00:aa:bb:cc:dd:10 ukphy0 at gec0 phy 0: Generic IEEE 802.3u media interface ukphy0: OUI 0x000e4e, model 0x0025, rev. 1 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gec0: status=00040114 uhub0 at usb0: Star OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub1 at usb1: Star EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 ehci0: strange port boot device: <unknown> root on gec0 〜 uhidev0 at uhub0 port 2 configuration 1 interface 0 uhidev0: Dell Dell USB Optical Mouse, rev 2.00/43.01, addr 2, iclass 3/1 ums0 at uhidev0: 3 buttons and Z dir. wsmouse0 at ums0 (mux ignored)
近くに落ちてたDELLのマウスを挿したら、一応ちゃんと見えているので動いているようだ。
でも ehci0: strange port とか言われてる。何か変? テストに適当なUSB2.0 なデバイス何か無いかな。
そして ether の hardware checksum も support。何故か ip4csum-tx だけ動かない。ip4csum-rx および tcp4csum と udp4csum はちゃんと動く。謎。
速度のほうは、
TX=2.50MB/s, RX=2.85MB/s (FAST_SOFTINT, software checksum)だったのが、
TX=2.65MB/s, RX=2.98MB/s (no FAST_SOFTINT, hardware checksum)くらいになった。ちなみに FAST_SOFTINTS 状態だと
TX=2.75MB/s, RX=3.05MB/s (FAST_SOFTINT, hardware checksum) だけど、腐ってるので封印。
2009-08-15 STR8132その5
イーサをデバッグしたりチューニングしたりリファインしたりして、とりあえず安定動作するようになった。
ring buffer が stall したりするのも回避コードを入れて、かなりロバストになった。
CPU data cache を on にすると動かないのはいつの間にか修ってた。関連しそうな所をいじった覚え無いんだがなぁ。どこかおかしかったんだろう。気にしないことにする。
ftp すると TX=2.50MB/s, RX=2.85MB/s 程度は出る。XScale 266MHz の NSLU2 が RX=1.5MB/s TX=3.2MB/s 程度なので、250MHz にしてはそこそこか。
現在のステータスは
・com, timer, ether が完了
・nfsboot で multiuser までほぼ安定動作。sshd 等も動いて remote login 可能。
・DIAGNOSTIC を付けていると、
panic: kernel diagnostic assertion "si->si_active" failed: file "../../../../kern/kern_softint.c", line 506
で落ちる。たぶん割込みまわりで __HAVE_FAST_SOFTINTS なのに softint のダミーの IRQ でマスクとかしてないからだろう。
世界で数人しか必要でないだろうがとってもαなコードを置いてみる。
2009-08-13 Sheeva Plug Serial


115200bps。
__ __ _ _ | \/ | __ _ _ ____ _____| | | | |\/| |/ _` | '__\ \ / / _ \ | | | | | | (_| | | \ V / __/ | | |_| |_|\__,_|_| \_/ \___|_|_| _ _ ____ _ | | | | | __ ) ___ ___ | |_ | | | |___| _ \ / _ \ / _ \| __| | |_| |___| |_) | (_) | (_) | |_ \___/ |____/ \___/ \___/ \__| ** MARVELL BOARD: SHEEVA PLUG LE U-Boot 1.1.4 (Mar 19 2009 - 16:06:59) Marvell version: 3.4.16 U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006CEE80 Soc: 88F6281 A0 (DDR2) CPU running @ 1200Mhz L2 running @ 400Mhz SysClock = 400Mhz , TClock = 200Mhz DRAM CAS Latency = 5 tRP = 5 tRAS = 18 tRCD=6 DRAM CS[0] base 0x00000000 size 256MB DRAM CS[1] base 0x10000000 size 256MB DRAM Total size 512MB 16bit width Flash: 0 kB Addresses 8M - 0M are saved for the U-Boot usage. Mem malloc Initialization (8M - 7M): Done NAND:512 MB CPU : Marvell Feroceon (Rev 1) Streaming disabled Write allocate disabled USB 0: host mode PEX 0: interface detected no Link. Net: egiga0 [PRIME], egiga1 Hit any key to stop autoboot: 0 NAND read: device 0 offset 0x100000, size 0x400000 Reading data from 0x4ff800 -- 100% complete. 4194304 bytes read: OK ## Booting image at 00800000 ... Image Name: Linux-2.6.22.18 Created: 2009-03-19 9:18:16 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2106696 Bytes = 2 MB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK OK Starting kernel ... Uncompressing Linux.................................................................................................................................... done, booting the kernel. Linux version 2.6.22.18 (dhaval@devbox) (gcc version 4.2.1) #1 Thu Mar 19 14:46:22 IST 2009 CPU: ARM926EJ-S [56251311] revision 1 (ARMv5TE), cr=00053177 Machine: Feroceon-KW Using UBoot passing parameters structure Memory policy: ECC disabled, Data cache writeback CPU0: D VIVT write-back cache CPU0: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets CPU0: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets Built 1 zonelists. Total pages: 130048 Kernel command line: console=ttyS0,115200 mtdparts=nand_mtd:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 rw ip=10.4.50.4:10.4.50.5:10.4.50.5:255.255.255.0:DB88FXX81:eth0:none PID hash table entries: 2048 (order: 11, 8192 bytes) Console: colour dummy device 80x30 Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) Memory: 256MB 256MB 0MB 0MB = 512MB total Memory: 515456KB available (3864K code, 257K data, 104K init) Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok NET: Registered protocol family 16 CPU Interface ------------- SDRAM_CS0 ....base 00000000, size 256MB SDRAM_CS1 ....base 10000000, size 256MB SDRAM_CS2 ....disable SDRAM_CS3 ....disable PEX0_MEM ....base e8000000, size 128MB PEX0_IO ....base f2000000, size 1MB INTER_REGS ....base f1000000, size 1MB NFLASH_CS ....base fa000000, size 2MB SPI_CS ....base f4000000, size 16MB BOOT_ROM_CS ....no such DEV_BOOTCS ....no such CRYPT_ENG ....base f0000000, size 2MB Marvell Development Board (LSP Version KW_LSP_4.2.7_patch2)-- SHEEVA PLUG Soc: 88F6281 A0 LE Detected Tclk 200000000 and SysClk 400000000 MV Buttons Device Load Marvell USB EHCI Host controller #0: c08b8600 PEX0 interface detected no Link. PCI: bus0: Fast back to back transfers enabled SCSI subsystem initialized usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb NET: Registered protocol family 2 Time: kw_clocksource clocksource has been installed. IP route cache hash table entries: 16384 (order: 4, 65536 bytes) TCP established hash table entries: 65536 (order: 7, 524288 bytes) TCP bind hash table entries: 65536 (order: 6, 262144 bytes) TCP: Hash tables configured (established 65536 bind 65536) TCP reno registered RTC registered Use the XOR engines (acceleration) for enhancing the following functions: o RAID 5 Xor calculation o kernel memcpy o kenrel memzero Number of XOR engines to use: 4 cesadev_init(c000c894) mvCesaInit: sessions=640, queue=64, pSram=f0000000 Warning: TS unit is powered off. MV Buttons Driver Load NTFS driver 2.1.28 [Flags: R/O]. JFFS2 version 2.2. (NAND) 息 2001-2006 Red Hat, Inc. io scheduler noop registered io scheduler anticipatory registered (default) Serial: 8250/16550 driver $Revision: 1.61 $ 4 ports, IRQ sharing disabled serial8250.0: ttyS0 at MMIO 0xf1012000 (irq = 33) is a 16550A serial8250.0: ttyS1 at MMIO 0xf1012100 (irq = 34) is a 16550A Loading Marvell Ethernet Driver: o Cached descriptors in DRAM o DRAM SW cache-coherency o Single RX Queue support - ETH_DEF_RXQ=0 o Single TX Queue support - ETH_DEF_TXQ=0 o TCP segmentation offload enabled o Receive checksum offload enabled o Transmit checksum offload enabled o Network Fast Processing (Routing) supported o Driver ERROR statistics enabled o Driver INFO statistics enabled o Proc tool API enabled o Rx descripors: q0=128 o Tx descripors: q0=532 o Loading network interface(s): o eth0, ifindex = 1, GbE port = 0 o eth1, ifindex = 2, GbE port = 1 mvFpRuleDb (dfd00000): 16384 entries, 65536 bytes Intel(R) PRO/1000 Network Driver - version 7.3.20-k2-NAPI Copyright (c) 1999-2006 Intel Corporation. e100: Intel(R) PRO/100 Network Driver, 3.5.17-k4-NAPI e100: Copyright(c) 1999-2006 Intel Corporation Warning Sata is Powered Off NFTL driver: nftlcore.c $Revision: 1.61 $, nftlmount.c $Revision: 1.61 $ NAND device: Manufacturer ID: 0xad, Chip ID: 0xdc (Hynix NAND 512MiB 3,3V 8-bit) Scanning device for bad blocks 2 cmdlinepart partitions found on MTD device nand_mtd Using command line partition definition Creating 2 MTD partitions on "nand_mtd": 0x00100000-0x00500000 : "uImage" 0x00500000-0x20000000 : "rootfs" ehci_marvell ehci_marvell.70059: Marvell Orion EHCI ehci_marvell ehci_marvell.70059: new USB bus registered, assigned bus number 1 ehci_marvell ehci_marvell.70059: irq 19, io base 0xf1050100 ehci_marvell ehci_marvell.70059: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004 usb usb1: configuration #1 chosen from 1 choice hub 1-0:1.0: USB hub found hub 1-0:1.0: 1 port detected USB Universal Host Controller Interface driver v3.0 usbcore: registered new interface driver usblp drivers/usb/class/usblp.c: v0.13: USB Printer Device Class driver Initializing USB Mass Storage driver... usbcore: registered new interface driver usb-storage USB Mass Storage support registered. mice: PS/2 mouse device common for all mice i2c /dev entries driver Linux telephony interface: v1.00 Marvell Telephony Driver: mvBoardVoiceAssembleModeGet: TDM not supported(boardId=0x9) assembly=-1,irq=-1 mp_check_config: Error, invalid voice assembley mode md: linear personality registered for level -1 md: raid0 personality registered for level 0 md: raid1 personality registered for level 1 raid6: int32x1 97 MB/s raid6: int32x2 114 MB/s raid6: int32x4 122 MB/s raid6: int32x8 110 MB/s raid6: using algorithm int32x4 (122 MB/s) md: raid6 personality registered for level 6 md: raid5 personality registered for level 5 md: raid4 personality registered for level 4 raid5: measuring checksumming speed arm4regs : 1083.600 MB/sec 8regs : 754.800 MB/sec 32regs : 899.600 MB/sec raid5: using function: arm4regs (1083.600 MB/sec) device-mapper: ioctl: 4.11.0-ioctl (2006-10-12) initialised: dm-devel@redhat.com dm_crypt using the OCF package. sdhci: Secure Digital Host Controller Interface driver sdhci: Copyright(c) Pierre Ossman mvsdmmc: irq =28 start f1090000 mvsdmmc: no IRQ detect usbcore: registered new interface driver usbhid drivers/hid/usbhid/hid-core.c: v2.6:USB HID core driver Advanced Linux Sound Architecture Driver Version 1.0.14 (Thu May 31 09:03:25 2007 UTC). mvCLAudioCodecRegGet: Error while reading register! mvCLAudioCodecInit: Error - Invalid Cirrus Logic chip/rev ID! Error - Cannot initialize audio decoder.at address =0xff<6>ALSA device list: #0: Marvell mv88fx_snd ALSA driver TCP cubic registered NET: Registered protocol family 1 NET: Registered protocol family 17 eth0: started IP-Config: Complete: device=eth0, addr=10.4.50.4, mask=255.255.255.0, gw=10.4.50.5, host=DB88FXX81, domain=, nis-domain=(none), bootserver=10.4.50.5, rootserver=10.4.50.5, rootpath= md: Autodetecting RAID arrays. md: autorun ... md: ... autorun DONE. Empty flash at 0x087dd338 ends at 0x087dd800 VFS: Mounted root (jffs2 filesystem). Freeing init memory: 104K * Setting preliminary keymap... [ OK ] * Setting the system clock * Starting basic networking... [ OK ] * Starting kernel event manager... [ OK ] * Loading hardware drivers... [ OK ] * Setting the system clock * Loading kernel modules... [ OK ] * Loading manual drivers... * Setting kernel variables (/etc/sysctl.conf)... [ OK ] * Setting kernel variables (/etc/sysctl.d/10-console-messages.conf)... [ OK ] * Setting kernel variables (/etc/sysctl.d/10-network-security.conf)... [ OK ] * Setting kernel variables (/etc/sysctl.d/10-process-security.conf)... error: "vm.mmap_min_addr" is an unknown key [fail] * Setting kernel variables (/etc/sysctl.d/10-tcp-timestamps-workaround.c[ OK ] * Activating swap... [ OK ] FATAL: Could not load /lib/modules/2.6.22.18/modules.dep: No such file or directory FATAL: Could not load /lib/modules/2.6.22.18/modules.dep: No such file or directory * Starting early crypto disks... [ OK ] FATAL: Could not load /lib/modules/2.6.22.18/modules.dep: No such file or directory FATAL: Could not load /lib/modules/2.6.22.18/modules.dep: No such file or directory * Starting remaining crypto disks... [ OK ] * Checking file systems... fsck 1.41.3 (12-Oct-2008) [ OK ] * Mounting local filesystems... [ OK ] * Activating swapfile swap... [ OK ] * Configuring network interfaces... [ OK ] * Setting up console font and keymap... [ OK ] * Starting system log daemon... Ubuntu jaunty (development branch) debian ttyS0 debian login: [ OK ] [ OK ] * Starting kernel log daemon... [ OK ] * Starting OpenBSD Secure Shell server sshd [ OK ] * Starting periodic command scheduler crond fat: exports duplicate symbol fat_add_entries (owned by kernel) insmod: error inserting '/boot/fat.ko': -1 Invalid module format Ubuntu jaunty (development branch) debian ttyS0 debian login:
u-boot
Marvell>> help ? - alias for 'help' base - print or set address offset boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootext2 dev:boot_part1,boot_part2 addr boot_image linux_dev_name bootm - boot application image from memory bootp - boot image via network using BootP/TFTP protocol bubt - Burn an image on the Boot Nand Flash. chpart - change active partition cmp - memory compare cmpm - Compare Memory cp - memory copy cpumap - Display CPU memory mapping settings. crc32 - checksum calculation date - get/set/reset date & time dclk - Display the MV device CLKs. dhcp - invoke DHCP client to obtain IP/boot params diskboot- boot from IDE device echo - echo args to console eeprom - EEPROM sub-system erase - erase FLASH memory ext2load- load binary file from a Ext2 filesystem ext2ls - list files in a directory (default /) fatinfo - print information about filesystem fatload - load binary file from a dos filesystem fatls - list files in a directory (default /) fi - Find value in the memory. flinfo - print FLASH memory information fsinfo - print information about filesystems fsload - load binary file from a filesystem image g - start application at cached address 'addr'(default addr 0x40000) go - start application at address 'addr' help - print online help icrc32 - checksum calculation ide - IDE sub-system iloop - infinite loop on address range imd - i2c memory display imm[.b, .s, .w, .l] - i2c memory modify (auto-incrementing) imw - memory write (fill) inm - memory modify (constant address) iprobe - probe to discover valid I2C chip addresses ir - reading and changing MV internal register values. loop - infinite loop on address range ls - list files in a directory (default /) map - Diasplay address decode windows md - memory display me - PCI master enable mm - memory modify (auto-incrementing) mp - map PCI BAR mtdparts- define flash/nand partitions mtest - simple RAM test mv_diag - perform board diagnostics mv_diag - display all available tests mv_diag all - run all available tests mv_diag test1 - run specified test mw - memory write (fill) nand - NAND sub-system nboot - boot from NAND device nbubt - Burn a boot loader image on the Boot Nand Flash. nm - memory modify (constant address) pci - list and access PCI Configuration Space phyRead - Read PCI-E Phy register pciePhyWrite - Write PCI-E Phy register phyRead - Read Phy register phyWrite - Write Phy register ping - send ICMP ECHO_REQUEST to network host printenv- print environment variables protect - enable or disable FLASH write protection rarpboot- boot image via network using RARP/TFTP protocol rcvr - Satrt recovery process (Distress Beacon with TFTP server) reset - Perform RESET of the CPU resetenv - Return all environment variable to default. run - run commands in an environment variable saveenv - save environment variables to persistent storage se - PCI Slave enable setenv - set environment variables sflash - read, write or erase the external SPI Flash. sg - scanning the PHYs status sp - Scan PCI bus. tftpboot- boot image via network using TFTP protocol usb - USB sub-system usbboot - boot from USB device version - print monitor version Marvell>> Marvell>> printenv baudrate=115200 loads_echo=0 rootpath=/mnt/ARM_FS/ netmask=255.255.0.0 console=console=ttyS0,115200 CASset=min MALLOC_len=1 ethprime=egiga0 bootargs_root=root=/dev/mtdblock2 ro ethmtu=1500 usb0Mode=host nandEcc=1bit ethact=egiga0 serverip=10.10.0.2 ipaddr=10.10.0.1 cesvcid=ULULULULULULPPULULULULULDA bootargs_end=:::DB88FXX81:eth0:none image_name=uImage standalone=fsload 0x2000000 $(image_name);setenv bootargs $(console) root=/dev/mtdblock0 rw ip=$(ipaddr):$(serverip)$(bootargs_end) $(mvPhoneConfig); bootm 0x2000000; mvPhoneConfig=mv_phone_config=dev0:fxs,dev1:fxs mvNetConfig=mv_net_config=(00:11:88:0f:62:81,0:1:2:3),mtu=1500 yuk_ethaddr=00:00:00:EE:51:81 netretry=no rcvrip=169.254.100.100 loadaddr=0x02000000 autoload=no ethaddr=00:50:43:01:D1:EE run_diag=no bootargs=console=ttyS0,115200 mtdparts=nand_mtd:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 rw ip=10.4.50.4:10.4.50.5:10.4.50.5:255.255.255.0:DB88FXX81:eth0:none bootcmd=nand read.e 0x800000 0x100000 0x400000; bootm 0x800000 stdin=serial stdout=serial stderr=serial mainlineLinux=no enaMonExt=no enaCpuStream=no enaWrAllo=no pexMode=RC disL2Cache=no setL2CacheWT=yes disL2Prefetch=yes enaICPref=yes enaDCPref=yes sata_dma_mode=yes netbsd_en=no vxworks_en=no bootdelay=3 disaMvPnp=no enaAutoRecovery=yes
2009-08-11 Sheeva Plug
msaitoh氏に相乗りしてたSheeva Plugが来たのでとりあえず分解
この大きさと値段で1.2GHzはパフォーマンスいいよなぁ。




作り置きのTTLレベルシリアルケーブルが無いので現在作成中。
2009-08-02 STR8100/STR9100デバイスまとめ
これと同じようにNetBSDが動かせると思わしきデバイス。STR9100のコードはまだ書いてないけど、今の所STR8100と違う所は割り込みとEther部分だけだからやりだせばすぐだろう。
AREA LAN EVOLUTION | STR8132 250MHz | LAN,USB |
CNET CWR-635M(※) | STR9105 200MHz | LAN,USB,mini-pci(WiFi) |
COREGA CG-BARPROG | STR9102 ?MHz | LAN |
PLANEX MZK-W04G | STR91?? ?MHz | LAN,USB,WiFi |
NetIndex クティオ | STR91?? ?MHz | LAN,USB,WiFi,CF |
CG-BARPROGはETHERしかないのでかなりどうでもいいけど、MZK-W04Gは欲しい。実質8kくらいか。中古で落ちてないかなあ。
クティオは高い…。あとはCMR-250のCPUが気になる。これも高いけど。
※TRIPLET GATEのTWR-350 or COVENTIVEのCMR-350のOEM
2009-08-01 Eye-Fi
というわけで、超いまさらですが先日EyeFiを買いました。持ってるデジカメが古くてSDHC使えないのでEyeFi Share 2Gです。 いきなし初期不良で涙目だったけど、サポートの対応が結構素早くて、1〜2日で交換完了。
初期登録にはWindows/Macが必要なんだけど、プロトコルはある程度hackされていたのでいろいろ試してみた。
EyeFiManager (on Windows) の動作は
・https://api.eye.fi/ へ接続して EyeFiManager の Private Address を登録する (?)
・TCP Port 59748 で Listen して、EyeFi カードからの接続を待ち受ける。
・EyeFi カードから接続されると、SOAP を喋って EyeFiカードから画像を受信する。 その時ついでにサムネイル等を作ってEyeFiサーバへ情報をうpする
EyeFiカード側の動作は
・SSIDをscanする
・scanして接続すべきSSIDがあれば接続、dhcpでアドレスをもらう
・https://api.eye.fi/ へ接続して何やら喋る。EyeFiManager の Private Address を教えてもらう
・教えてもらった EyeFiManager の Private Address へ接続する
・接続できなければ、dhcp でもらった subnet 内にあるIPアドレスの存在をarpで調べて、 arp に答えたら片っ端から TCP Port 59748 に接続を試す(ひでえ!)
・EyeFiManager の TCP Port 59748 に接続できたら、SOAP を喋って EyeFiManager へ画像を送信する
EyeFiManager のアドレスを http://api.eye.fi/ に登録する所は SSL なので解析できてないみたいだけど、 EyeFiカードとEyeFiManager間のプロトコルは平文のSOAPなので余裕で解析されていて、 Eye Fi Standalone Server を使えば Windows の EyeFiManager は必要なくなったのでした。めでたしめでたし。
他にもEyeFiカードが直接EyeFiのサーバへ画像をアップロードする設定とかもあるようだ。
この場合、後から起動された EyeFiManager が EyeFi サーバへ接続して画像を取りにいくのかな。
この部分のプロトコルもまだ解析されていないみたい (たぶんhttpsなんでめんどくさいんだろう)
EyeFiカードとおしゃべりするには、EyeFi SDカード内のファイルシステム上に特殊なファイルがあるので、そのファイルに対してread/writeしてやれば良いようだ。
でもこれもまだあまり解析されてないっぽい。
2009-07-30 00:aa:bb:cc:dd:10
糞エアリアの LAN EVOLUTION の firmware として最初から入ってる Linux を立ち上げて、(初めて)WEB画面にアクセスして確認してみたら、mac adderss は 00:22:ec:02:00:f3 になってた。
今使ってる 00:aa:bb:cc:dd:10 は、LAN EVOLUTION の U-Boot の flash の環境変数領域に設定されていた値で、U-Boot の tftpboot はこのふざけた mac address で boot しやがるのですが、 やっぱりどっかにちゃんとした mac address が書かれているんだなぁ。どこだろう。まぁ 00:aa:bb:cc:dd:10 のままでもいいんですが。
というわけで、イーサの続きを書く。
受信時のCRCを含めるか含めないかのビット操作に気づかなくて少しハマったものの、一応 nfsboot でシングルユーザまで動いた。
たまに boot 中に RX FIFO FULL でドライバが止まったりするけど。
パフォーマンス出てないっぽい。CPU のデータキャッシュが disable なままだったり、ドライバがまだヘボヘボチューニングなのもあるけど、根本的に遅いのは RX ring buffer の充填を auto polling にしてるのが悪いんじゃなかろうか。
自前でDMAをハンドリングするように変えてみよう…
NetBSD/evbarm STR81xx/91xx Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.15 (STR81xx) #868: Thu Jul 30 03:44:56 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28288 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC disabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star STR8100 Equuleus Family SoC (0x8131eeee) starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console com1 at star0 addr 0x78800000-0x7880001f irq 10: ns16550a, working fifo gec0 at star0 addr 0x70000000-0x70000133 irq 18: Gigabit Ethernet Controller gec0: Ethernet address 00:aa:bb:cc:dd:10 ukphy0 at gec0 phy 0: Generic IEEE 802.3u media interface ukphy0: OUI 0x000e4e, model 0x0025, rev. 1 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gec_mib_intr:390: sc=0xc4098000, status=0x4<PORT_STATUS_CHG> boot device: <unknown> root device: gec_mib_intr:390: sc=0xc4098000, status=0x4<PORT_STATUS_CHG> gec0 dump device: file system (default generic): root on gec0 nfs_boot: trying static nfs_boot: client_addr=172.31.185.8 nfs_boot: gateway=172.31.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=172.31.185.65 nfs_boot: root=172.31.185.65:/src/boot/str8132 gec_init:707: ifp=0xc4099858 gec_stop:809: ifp=0xc4099858 gec_reset:1064 gec_miibus_statchg:1053: status=>00040114 gec_mib_intr:390: sc=0xc4098000, status=0x4<PORT_STATUS_CHG> root on 172.31.185.65:/src/boot/str8132 root file system type: nfs WARNING: no TOD clock present WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! init path (default /sbin/init): init: trying /sbin/init Thu Jul 30 03:48:37 UTC 2009 eval: cannot open /etc/fstab: no such file mount: Cannot open `/etc/fstab': No such file or directory mount: Cannot open `/etc/fstab': No such file or directory mount: Cannot open `/etc/fstab': No such file or directory mount: Cannot open `/etc/fstab': No such file or directory mount: /: unknown special file or file system. swapctl: Cannot open `/etc/fstab': No such file or directory Starting file system checks: fsck: Cannot open `/etc/fstab': No such file or directory fsck: Can't open checklist file: /etc/fstab Automatic file system check failed; help! ERROR: ABORTING BOOT (sending SIGTERM to parent)! 1 2009-07-30T03:55:47.998088+00:Enter pathname of shell or RETURN for /bin/sh: Terminal type is vt100. We recommend that you create a non-root account and use su(1) for root access. # # uname -a NetBSD 5.99.15 NetBSD 5.99.15 (STR81xx) #868: Thu Jul 30 03:44:56 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx evbarm # cd /etc # cat > fstab 172.31.185.65:/src/boot/str8132 / nfs rw ^D # mount / # df Filesystem 1K-blocks Used Avail %Cap Mounted on 172.31.185.65:/src/boot/str8132 479777102 130617864 325170384 28% / # ifconfig -a gec0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:aa:bb:cc:dd:10 media: Ethernet autoselect (100baseTX full-duplex) status: active inet 172.31.185.8 netmask 0xfffffe00 broadcast 172.31.185.255 inet6 fe80::2aa:bbff:fecc:dd10%gec0 prefixlen 64 scopeid 0x1 lo0: flags=8048<LOOPBACK,RUNNING,MULTICAST> mtu 33192 #
調子にのってマルチユーザにしたら落ちた。
# ^DThu Jul 30 03:51:19 UTC 2009 Not checking /: nfs mounted Starting file system checks: Setting tty flags. Setting sysctl variables: ddb.onpanic: 1 -> 0 Starting network. /etc/rc: WARNING: $hostname not set. IPv6 mode: host Configuring network interfaces:. Adding interface aliases:. Building databases: dev, utmp, utmpx, servicespanic: kernel diagnostic assertion "si->si_active" failed: file "../../../../kern/kern_softint.c", line 506 cpu0: Begin traceback... 0xc3ffdf70 scp=0xc3ffdf70 rlv=0xc3ffdf54 (0xc3ffdf54) rsp=0xc3ffdf44 rfp=0xc0131960 Bad frame pointer: 0xc0131960 cpu0: End traceback... rebooting...
kern_softintってまたイヤそうな所だな…
2009-07-28 ICMP6
PHY見えたーーーーーーーー。
なぜか U-Boot が起動時に (しかもご丁寧に tftp でカーネルをロードした直後に) Power Management Register (0x77000000〜) の PHY のソフトリセットビットを操作してやがった。なぜそんなことを…リンクダウンさせるため? にしては強引すぎるだろ常考
しかもETHERコントローラのレジスタではなくリセットビット…さらにリセットしっぱなしで寝かせたビットを起こさずに…。理解不能。
というわけで、無事にukphy0が見えた。
NetBSD 5.99.15 (STR81xx) #788: Tue Jul 28 00:33:30 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28288 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC disabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star STR8100 Equuleus Family SoC (0x8131eeee) starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console com1 at star0 addr 0x78800000-0x7880001f irq 10: ns16550a, working fifo gec0 at star0 addr 0x70000000-0x70000133 irq 18: Gigabit Ethernet Controller gec0: Ethernet address 00:aa:bb:cc:dd:10 ukphy0 at gec0 phy 0: Generic IEEE 802.3u media interface ukphy0: OUI 0x000e4e, model 0x0025, rev. 1 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto boot device: <unknown> root device:
§ § §
リンクアップさえすれば送信も余裕で動くだろうと思いつつ実行するが…全然ダメだった。うーむ。
しかし、どうも壊れてるっぽい変なパケットを観測。リングバッファのアドレスがおかしい…じゃなくて、キャッシュか? bus_dmamap_syncをきちんと挿入して再度チャレンジすると、違うパケットが出た。
00:34:06.984958 00:aa:bb:cc:dd:10 > 33:33:ff:cc:dd:10, ethertype IPv6 (0x86dd), length 86: :: > ff02::1:ffcc:dd10: HBH ICMP6, multicast listener reportmax resp delay: 0 addr: ff02::1:ffcc:dd10, length 24 0x0000: 6000 0000 0020 0001 0000 0000 0000 0000 `............... 0x0010: 0000 0000 0000 0000 ff02 0000 0000 0000 ................ 0x0020: 0000 0001 ffcc dd10 3a00 0100 0502 0000 ........:....... 0x0030: 8300 c4e9 0000 0000 ff02 0000 0000 0000 ................ 0x0040: 0000 0001 ffcc dd10 ........
なぜにIPv6…
INET6 な kernel なので、インターフェイスが UP した瞬間にリンクローカルアドレスが付いて NDP を喋ってるからだ。
いやそれはわかるんだけど、nfsboot が出力しているはずの ARP パケットはなぜ出力されないのだろう。
§ § §
気分転換していたら気がついた。IPv6のNDPだけ出て、ARPが出ないのはパケット長のせいだった。
調べてみると、CRC含む64byte未満のセグメントは、リングバッファからDMA転送されて送信完了割り込みが来てMIBカウンタまで更新するものの、実際はパケットを出力していなかった。
padding 用のセグメントを bus_dmamem_alloc しておいて、足りないパケットにはパディングセグメントを付け足してやる。
ついでにいろいろ綺麗に書き直す。bus_dmamap_t は物理アドレスだけでなく論理アドレスもMIで保存してくれればいいのに。
来週は受信。
2009-07-26 Embedded PHY
STR81xxのpdfに Gigabit Ethernet Contoller (GEC) と書いてあるので if_gec.c にする。
安直なので後で困りそう。Gigabitと名前が付いてる割に、Embedded な PHY は 10/100M しか対応してない。1G は外付け PHY で実装した時のみだ。
ちなみにSTR91xxの方は
・Embedded Switch Controller (including HNAT and MAC)
・Embedded 4-port Gigabit Switch Engine
とかいう表記があるので if_esc とか if_gse にするか。いまいちパッとしないなぁ。
§ § §
送信パケットなmbufをNICのring bufferに展開する所を書いて、ついでに確認のためmbufの中身をprintfしたりするデバッグコードを入れて、送信してみる。試行錯誤しながら、なんとなく動くようになった。
gec_start() で ring bufferを充填して、DMA転送開始。送信完了割り込みも問題なく入る。うはw余裕www送信キター…と思ったら、してくれない。PHYが見えないのだ。
内蔵PHYなのでmiibus経由でアクセスするのじゃなくて、レジスタ直接叩くのかなぁ、とか思っていろいろ試すが、反応しない。MII経由でPHYをread/writeしても0xffffしか読めない。というかそもそもリンクアップさえしてないよ? うーん…
pdfには、STR8132はMIIBUSを持っていないように読み取れるので、そもそもMIIはアクセスできないのだろうと思って各種レジスタを叩きまくるが、やっぱりリンクアップしない。
うーーーーーーーむ。
土日の間、丸二日悩みつつ、やっぱりわからないのでカルドセプトDSをしつつフテ寝する。
2009-07-22 gcc -fno-delete-null-pointer-checks
http://slashdot.jp/linux/article.pl?sid=09/07/22/0121226 http://isc.sans.org/diary.html?storyid=6820 http://tamo.tdiary.net/20090718.html
知らなかった。恐いなぁ。
テスト。
#include <stdio.h> struct xxx { struct xxx *xxx; }; void test(struct xxx *p) { struct xxx *pp = p->xxx; if (p == NULL) return; printf("HERE pp=%p\n", pp); }
# cc -fdelete-null-pointer-checks -O -S test.c .file "test.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "HERE pp=%p\n" .text .globl test .type test, @function test: pushl %ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax pushl (%eax) // pp = p->xxx pushl $.LC0 call printf // printf(...) addl $16, %esp leave ret .size test, .-test .ident "GCC: (GNU) 4.1.3 20080704 prerelease (NetBSD nb2 20081120)"
無条件にprintfが呼ばれてる。まじか…
# cc -fno-delete-null-pointer-checks -O -S test.c .file "test.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "HERE pp=%p\n" .text .globl test .type test, @function test: pushl %ebp movl %esp, %ebp subl $8, %esp movl 8(%ebp), %eax movl (%eax), %edx // pp = p->xxx testl %eax, %eax // if (p == NULL) je .L4 // return; subl $8, %esp pushl %edx pushl $.LC0 call printf // printf(...) addl $16, %esp .L4: leave ret .size test, .-test .ident "GCC: (GNU) 4.1.3 20080704 prerelease (NetBSD nb2 20081120)"
このように -fno-delete-null-pointer-checks を付けると大丈夫なのだが、-fdelete-null-pointer-checks は -O2 で enable になるので、
zero page触ってfaultしないkernelとか組込みでは -fno-delete-null-pointer-checks 付けとくのが無難。
つーかそれよりも zero page 触ると panic するようにしとくのが一番いい。
2009-07-21 cpu_initclocks
mountrootまで動いたのはいいのだが、main() → configure2() → initclocks() → cpu_initclocks() でタイマが intr_establish された直後から割り込みがかかりっぱなしになる。
dispatcher で interrupt status をクリアしても消えませんよ? なんじゃらほい? と悩んでいた訳なのだが、単に制御レジスタの叩き方がまずいだけだった。
割り込みコントローラに Software Interrupt Register ってのがあるのだが、swi のことか? と思って何も考えず 1 を書いてしまっていたのである。
これは ARM の swi とは全然関係なくて(よく考えりゃあたりまえだ)、IRQをソフト的に発生させる、というレジスタで、そんなものとりあえず使わないので 0x00000000 書いて終了。
これで割り込みは問題なく動くようになった。
次、com_attach_subr() が固まる問題。
実は固まっているのではなく、ものすごく時間がかかっていただけで、偶然気付いたのだが数分放置していたら mountroot まで来ていた。
となると怪しい個所は何かの timeout 待ちか delay くらいしか思いつかず、すぐに判明。
タイマ関連の割り込み設定やレジスタ初期化は cpu_initclocks() で行うようにしているが、com_attach_subr() は cpu_initclocks() よりも
timer attach の中で初期化するようにして終わり。
というわけで、VM、割り込み、および timer と com の attach までクリア
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.15 (STR81xx) #507: Tue Jul 21 01:35:53 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28576 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC disabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star STR8100 Equuleus Family SoC (0x8131eeee) starclk0 at star0 addr 0x79000000-0x79000047: SoC Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console boot device: <unknown> root device: ? use one of: md0[a-h] ddb halt reboot root device: ddb Stopped in pid 0.1 (system) at netbsd:cpu_Debugger+0x4: mov r15, r14 db> show event evcnt type 1: cpu int 0 = 115 evcnt type 1: cpu int 1 = 75 evcnt type 1: cpu int 9 = 5 evcnt type 0: softint clk/0 = 5 evcnt type 0: callout late/0 = 3 evcnt type 0: crosscall unicast = 2 evcnt type 0: namecache under scan target = 1 db> c use one of: md0[a-h] ddb halt reboot root device: halt syncing disks... done unmounting file systems... done The operating system has halted. Please press any key to reboot. rebooting...
USBはともかく、GPIOとかRTCとかWatchDogとか軽めのやつもいろいろ残ってるけど、次は当然Etherで。memory diskとかめんどくさいことせずに一気にnfsbootしちゃおう。
2009-07-16 TWR-350
じゃんぱら2号店にTWR-350が8.8kであった。微妙に悩んだものの、無線付いて安いSTR9105デバイスということと、mountrootまで来た記念に買ってきた。いわゆるイーモバ用アクセスポイントルータ。OEMはCWR-635M。
いつものように電源入れてみる前に分解。




TXとRXはどちらかわからないので、一度継いでから電源入れつつシリアルのスピードを9600〜115200まで変えてみて、
ダメだったらTXとRX入れ変えて再度スピード特定。
スピードは38400bps、ピン配置は、外側から順に、RX、VCC、TX、GNDの順でした。(※初出ピンの順序間違えてたので修正しました)
中身は ARMBoot + Linux。
ARMboot 1.1.0 (Dec 20 2005 - 16:07:00) PEK maintain version 1.3.100000000 ARMboot code: 00000000 -> 00016900 DDR SDRAM Configuration with DDRC Data Bus Width x16: DDR Bank #0: 00000000 32 MB *** Using default environment init pgtable ttb is at: 40000 pgtconf... ttbSet ttbSet OK... Hit any key to stop autoboot: 0 done. ## Starting application at 0x0cf00000 ... Uncompressing Linux............................................................................. done, booting the kernel. paging_init()....OK request_standard_resources()....OK Linux version 2.4.27-uc0-pek3 (stone@user-desktop) (gcc version 3.3.6) #6 篋 9 26 13:58:46 CST 2008 CPU: Faraday FA526id(wb) revision 1 ICache:16KB enabled, DCache:16KB enabled, BTB support Machine: STAR_STR9100 alloc_bootmem_low memtable_init On node 0 totalpages: 8192 zone(0): 8192 pages. zone(1): 0 pages. zone(2): 0 pages. Kernel command line: root=/dev/ram0 mem=32M panic=1 IRQ Timer1 at interrupt number 0x0 and clock 100000000(Hz) Calibrating delay loop... 153.60 BogoMIPS Memory: 32MB = 32MB total Memory: 25460KB available (1905K code, 536K data, 64K init) Dentry cache hash table entries: 4096 (order: 3, 32768 bytes) Inode cache hash table entries: 2048 (order: 2, 16384 bytes) Mount cache hash table entries: 512 (order: 0, 4096 bytes) Buffer cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 8192 (order: 3, 32768 bytes) POSIX conformance testing by UNIFIX PCI: bus0: Fast back to back transfers disabled pci bridge found AHB to bridge interrupt status : 24200000 pci_enable: bus: 0 devfn: 0 pci_enable: bus: 0 devfn: 10 Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink socket Starting kswapd Journalled Block Device driver loaded i2c-core.o: i2c core module version 2.6.1 (20010830) i2c-dev.o: i2c /dev entries driver module version 2.6.1 (20010830) i2c-proc.o version 2.6.1 (20010830) Str9100 Serial Driver version 5.05c (2001-07-08) with no serial options enabled ttyS00 at 0xf7800000 (irq = 10) is a Star_UART STAR star9100 Driver, v1.9pek-d20cm (11/03/2005) - by PEK & Star Semi. RAMDISK driver initialized: 16 RAM disks of 14336K size 1024 blocksize PPP generic driver version 2.4.2 PPP MPPE compression module registered PPP Deflate Compression module registered SCSI subsystem driver Revision: 1.00 kmod: failed to exec /sbin/modprobe -s -k scsi_hostadapter, errno = 2 kmod: failed to exec /sbin/modprobe -s -k scsi_hostadapter, errno = 2 physmap flash device: 800000 at 10000000 phys_mapped_flash: Found 1 x16 devices at 0x0 in 16-bit bank Amd/Fujitsu Extended Query Table at 0x0040 phys_mapped_flash: Swapping erase regions for broken CFI table. number of CFI chips: 1 cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness. kmod: failed to exec /sbin/modprobe -s -k cmdlinepart, errno = 2 cmdlinepart partition parsing not available kmod: failed to exec /sbin/modprobe -s -k RedBoot, errno = 2 RedBoot partition parsing not available Using physmap partition definition Creating 3 MTD partitions on "phys_mapped_flash": 0x00000000-0x00040000 : "bootROM" 0x00040000-0x007c0000 : "bootpImage" 0x007c0000-0x00800000 : "User FS" Linux Kernel Card Services 3.1.22 options: [pci] [cardbus] usb.c: registered new driver usbdevfs usb.c: registered new driver hub hcd.c: ehci_hcd @ EHCI, EHCI_HCdriver hcd.c: irq 24, pci mem c3005000 usb.c: new USB bus registered, assigned bus number 1 USB f.c enabled, EHCI 1.00, driver 2003-Dec-29/2.4 hub.c: USB hub found hub.c: 2 ports detected host/usb-ohci_STR.c: USB OHCI at membase 0xc700c000, IRQ 23 host/usb-ohci_STR.c: usb-OHCI, OHCI_HCdriver usb.c: new USB bus registered, assigned bus number 2 hub.c: USB hub found hub.c: 2 ports detected usb.c: registered new driver acm acm.c: v0.21:USB Abstract Control Model driver for USB modems and ISDN adapters usb.c: registered new driver usblp printer.c: v0.13: USB Printer Device Class driver Initializing USB Mass Storage driver... usb.c: registered new driver usb-storage USB Mass Storage support registered. Linux video capture interface: v1.00 NET4: Linux TCP/IP 1.0 for NET4.0 IP Protocols: ICMP, UDP, TCP, IGMP IP: routing cache hash table of 512 buckets, 4Kbytes TCP: Hash tables configured (established 2048 bind 4096) ip_conntrack version 2.1 (256 buckets, 2048 max) - 328 bytes per conntrack ip_conntrack_pptp version $Revision: 1.61 $ loaded ip_nat_pptp version $Revision: 1.61 $ loaded ip_tables: (C) 2000-2002 Netfilter core team ipt_recent v0.3.1: Stephen Frost <sfrost@snowman.net>. http://snowman.net/projects/ipt_recent/ NET4: Unix domain sockets 1.0/SMP for Linux NET4.0. Ebtables v2.0 registered NET4: Ethernet Bridge 008 for NET4.0 Bridge firewalling registered 802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com> Other stuff added by David S. Miller <davem@redhat.com> NetWinder Floating Point Emulator V0.97 (double precision) ds: no socket drivers loaded! RAMDISK: Compressed image found at block 0 Freeing initrd memory: 4349K VFS: Mounted root (ext2 filesystem) readonly. Freeing init memory: 64K UART IRQ_ports = c0264e18 UART IRQ at interrupt number 0xa e2fsck 1.25 (20-Sep-2001) /dev/mtdblock3: clean, 12/32 files, 26/256 blocks e2fsck 1.25 (20-Sep-2001) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/mtdblock3: 12/32 files (0.0% non-contiguous), 26/256 blocks mount: Mounting /dev/mtdblock3 on /mount failed: Device or resource busy cp: /mount/nasmac: No such file or directory cp: `/mount/..' and `/cfg/..' are the same file crc_sum[fbdd567e] crc_x[fbdd567e] cmd[ifconfig eth0 hw ether 0008a1c0457e0008a1c0457f] SIOCSIFHWADDR: Success cmd[ifconfig eth1 hw ether 0008a1c0457f] SIOCSIFHWADDR: Success check switch mode start SW_PW cp: /home/httpd/cgi-bin/welcome_router.html: No such file or directory check switch mode end enter SW_MID SW_PW Using /bin/ovcamchip.o ovcamchip_core.c: v2.28 : OV camera chip I2C driver Using /bin/ov511.o usb.c: registered new driver ov511 ov511_core.c: v2.28 : ov511 USB Camera Driver Using /bin/pwc.o pwc Philips webcam module version 9.0.2 loaded. pwc Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840. pwc Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30, pwc the Creative WebCam 5 & Pro Ex, SOTEC Afina Eye and Visionite VCS-UC300 and VCS-UM100. usb.c: registered new driver Philips webcam Using /bin/pwcx.o Warning: loading pwcx will taint the kernel: non-GPL license - Proprietary. See http:pwc Philips webcam decompressor routines version 9.0-BETA-2 //pwc Supports all cameras supported by the main module (pwc). www.smcc.demon.nl/webcam/tainting.html See http://www.tux.org/lkml/#export-tainted for information about tainted modules Using /bin/spca5xx.o usb.c: registered new driver spca5xx spca5xxx.c: spca5xx driver 00.60.01 registered Using /bin/rt61ap.o Warning: loading rt61ap will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules we are now in Router mode! device eth0 entered promiscuous mode device ra0 entered promiscuous mode killall: pekcmd: no process killed bre0: port 2(ra0) entering learning state bre0: port 1(eth0) entering learning state killall: rt61apd: no process killed bre0: port 2(ra0) entering disabled state bre0: port 2(ra0) entering disabled state device ra0 left promiscuous mode Using /bin/rt61ap.o Warning: loading rt61ap will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules AuthMode:AuthMode=OPEN Key1Str=2004012677 Key2Str=2004012677 Key3Str=2004012677 Key4Str=2004012677 DefaultKeyID=1 device ra0 entered promiscuous mode bre0: port 2(ra0) entering learning state iptables: No chain/target/match by that name iptables: No chain/target/match by that name iptables: No chain/target/match by that name iptables: No chain/target/match by that name switch_mode=[router] 55555------rmmod usbserial----- rmmod: usbserial: No such file or directory USB device changed! debug FTP: looks like FTP server already DISABLED. cp: `/cfg/..' and `/mount/..' are the same file Welcome to _____ ____ ___ __ | __ \ / ___| | | / / | | | | | | | | / / | | | | | |__ | |/ / | |_| | | __| | \ Linux (Router with NAS) | ___/ | | | /\ \ | | | |___ | | \ \_ |_| \_____| |_| \ _\ STAR(R) STR910x USB device changed! dnsmasq: started, version 2.22 cachesize 150 dnsmasq: cleared cache dnsmasq: reading /etc/resolv.conf pek>info, udhcpd (v0.9.9-pre) started error, max_leases value (254) not sane, setting to 251 instead error, Unable to open /etc/udhcpd.leases.bre0 for reading bre0: port 1(eth0) entering forwarding state bre0: topology change detected, propagating bre0: port 2(ra0) entering forwarding state bre0: topology change detected, propagating
2009-07-15 mountroot
CFATTACH_DECL_NEW ではなく CFATTACH_DECL を使っていたという比較的つまらないポカだった。修正しつついろいろ試行錯誤して、mountrootまで来た。
試行錯誤と言っても com0 を attach したら止まったので、無理矢理 com attach を return させると以下まで来たのだった。
たぶん割り込みがいいかげんなせいだろう。
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.15 (STR81xx) #347: Wed Jul 15 22:22:22 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28576 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC disabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Semiconductor, STR8100/STR9100 Network Access Processor startmr0 at star0 addr 0x79000000-0x79000047: SoC Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: XXX boot device: <unknown> root device: ? use one of: md0[a-h] ddb halt reboot root device: ddb Stopped in pid 0.1 (system) at netbsd:cpu_Debugger+0x4: mov r15, r14 db> bt netbsd:getdisk+0x10 scp=0xc00accec rlv=0xc00ad128 (netbsd:setroot+0xf4) rsp=0xc02c4e08 rfp=0xc02c4fa0 r10=0x00e6dcf2 r9=0x00e6de06 r8=0x00000000 r7=0xc02c4ee8 r6=0x00000001 r5=0xc02c4f70 r4=0x00000002 netbsd:setroot+0x10 scp=0xc00ad044 rlv=0xc0068edc (netbsd:main+0x25c) rsp=0xc02c4fa4 rfp=0xc02c4fec r10=0x00e6dcf2 r9=0x00e6de06 r8=0xc0210e6c r7=0xc02884dc r6=0x00000002 r5=0x00e6dca4 r4=0x00000000 netbsd:main+0x10 scp=0xc0068c90 rlv=0xc00081f0 (netbsd:kernel_text+0x3c) rsp=0xc02c4ff0 rfp=0xc02c4ffc r10=0x00e6dcf2 r8=0x00e6ffdc r7=0x00e6de06 r6=0x00000002 r5=0x00e6dca4 r4=0x20008104 netbsd:kernel_text+0x3c scp=0xc00081f0 rlv=0xc010e628 (netbsd:initarm+0x8b4) rsp=0xc02c5000 rfp=0x00000000 db>
rebootもできるようにした。
db> reboot syncing disks... done unmounting file systems... done rebooting... U-Boot 1.1.4 (Nov 27 2007 - 09:29:18) U-Boot code: 00000000 -> 0001AF80 BSS: -> 0001FEF4 IRQ Stack: 00e6ff7c FIQ Stack: 00e6ef7c RAM Configuration: Bank #0: 00000000 32 MB Flash Manufacturer: ST Flash: 8 MB In: serial Out: serial Err: serial PLL clock at 250MHz CPU clock at 250MHz AHB clock at 125MHz APB clock at 62MHz Hit any key to stop autoboot: 0 Star Equuleus #
資料見つけてから一ヶ月。思ったより時間かかるなぁ。
2009-07-14 copyright
キタ━━━━━━
CPUのデータキャッシュ(CPU_CONTROL_DC_ENABLE)をOFFにしたら動いた。
そもそもNetBSDのFA526サポートはちゃんと動いてるのか疑惑ががが
ちなみにdata cache enableのままだと、vmをallocした個所を触ってfaultしてdata_abort_handler内でpmapがTLB埋めてreturnした後、再度同じアドレスでfault、という風にループしてた。
TLB設定した後にcache invalidateしてやればcache enableでも動くんじゃなかろうか。まぁいいや。些末な問題っぽいので後にしよ。
…というか動かなかったのオレジャネーーーーーーーーーーーーーー!!!!!!!
panic: config_devalloc: star は何かポカしてるだけだろう。
さて、これでやっと割り込みで遊べるお。
## Starting application at 0x21000000 ... NetBSD/evbarm STR81xx/91xx physmemory: 8192 pages at 0x00000000 -> 0x01ffffff freestart = 0x002a2000, free_pages = 7518 (0x00001d5e) Allocating page tables initarm: kernel_l1pt: 0xc02a4000:0x2a4000 initarm: kernel_pt_table: 0xc02a2000:0x2a2000 0xc02a3000:0x2a3000 0xc02a8000:0x2a8000 0xc02a9000:0x2a9000 0xc02aa000:0x2aa000 0xc02ab000:0x2ab000 0xc02ac000:0x2ac000 0xc02ad000:0x2ad000 0xc02ae000:0x2ae000 0xc02af000:0x2af000 0xc02b0000:0x2b0000 0xc02b1000:0x2b1000 0xc02b2000:0x2b2000 0xc02b3000:0x2b3000 0xc02b4000:0x2b4000 FIQ stack: p0x002b6000 v0xc02b6000 IRQ stack: p0x002b7000 v0xc02b7000 ABT stack: p0x002b8000 v0xc02b8000 UND stack: p0x002b9000 v0xc02b9000 SVC stack: p0x002ba000 v0xc02ba000 Creating L1 page table at 0x002a4000 Mapping kernel Constructing L2 page tables Mapping the vector page switching to new L1 page table @0x2a4000...done. init subsystems: stacks vectors undefined page pmap irq done. Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 5.99.15 (STR81xx) #305: Tue Jul 14 21:19:27 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28612 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC disabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache panic: config_devalloc: star Stopped in pid 0.1 (system) at netbsd:cpu_Debugger+0x4: mov r15, r14 db> db> db> reboot The operating system has halted. Please press any key to reboot. rebooting...
CPUのデータキャッシュ(CPU_CONTROL_DC_ENABLE)をOFFにしたら動いた。
そもそもNetBSDのFA526サポートはちゃんと動いてるのか疑惑ががが
ちなみにdata cache enableのままだと、vmをallocした個所を触ってfaultしてdata_abort_handler内でpmapがTLB埋めてreturnした後、再度同じアドレスでfault、という風にループしてた。
TLB設定した後にcache invalidateしてやればcache enableでも動くんじゃなかろうか。まぁいいや。些末な問題っぽいので後にしよ。
…というか動かなかったのオレジャネーーーーーーーーーーーーーー!!!!!!!
panic: config_devalloc: star は何かポカしてるだけだろう。
さて、これでやっと割り込みで遊べるお。
2009-07-09 pmap
serialがうまく動かなかったのは単に bus_space_tag が違っただけだった。8bit I/O を 32bit に map するべく a4x_space を使えば ok。comのクロックの設定の所だけ com.c の中で微妙に場合分け。
しかし arm の bus_space まわりも同じファイルがいろいろコピペされてるなぁ。bus幅変換はbus_spaceの基本機能として汎用的に作れそうな気がするのだが。
そして
panic: pmap_map_entry: no L2 table for VA 0xffff0000
は、「0xffff0000 に対応する L2 table entry が L1 table に無い」ということだった。
それくらい自動でやってよ pmap! とも思ったけど l2 table 領域の確保とかもあるからそうもいかないのか。
ちなみに STR81xx/91xx は 0x00080000 または 0x001000000 バイト毎に I/O が広く分布していてなかなか大変で、
star/star_machdep.c では pmap_devmap[] 以下のぶんだけ30エントリほど並べて書いている。
L1 table のサイズは 0x00100000 なので、ほぼ1デバイスで1エントリ分L1 tableを消費してしまう。
PA VA --------------------------------------- ---------- ----------- STR8100_FLASH_SRAM_MEMORY_BANK0 0x10000000 0xE1000000 STR8100_FLASH_SRAM_MEMORY_BANK1 0x11000000 0xE1100000 STR8100_FLASH_SRAM_MEMORY_BANK2 0x12000000 0xE1200000 STR8100_FLASH_SRAM_MEMORY_BANK3 0x13000000 0xE1300000 STR8100_IDE_DEVICE_REGISTER_SPACE 0x18000000 0xE1800000 STR8100_SPI_SERIAL_FLASH_MEMORY 0x30000000 0xE3000000 STRx100_GENERIC_DMA_REGISTER 0x60000000 0xE6000000 STR8100_NIC_REGISTER 0x70000000 0xE7000000 STR8100_SPI_PCM_TWI_IS_REGISTER 0x71000000 0xE7100000 STR8100_SDR_DDR_SDRAM_CONTROL_REGISTER 0x72000000 0xE7200000 STR8100_STATIC_MEMORY_CONTROL_REGISTER 0x73000000 0xE7300000 STR8100_IDE_CONTROL_REGISTER 0x74000000 0xE7400000 STRx100_MISC_REGISTER 0x76000000 0xE7600000 STRx100_POWER_MANAGEMENT_REGISTER 0x77000000 0xE7700000 STRx100_UART0_REGISTER 0x78000000 0xE7800000 STR8100_UART1_REGISTER 0x78800000 0xE7880000 STRx100_TIMER_REGISTER 0x79000000 0xE7900000 STRx100_WATCH_DOG_TIMER_REGISTER 0x7A000000 0xE7A00000 STRx100_REAL_TIME_CLOCK_REGISTER 0x7B000000 0xE7B00000 STRx100_GPIOA_REGISTER 0x7C000000 0xE7C00000 STR8100_GPIOB_REGISTER 0x7C800000 0xE7C80000 STRx100_PCI_CONFIGURATION_DATA_REGISTER 0xA0000000 0xEA000000 STRx100_PCI_CONFIGURATION_ADDR_REGISTER 0xA4000000 0xEA400000 STRx100_PCI_IO_SPACE 0xA8000000 0xEA800000 STRx100_PCI_MEMORY_SPACE 0xB0000000 0xEB000000 STRx100_USB11_CONFIGURATION_REGISTER 0xC0000000 0xEC000000 STRx100_USB11_OPERATION_REGISTER 0xC4000000 0xEC400000 STRx100_USB20_CONFIGURATION_REGISTER 0xC8000000 0xEC800000 STRx100_USB20_OPERATION_REGISTER 0xCC000000 0xECC00000 STR8100_USB11_20_DEVICE_REGISTER 0xD0000000 0xED000000 STR8100_INTERRUPT_CONTROL_REGISTER 0xFFFFF000 0xEFFFF000
たくさんあるとTLBのパフォーマンスにも影響しそうな気が。それともcacheするのはpage単位だからそうでもない?
FlashとPCI(STR8132には無いけど)はともかく、その他のデバイスは1MByteも領域要らないので、もっと小さな領域にまとめてL1 tableのエントリ2〜3個で済ましたほうがいいのかな。
さて、おかしかった所を修正して実行。
## Starting application at 0x21000000 ... NetBSD/evbarm STR81xx/91xx kerneldatasize=2835336 physmemory: 8192 pages at 0x20000000 -> 0x21ffffff freestart = 0x202b5000, free_pages = 7499 (0x00001d4b) Allocating page tables FIQ stack: p0x202e2000 v0xc02e2000 IRQ stack: p0x202e3000 v0xc02e3000 ABT stack: p0x202e4000 v0xc02e4000 UND stack: p0x202e5000 v0xc02e5000 SVC stack: p0x202e6000 v0xc02e6000 Creating L1 page table at 0x202b8000 Mapping kernel Constructing L2 page tables Mapping the vector page devmap_bootstrap switching to new L1 page table @0x202b8000...done. init subsystems: stacks vectors undefined page pmap irq done.
…の後固まった。むーん。
printfで調べてみると、どうも initarm() → main() → cpu_startup() まではちゃんと来ていて、
cpu_startup() からさらに pmap_postinit() の中で pool_grow した後の pool_item を触る所で固まっている。
これは fault が起こるべきなのに起きていないということか?
ARM_VECTORS_HI も ARM_VECTORS_LOW も試したのだがダメだった。arch/evbarm/star/star_machdep.c にはもうおかしな個所は無いはずだ。
何故だろう。arch/arm の方も読んでいかないとダメか…。
pdfともにらめっこ。
2009-06-30 panic
evbarm で KERNEL_BASE_PHYS が $xx200000 になってて前半2MbyteがMOTTAINAIのは、l1table や stack に使われてるのでMOTTAINAくないんじゃないかとymdさんに教えてもらった。
なるほど、確かにl1tableとstackに使っている。…が、l1tableは16kbyteあればいいし、stackも仮設定で sys/arch/arm/arm32/locore.S の中で svcstk としてちゃんと確保されなおすので、やっぱり 2Mbyte は取りすぎのような気がする。evbarm/orion_nas は 32kbyte だった。これくらいなら納得だ。
メモリレイアウトをどうしようかダラダラ考えていてあまり進んでなかったのだが、kernel を flash に置いたまま実行というのもしたいなぁ、と思って各領域を細かく l1table に登録することも少し考えてみたが、data セクションとかは結局 copy しなきゃならないし ldscript を別にしなきゃいけないしでめんどくさそうなので日和る。
案1。kernelがメモリに置かれた場合(0x21000000)は、0x20000000-0x21FFFFFF および kernel の後ろを VM にする。
とてもめんどくさそう。
案2。起動直後に 0x21000000 (または任意の場所) にロードされた自分自身を 0x20000000 にコピーする。
0x20000000〜 は U-Boot の領域とバッティングするが、割り禁にすればたぶん問題ない。
案3。kernelをflash(ROM)に置いたまま。
起動時に data section を FLASH から RAM へコピーしなければならない。ldscript で text と data の位置を考えて指定する必要がある。
とてもめんどくさそう。やるとしても後から考えよう。
というわけで素直に案2にする。
§ § §
star_start.S と star_machdep.c をガリガリ書いて、デバッグ用のシリアル直書き関数を携えて実行。
再配置のための自分自身のコピーもMMU Enableもできたようだ。デバッグ用のUART直叩きputc関数により、0xC0000000の仮想アドレスで実行できていることは確認。ヮーィ
しかし copyright は未だ表示されない。どうも consinit() で止まっているようだ。
どうやらこのUARTもなんちゃって16C550互換な様子。com.c に場合分けが必要。
でもこのせいではない。どうも bus_space_map が変っぽいなぁ…
とりあえず無理矢理comcnattachを通してやるとpanic()が動いた。
なにそれこわい
§ § §
よく見たら options CPU_FA526 の入れ忘れだった。
気をとり直しして再度ビルドして実行。
むー。star_machdep.c が適当だからっぽいなぁ。もうちょっとちゃんと読もう。
なるほど、確かにl1tableとstackに使っている。…が、l1tableは16kbyteあればいいし、stackも仮設定で sys/arch/arm/arm32/locore.S の中で svcstk としてちゃんと確保されなおすので、やっぱり 2Mbyte は取りすぎのような気がする。evbarm/orion_nas は 32kbyte だった。これくらいなら納得だ。
メモリレイアウトをどうしようかダラダラ考えていてあまり進んでなかったのだが、kernel を flash に置いたまま実行というのもしたいなぁ、と思って各領域を細かく l1table に登録することも少し考えてみたが、data セクションとかは結局 copy しなきゃならないし ldscript を別にしなきゃいけないしでめんどくさそうなので日和る。
案1。kernelがメモリに置かれた場合(0x21000000)は、0x20000000-0x21FFFFFF および kernel の後ろを VM にする。
とてもめんどくさそう。
RAM 0x20000000 (U-Boot) → VM RAM 0x20F00000 → VM RAM 0x21000000 (kernel) → KERNEL(0xC0000000) + VM + msgbuf RAM end 0x22000000
案2。起動直後に 0x21000000 (または任意の場所) にロードされた自分自身を 0x20000000 にコピーする。
0x20000000〜 は U-Boot の領域とバッティングするが、割り禁にすればたぶん問題ない。
RAM 0x20000000 (U-Boot) → KERNEL(0xC0000000) + VM RAM 0x20F00000 → VM RAM 0x21000000 (kernel→copy) → VM + msgbuf RAM end 0x22000000
案3。kernelをflash(ROM)に置いたまま。
起動時に data section を FLASH から RAM へコピーしなければならない。ldscript で text と data の位置を考えて指定する必要がある。
とてもめんどくさそう。やるとしても後から考えよう。
FLASH 0x10000000 (kernel on flash) → KERNEL(0xC0000000) RAM 0x20000000 (U-Boot) → DATA RAM 0x20F00000 → VM RAM 0x21000000 → VM + msgbuf RAM end 0x22000000
というわけで素直に案2にする。
§ § §
star_start.S と star_machdep.c をガリガリ書いて、デバッグ用のシリアル直書き関数を携えて実行。
再配置のための自分自身のコピーもMMU Enableもできたようだ。デバッグ用のUART直叩きputc関数により、0xC0000000の仮想アドレスで実行できていることは確認。ヮーィ
しかし copyright は未だ表示されない。どうも consinit() で止まっているようだ。
どうやらこのUARTもなんちゃって16C550互換な様子。com.c に場合分けが必要。
でもこのせいではない。どうも bus_space_map が変っぽいなぁ…
とりあえず無理矢理comcnattachを通してやるとpanic()が動いた。
Load address: 0x21000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################# done Bytes transferred = 2578976 (275a20 hex) ## Starting application at 0x21000000 ... 0xc010c06c HELLO consinit:start iobase:0x78000000 # 注: このへんは生々しいprintf debugの跡 iot:0xc027b9bc ioh:0xf7800000 consinit:done Hello? NetBSD/evbarm STR81xx/91xx panic: No support for this CPU type (66015260) in kernel
なにそれこわい
§ § §
よく見たら options CPU_FA526 の入れ忘れだった。
気をとり直しして再度ビルドして実行。
NetBSD/evbarm STR81xx/91xx physmemory: 8192 pages at 0x20000000 -> 0x21ffffff freestart = 0x202b4000, free_pages = 7500 (0x00001d4c) Allocating page tables pv_pa = 202b4000, L1_TABLE_SIZE=16384 IRQ stack: p0x202c2000 v0xc02c2000 ABT stack: p0x202c3000 v0xc02c3000 UND stack: p0x202c4000 v0xc02c4000 SVC stack: p0x202c5000 v0xc02c5000 Creating L1 page table at 0x202b4000 Mapping kernel pmap_map_chunk: pa=0x20000000 va=0xc0000000 size=0x20c000 resid=0x20c000 prot=0x3 cache=1 SSPPPPPPPPPPPP pmap_map_chunk: pa=0x2020c000 va=0xc020c000 size=0xa8000 resid=0xa8000 prot=0x3 cache=1 PPPPLLLLLLLLLLPPPP Constructing L2 page tables pmap_map_chunk: pa=0x202c2000 va=0xc02c2000 size=0x1000 resid=0x1000 prot=0x3 cache=1 P pmap_map_chunk: pa=0x202c3000 va=0xc02c3000 size=0x1000 resid=0x1000 prot=0x3 cache=1 P pmap_map_chunk: pa=0x202c4000 va=0xc02c4000 size=0x1000 resid=0x1000 prot=0x3 cache=1 P pmap_map_chunk: pa=0x202c5000 va=0xc02c5000 size=0x2000 resid=0x2000 prot=0x3 cache=1 PP pmap_map_chunk: pa=0x202b4000 va=0xc02b4000 size=0x4000 resid=0x4000 prot=0x3 cache=2 PPPP pmap_map_chunk: pa=0x202b8000 va=0xc02b8000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202b9000 va=0xc02b9000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202ba000 va=0xc02ba000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bb000 va=0xc02bb000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bc000 va=0xc02bc000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bd000 va=0xc02bd000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202be000 va=0xc02be000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bf000 va=0xc02bf000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202c0000 va=0xc02c0000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P panic: pmap_map_entry: no L2 table for VA 0xffff0000
むー。star_machdep.c が適当だからっぽいなぁ。もうちょっとちゃんと読もう。
2009-06-25 STR8132その4
割り込みまわりとcomとtimer入りのkernelはビルドできるようになった。まだ動かないけど。
めんどくさいからとりあえずメモリ32Mあるうちの16Mbyte目、0x21000000 にロードして VA=PA でマッピングして
go すりゃいいやと思ってたら、
みたいにしないとだめっぽいなあ。特にI/Oアドレス空間。
少くともSTR81xx/STR91xx みたいにメモリ空間の大半を占有してしまうようなレイアウトを、もっと狭くマッピングしなおしてやらないとダメっぽ。
そういえば最初に見た linux のパッチもそんなことしてたような、と思って見てみたら、確かに
として 0x12345678 を 0xf1235678 にマッピングしなおしていた。こいつかー。
§ § §
メインメモリ32Mbyteのうち、メモリの頭(0x20000000)から15Mbyte(!)をU-Bootが使っていて、
ここにloadしてしまうとloadした瞬間にU-Bootが落ちてしまう。
netbsd.bin を 0x21000000 にロードして、こんな感じにすればいいのかな。
0x21000000あるいは任意の場所にロードした後、割り禁にして自分自身を0x20000000にコピーして0x20000000から実行、のほうがレイアウト的には綺麗だしcopyしてjumpまでをrelocatableに書いとけばどこにロードしても動くので汎用性がありそうだが…。
つーか evbarm で KERNEL_BASE_PHYS が $xx200000 になってるやつがいくつかあるけど、前半2Mbyteは放置してるんだろうか、それとも使ってはいけない領域だから触ってないだけなんだろうか。2MbyteもMOTTAINAI!
ちゃんと使い切ってるようには見えないが…
次は evbarm/star/star_machdep.c と evbarm/star/star_starup.S あたりを。
めんどくさいからとりあえずメモリ32Mあるうちの16Mbyte目、0x21000000 にロードして VA=PA でマッピングして
go すりゃいいやと思ってたら、
kernel text 0xC0000000 〜 0xC1FFFFFF kernel vm 0xC1000000 〜 0xCFFFFFFF I/O, SoC regs 0xF0000000 〜 0xFFFFFFFF
みたいにしないとだめっぽいなあ。特にI/Oアドレス空間。
少くともSTR81xx/STR91xx みたいにメモリ空間の大半を占有してしまうようなレイアウトを、もっと狭くマッピングしなおしてやらないとダメっぽ。
そういえば最初に見た linux のパッチもそんなことしてたような、と思って見てみたら、確かに
#define IO_BASE 0xF0000000 #define IO_ADDRESS(x) (((x >> 4) & 0xffff0000) + (x & 0xffff) + IO_BASE)
として 0x12345678 を 0xf1235678 にマッピングしなおしていた。こいつかー。
§ § §
メインメモリ32Mbyteのうち、メモリの頭(0x20000000)から15Mbyte(!)をU-Bootが使っていて、
ここにloadしてしまうとloadした瞬間にU-Bootが落ちてしまう。
netbsd.bin を 0x21000000 にロードして、こんな感じにすればいいのかな。
Physical Addr ------- ----------------------- FLASH 0x10000000 → mapped I/O (0xF1000000〜? 空間足りる?) SoC reg 0x18000000 → mapped I/O (0xF1800000〜) RAM 0x20000000 (U-Boot) → VM RAM 0x20F00000 → VM RAM 0x21000000 → KERNEL_TEXT(0xC0000000) + VM + msgbuf RAM end 0x22000000 SoC reg 0x30000000 → mapped I/O (0xF3000000〜) SoC reg : → mapped I/O (0xFx000000〜) SoC reg 0xFFFFFFFF → mapped I/O (0xFF000000〜)
0x21000000あるいは任意の場所にロードした後、割り禁にして自分自身を0x20000000にコピーして0x20000000から実行、のほうがレイアウト的には綺麗だしcopyしてjumpまでをrelocatableに書いとけばどこにロードしても動くので汎用性がありそうだが…。
つーか evbarm で KERNEL_BASE_PHYS が $xx200000 になってるやつがいくつかあるけど、前半2Mbyteは放置してるんだろうか、それとも使ってはいけない領域だから触ってないだけなんだろうか。2MbyteもMOTTAINAI!
ちゃんと使い切ってるようには見えないが…
次は evbarm/star/star_machdep.c と evbarm/star/star_starup.S あたりを。
2009-06-19 STR8132 その3
IPLのコマンドでメモリいじってあそぶ。
GPIOA (0x7c000000) に 0x00000000/0xFFFFFFFF を書いたら LED が明滅した。
System clock control register (0x7700000c) の RTC_Sel を 1 (25MHzソース) にしたら、RTC (0x7b000000) が動き出した。
というわけで、がんばってずらずら書いた。う〜ん、作業チック。めんどくさい度up。
STR81xx と STR91xx は割り込みレジスタの設定がぜんぜん違うのでbusも別にしようと思ったけど、configが綺麗じゃないなぁ。
ifdefか動的に切り分ければいいや。というわけで
にする。来週は star_intr.[ch] あたりを。
ところで糞エアリア以外でSTR81xx/STR91xxな安いデバイスは他に無いもんか。
STR9105 - TWR-350 (CWR-635M)
http://su-u.jp/juju/%CA%AC%B2%F2%A4%B7%A4%C6%A4%DF%A4%E8%A4%A6/TWR-350.html http://www.cnet.com.tw/product/cwr-635m.html
STR9102 - CG-BARPROG
http://bb.watch.impress.co.jp/cda/review/10671.html
STR910? - MZK-W04G
http://www.planex.co.jp/product/router/mzk-w04g/
GPIOA (0x7c000000) に 0x00000000/0xFFFFFFFF を書いたら LED が明滅した。
System clock control register (0x7700000c) の RTC_Sel を 1 (25MHzソース) にしたら、RTC (0x7b000000) が動き出した。
というわけで、がんばってずらずら書いた。う〜ん、作業チック。めんどくさい度up。
STR81xx と STR91xx は割り込みレジスタの設定がぜんぜん違うのでbusも別にしようと思ったけど、configが綺麗じゃないなぁ。
ifdefか動的に切り分ければいいや。というわけで
# STR81xx(Equuleus Family), STR91xx(Orion Family) System-on-chip star0 at mainbus? # On-board UARTs com0 at star? addr 0x78000000 irq 9 # UART0
にする。来週は star_intr.[ch] あたりを。
ところで糞エアリア以外でSTR81xx/STR91xxな安いデバイスは他に無いもんか。
STR9105 - TWR-350 (CWR-635M)
http://su-u.jp/juju/%CA%AC%B2%F2%A4%B7%A4%C6%A4%DF%A4%E8%A4%A6/TWR-350.html http://www.cnet.com.tw/product/cwr-635m.html
STR9102 - CG-BARPROG
http://bb.watch.impress.co.jp/cda/review/10671.html
STR910? - MZK-W04G
http://www.planex.co.jp/product/router/mzk-w04g/
2009-06-17 STR8132 その2
これまでのあらすじ1、2、3。
エアリアにGPLだからソースくれくれメールを出したものの、ずっと放置され続けてかなりどーでもよくなってた今日この頃ですが、
ふと思ってgoogle先生じゃなくてbing先生に聞いたら色々資料が見つかった。googleもうだめぽ。
そして「少々お時間を頂けますでしょうか」の返事のあと、メールに一切反応しなくなった株式会社エアリアは死ね。
§ § §
http://www.cnusers.org/ から辿ってこれのようだ。
うひょー。メモリマップ載ってるぅ。
というわけで、serialは0x78000000?
linuxのSTR9100 用のパッチも見てみると、やっぱりデバイスまわりはSTR9100とあまり違わなかったっぽい。
#define APB_DEVICES_UART_BASE_OFFSET (0x08000000) #define SYS_APB_DEVICES_BASE_ADDR (0x70000000) #define SYS_MEM_MAP_ADDR(region_name) (SYS_##region_name##_ADDR) #define APB_DEVICES_BASE_ADDR SYS_MEM_MAP_ADDR(APB_DEVICES_BASE) #define APB_DEVICES_MEM_MAP_ADDR(regname) (APB_DEVICES_BASE_ADDR + APB_DEVICES_##regname##_OFFSET) #define UART_BASE_ADDR APB_DEVICES_MEM_MAP_ADDR(UART_BASE)
STR9100も0x78000000だ。
というわけで、実機にて
Star Equuleus # coninfo List of available devices: serial 80000003 SIO stdin stdout stderr Star Equuleus # help mw mw [.b, .w, .l] address value [count] - write memory Star Equuleus # mw.b 0x78000001 0x40 @Star Equuleus #
とすると "@" が一文字出力できていることを確認。やふー。
つーか、tinyhackの中の人はSTR9104でFreeBSD multiuserまでできてるよ。
しかしどうもARMは種類が多すぎて何が同じで何が違うのかわけがわからんな…
Marvel OrionとStar Orionはぜんぜん別物なのか。まぎらわしい。
2009-05-25 AIR BONE ZT-351
ブレーキレバーが物故割れたのでサイクルベースあさひでブレーキを注文したついでに AIR BONE ZT-351 も買ってみた。ちょっと面白いかも。
デジカメ付けて試し撮りしたら、振動のためかSDカードアクセスエラーで止まりまくりだったが、カードスロットの遊びをテープで適当に補強すればエラーが出なくなった。
家から会社まで20分弱、全工程録画成功!
下はその一部。タシーロ通り中古ロード前あたりから中央通りまで。横断歩道を渡りましょう(ぉ
揺れるのはあとからソフトで補正できないもんか。
2009-05-21 NetBSD src/usr.sbin/inetd
この 変更 の
@@ -649,6 +649,7 @@ char buf[NI_MAXSERV]; struct servtab *s; #ifdef LIBWRAP + char abuf[BUFSIZ]; struct request_info req; int denied; char *service = NULL; /* XXX gcc */ @@ -672,17 +673,19 @@ ntohs(sep->se_ctrladdr_in.sin_port)); } service = buf; + sockaddr_snprintf(abuf, sizeof(abuf), "%a", + &sep->se_ctrladdr); } if (denied) { syslog(deny_severity, - "refused connection from %.500s, service %s (%s)", - eval_client(&req), service, sep->se_proto); + "refused connection from %.500s(%s), service %s (%s)", + eval_client(&req), abuf, service, sep->se_proto); goto reject; } if (lflag) { syslog(allow_severity, - "connection from %.500s, service %s (%s)", - eval_client(&req), service, sep->se_proto); + "connection from %.500s(%s), service %s (%s)", + eval_client(&req), abuf, service, sep->se_proto); } } #endif /* LIBWRAP */
…の本来の意図は、↓のように
@@ -672,7 +672,7 @@ } service = buf; sockaddr_snprintf(abuf, sizeof(abuf), "%a", - &sep->se_ctrladdr); + req.client->sin); } if (denied) { syslog(deny_severity,
こうしたかったのではなかろうか。
bindしてるアドレスを表示したいんじゃなくて、クライアントのアドレスを表示したいんだよなぁ。どう考えても。
追記:
ちゃんと元のPRまで追って見たらやっぱりその意図だった。http://mail-index.netbsd.org/netbsd-bugs/2009/01/07/msg008213.html というか何で誰も気(r
誰か(
追記(2):
がんばってメールした。
2009-05-18 simple twitter client
simple twitter client with Net::Twitter (perl)
friend timelineの表示、指定idのtimelineの表示、public timelineの表示、およびポストができる。
特徴としては、一度取得したメッセージは ~/.twitter/cache/<id>.yaml にひたすらキャッシュする。
friend timelineの表示、指定idのtimelineの表示、public timelineの表示、およびポストができる。
特徴としては、一度取得したメッセージは ~/.twitter/cache/<id>.yaml にひたすらキャッシュする。
2009-05-18 /usr/bin/top: show full commandline patch
/usr/bin/top で argv をぜんぶ表示する。
m_netbsd.c-netbsd-5-diff(for NetBSD-5.0)
m_netbsd.c.diff(for NetBSD current)
m_netbsd.c-netbsd-5-diff(for NetBSD-5.0)
m_netbsd.c.diff(for NetBSD current)
2009-04-20 Hashed and Hierarchical Timing Wheels
これは "Hashed and Hierarchical Timing Wheels: Efficient Data Structures for Implementing a Timer Facility" by George Varghese and Tony Lauck. というアルゴリズムとほぼ同じということを、sys/kern/kern_timeout.c を読んで知った。
再発明ですかそうですか。
再発明ですかそうですか。
2009-04-04 canvasで遊ぶ
cgiでrrdtoolとかの結果をjson形式にして返して、AJAXでグラフをクライアント側でヌルヌルと好きなように描画させるようなものを作るべく、
Canvasチュートリアルを見ながら色々いじってたのだが、DrawText()は今の所mozillaにしか実装されてないのね…
このへんの人も、divで文字を置いてcanvasの上に配置してるなあ。でもdivだとtranslateとかrotateとか使えないし。
というわけで、フォントデータを内部に用意して自前で文字描画するものを作った。グラフの目盛りはこれで描こう。
※ちなみにフォントは昔某ポケステ同人ゲーム用に自作したものなのでcopyrightに問題ありません。
※canvasの無いIEでは当然動きません。ExplorerCanvasでもdrawImage()がちゃんと実装されていないらしく動きません
Canvasチュートリアルを見ながら色々いじってたのだが、DrawText()は今の所mozillaにしか実装されてないのね…
このへんの人も、divで文字を置いてcanvasの上に配置してるなあ。でもdivだとtranslateとかrotateとか使えないし。
というわけで、フォントデータを内部に用意して自前で文字描画するものを作った。グラフの目盛りはこれで描こう。
※ちなみにフォントは昔某ポケステ同人ゲーム用に自作したものなのでcopyrightに問題ありません。
※canvasの無いIEでは当然動きません。ExplorerCanvasでもdrawImage()がちゃんと実装されていないらしく動きません
2009-03-12 timetable queue
花粉激し杉。花の粉パランのおつとめソングを聴きながら花粉日和を過ごしている今日この頃です。
さて、設定された時刻でtimeoutする必要のある大量のオブジェクトがあって、これらに自動expire機能を持たせる場合、
普通は全オブジェクトをリストにしておいて定期的に一部または全部を辿ってtimeoutしていたらdestroy、のような処理をする訳ですが、
くしゃみをしながら効率の良い実装を思いついたので基幹部分を作ってみました。
X1, X2, ..., Xn のオブジェクトがあって、timeoutメンバに生存限界時刻が格納されているとする。
X(t) が timeout=t を表すとしよう。
ここで時間別のタイムアウトテーブルを用意する。
こんな感じで各timeout毎にグループを作ってリストにしておく。expire のチェックは1秒間隔で行えばいいとして、次の expire チェックでは timeout[0] のリストだけをチェックすれば十分である。
その後はこのテーブルをシフトさせて、
とさせて、以下同様にくり返せばok。
さて、任意のオブジェクトは、必要であれば timeout を延長することができる。
上の状態から X4 の timeout を5秒後に再設定する場合は、X4 を timeout[0] のリストからの削除して、timeout[4] のリストへ追加すればいい。
ところで、timeout[] 配列は有限であり、今回は長さ10の配列で、timeout[9] が末尾となる。
X4 の timeout を今度は5秒ではなく15秒後に設定したい場合は、timeout[15] に設定したい所だが存在しないので、末尾の timeout[9] に入れなおす。
この状態で8秒経つと8回expireチェックが走り、以下のような状態となる。
X98, X99 はテーブル通りの残り時間なのでいいとして、X4の寿命はまだ残り7秒ある(15秒に設定してから8秒しか経っていないので)。
さらに1秒経つと以下のようになる。
よってtimeout[0]に所属するオブジェクトは、残り時間1秒であるという仮定は成り立たないため、
expireチェックでもちゃんと残り秒数を調べてからtimeout処理をしなければならない。
残り秒数が1以下でないオブジェクトは、再度残り時間に対応するtimeoutテーブルに登録することにする。
このようにexpireチェック時にtimeout[0]のオブジェクトの残り秒数を調べ、必要であればdestroyまたは再配置を行うのであれば、
timeoutを大きくする方向で設定する場合は、いちいちリストからの削除追加しなくても良くなる。(別にやってもいい)
逆にtimeoutを小さくする場合は、リストの削除追加は *必須* になる。
というわけで、上記構造を簡単に実現するためのマクロを作った。
使い方は sys/queue.h とほぼ同じインターフェイス。サンプル。
そのうち時期を見てSEILのNATとfilterのステートで使ってみるテスト。
ちなみにpfもこういう工夫はしてなかった。その代わり、毎回全ステートを調べるのではなく一定数ずつ調べることで重くなるのを防いでいた。
さて、設定された時刻でtimeoutする必要のある大量のオブジェクトがあって、これらに自動expire機能を持たせる場合、
普通は全オブジェクトをリストにしておいて定期的に一部または全部を辿ってtimeoutしていたらdestroy、のような処理をする訳ですが、
くしゃみをしながら効率の良い実装を思いついたので基幹部分を作ってみました。
X1, X2, ..., Xn のオブジェクトがあって、timeoutメンバに生存限界時刻が格納されているとする。
X(t) が timeout=t を表すとしよう。
ここで時間別のタイムアウトテーブルを用意する。
現在時刻 = 123000 timeout[9] X98(123010) X99(123010) ... ※あと10秒 timeout[8] X97(123009) ... ※あと9秒 : timeout[1] X4(123002) X5(123002) ... ※あと2秒 timeout[0] X1(123001) X2(123001) X3(123001) ... ※あと1秒
こんな感じで各timeout毎にグループを作ってリストにしておく。expire のチェックは1秒間隔で行えばいいとして、次の expire チェックでは timeout[0] のリストだけをチェックすれば十分である。
その後はこのテーブルをシフトさせて、
現在時刻 = 123001 timeout[9] ※あと10秒 timeout[8] X98(123010) X99(123010) ... ※あと9秒 timeout[7] X97(123009) ... ※あと8秒 : timeout[0] X4(123002) X5(123002) ... ※あと1秒
とさせて、以下同様にくり返せばok。
さて、任意のオブジェクトは、必要であれば timeout を延長することができる。
上の状態から X4 の timeout を5秒後に再設定する場合は、X4 を timeout[0] のリストからの削除して、timeout[4] のリストへ追加すればいい。
現在時刻 = 123001 timeout[9] ※あと10秒 timeout[8] X98(123010) X99(123010) ... ※あと9秒 timeout[7] X97(123009) ... ※あと8秒 : timeout[4] X4(123006) ※あと5秒 : timeout[0] X5(123002) ... ※あと1秒
ところで、timeout[] 配列は有限であり、今回は長さ10の配列で、timeout[9] が末尾となる。
X4 の timeout を今度は5秒ではなく15秒後に設定したい場合は、timeout[15] に設定したい所だが存在しないので、末尾の timeout[9] に入れなおす。
現在時刻 = 123001 timeout[9] X4(123016) ※あと10秒(以上) timeout[8] X98(123010) X99(123010) ... ※あと9秒 timeout[7] X97(123009) ... ※あと8秒 : timeout[0] X5(123002) ... ※あと1秒
この状態で8秒経つと8回expireチェックが走り、以下のような状態となる。
現在時刻 = 123009 timeout[9] ※あと10秒 : timeout[1] X4(123016) ※あと2秒(以上) timeout[0] X98(123010) X99(123010) ... ※あと1秒
X98, X99 はテーブル通りの残り時間なのでいいとして、X4の寿命はまだ残り7秒ある(15秒に設定してから8秒しか経っていないので)。
さらに1秒経つと以下のようになる。
現在時刻 = 123010 timeout[9] ※あと10秒 timeout[8] ※あと9秒 : timeout[1] ※あと2秒 timeout[0] X4(123016) ※あと1秒(以上)
よってtimeout[0]に所属するオブジェクトは、残り時間1秒であるという仮定は成り立たないため、
expireチェックでもちゃんと残り秒数を調べてからtimeout処理をしなければならない。
残り秒数が1以下でないオブジェクトは、再度残り時間に対応するtimeoutテーブルに登録することにする。
現在時刻 = 123011 timeout[9] ※あと10秒以上 : timeout[4] X4(123016) ※あと5秒以上 : timeout[0] ※あと1秒以上
このようにexpireチェック時にtimeout[0]のオブジェクトの残り秒数を調べ、必要であればdestroyまたは再配置を行うのであれば、
timeoutを大きくする方向で設定する場合は、いちいちリストからの削除追加しなくても良くなる。(別にやってもいい)
逆にtimeoutを小さくする場合は、リストの削除追加は *必須* になる。
というわけで、上記構造を簡単に実現するためのマクロを作った。
使い方は sys/queue.h とほぼ同じインターフェイス。サンプル。
そのうち時期を見てSEILのNATとfilterのステートで使ってみるテスト。
ちなみにpfもこういう工夫はしてなかった。その代わり、毎回全ステートを調べるのではなく一定数ずつ調べることで重くなるのを防いでいた。
EOF