RT3050F

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

このページに書いてある事はFreeBSDのsys/mips/rt3050をベースにした話です。 12-CURRENT以降ではFDT化したsys/mips/mediatekに移行しているので、ここに あることは昔話になってしまいました。

HARD OFFでFON2305EというWifiルーターを525円で購入してみたので、その中身を調 べてみました。このルーターはiPhoneのおまけでSoftbankが配布していたようです。

このルーターはRalinkというメーカーのRT3050Fというチップで作られている。 ほとんどの機能がこのチップに含まれていて、外部にはフラッシュとDRAMと Ethernetのモジュールが主要な部品になっています。

スクリーンショット(2014-08-01 8.56.20)

足のゴムをはがすとT6のトルクスのねじがありこれを外すと分解できます。 このモジュールのシリアルとJTAGらしき端子は一目瞭然ですぐにシリアル コンソールは確認できました。ボーレートは57600で3.3Vのインターフェースの ようです。チップ実装面でコネクタ側を下にするとVCC,RX,GND,TXのならびに なっています。写真はストロベリー・リナックスのFT2232Hのモジュールと接続 したところです。このモジュールは3.3VなのでTX,RX,GNDを接続してCTS,RTSを ループさせています。

IMGP0043

シリアルコンソールでU-Bootを使っている事が確認できたのですが、OS起動後も シリアルからの入力を受け付けないコンフィグレーションになっているようでブート 時も入力でオートブートを止める事ができません。。。

いろいろ試していたところ、電源投入時にWPSボタンを押しているとU-Bootでhttp サーバが起動され、192.168.0.250でファームのアップロードフォームが表示され るようです。(後日記入:この機能は動作しないようです。)

sh-3.2$ sudo cu -l /dev/cu.usbserial-000011FDA -s 57600
Connected.


U-Boot 1.1.3 (Nov 29 2009 - 20:59:38)

Board: Fonera
DRAM:  32 MB
relocate_code Pointer at: 81fac000
spi_wait_nsec: 3e 
spi deice id: c2 20 15 c2 20 (2015c220)
find flash: mx25l1605d
raspi_read: from:41030000 len:1000 
Using default environment


 ##### The CPU freq = 320 MHZ #### 

SDRAM bus set to 16 bit 
 SDRAM size =32 Mbytes

Please choose the operation: 
   1: Boot system code via Flash (default).
   2: Load system code then write to Flash via TFTP. 
   3: Entr boot command line interface.
reset pressed for 2 seconds
 0 


Trying Eth0 (10/100-M)

 ETH_STATE_ACTIVE!! 
starting httpd server from server 192.168.0.250

WPSのボタンを離すときに3を入力しているとオートブートをキャンセルしてコマンド インターフェースになるようです。(時々失敗するので何度ややるとうまくいきます)

sh-3.2$ sudo cu -l /dev/cu.usbserial-000011FDB -s 57600
Connected.


U-Boot 1.1.3 (Nov 29 2009 - 20:59:38)

Board: Fonera
DRAM:  32 MB
relocate_code Pointer at: 81fac000
spi_wait_nsec: 3e 
spi deice id: c2 20 15 c2 20 (2015c220)
find flash: mx25l1605d
raspi_read: from:41030000 len:1000 
Using default environment


 ##### The CPU freq = 320 MHZ #### 

SDRAM bus set to 16 bit 
 SDRAM size =32 Mbytes

Please choose the operation: 
   1: Boot system code via Flash (default).
   2: Load system code then write to Flash via TFTP. 
   3: Entr boot command line interface.
reset pressed for 2 seconds

You choosed 3

 0 


   
3: System Enter Boot Command Line Interface.

U-Boot 1.1.3 (Nov 29 2009 - 20:59:38)
RT3052 # help       
erase   - erase SPI FLASH memory
?       - alias for 'help'
bootm   - boot application image from memory
cp      - memory copy
go      - start application at address 'addr'
help    - print online help
httpd   - start webserver
md      - memory display
mm      - memory modify (auto-incrementing)
mw      - memory write (fill)
nm      - memory modify (constant address)
printenv- print environment variables
reset   - Perform RESET of the CPU
setenv  - set environment variables
tftpboot- boot image via network using TFTP protocol
version - print monitor version
RT3052 # printenv
bootcmd=httpd
bootdelay=2
baudrate=57600
ethaddr="00:AA:BB:CC:DD:10"
ipaddr=10.10.10.200
serverip=10.10.10.3
ramargs=setenv bootargs root=/dev/ram rw
addip=setenv bootargs $(bootargs) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmas
k):$(hostname):$(netdev):off
addmisc=setenv bootargs $(bootargs) console=ttyS0,$(baudrate) ethaddr=$(ethaddr)
 panic=1
flash_self=run ramargs addip addmisc;bootm $(kernel_addr) $(ramdisk_addr)
kernel_addr=BFC20000
bootfile=fonita.img
u-boot=u-boot.bin
load=tftp 8A100000 $(u-boot)
u_b=protect off 1:0-1;era 1:0-1;cp.b 8A100000 BC400000 $(filesize)
loadfs=tftp 8A100000 root.cramfs
u_fs=era bc540000 bc83ffff;cp.b 8A100000 BC540000 $(filesize)
test_tftp=tftp 8A100000 root.cramfs;run test_tftp
stdin=serial
stdout=serial
stderr=serial
ethact=Eth0 (10/100-M)

Environment size: 786/4092 bytes

Linux(OpenWRT)がブートしてしまうとシェルは起動していないようでコンソールから の入力は効かなくなります。

Linuxを起動して表示されるFLASHの構成
0x00000000-0x00010000uboot64K
0x00010000-0x00020000boardconfig64K
0x00020000-0x00200000image1920K
0x00020000-0x000b6000linux600K
0x000b6000-0x001f0000rootfs1256K
0x001f0000-0x00200000uci_overlay64K

とここまでで、JTAGを使わなくてもOSの焼き直しができそうです。ところでこの 基盤のJTAGらしきパターンの穴はDIPではなく2mmピッチです。シリアルのパターンは DIPの2.54mmなんですが。。。(後日修正)

ここを参考に カスタムファームを焼こうとを思ったのだが、2は選べるのだが以下のように Operation terminatedになってあっという間に勝手にブートしてしまう。。。

2: System Load Linux Kernel then write to Flash via TFTP. 
 Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)
 Operation terminated

2キーを押しっぱなしにしていた事でY/Nにも2が入っていた事が原因だった。一回 2を押してリセットを離すとうまくいった。 焼き直したファームにはtelentが出来る。

