このページに書いてある事はFreeBSDのsys/mips/rt3050をベースにした話です。 12-CURRENT以降ではFDT化したsys/mips/mediatekに移行しているので、ここに あることは昔話になってしまいました。
HARD OFFでFON2305EというWifiルーターを525円で購入してみたので、その中身を調 べてみました。このルーターはiPhoneのおまけでSoftbankが配布していたようです。
このルーターはRalinkというメーカーのRT3050Fというチップで作られている。 ほとんどの機能がこのチップに含まれていて、外部にはフラッシュとDRAMと Ethernetのモジュールが主要な部品になっています。
足のゴムをはがすとT6のトルクスのねじがありこれを外すと分解できます。 このモジュールのシリアルとJTAGらしき端子は一目瞭然ですぐにシリアル コンソールは確認できました。ボーレートは57600で3.3Vのインターフェースの ようです。チップ実装面でコネクタ側を下にするとVCC,RX,GND,TXのならびに なっています。写真はストロベリー・リナックスのFT2232Hのモジュールと接続 したところです。このモジュールは3.3VなのでTX,RX,GNDを接続してCTS,RTSを ループさせています。
シリアルコンソールで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)がブートしてしまうとシェルは起動していないようでコンソールから の入力は効かなくなります。
0x00000000-0x00010000 | uboot | 64K |
0x00010000-0x00020000 | boardconfig | 64K |
0x00020000-0x00200000 | image | 1920K |
0x00020000-0x000b6000 | linux | 600K |
0x000b6000-0x001f0000 | rootfs | 1256K |
0x001f0000-0x00200000 | uci_overlay | 64K |
とここまでで、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.zimage | 3914752 |
D-Link_DAP-1350_kernel | 4625359 |
D-Link_DAP-1350_kernel.kbin | 3738204 |
D-Link_DAP-1350_kernel.kbin.oldlzma | 1030654 |
D-Link_DAP-1350_kernel.kbin.oldlzma.uboot | 1030718 |
D-Link_DAP-1350_kernel.kbin.oldlzma.uboot.sync | 1048576 |
D-Link_DAP-1350_rootfs | - |
D-Link_DAP-1350_rootfs_clean | - |
D-Link_DAP-1350_rootfs_clean.iso | 11315200 |
D-Link_DAP-1350_rootfs_clean.iso.ulzma | 2866176 |
D-Link_DAP-1350_rootfs_clean.mtree | 11174 |
zimageが最終イメージのようだが、4Mちかくありまったく入らない。。。oz_
作戦としては以下のような事が考えられる。
モデル | 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_sysctl | ○ | sys/mips/rt305x/rt305x_sysctl.c |
rt305x_ic | ○ | sys/mips/rt305x/rt305x_ic.c |
timer | ||
rt305x_memc | ||
pcm | ||
uart | ○ | sys/mips/rt305x/uart_*c |
gpio | ○ | sys/mips/rt305x/rt305x_gpio.c |
rt305x_dma | ||
rt305x_nandc | ||
i2c | ||
i2s | ||
spi | ||
uart | ○ | sys/mips/rt305x/uart_*c |
cfi | ○ | sys/dev/cfi/cfi_bus_obio.c |
dotg | ○ | sys/mips/rt305x/rt305x_dotg.c |
rt5350_usb | ○ | sys/mips/rt305x/rt5350_usb.c |
switch | ○ |
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を挟む ような実装になっている。
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にしてみた。
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の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には入らない。いじった点は以下のようなところ。
DEVMETHOD(spibus_get_block, rt305x_spi_get_block),
mips/rt305x/rt305x_spi.c optional spi rt305x_spi
KERNCONF_DEVICES+= spi KERNCONF_DEVICES+= spibus KERNCONF_DEVICES+= rt305x_spi KERNCONF_DEVICES+= mx25l
hint.spi.0.at="obio0" hint.spi.0.maddr=0x10000B00 hint.spi.0.msize=0x00000100 hint.spi.0.irq=-1 hint.mx25l.0.at="spibus0" hint.mx25l.0.cs=0
#!/bin/sh UBOOTEND=131072 KERNSIZE=`ls -l *.sync | awk '{print $5}'` FSSIZE=`ls -l *.ulzma | awk '{print $5}'` KERNEND=`expr ${UBOOTEND} + ${KERNSIZE}` FSEND=`expr ${KERNEND} + ${FSSIZE}` printf "%08x\n" ${UBOOTEND} printf "%08x\n" ${KERNEND} printf "%08x\n" ${FSEND}
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は以下のような構成のようだ。
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
ハードコードしてブート時にデバッグ吐かせてみた。ブート後は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 | × | |
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の ドライバコードが吐いていて動作には影響ないエラーのようだ。
socs | SOCに由来の設定を保存するところ |
boards | ボードに由来の設定を保存するところ |
profiles/*_ | 既存のプロファイルをコピーして、ここにビルドの目的 の設定を保存するのが良いよな気がする。 |
vendor | boardsの一階層めのメーカごとの設定ファイル。ここは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のパターンの近くに未実装の抵抗のパターンがある。
8 | R31 | A8 |
9 | R88 | A19 |
13 | R83 | A21 |
16 | R85 | A18 |
ハイアドレスピンを実装するメモリサイズよって変更する(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)のみの普通の インターフェースになった模様。