AR2315

お約束ですが、このページのいかなる記載においても著者は一切の責任をおいません。

古いモジュールは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
ARMEM

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

8250の解説ページ, OpenBSDのELFの解説

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は以下のように接続されていると思う。

LED188E6060に接続-
LED288E6060に接続-
LED62色でGPIO1/2
LED41色でGPIOで未実装3?
LED52色でGPIO4/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

OpenWRTのAR2313な情報

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
AR2312AR5312AP30
AR2313AP43,AP48
AR2314
2stGen AR2315AP51SPI Flash
AR2316WIFI Internal
AR2317AP61
AR2318AP61

一世代目は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 - 0x14PHY Registers
0x18 - 0x1dSwitch Port Registers
0x1fSwtich 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アドレスを設定すると固まる。



Copyright (C) 2015 Hiroki Mori All Rights Reserved.