$ sudo ifconfig rl0 inet 10.10.10.10 alias
$ telnet 10.10.10.254
Trying 10.10.10.254...
Connected to 10.10.10.254.
Escape character is '^]'.

(none) login: admin
Password: 


BusyBox v1.12.1 (2011-12-30 19:52:41 EST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

# ls
sys     media   dev     bin     init    home    proc    sbin
usr     mnt     tmp     lib     etc_ro  var     etc

現在手元には2305が二台と2405が二台あるが、2405の一台はACアダプタのコネクタの サイズが違っている。2305のトルクスネジはT-6だったが2405はT-8でだった。T-6,T-8 も持っていたのだが軸が短く使えず新たに買うはめになった。

ZRouterというプロジェクトがあるようだ。 作成して放置さているようだが、時間が出来たら試してみたい。

とりあえず手順に従い、同じRalink RT305xが使われているD-LinkのDAP-1350で最小 セットでビルドしてみた。エラーなどなくビルドは出来た。(2014/07/27)

ファイル名サイズ
D-Link_DAP-1350.zimage3914752
D-Link_DAP-1350_kernel4625359
D-Link_DAP-1350_kernel.kbin3738204
D-Link_DAP-1350_kernel.kbin.oldlzma1030654
D-Link_DAP-1350_kernel.kbin.oldlzma.uboot1030718
D-Link_DAP-1350_kernel.kbin.oldlzma.uboot.sync1048576
D-Link_DAP-1350_rootfs-
D-Link_DAP-1350_rootfs_clean-
D-Link_DAP-1350_rootfs_clean.iso11315200
D-Link_DAP-1350_rootfs_clean.iso.ulzma2866176
D-Link_DAP-1350_rootfs_clean.mtree11174

zkernel
zimage

zimageが最終イメージのようだが、4Mちかくありまったく入らない。。。oz_
作戦としては以下のような事が考えられる。

FreeBSDのMIPSポートの情報
RT3052Fの情報

モデル CPU SRAM Flash U-Boot 備考
FON2305E Ralink RT3050F ESMT M12L2561616A MX 25L1605M2I 1.1.3 (Nov 29 2009 - 20:59:38) USB/JTAG/CFIのパターン有り。シリアルのピンヘッダーにホールがあり付けやすい のでお勧めだが、あまり生産されてなかったのか2405に比べるとHardOffなどで見当たら ない。DCプラグは2.5/5.5。ネジはT-6
FON2305E ? ? ? ? 2405と同じく上部のロゴがシルバーのプリントバージョンがネットオークションで 確認できるが、手元にある2305は凹加工で未確認。
FON2405E Ralink RT3050F ESMT M12L2561616A MX 25L1606E (8pin) 1.1.3 (Jan 6 2010 - 07:10:30) Flashは裏側に実装されるようになっていて16ピンの パターンもある。8ピンのSPIのメモリは64MbitがDigiKeyの標準在庫で128Mbitからは 16ピンの方が標準在庫となっているようなので、大きいFlashを載せ変えたいので あればこちらがいいかもしれない。基本的には2305のコストダウン版なのだが左端の LEDが二色に変更されている。DCプラグは2.1/5.5か1.7/4.0。ネジはT-8
FON2405E Ralink RT3050F ESMT M12L2561616A MX 25L1605DMI-12G (16pin) ? ACアダプタコネクタサイズで区別がつくかとおもったがそうでもないようだ。

とりあえずカーネルだけ試すには以下のコマンドをU-Bootで実行。

tftpboot 0x80800000 Fon_FON2305E.zimage
bootm

zrouter/boards/D-Link/DAP-1350/board.mkを修正してkernelからUSBのサポート外して、 zrouter/profiles/xSMALL_/profile.mkにファイルシステムに放り込むバイナリの一覧 があるので、いったん全部外して、ビルドしてみたところzimageが1.5M位になったので flashに焼いてブートしてみたが、rootfsがマウントできず落ちる。

U-Boot 1.1.3 (Nov 29 2009 - 20:59:38)

Board: Fonera
DRAM:  32 MB
relocate_code Pointer at: 81fac000
spi_wait_nsec: 3e 
spi deice id: c2 20 15 c2 20 (2015c220)
find flash: mx25l1605d
raspi_read: from:41030000 len:1000 
Using default environment


 ##### The CPU freq = 320 MHZ #### 

SDRAM bus set to 16 bit 
 SDRAM size =32 Mbytes

Please choose the operation: 
   1: Boot system code via Flash (default).
   2: Load system code then write to Flash via TFTP. 
   3: Entr boot command line interface.

booting from flash
## Booting image at bf020000 ...
raspi_read: from:20000 len:40 
   Image Name:   FreeBSD Kernel Image
   Created:      2014-07-30  13:00:29 UTC
   Image Type:   MIPS Linux Kernel Image (lzma compressed)
   Data Size:    974350 Bytes = 951.5 kB
   Load Address: 80001000
   Entry Point:  80001000
raspi_read: from:20040 len:ede0e 
   1Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK
No initrd
## Transferring control to Linux (at address 80001000) ...
## Giving linux memsize in MB, 32

Starting kernel ...

RT3350 runing with 320MHz clock
System bus clock - 106MHz
System start from NOR flash storage
U-Boot args (from 0 args):
        None
Environment:
entry: mips_init()
Cache info:
  picache_stride    = 4096
  picache_loopcount = 8
  pdcache_stride    = 4096
  pdcache_loopcount = 4
cpu0: MIPS Technologies processor v76.150
  MMU: Standard TLB, 32 entries
  L1 i-cache: 4 ways of 256 sets, 32 bytes per line
  L1 d-cache: 4 ways of 128 sets, 32 bytes per line
  Config1=0xbea3319e<PerfCount,WatchRegs,MIPS16,EJTAG>
  Config3=0x420
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 #0: Wed Jul 30 21:59:51 JST 2014
    hiroki@microserver:/usr/home/hiroki/ZRouter/obj/usr/home/hiroki/ZRouter/zrou
ter/tmp/mips.mipsel/usr/home/hiroki/ZRouter/FreeBSD/head/sys/usr/home/hiroki/ZRo
uter/obj/usr/home/hiroki/ZRouter/zrouter/conf/D-Link_DAP-1350 mips
real memory  = 33554432 (32768K bytes)
avail memory = 27942912 (26MB)
random device not loaded; using insecure entropy
nexus0: <MIPS32 root nexus>
clock0: <Generic MIPS32 ticker> on nexus0
Timecounter "MIPS32" frequency 160000000 Hz quality 800
Event timer "MIPS32" frequency 160000000 Hz quality 800
obio0 at mem 0x10000000-0x1fffffff on nexus0
rt305x_sysctl0: <RT305X System Control driver> at mem 0x10000000-0x100000ff irq 
0 on obio0
rt305x_sysctl0: Use gpiomode=0x00029d
        Chip ID: "RT3350  "
    SYSCTL_SYSCFG=0x8830000
        GE0 mode 0
        Boot from 3
        Bootstrap test code 0
        SRAM_CS mode 0
        8mA SDRAM_CLK driving
    SYSCTL_CLKCFG0=0x40000000
        SDRAM_CLK_SKEW 1ns
    SYSCTL_CLKCFG1=0x04283c
        USB OTG clock is enabled
        I2S clock is internal 15.625MHz
        I2S clock divider 40
        PCM clock is internal 15.625MHz
        PCM clock divider 60
    SYSCTL_GPIOMODE=0x00029d
rt305x_ic0: <RT305X Interrupt Controller driver> at mem 0x10000200-0x100002ff on
 obio0
uart1: <rt305x_uart> at mem 0x10000c00-0x10000cff irq 12 on obio0
uart1: console (115200,n,8,1)
cfi_do_query: query at 0 with mask 0xff (w=1, s=2)
cfi_do_query: cfi_read(sc, ofs, CFI_QRY_IDENT) return 0xe0
cfi_do_query: query at 0 with mask 0xff (w=1, s=1)
cfi_do_query: cfi_read(sc, ofs, CFI_QRY_IDENT) return 0
switch0: <ethernet switch bus> at mem 0x10110000-0x10117fff irq 17 on obio0
rt305x_switch0: <RT305XF internal ethernet switch> on switch0
set_vlan_ports: idx=0, memb=0000007f
rt0: <Ralink RT305XF onChip Ethernet MAC> at mem 0x10100000-0x1010ffff irq 3 on 
nexus0
rt0: RT305XF Ethernet MAC
rt0: use hardcoded 00:18:e7:d5:83:90 macaddr
rt0: Ethernet address: 00:18:e7:d5:83:90
rt305x_switch_port_state_change: Link status:
            * 
Timecounters tick every 10.000 msec
Trying to mount root from cd9660:/dev/map/rootfs.uncompress []...
mountroot: waiting for device /dev/map/rootfs.uncompress ...
Mounting from cd9660:/dev/map/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>

いったんビルドしないとkernelとrootfsのサイズが確定されず、この値をhintsに書いて もう一度ビルドして、zimageを作るのが手順なのかな。

起動後の処理は以下のようにおこなわれている。

フラッシュのrootfsがマウントできない。。。RT305xFのspiは2014/8現在作りかけの 様でrt305x_spi.cはzrouterのソースツリーにしかなく、obio.cのなかでspiはnotyet でコメントアウトされている。これを有効にすると下記のように落ちる。

obio0 at mem 0x10000000-0x1fffffff on nexus0
Can't add child spi0 ordered
Trap cause = 2 (TLB miss (load or instr. fetch) - kernel mode)
[ thread pid 0 tid 100000 ]
Stopped at      device_get_parent:      jr      ra
db> where
Tracing pid 0 tid 100000 td 0x803696d0
802b8d1c+c (?,?,?,?) ra 803bc848 sp 803333340000005c sz 0
80006f8c+a8 (186a0,?,8033a450,?) ra 20803bc848 sp 80334943000002a8 sz 1
VOP_LOOKUP_AP+ebcd8 (?,?,?,?) ra 803bc868 sp 80327cbb00000000 sz 0
pid 0

rtのサポートコードと、sys/dev/spibus,sys/dev/flashのソースでサポートできるの ではないかと思われる。KOBJという仕組みで、コンフィグレーションをおこなうよう だが、sys/mips/rt305x/spibus_if.mはsys/dev/spibus/の下のファイルと同じなので 本来はsys/dev/spibusの方を使うべきだろう。KOBJは*mからmakeobjops.awkで*.c,*.h を生成して使うようだ。(後日追記:おそらく確認用にコピーしただけでrt305xの下の spibus_if.mは必要なかった)

obio.cで追加されている、デバイス一覧

rt305x_sysctlsys/mips/rt305x/rt305x_sysctl.c
rt305x_icsys/mips/rt305x/rt305x_ic.c
timer
rt305x_memc
pcm
uartsys/mips/rt305x/uart_*c
gpiosys/mips/rt305x/rt305x_gpio.c
rt305x_dma
rt305x_nandc
i2c
i2s
spi
uartsys/mips/rt305x/uart_*c
cfisys/dev/cfi/cfi_bus_obio.c
dotgsys/mips/rt305x/rt305x_dotg.c
rt5350_usbsys/mips/rt305x/rt5350_usb.c
switch

spiは以下のような構成でサポートされる物と思われる。

spi

BUS_ADD_CHILDするとカーネル内のDRIVER_MODULEで定義されたデバイスコードで 第三引数のdriver_t構造体の第一メンバーが該当するドライバーを捜し出して、 第二メンバーのメソッドを呼び出すという処理の流れだと思われる。 なぜspiはうまくいかないんだろう。。

通常のドライバは設定済みのpciなどのバスにぶらさがるので、BUS_ADD_CHILD することはないが、obioは直接メモリに見えていて、それを処理するドライバコードを ロードする為にBUS_ADD_CHILDしていると思われる。

obio_add_res_childで存在しないデバイスを追加しようとすると、なにも起きないが spiを追加しようとすると落ちるのは、なんらか不備があるから何だと思われる。

atherosの方の実装はnexusに直接spiがぶらさがっているが、rt305xの方はobioを挟む ような実装になっている。

Driver

BUS_DEBUGを設定してカーネルをビルドして起動して吐かせた ログ

bootverboseを設定して起動したいが、loader.confはファイルシステムが読めてから 有効になるため、とりあえずkern/init_main.cのデフォルト値を1に変更してビルドし てみたがダメだったので、とりあえずソースを直接いじった。

上のログを見るとわかるがboards/D-Link/DAP-1350/board.hintsにspiの設定があり それが先に処理されてobioで追加しようとすると既に追加されてエラーになっていた。 hintsから消したら、落ちなくなったが認識もされてない。

RalinkにはRT3050,RT3052,RT5350というチップがあってRT305xは2008年にRT5350 は2010年位から製造されているようだ。2011年にMediaTek買収されているので、RT5350が Ralinkとしては最後の製品かもしれない。

国内ではFlashの販売が見つからなかったので、DigikeyでMX25L6406Eを購入して付け 替えてみた。元の25L1605を読みとり、ddで空の6Mのファイルを作りcatで連結して 25L6406に焼いてみた。RalinkのSDKに入っているU-Bootのコードを見ると、25L128まで サポートされている可能性が高いが、25L128はパッケージが8ピンの物はDigikey在庫が なく、在庫があるのは16ピンになるので外すのが面倒なので8ピンの25L6406にしてみた。

写真(2014-12-06 08.00) #2 写真(2014-12-06 12.31) #3
写真(2014-12-07 09.57) 写真(2014-12-07 09.58)

U-BootでImageは焼けるので、直づけで取り替えても良かったが、万が一U-Bootを飛ば した時にリカバリが楽なように開発用の一台だけソケットでFlashを付けてみた。 ヤフオクで入手した、SOPからDIPの変換キットにソケットをかまして使ってみた。 ピン間が2.54mmなので一列の1.27mmのソケットが使えたのだが、抜くとソケットのガワ が外れてしまう。。。 チップを外す為にSperkfunの表面実装部品用取り外しキットを使ってみた。8ピンなので 頑張れば、ハンダゴテだけでも外せるのかもだが、パターンをいためるともともこうも なくなるで、買ってみた。サンハヤトにも同様のキットがあって、値段が倍近くしたの でSperkfunのにしてみた。 Flashを付けた基板は、秋月のSOP 8ピンの変換基板だがMXのFlashはチップ自体の幅が 5.28mmと広くぎりぎりパターンにのって、足の下でハンダ付けされているような状態。 FTのページに書いたが、Flashは flashromという オープンソースを使ってFT2232Hで焼いてみた。 ネットを検索していたらSPI FlashチップのIDがU-Boot内に無くても使えるみたいだ。

Flashのアップデート時は以下のような状態になっていると思う。kldで用意するのが 良いのかもだがさすがにこれを作り込むのはかなり先になると思う。

Flash

読み出したFlashのU-Boot部分の内容はhexdumpで見ると以下のようになっていた。

0000000 27 05 19 56 9f 10 6c a9 4b 12 d2 b7 00 00 ed fe
0000010 80 10 00 00 80 10 00 00 c8 8a 38 8b 05 05 01 00
...
0001bf0 80 19 10 80 00 00 00 00 00 00 00 00 00 00 00 00
0001c00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0002040 5d 00 00 80 00 ff ff ff ff ff ff ff ff 00 7f 80
0002050 2c 20 00 ca f2 a5 f4 09 42 10 c8 20 03 c1 a0 14
...
000ee30 97 79 17 2f e4 cb 8c ae 2e ff dd ed 12 d6 00 00
000ee40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0010000 50 30 00 01 00 18 84 aa 18 7c ff ff ff ff ff ff
0010010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0010020 ff ff ff ff ff ff ff ff 00 18 84 aa 18 7e 00 0c
0010030 43 30 50 66 11 05 24 00 ff ff 2b 01 55 77 a8 aa
0010040 8c 88 ff ff 0c 00 00 00 00 00 00 00 00 00 ff ff
0010050 80 80 02 03 03 04 04 05 05 06 06 07 07 08 08 09
0010060 10 10 11 11 11 12 12 12 13 13 13 14 14 14 ff ff
0010070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*
00100d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff 88 88
00100e0 cc cc 88 aa cc cc 88 aa cc cc 88 aa cc cc 88 aa
00100f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*
0010200 46 4f 4e 32 33 30 35 00 00 00 00 00 00 00 00 00
0010210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0010ff0 00 00 00 00 00 00 00 00 00 00 00 00 61 72 6f 61
0011000 00 18 84 aa 18 7d be 4e e1 e5 e9 ca f3 79 b0 ed
0011010 5a e9 5c f6 c6 29 73 6c 63 a3 06 63 56 9d d9 56
0011020 29 c3 ba 70 b9 6d 70 31 53 69 57 53 57 39 4a 48
0011030 00 00 31 00 00 00 00 00 00 00 00 00 00 00 00 00
0011040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0020000 27 05 19 56 34 e7 e8 5c 54 44 43 b1 00 14 3a 38
0020010 80 00 10 00 80 00 10 00 72 4f e4 ea 05 05 02 01
...

FON2305EのBOOTの設定はboot from internal ROMとなっているのだが、この仕様が よくわからない。また吸い取った先頭64KがU-Bootなのだが文字列が見当たらないので 圧縮されているのだがと思うが、これもよくわからない。あと次の64K部分はU-Bootの 設定が入っているようなのだが、この構造もよくわからない。 とはいえ、動いているから時間が出来たら調べようと思う。

起動時に"Using default environment"と表示されているので、おそらく CFG_ENV_IS_NOWHEREがdefineされU-Bootがビルドされていて、Flash内にはuser config は無くてコード内のデフォルト値が使われている模様。setenvはメモリ内に設定値を 保存して、Flashには書き込めないようだ。

以下がROMのブートローダーなのかも。

RT3052 # md 00000000
00000000: 01000000 00000000 00000000 00000000    ................
00000010: ffffffff ffffffff ffffffff ffffffff    ................
00000020: ffffffff ffffffff ffffffff ffffffff    ................
00000030: ffffffff ffffffff ffffffff ffffffff    ................
00000040: ffffffff ffffffff ffffffff ffffffff    ................
00000050: ffffffff ffffffff ffffffff ffffffff    ................
00000060: ffffffff ffffffff ffffffff ffffffff    ................
00000070: ffffffff ffffffff ffffffff ffffffff    ................
00000080: ffffffff ffffffff ffffffff ffffffff    ................
00000090: ffffffff ffffffff ffffffff ffffffff    ................
000000a0: ffffffff 00000000 69616b20 2072656b    ........ kaiker 
000000b0: 30337472 49203235 2043494e 67616d69    rt3052 INIC imag
000000c0: 6f622065 6c20746f 6564616f 00000072    e boot loader...
000000d0: 02000112 40000000 ffff148f 00000001    .......@........
000000e0: 060a0100 00000200 00014000 00190209    .........@......
000000f0: 80000101 00040950 ffff0100 050700ff    ....P...........

ZRouterをいじっていて、どうにか動くようになった。起動ログは こんな感じ。イメージはxSMALL_でビルドして4MByte 弱となっていてノーマルのFONには入らない。いじった点は以下のようなところ。

ZRouterではmapの中で#!/bin/shで始まるブロック(*.ulzma)をg_uncompress.cで解凍し てメモリディスクとしてrootファイルシステムとしてマウントする。map/rootfsが解凍 されてmap/rootfs.uncompressになる。hintsのmapでrootfsのstartがずれていると解凍 されず、map/rootfs.uncompressが出来ずマウントできずに落ちるのだが、 g_uncompress.cはデバッグログを吐かせないと、エラーに気がつけないのはちょっと 不親切かもしれない。

ZRouteはAtherosのAR71が充実していて、Ralinkが次に充実していて、 Broadcomは申し訳程度のサポートしか無いようだ。

soc.mkで指定されているmipselはmipsでlittle endianな仕様の事のようだ。

newbusの仕組みは元々の4BSDの仕組みで無かった、ダイナミックなドライバーの ロードをサポートした点であるようなのだが、それはkldで実装された部分がほとんど で実際はドライバーコードは4.3BSD頃からあまり変わっていない感じも受ける。 Appleのkextみたいに完全に新しく作ったぜ、みたいな感じは全くない。newconfig と喧々諤々やたため、あまり成果が出せなかったのかな。というよりいろんな人の 意見をまとめなければならないオープンソースコミュニティーの宿命なのかもしれ ない。と書いたが船頭多くしてなんとかは一般企業でも同じかもしれない。

考え直してみるとnewbusとnewconfigの話だが、本質的にはELF,kld移行でカーネル屋 さんが忙しく英語の得意ではない日本勢のnewconfigの話を聞いている時間がなくなり、 話が伝わりやすいnewbus勢に傾いたのかもしれないと思ったりする。

lvanのポートのmacアドレスをkenvで設定するようにrcファイルに書いてあるのだが、 kenvの中身は、どうやって設定するのだろうか?

いろいろ調べていて、U-BootについてKMCさんの こちらの記事が参考 になる。

ZRouterのビルドは以下の順で実行されている。

>>> Rebuilding the temporary build tree
>>> stage 1.1: legacy release compatibility shims
>>> stage 1.2: bootstrap tools
>>> stage 2.2: rebuilding the object tree
>>> stage 2.3: build tools
>>> stage 3: cross tools
>>> stage 4.1: building includes
>>> stage 4.2: building libraries
>>> Rebuilding the temporary build tree
>>> stage 1.1: legacy release compatibility shims
>>> stage 1.2: bootstrap tools
>>> stage 2.2: rebuilding the object tree
>>> stage 2.3: build tools
>>> stage 3: cross tools
>>> Building an up-to-date make(1)
>>> World build started on Wed Dec 31 20:19:10 JST 2014
>>> stage 2.2: rebuilding the object tree
>>> stage 2.3: build tools
>>> stage 4.1: building includes
>>> stage 4.2: building libraries
>>> stage 4.3: make dependencies
>>> stage 4.4: building everything
>>> World build completed on Wed Dec 31 20:21:00 JST 2014
>>> Making hierarchy
>>> Installing everything
>>> Kernel build for /usr/home/hiroki/ZRouter/obj//usr/home/hiroki/ZRouter/zrout
er/conf/FON_FON2305E started on Wed Dec 31 20:21:07 JST 2014
>>> stage 1: configuring the kernel
>>> stage 2.2: rebuilding the object tree
>>> stage 2.3: build tools
>>> stage 3.1: making dependencies
>>> stage 3.2: building everything
>>> Kernel build for /usr/home/hiroki/ZRouter/obj//usr/home/hiroki/ZRouter/zrout
er/conf/FON_FON2305E completed on Wed Dec 31 20:24:25 JST 2014
>>> Installing kernel /usr/home/hiroki/ZRouter/obj//usr/home/hiroki/ZRouter/zrou
ter/conf/FON_FON2305E

scosのRT3050にはrt2860が入っていたが、RT3052はralであった。rt2860がコンパイル できなかったのでralに代えて確認してみた。 ral0はprobeされifconfigで見えるが以下のようにエラーになる。

# ifconfig wlan0 create wlandev ral0
# ifconfig wlan0 up scan
ral0: timeout waiting for MCU to initialize
ral0: could not load 8051 microcode

rt2860.cのrt2860_load_microcode()でマイクロコードを書いた後に8051をスタートさ せたにも関わらずレスポンスが無いようだ。。。

上のダンプを見ると、おそらく本体の下に書いてあるMACアドレスと連続した二つ の計三つが割り当てられていて末尾が7Cの場合7D,7Eが割当られていると思われる。

フラッシュの付いた基板の生産はどういう手順なのかまったくわからないのだが フラッシュによくペインとしてあるので、バージョン管理をペイントでおこない 焼いた物を実装しているものと思われる。実装してから、JTAGで焼く事も出来るが 時間がかかるので、生産ラインとしては非現実的なような気がする。ただ上記のよう に、筐体のシールとフラッシュの中身を一致させる必要があるので、生産ラインの コントロールはかなり慎重におこなわれているのかもしれない。

パッケージにはRT3050とあるがCHIPID0_3/CHIPID4_7を読むとRT3350と返ってくるし RT2860が入ってるのかと思いきや、ASIC_VER_IDは0x28720200と返ってきて、手元の データーシートと違っている。。。

RT288x_SDK/source/linux-2.6.21.x/drivers/net/wireless/rt2860v2/include/firmware.h がオリジナルのファームのようだ。SDKの中には元のbinファイルは見つからない。

FreeBSDの方はsys/contrib/dev/ralの下にRalinkから提供されたファームがuuencode されて入っている。

Ralinkのチップはプロダクト番号が不規則に指定されていて、番号だけでは何のチップ かわからない。2560と2561は同じWIFIのチップなのだが前者が作り込みで 後者が8051を使ったホストからファームをダウンロードするタイプで全く違うものに なっている。2460と2560は同じ系統でbとb/gの機能差だったりするからなにがなんだか わからない。

rt2860.cの中にはRT2860とRT3593とRT3071以上の処理が入っている。

RT3050のWIFIは以下のような構成のようだ。

RTWIFI

RT2860はPCIにもつながりその場合はMedia Access Controller / Baseband Processor のチップににEEPROMがつながっていて、それにMACアドレスなどが書かれている。 RT3050などのSOCの場合はEEPROMは無いので、SDKではFlashにそれと同等のデータを 書き込んでおいて、利用しているようだ。デフォルトの値はカーネルの中にも 入っているようだ。

ZRouterのFreeBSDのソースツリーにはrt2860というドライバーコードもはいっていて、 これも試してみた。conf/files.mipsにフォルダーのpci以外のcソースを突っ込んで rt2860.cの構造体のメンバーのtxa_acをtxa_tidに変更したら、コンパイルが通った。 txa_tidで書かれている部分もあるのになんで、こんな半端な状態なんだろう。。。 あと、rt2860_io.cのEEPROMイメージがRT3052だけだったのでRT3050も追加してみた。

ifconfigしてもエラーが出なくなったので、hostapを入れてビルドして、サイズを確認 してmapを直して、もう一度ビルドして試したら、こんな感じ。この時点で4MByte越え になってしまってます。

# ifconfig wlan0 create wlandev rt28600 wlanmode hostap channel 1 country JP
wlan0: Ethernet address: 00:0c:43:30:52:88
# ifconfig wlan0 inet 192.168.1.1 netmask 255.255.255.0
# /usr/sbin/hostapd
Shared object "libpcap.so.8" not found, required by "hostapd"

profiles/hostap/profile.mkにWORLD_SUBDIRS_LIB+=libpcapを追加してビルドして map直して、ビルドしてhostapdを実行

# /usr/sbin/hostapd /etc/hostapd.conf
Configuration file: /etc/hostapd.conf
Using interface wlan0 with hwaddr 00:0c:43:30:52:88 and ssid 'freebsdap'
ieee80211_load_module: load the wlan_xauth module by hand for now.
ioctl[SIOCS80211, op=7, val=5, arg_len=0]: Invalid argument
bsd_set_ieee8021x: Failed to enable WPA/802.1X
IEEE 802.1X initialization failed.
wlan0: Unable to setup interface.
rmdir[ctrl_interface]: No such file or directory
# kldload wlan_xauth
# kldload wlan_tkip
# /usr/sbin/hostapd /etc/hostapd.conf
Configuration file: /etc/hostapd.conf
Using interface wlan0 with hwaddr 00:0c:43:30:52:88 and ssid 'freebsdap'

hostapとしては機能しているようには見えないが、scanするとときどきアクセス ポイントが見えているので微妙に動いている模様。ralのnexus直下のコードもZRouter オリジナルのようだが、ralが動かないのでrt2860の方に移行したのかな。。。 rt2860の方も元々はPCIのコードでnexus直下のコードはZRouter追加したのではないかと 思われる。 しかしrt2860は実際のデバイス名がrt28600となり何とも気持ちが悪い。 UNIXでデバイス名には数字を使わない事って、どっかに書いてあるのかな?

RalinkはUSBのWIFIモジュールも作っていてFreeBSDではuralが2500でrumが2501で runが2700などのドライバが用意されている。コードはsys/dev/usb/wlanの下にある。 runは8051を使ったタイプでrunfwにRalinkから提供されたファームが入っている。 runfwはralfwと違いfirmwareのドライバを使わずドライバ内にコードが入れている。

run0: MAC/BBP RT3070 (rev 0x0201), RF RT3020 (MIMO 1T1R), address 00:00:00:00:00:00

FON2305Eの技適

ハードコードしてブート時にデバッグ吐かせてみた。ブート後はsysctlでdev.rt2860.0.debug を設定する事でログ出ます。

rt28600: <Ralink RT2860 802.11n MAC/BPP> at mem 0x10180000-0x101bffff irq 4 on n
exus0
rt28600: attaching
rt28600: EEPROM rev=0x0101
rt28600: EEPROM mac address=00:0c:43:30:52:88
rt28600: EEPROM RF rev=0x0005, paths=1T1R
rt28600: EEPROM NIC config: HW radio cntl=0, Tx AGC cntl=0, ext LNA gains=0/0
rt28600: EEPROM country code=255/255
rt28600: EEPROM freq offset=0x2f
rt28600: EEPROM LED cntl=0x01, LEDs=0x7755/0xaaa8/0x888c
rt28600: invalid EEPROM LNA gain #2: 0x00
rt28600: invalid EEPROM LNA gain #3: 0x00
rt28600: EEPROM LNA gains=0x00/0x00/0x00/0x00
rt28600: EEPROM RSSI offsets 2GHz=0/0/0
rt28600: EEPROM RSSI offsets 5GHz=0/0/0
rt28600: EEPROM Tx power per rate deltas=0(2MHz), 0(5MHz)
rt28600: EEPROM Tx power per rate #0=0xaacc6666(20MHz), 0xaacc6666(40MHz/2GHz), 
0xaacc6666(40MHz/5GHz)
rt28600: EEPROM Tx power per rate #1=0xaacc6688(20MHz), 0xaacc6688(40MHz/2GHz), 
0xaacc6688(40MHz/5GHz)
rt28600: EEPROM Tx power per rate #2=0xaacc6688(20MHz), 0xaacc6688(40MHz/2GHz), 
0xaacc6688(40MHz/5GHz)
rt28600: EEPROM Tx power per rate #3=0xaacc6688(20MHz), 0xaacc6688(40MHz/2GHz), 
0xaacc6688(40MHz/5GHz)
rt28600: EEPROM Tx power per rate #4=0xffff6688(20MHz), 0xffff6688(40MHz/2GHz), 
0xffff6688(40MHz/5GHz)
rt28600: EEPROM TSSI 2GHz: 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 step=255
rt28600: EEPROM TSSI 5GHz: 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 step=255
rt28600: invalid EEPROM powersave level
rt28600: EEPROM powersave level=0xff
rt28600: MAC/BBP RT2860 (rev 0x28720200), RF RT3020 2.4G 1T1R
rt28600: skip channel 10, could not find extension channel
rt28600: skip channel 11, could not find extension channel
rt28600: skip channel 12, could not find extension channel
rt28600: skip channel 13, could not find extension channel
rt28600: skip channel 14, could not find extension channel

3020は5Gはサポートしてないのだが、5Gの処理が動いているのが気になるが、特に 影響なさそうなんだが。

ZRouterのrt2860のコードにはRT3052のEEPROMイメージが含まれているので、おそらく RT3052では動いていたのではないかと思われる。また28720200で処理を分けている部分 はRT3052用に追加したのではないのだろうか。RT3050とRT3052の違いはRFがRT3020(1T1R) かRT3022(2T2R)になる。

rt2860_rf.cの一番下に付いている、rt2872_rf_set_chan()は おそらくRT3050用に追加したのではないかな。。。common/cmm_asic.cとrt2860_rf.c を見比べるしかないかな。

rt2860のコードの中でrt2860_io_rf_writeしているのは、rt2860.cとrt2860_rf.cと rt2860_io.cにある。

rt2860_io.cの中のEEPROMイメージが3052だった物を3050のタイプに書き換えたのだが rt2860.cの中に3052で判断してRFを初期化していて、ここを直したら動くようになった 気がする。他にもrt2860_rf.cのチャンネル設定をSDKに入っているコードと同じように readしてから設定値をwriteするようにしたが、必要なかったかも。

wlan関係のモジュールをすべて入れても元から入っているhostapd.confではエラーに なったので こちらのページを参考にした。

同じRT3050Fを搭載してCFIなPLANEXのMZK-WNHをブートしたところ。U-Bootはかなり いろいろな機能を入れてあり、またCFIからの直接のブートの為192Kbとなっている。

============================================ 
Ralink UBoot Version: 3.1
-------------------------------------------- 
ASIC 3052_MP1 (MAC to GigaMAC Mode)
DRAM COMPONENT: 256Mbits 
DRAM BUS: 16BIT 
Total memory: 32 MBytes
Flash: 4 MBytes
Date:Nov  7 2008  Time:13:35:55
============================================ 
icache: sets:256, ways:4, linesz:32 ,total:32768
dcache: sets:128, ways:4, linesz:32 ,total:16384 

 ##### The CPU freq = 320 MHZ #### 

SDRAM bus set to 16 bit 
 SDRAM size =16 Mbytes

Please choose the operation: 
   0: Load ucos code to SDRAM via TFTP Client. 
   1: Load system code to SDRAM via TFTP. 
   2: Load system code then write to Flash via TFTP. 
   3: Boot system code via Flash (default).
   4: Entr boot command line interface.
   9: Load Boot Loader code then write to Flash via TFTP. 
 0 
   
3: System Boot system code via Flash.
## Booting image at bfc50000 ...
Bad Magic Number,43535953 
   Image Name:   Linux Kernel Image
   Created:      2009-11-04   2:36:57 UTC

 System Control Status = 0x01000000 
   Image Type:   MIPS Linux Kernel Image (lzma compressed)
   Data Size:    2863020 Bytes =  2.7 MB
   Load Address: 80000000
   Entry Point:  802ad000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

2/27にIIJで行われたFreeBSD WorkshopのLTで話してきてみた。 スライド

iPhone 3Gからは無線からインターネットにアクセスできるようになったが、Androidは WIFI接続してIPを拾った直後に切断され、iPhone 6はWIFIの接続ができない。dhcpdと hostapdの設定の問題な気がする。

ただブラウザでネットのページを見ていると以下のようなエラーがときどきでる。 かなりきわどいエラーにも見えるが、カーネルが落ちたりはしていない。^ ^;

rt28600: could not load mbuf DMA map: ndmasegs=0, len=1524, error=12

連休で時間があったので、いろいろ設定していたところ、 miruoというKLabさんの方が つくったネットワークアナライザがBSDでもコンパイルできるようになっていたので、 さっそくZRouterのビルドツリーに放り込んでみた。ソースをcontribにコピーして profiles/miruo/profile.mk,target/sbin/miruo/Makefileを作ってちょっといじったら 1間くらいで放り込めた。httpのリクエストの挙動はは下記のようにすると確認できる。

# miruo -q -m http --live -i wlan0 | egrep 'RequestLine.*GET|Header.*Host|ResponseLine.*HTTP/1.1'

hostapdがうまく動かなかったので、FreeBSD 10.1Rのソースにはhostapd 2.0が含まれて いたのでcontrib/wpaとusr.sbin/wpaを持ってきてみた。ZRouterのビルドはエラー無く できたが問題は改善せず。。。Androidから接続したときのログはこんな感じ。

05-06 18:25:07.395: V/WifiStateTracker(96): Changing supplicant state: FOUR_WA
Y_HANDSHAKE ==> FOUR_WAY_HANDSHAKE
05-06 18:25:08.405: I/wpa_supplicant(8968): WPA: 4-Way Handshake failed - pre-
shared key may be incorrect
05-06 18:25:08.405: I/wpa_supplicant(8968): CTRL-EVENT-DISCONNECTED - Disconne
ct event - remove keys
05-06 18:25:08.405: V/WifiMonitor(96): Event [WPA: 4-Way Handshake failed - pr
e-shared key may be incorrect]
05-06 18:25:08.405: V/WifiMonitor(96): Event [CTRL-EVENT-DISCONNECTED - Discon
nect event - remove keys]
05-06 18:25:08.405: V/WifiStateTracker(96): New network state is DISCONNECTED
05-06 18:25:08.415: I/wpa_supplicant(8968): CTRL-EVENT-STATE-CHANGE id=9 state
=0 BSSID=00:00:00:00:00:00
05-06 18:25:08.415: V/WifiMonitor(96): Event [CTRL-EVENT-STATE-CHANGE id=9 sta
te=0 BSSID=00:00:00:00:00:00]
05-06 18:25:08.415: V/WifiStateTracker(96): Changing supplicant state: FOUR_WA
Y_HANDSHAKE ==> DISCONNECTED
05-06 18:25:08.415: D/WifiStateTracker(96): Failed to authenticate, disabling 
network 9
05-06 18:25:08.415: I/wpa_supplicant(8968): CTRL-EVENT-STATE-CHANGE id=9 state
=0 BSSID=00:00:00:00:00:00
05-06 18:25:08.425: V/WifiMonitor(96): Event [CTRL-EVENT-STATE-CHANGE id=9 sta
te=0 BSSID=00:00:00:00:00:00]
05-06 18:25:08.425: V/WifiStateTracker(96): Disabled network: 9

hostapdのログを見ると4-Way HandshakeでSTAから返ってくる、EAPOLのレスポンスが 一致せず4回リトライしてエラーになってしまっているようだ。この処理に関しては ここのページが参考になった。

FreeBSDのソースのheadにはhostapd 2.4が入っていたので、svnで取り出してちょっと いじってビルドできるようにしてみたが、同じ結果だった。

Android 2.3× WPAの4-Way Handshakeに失敗してるパスワードの間違いだったが、やっぱり 接続切断を繰り返す。パスワードの間違いがあっても表示されない仕様って良くない ですね。
iOS 4.2.1(JB)
iOS 8.2× EAPOLのGroup Messageも成功して接続完了した後にDHCPの処理を行った後に切れる
MacOS X 10.6.8× iOS 8.2と同じような感じ
Windows 7 インターネットの接続の認識に時間がかかるが使える
FreeBSD 9 wpa_supplicantでは問題なく接続できるdhcpは未確認

dhcpdからdnsmasqに代えてみたが、状況変わらず。。oz_

MacのWIFIを調べたのだが、WIFIが複雑で 動かない事が良くある事があらためて身にしみる。。。

hostapdはSTAからの切断時にioctl[SIOCS80211, ...のようなログが出るがこれはbsdの ドライバコードが吐いていて動作には影響ないエラーのようだ。

socsSOCに由来の設定を保存するところ
boardsボードに由来の設定を保存するところ
profiles/*_既存のプロファイルをコピーして、ここにビルドの目的 の設定を保存するのが良いよな気がする。
vendorboardsの一階層めのメーカごとの設定ファイル。ここはgit に入らないので、個別設定はここで行う。

Macのから接続すると以下のようなログがでている。

May 17 09:21:20 hiroki-no-macbook-air kernel[0]: AirPort: RSN handshake complete
 on en0
May 17 09:21:27 hiroki-no-macbook-air kernel[0]: en0: Terminating supplicant.
May 17 09:21:27 hiroki-no-macbook-air kernel[0]: RSNSupplicant: Releasing authen
ticator for 00:0c:43:30:52:88
May 17 09:21:27 hiroki-no-macbook-air kernel[0]: AirPort: Link Down on en0. Reas
on 8 (Disassociated because station leaving).
May 17 09:21:27 hiroki-no-macbook-air airportd[254]: Apple80211Associate() faile
d -3905 (Timeout)
May 17 09:21:27 hiroki-no-macbook-air Apple80211 framework[144]: airportd MIG fa
iled (Associate Event) = -3905 (Timeout)  (port = 69123)
May 17 09:21:27 hiroki-no-macbook-air SystemUIServer[144]: Error joining freebsd
ap: 接続がタイムアウトになりました (-3905 timeout connecting)

ZRouterはメンテが止まってしまっているので、freebsd-wifi-buildでビルドを試して いるがkernelをtftpでメモリに貼付けて実行しているがまったくログがでない。 platform_startまで到達していないような感じ。。。

headのソースを見て気がついたのだが、spibusは実はtransferしかメソッドが無くて get_blockはAleksandrさんが追加したみたいだ。CPUのサポート(?)でメモリアドレス から読める場合は高速化できるからだと思う。ただspibusはいろいろなところで使わ れているので、メソッド追加をheadに入れるのはちょっと面倒なのかもしれない。

どうにかfreebsd-wifi-buildでブートできるカーネが作れるようになったのでPRして マージしてもらった。まだまだ問題山積みだがこつこつ対応していきたい。

rt305x_spi.cがheadにマージされてないのは、spibus.cやmx25l.cにも修正が入って いるからのようだ。spibus.cやmx25l.cの修正は影響範囲が大きいので、どうするのが いいかな。。。

freebsd-wifi-buildはheadベースなのでZRouterの差分が分かってきたのだが、上の SPI関係以外にdev/switchもAleksandrさんが作った物だった。こちらはほとんど 他のコードに依存が無いので、ちゃんと動作確認してheadに入れられるといいのだが。 あとリンク時のスクリプトからヘッダーのオフセットをとっているがこれがないと なぜかフラッシュからブートできない。tftpbootでメモリに貼付けてbootmで展開して ブートするとには問題ないのだが不思議だ。

freebsd-wifi-buildはおそらくAtheros 以外ではほとんど動作確認されてない気がする。

rt2860というドライバはheadに入っていないがmips/conf/RT305X.hintsにはその設定が ある。

すべてのソースをheadに入れるのは無理にしても、せっかくの動くコードはメンテ できる状態にしておきたい物だ。

spimmcというコードがメーリングリストにあったのだが、こちらもspibusを修正して いるのでheadに入れるのは難しいのかもしれない。こういうspi関係どうしたものかな。

geom_mapのhintsを設定するために、一度kernelとrootfsを作って計算して もう一度kernelとrootfsを作りなおしている。よくよく考えてみると、hintsは kernelの中に入っていて、サイズは変わらないので、kernelの再構築だけで 良いはずだ。どうやったら出来るかな。。。

11.0-CURRENTベースのソースでビルドするようにしたらシリアルからもtelnetでも ログインできなくなった。仕方なくシングルユーザで起動するようにソースを修正 して確認したら、passwdコマンドなどでpam_start()がエラーになっていた。 loginも同じようだった。いろいろ試していたら、pam.dにotherがないとエラーに なるようになってしまったようで、ファイルを作ったら認証は通るようになった。

ところがtelnetでは入れるようになったが、シリアルからログインしたあと シェルのプロンプトが出なくなってしまった。制御線を見ているようなのだが、 どうすると無視できるのかな。

# ps -axl 104
UID PID PPID CPU PRI NI  VSZ  RSS MWCHAN STAT TT     TIME COMMAND
  0 104  103   0  29  0 6988 1868 ttydcd I+   u1  0:00.07 -sh (sh)

-clocalになってしまっていたので、/etc/gettytabと/etc/ttysを修正したら入れる ようになった。

もともとのZRouterのFreeBSDのソースは9.0Rが出た後の10.0-CURRENTを使っている と思われる。このソースを元にしたカーネルは4434044バイトとなっている。 現在の11.0-CURRENT(2015/10)ベースのカーネルは4627448バイトで5%くらい大きく なっているようだ。

VLAN機能をつかって、Etherのポートを別々のインターフェースにした場合、 設定は以下のような選択がある。

FON2305Eに富士通の29LV160BE-90PFTMというCFIなフラッシュを実装してみたが認識 できない。よくよくみるとCFIのパターンの近くに未実装の抵抗のパターンがある。

FON-CFI-1 FON-CFI-2
8R31A8
9R88A19
13R83A21
16R85A18

ハイアドレスピンを実装するメモリサイズよって変更する(2MByteだったらA19で 4MByteだったらA20まで)とかのパターンなのかとも思えるが、A8がなぜ同じような パターンになってるかわからない。。。ネットを調べると28系と29系でピンが違う という情報があったが、おそらく実装対象のMXのチップとピン配列は同じように みえるのだが。

年明けに突然ルータの調子が悪くなって、FON2305Eを急遽Firewall/DHCP/DNSサーバと して設定して、実践投入してみた。WIFIだけGaetwayとして元のルータに残した。 DNSサーバとしてunboundを使うようにしてみた。ZRouterオリジナルなSwitchベースの VLANは安定して動いている。

上のファームをFON2405Eに焼いてみたところ、ネットワークが正常に使えなかった。 FON2305EとFON2405Eはネットワーク部分とかには差がないと思っていたのだが。。。

RT3050はGPIOは52本あるのですが、他の機能との切り替えになっています。

JavaScriptでGPIOのmodeをチェックするできるようにしてみました。 RT3050 GPIO Mode

FreeBSDでmips/rt3050の実装とは別にmips/mediatekにFDT対応の実装が用意された。 いろいろ試したのだが、どうにか使えるようになっている。(2016/09/29)

RT3050のUSBはOTGというHost/Deviceの両方がサポートされていて、これのドライバは dwcotgというドライバになるようだ。RT5xxx以降はHost(ehci/ohci)のみの普通の インターフェースになった模様。



Copyright (C) 2011 Hiroki Mori All Rights Reserved.