古いモジュールはFlashやメモリが少ないケースが多いのだが、Fon2201はFlashが8M でRAMが16Mと大きいのでちょっといじってみた。
FON2201でZRouterでビルドしたAR71xxなカーネルを焼いてみたが、うんともすんとも いわない。UARTがAR23xx系と変わってるのかな。。。後日追記:AR7系とは違っていたし AR2(5)系でも二種類ある。BootやKernelのポーティングのUARTが最初の確認になるので、 なるべく同じ方が良いと思うのだが。
いまのところFreeBSDではAtherosの一世代目のMIPS SOCのAR23xxはサポートには 入っていない。古いシステムのサポートが新しく入るとも思いにくく、自分で やるしか無いかな。。。
AR23xxシリーズとAR53xxという製品番号にがあるが2.4G(b,g)と5G(a)のサポートに よる物のようだ。
AR2312とAR2315はちょっと構成が変わっているようだ。
AR2313はAR2315と同じっぽい。AR2311-AR2314,AR2315-AR2318というような
グループになるようだ。2312にはUART/MACが二つずつあるが2315では一つずつになった
代わりにPCIバスがある。また2312はCFIなFlashで2315はSPIなFlashになっている。
RedBootはELFをメモリにloadして実行する事ができて、flashに焼かずにTFTPでメモリ にロードして実行する方法はこんな感じ。
RedBoot> ip_address -l 10.10.10.180 -h 10.10.10.3 RedBoot> load Fon_FON2201_kernel RedBoot> exec
AR71xxでRedBootなルータの 情報
まったく動かないのは、なんかしゃくなのでちょっと調べている。RedBootのデフォルトの UARTは9600だがFreeBSDのARのコードのUARTは115200だったのでfconfigで115200に変更 してみた。(2015/05/30)
ブートから起動した時に最初に呼ばれるのはsys/mips/atherosのar71xx_machdep.cの platform_start()のようだ。この中で呼んでいるcninit()がカーネルコンソールの 初期化で実体はkern/kern_cons.cにある。
i386ではloaderがコンソールを検出して、カーネルに引き渡すようだ。
BCMのコードはdev/uart/uart_cpu_siba.cにあるが、ARのコードは mips/atheros/uart_cpu_ar71xx.cになるようだ。名前の付け方やファイルの置き 場所とかかなり混沌としてしまっている。uart_cpu_ar71xx.cはブートから使われる コードでuart_bus_ar71xx.cはnewbusのためのコードと思われる。
AR2315のUARTは0xB11000030xB1100000にあるようだ。Liunxのシリアルの説明が
こちらにある。
シリアル通信にはクロックが必要でPLLの初期化が必要なのだと思われる。クロックが
正しく設定できてポートがあっていれば何らか出力できるのではないかと思う。
ar71xxでもバス上のアクセスはアドレスの3足されているがapbによるものなのかな。
atherosのディレクトリにはapb.cというファイルが唐突にある。なにするものかと 思っていたのだがatherosのSOCはARM由来のAdvanced Peripheral Busという仕組みを 採用しているようだ。
FreeBSDのheadにはar9系のファイルが増えているようだがar2系はもちろんまだない。
NetBSDのmipsのコードはこのへんにある。FON由来のコードは このへんのようだ。
いっこうに進捗がないので、試しにOpenWRTのカーネルをブートしてみた。 イメージはここから入手した。
RedBoot> ip_address -l 10.10.10.180 -h 10.10.10.3 IP: 10.10.10.180/255.255.255.0, Gateway: 0.0.0.0 Default server: 10.10.10.3 RedBoot> load openwrt-atheros-vmlinux.elf Using default protocol (TFTP) Entry point: 0x802730a0, address range: 0x80041000-0x802fe65c RedBoot> exec Now booting linux kernel: Base address 0x80030000 Entry 0x802730a0 Cmdline : [ 0.000000] Linux version 3.3.8 (blogic@Debian-60-squeeze-64-minimal) (gcc ve rsion 4.6.3 20120201 (prerelease) (Linaro GCC 4.6-2012.02) ) #1 Sat Mar 23 17:43 :48 UTC 2013 [ 0.000000] gpiochip_add: registered GPIOs 0 to 21 on device: ar2315-gpio [ 0.000000] ar2315-gpio: registered 22 GPIOs [ 0.000000] bootconsole [early0] enabled [ 0.000000] CPU revision is: 00019064 (MIPS 4KEc)
rootfsがマウントできないので途中で止まるがちゃんとprintfがUARTで使えている。 このファイルのelfのヘッダーはこんな感じ。
% readelf -h openwrt-atheros-vmlinux.elf ELF Header: Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, big endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: MIPS R3000 Version: 0x1 Entry point address: 0x802730a0 Start of program headers: 52 (bytes into file) Start of section headers: 2877216 (bytes into file) Flags: 0x50001001, noreorder, o32, mips32 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 2 Size of section headers: 40 (bytes) Number of section headers: 19 Section header string table index: 18
ZRouterでビルドされたカーネルを逆アセンブラしてみた。
% `find tmp -name objdump -type f | head -1` -d FON_FON2201_kernel FON_FON2201_kernel: file format elf32-tradbigmips Disassembly of section .text: 80050100 <_locore>: 80050100: 40806800 mtc0 zero,c0_cause 80050104: 3c080050 lui t0,0x50 80050108: 3c092000 lui t1,0x2000 8005010c: 400a6000 mfc0 t2,c0_status 80050110: 01485024 and t2,t2,t0 80050114: 01495025 or t2,t2,t1 80050118: 408a6000 mtc0 t2,c0_status 8005011c: 00000040 ssnop 80050120: 00000040 ssnop 80050124: 00000040 ssnop 80050128: 00000040 ssnop 8005012c: 00000040 ssnop 80050130: 24080003 li t0,3 80050134: 40888000 mtc0 t0,c0_config
KIIDAXさんのJTAGのコードからMIPSのELFを作るコードを抜き出してみた。
mipself
FreeBSDの起動時のコンソールの設定方法を調べてみた。FreeBSDではカーネルソースの 中で定義されているCONSOLE_DRIVERの中から、bestなものをcninit()で探して コンソールとする。AR7系の処理の流れは以下のような感じ。vgaがあるアーキテクチャ でシリアルコンソールを選択する場合はboothowtoにRB_SERIALがセットされたときに uart_cnprobe()でcn_priにCN_NORMALより大きいCN_REMOTEを設定してbestとして選択 させている。
mips/atheros/ar71xx_machdep.c platform_start(__register_t a0 __unused, __register_t a1 __unused, __register_t a2 __unused, __register_t a3 __unused) { cninit(); } kern/kern_cons.c cninit(void) { cn_probe(cn); } CONSOLE_DRIVER(uart)で定義された以下が実行される dev/uart/uart_tty.c uart_cnprobe(struct consdev *cp) { uart_cpu_getdev(UART_DEV_CONSOLE, &uart_console); } mips/atheros/uart_cpu_ar71xx.c uart_cpu_getdev(int devtype, struct uart_devinfo *di) { }
UARTが使えない場合のデバッグ方法としてGPIOのLEDを使うという方法もあるが、それ も出来ない場合は以下のコードでresetしてそこまで実行されているか確認する方法が ある。
ATH_WRITE_REG(0x11000000, 0x00000001 | 0x00000002 | 0x00000004);
リブート戦法で問題を確認したところ関数ポインターの構造体の初期化を忘れて いただけだった。すぐにパニックするがとりあえず起動ログはこんな感じ。
RedBoot> load FON_FON2201_kernel Using default protocol (TFTP) Entry point: 0x80050100, address range: 0x80050000-0x8043bb90 RedBoot> exec Now booting linux kernel: Base address 0x80030000 Entry 0x80050100 Cmdline : CPU platform: Atheros AR???? rev 1 CPU Frequency=180 MHz CPU DDR Frequency=180 MHz CPU AHB Frequency=92 MHz platform frequency: 192000000 arguments: a0 = 00000002 a1 = 80030020 a2 = 80030000 a3 = 0000001b Cmd line: Environment: envp skiped Cache info: picache_stride = 4096 picache_loopcount = 4 pdcache_stride = 4096 pdcache_loopcount = 4 cpu0: MIPS Technologies processor v100.144 MMU: Standard TLB, 16 entries L1 i-cache: 4 ways of 256 sets, 16 bytes per line L1 d-cache: 4 ways of 256 sets, 16 bytes per line Config1=0x9e9b4d82<EJTAG> Config3=0x20 Trap cause = 2 (TLB miss (load or instr. fetch) - kernel mode) panic: trap Uptime: 1s
とりあえず作戦としては、FreeBSDのAR7系の実装を参考にNetBSDのヘッダーや実装を 放り込むつもり。
apbで落ちるので、とりあえずhintsから外したら、mountrootまで進んだ。apbが認識 できないとデバイスが全く使えないので、どうにかしないとだ。
AR5315で使えるデバイスはUART,GPIO,ETHER,WIFI,SPIになる。USBはPCI接続のチップ (NEC PD720102)が無いと使えず、FON2201にはパターンはあるが実装されてないので、使えない。
APBはマップアドレスの変更なども機能もありそうだが、実質的には割り込みの シェアリングとして機能するようだ。
いろいろいじってmountrootまで起動する事ができた。GPIO/SPI/ETHER/WIFIが使えて ないのでまだ先は長い。(2015/07/12)
RedBoot> load Fon_FON2201_kernel Using default protocol (TFTP) Entry point: 0x80050100, address range: 0x80050000-0x804436ec RedBoot> exec Now booting linux kernel: Base address 0x80030000 Entry 0x80050100 Cmdline : CPU platform: Atheros AR???? rev 1 CPU Frequency=184 MHz CPU DDR Frequency=0 MHz CPU AHB Frequency=92 MHz platform frequency: 184000000 arguments: a0 = 00000002 a1 = 80030020 a2 = 80030000 a3 = 0000001b Cmd line: Environment: envp skiped Cache info: picache_stride = 4096 picache_loopcount = 4 pdcache_stride = 4096 pdcache_loopcount = 4 cpu0: MIPS Technologies processor v100.144 MMU: Standard TLB, 16 entries L1 i-cache: 4 ways of 256 sets, 16 bytes per line L1 d-cache: 4 ways of 256 sets, 16 bytes per line Config1=0x9e9b4d82<EJTAG> Config3=0x20 KDB: debugger backends: ddb KDB: current backend: ddb Copyright (c) 1992-2012 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 10.0-CURRENT #35: Sun Jul 12 08:32:08 JST 2015 hiroki@microserver:/usr/home/hiroki/ZRouter/obj/usr/home/hiroki/ZRouter/zrou ter/tmp/mips.mips/usr/home/hiroki/ZRouter/FreeBSD/head/sys/usr/home/hiroki/ZRout er/obj/usr/home/hiroki/ZRouter/zrouter/conf/FON_FON2201 mips real memory = 16777216 (16384K bytes) avail memory = 10829824 (10MB) random device not loaded; using insecure entropy nexus0: <MIPS32 root nexus> clock0: <Generic MIPS32 ticker> on nexus0 Timecounter "MIPS32" frequency 92000000 Hz quality 800 Event timer "MIPS32" frequency 92000000 Hz quality 800 apb0 at irq 0 on nexus0 uart0: <16550 or compatible> on apb0 uart0: console (115200,n,8,1) Timecounters tick every 1.000 msec Trying to mount root from cd9660:/dev/redboot/rootfs.uncompress []... mountroot: waiting for device /dev/redboot/rootfs.uncompress ... Mounting from cd9660:/dev/redboot/rootfs.uncompress failed with error 19. Loader variables: Manual root filesystem specification: <fstype>:<device> [options] Mount <device> using filesystem <fstype> and with the specified (optional) option list. eg. ufs:/dev/da0s1a zfs:tank cd9660:/dev/acd0 ro (which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /) ? List valid disk boot devices . Yield 1 second (for background tasks) <empty line> Abort manual input mountroot>
RedBootの場合、geom_mapではなくgeom_redbootでパーティションマップを読んで rootfsをマウントするようだが、redbootで事前にfis createしてもなぜか見えてない。。。
spi0: <AR71XX SPI> at mem 0x11300000-0x122fffff on nexus0 spibus0: <spibus bus> on spi0 mx25l0: <M25Pxx Flash Family> at cs 0 mode 0 on spibus0 mx25l0: at25128, sector 64 bytes, 256 sectors Timecounters tick every 1.000 msec Trying to mount root from cd9660:/dev/redboot/rootfs.uncompress []... mountroot: waiting for device /dev/redboot/rootfs.uncompress ... Mounting from cd9660:/dev/redboot/rootfs.uncompress failed with error 19.
よくよくみるとSPIのFlashが正しく認識されたなさげ。本当はMX25L6405が付いている。
tx/rxのサイズはCTLレジスタで設定できるが4ビットで15バイトまでとなるが、DATA レジスタの4バイトを超えて設定できるのだろうか?
spibusはtransferとget_blockのメソッドがあるが、transferだけでもよいようだ。 その場合はCMD_FAST_READ(0x0B)でデータの読み込みが実行される。メモリに張り付いて 見えるデバイスの場合はget_blockを用意して、そのメモリからのコピーを行う。
transferを修正してちゃんと0x9fでデバイスのIDを拾えるようにして、get_blockを AR5315_MEM1_BASEから読み込むようにしたところflashは見えるようになった。ところが geom_redbootが認識せず調べてみたところ、現在のコードは"FIS directory"がflashの 最後か先頭のブロックの決めうちでFON2201は最後から二つ目のブロックになっている ことが原因だった。とりあえず最後から二ブロック前をチェックするようにしたところ rootfsは見えるようになった。これはハードコードでなくhintsで設定できるように するのがスマートな気がする。
spi0: <AR5315 SPI> at mem 0x11300000-0x1130000b on nexus0 spibus0: <spibus bus> on spi0 mx25l0: <M25Pxx Flash Family> at cs 0 mode 0 on spibus0 mx25l0: mx25ll64, sector 65536 bytes, 128 sectors Timecounters tick every 1.000 msec redboot/rootfs.uncompress: GEOM_ULZMA image found redboot/rootfs.uncompress: 117 x 65536 blocks Trying to mount root from cd9660:/dev/redboot/rootfs.uncompress []... warning: no time-of-day clock registered, system time will not be set accurately /etc/rc: cannot Trap cause = 7 (bus error (load or store) - kernel mode) [ thread pid 12 tid 100008 ] Stopped at cpu_startprofclock+0x3650: lw s2,0(v0) db>
もう一歩な感じだが落ちる。なんでろう。
上の方に書いた方法で、kernelを逆アセンブラして、cpu_startprofclockのアドレスを 調べて、そのアドレスに0x3650を足したところを見たところ、apb_filter()の中で あった。コードを見直したところAR7のコードが残っていて、とりあえず直してみた ところ落ちなくはなった。
とりあえず動くカーネルが出来たので、焼いてみる。entry pointはreadelfで確認して 設定した。
ところが起動は出来るがgeomがエラーをおこす。なんだかなー。。。rootfs,kernel ではなくkernel,rootfsの順番で作るとエラーがでない。geom_redbootの出来が悪い 気がするな。。。
RedBootのオペレーションはこんな感じ。
LEDは以下のように接続されていると思う。
LED1 | 88E6060に接続 | - |
LED2 | 88E6060に接続 | - |
LED6 | 2色でGPIO | 1/2 |
LED4 | 1色でGPIOで未実装 | 3? |
LED5 | 2色でGPIO | 4/7 |
WIFIはATHで使えるのかな?AR71xxなコードはsys/dev/ath/if_ath_ahb.cのようだ。
Etherは多分NetBSDなどを参考にして作らないとダメかも。
sys/dev/aeをいじったらが使えるのかもしれない。
とおもったが、aeはAttansic Technology由来のドライバのようで、この会社の
買収は2006年くらいで、チップの開発よりも後なので違う物かも。
ちょっとhints書いてみたけどダメみたい。
ath0: <Atheros 5212> at mem 0x10000000-0x100fffff irq 1 on nexus0 ath0: eeprom @ 0x83f0000 nexus_alloc_resource: could not reserve resource for ath0 ath0: cannot map eeprom space
AR231xのSDKとしてAtherosはRedBootを提供していたようだ。GPLで公開されている ソースのビルドを試したのだがeCosというビルドシステムを使っていてLinuxのELFの ecosconfigというコマンドを使っていてFreeBSDのLinuxエミュレートで実行できた。 gmakeを使っていたりtclshを使っていたりしているが、それほど依存は無い感じ。 gccのオプションの調整をしてみたら、一部のビルドはできるので型関係のエラーを とっていけば、ビルドできそうだがZRouterでarをビルドしてないので、arを用意する のが面倒なのでいったんペンディング。
AR231xなredbootのコードはここにコピーがある。
Bootについて整理してみると、シリアルコンソールの用意、Flashの読み書き機能、 Flashのサイズ管理、メモリのサイズ管理、およびネットワークインターフェース が主要な調整点だと思う。
上記のdd-wrtのアーカイブにはビルドしたイメージもあるので、上記が一致する バイナリがあればそれを使うのが吉かも。
WR6670Sのブートを書き換えようと思い立ち、JTAGのピンを立てるためにホールの ハンダをドリルで除去している時にパタンを一本切ってきました。しょうがないので ジャンパーをはったところ、ちゃんとditectできるようになりました。
ネットに落ちていたRedBootのバイナリを焼いたところ起動は確認できたのですが、 ネットワークが使えなかったので、ビルドを試してみる事にしました。
いろいろ調べてU-Boot,RedBootとも いろいろ面倒そうなので、とりあえずFonなどで実績のあるRedBootを試してみる ことにしました。RedBootはeCosというビルドシステムを使っていてLinuxのELFな コマンドを使います。FreeBSDには Linuxエミュレーション がありそれを使ってコマンドの実行はできた。クロス用のbinutilとgccの用意は binutilは簡単に用意できたがgccかなり苦労した。最初はgcc4でビルドを試したが ar531xなredboot自体がgcc3の頃のコードで ここらへんのエラーがありコツコツ直していこうかとおもいましたが、こころが おれたのでgcc3を用意する事を試す事にしました。 こちらと こちらを参考に これもかなり苦労して結局 ライブラリが作れなくて完全にビルドはできなかったんですが、コマンドが 用意できたので、それを使う事にしました。libは適当なところからコピーしました。 あとビルドで必要なgmakeがmakeとして使えるようにすることとtclshの用意でした。 gpio関係のコードがリンクされてないようでダミーの関数を作りました。 これでredboot.romが出来上がりました。
AP30: AR5312 WiSoC MIPs R4Kc CPU, running at 220MHz 2 AR5212 Wireless MACs ("WMACs") 2 AR5112 Radios (the first for 5.0GHz, the second for 2.4GHz) 2MB of SST 39VF160 x16 Flash 16MB of by-32 SDRAM Marvell M88E6060 Ethernet Phy Switch with 5 Ethernet phy ports ethernet MAC0 controls Phy Switch ethernet MAC1 unused AP43: AR2313 WiSoC MIPs R4Kc CPU, running at 180MHz 1 AR5212 Wireless MAC ("WMAC") 1 AR2112 Radio (AR5112-compatible, 2.4GHz-only) 2MB of MX 29LV160ATTC x16 Flash 8MB of by-16 SDRAM Marvell M88E6060 Ethernet Phy Switch with 5 Ethernet phy ports ethernet MAC1 controls Phy Switch ethernet MAC0 used for Phy control AP48: AR2313 WiSoC MIPs R4Kc CPU, running at 180MHz 1 AR5212 Wireless MAC ("WMAC") 1 AR5112 Radio (AR5112-compatible, 2.4GHz-only) 2MB of MX 29LV160ATTC x16 Flash 8MB of by-16 SDRAM Kendin KS8721B Ethernet Phy port ethernet MAC1 controls Phy port ethernet MAC0 used for Phy control
現在の私の理解ではAR2312/5312以前とAR2313-AR2318はAPBのアドレスが違っている
ようだ。よくよく考えてみると2313以前はCFIなFlashでAR2315以降はSPIなFlash
になっているようなので、2313は一世代目に入り2315から二世代目になるのかもしれ
ない。2314というチップもあったような情報があるが、こちらは2313と同じ分類になる
ようだ。
なぜか後発と思われる2313の方が5312よりもクロックが下がっている。
AtherosはAR2系とAR5系とか末尾が一つ違うだけでアーキテクチャが違ったりなぜなぜ
仕様が多い。
redbootはecos/packagesでターゲットのビルドに必要なファイルをredboot/にコピー してビルドを実行する。
RedBootはROMに焼き付けるイメージと既存のROMからメモリに貼付けるRAMイメージが ある。ROMイメージはecos/packages/hal/mips/ar5312/current/include/platform.inc にリセット後の処理がありecos/packages/hal/mips/arch/current/src/vectors.Sに 実際の初期化ルーチンが存在する。platform.incではpllやSDRAMの初期化を行って いる。 ecos/packages/hal/mips/の下のap43やmips32も使われている。何とも見通しが悪い。
流れ的にはreset_vector,_start,cyg_startというような感じみたい。
vectors.Sでなぜかhal_serial_initがCYG_HAL_STARTUP_RAMだけになっている。ROM の場合はどうするんだろう?
redbootのcコードのエントリーポイントはcyg_start()で実態は ecos/packages/redboot/current/src/main.cにある。
例えば1-4,5-8というグループがあるとすると1.h,5.hというヘッダーファイルにすべき であろう。それがredbootでは2.h,6.hのようになっていてNetBSDは2.h,5.hとなって いる。データシートが非公開ということもあるのだろうが、redbootはatherosが手を 入れたとおもうのだが、なんだかな。。。
1stGen | AR2311 | CFI Flash | WIFI External | marvell, realtek, icplus or kendin | ||
AR2312 | AR5312 | AP30 | ||||
AR2313 | AP43,AP48 | |||||
AR2314 | ||||||
2stGen | AR2315 | AP51 | SPI Flash | |||
AR2316 | WIFI Internal | |||||
AR2317 | AP61 | |||||
AR2318 | AP61 |
一世代目はCFIなFlashを利用していてUART/MACが二つずつありました。二世代目は SPIなFlashに変更され、UART/MACは一つになりました。この時代にはAtherosは EtherSwitchを作っていなかったのでmarvell, realtek, icplus, kendinなチップを 使う事を想定しているようです。
七転八倒して、結局ここのアーカイブを元にビルドできた。 http://downloads.openwrt.org/reference/redboot.tar.bz2 こちらにはLinuxの32版のgccなどのバイナリも含まれている。 v2_0というバージョンが入っていて、他のソースに比べると大きめのバイナリになる。
AE5315ではどういう仕組みかわからないがSPI Flashがメモリにmapされている。 mx25lのコードではFIST_READでデータの読み込みを行っているので、その場合はSPI の処理ではなくそのメモリからコピーするようにしている。
AR2315からMIIで88E6060は以下のように見えている。
0x10 - 0x14 | PHY Registers |
0x18 - 0x1d | Switch Port Registers |
0x1f | Swtich Global Registers |
NetBSDのコードをみたところAR231xのEtherはDECのTULIPチップの互換ということで deをコピーしていじっているが、なかなか動かない。NetBSDとFreeBSDのドライバに ついて書かれた メモがあた。
FONのAR231xなEtherはSiByteのドライバが流用されているようだ。SiByteはBroadcom に買収されたはずなのにどういう事だろう。またこれにはIDTなコードも含まれていて どういう経緯でそうなったのだろうか。
ネットワークやシリアルのドライバは基本的には入ってきたデータを上位レイヤーに 上げて、上位レイヤーから降りてきたものを送り出すだけなのだが。。。 FreeBSDのネットワークの仕組みの説明の資料
TULIPでは送信時にはcsr_txlistにtulip_desc_tという構造体を渡します。この構造体に データへのポインタとサイズが二つ含まれています。tulip_desc_tはbus_dmamap_load して、実際の送信するデータを含むmbufはbus_dmamap_load_mbuf_sgしている。 その後csr_txpollに1を書き込むことでDMAでデータがPHYに送り出されるようです。 その後処理が終わったときに割り込みが上がり後処理としてbus_dmamap_unloadなどを 行って処理が完了です。csr_commandにThreshold ControlというパラメタがあるがTX 関係のようだが、どのようなパラメタか分からない。
ここにTulipのドライバの説明の資料があった。
何度かTulipのDatasheetを探していたのだが、レジスタの内容が書かれたpdfが見当た らず、あきらめていたのだがよくよく調べてみたらpsファイルであった。やっぱ Datasheetを確認するのが一番良い。
MIPSアーキテクチャでは8bitすなわち8本の割り込み処理があり、最初の2本が ソフトウエア割り込みに使われている。残りの6本がハードウエア割り込みで、通常は その1本にPICを接続してより多くの割り込みを処理する。
TulipのDescriptorは二種類の使い方があって、一つは連続したDescriptorでringとして 使うやり方で、もう一つはDescriptorに次のDescriptorへのリンクをおいてchainとして 使うやり方になる。deはringで使っているようだ。
bus_dma_tag_create() -> bus_dmamem_alloc()するとカーネルからアクセスする ためのKVAなアドレスが返ってくる。次にbus_dmamap_load()するとコールバックにdma に使用する物理アドレスが入ったbus_dma_segment_tが渡される。
送信時のDescriptorのbufferはbus_dmamap_load_mbuf_sgでmbufの物理アドレスを受け 取って放り込んでいるようです。
m_adj(m,len)するとm_dataがlen移動してm_lenがlen分減ります。 Ethernetドライバで受け取ったパケットでTCPヘッダーを32ビットバウンダリに合わ せるためm_adjで4バイト進めておいて受け取った後、2バイト前に戻しています。 これはEhternetヘッダーが34バイトあるので、TCPヘッダーがバウンダリの途中に なるためです。
AR2315系はかなり使えるようになっているが、AR2312系はポーティングしてみたが、 割り込みまわりが謎でなかなかマルチユーザにできない。(2016/03/05)
AR2312系は実装忘れが2カ所あってそれを直したらちゃんと動くようになった。
ar531xサポートのコードをFreeBSDのレビューに出してheadに入れてもらえました。
AR2316のデータシートを見るとGPIOの後半はPCIとマルチプレックスになっている。 FON2201のUSBインターフェースの足で確認してみたところ、INのステータスが 変化して反応があるが、安定しない。OUTもできない。なんでかな。。。
AR5312で二つ目のネットワークインターフェースが使えないのを調べているのだが なかなか解決しない。二つ目のインターフェースはSWITCHの切り離されたPHYに接続 されているはずなのだが、うまくいかな。おそらくMDIO接続が無いのが原因と思われる が対応方法が分からない。(2016/11/09)
上の問題はAR7/9系でも似たように二つ目のインターフェースが使えないケースが あるが、argeと違ってareはIPアドレスを設定すると固まる。