FON2405E カスタムファーム

実家に転がっていた FON Simple(FON2405E)を貰ってきたのだが、 SoftBank の携帯からでしか、 Linus にはなれないようで、 MyPlace しか使えないらしい。
自分は、 FON_FREE_INTERNET を使うことが出来ないのに第三者にサービスするほどお人よしではないので、「鳴かぬなら殺してしまえ杜鵑」ということで、いろいろ調べてみると、やはり、ファームウェアを書き換えている人はいるようで、真似をしてみた。(→Hot Tuna Labs

シリアルコンソールを繋いで、ブートメッセージを見るまでは簡単に到達できたのだが、その次のステップの TFTP でファームを送り込む作業が大変だった。
基本的には、書いてあるとおりに作業を進めればよいのだが、 U-Boot で、 "2: Load system code then write to Flash via TFTP." を選択することが出来ず、普通に立ち上がってしまう。何度かリトライしているうちに、なぜかうまくいった。 どうやらリセットボタンを離すタイミングと、キーボードから "2" を入力するタイミングとの問題のようなのだが、「なぜかうまくいった」と書いたとおり残念ながら、どうするとうまくいくのかを説明することは出来ない。
ちなみに、リセットボタンと称しているのは、後ろのコネクタの並びにある FONWDS ボタンのことである。

なんとか、 TFTP 経由でカスタムファームに書き換え、起動するところまでは行ったのだが、 Radiko を聞いていると、10分ほどで通信が途切れてしまうと言う問題があることがわかった。こうなってしまうと、有線側からログインして、再起動するか、パワーサイクルを行ってコールドブートするしかない。

そんなこともあって、本当にオリジナルのカスタムファームを作ることにした。

そもそも、 FON Simple の中で走っているファームウェアは、 OpenWRT という Linux ベースのシステムであり、 CPU / Chipset 毎に用意されている Software Development Kit を入手して、クロスコンパイル環境を構築してしまえば、容易にカスタムファームを作ることが出来る。
そこで、 RoyalWindows を参考に、 Ubuntu10.04LTS で組んだ自宅の仮想サーバー群の開発用環境に クロスコンパイル環境を構築し、カスタムファームウェアを作製した。

基本的には、 RoyalWindows のサイトのとおりであるが、生の Ubuntu なので、通常アカウントでの作業になり、 tar 展開から、 sudo で作業を行わなければならないので注意する。( SDK が使う ./dev 以下のノードを作製するところで、特権が必要になるため、通常アカウントでは tar がエラーとなる。)私の使用環境では、 AP Client Mode / PPP 接続 / Firewall 機能 / 802.1q TagVLAN は不要なので削除し、 nslookup や netstat などのネットワークツールを導入している。 多くの機能を削ったために、イメージサイズは、1.6MBとかなり小さくなった。
Image Name: Linux Kernel Image
Created: Sat Mar 3 09:46:32 2012
Image Type: MIPS Linux Kernel Image (lzma compressed)
Data Size: 1683310 Bytes = 1643.86 kB = 1.61 MB

出来上がったファームウェアは、 Hot Tuna Labs のカスタムファームウェアが適用されていれば WebUI からの書き換えが可能なので、書き換え自体は容易である。

さて、自分でビルドしたファームウェアを導入したところ、 10 分ほどでアクセスポイントが使えなくなってしまう現象は、発生しなくなった。ただ、 WPA2 の鍵の更新で手間取るのか、鍵の更新タイミングで 10 秒ほど通信断が生じてしまう。
 とりあえずは、定期的に再起動しなければならなかった状況からは大幅の進展なので、よしとする。

残作業としては、
 ・鍵の交換タイミングでの通信断の解消
 ・本体の状態表示用の LED が電源ランプ以外は機能していない問題の解消
である。

出来上がったカーネルのブートメッセージ
タイマーが 17179569.184000 から始まるのはご愛嬌

# dmesg
[17179569.184000] Linux version 2.6.21ASROC_Custom_Image_NoPPP_NoIPFilter_NoAPClient (root@bt) (gcc version 3.4.2) #17 Sat Mar 3 09:46:26 EST 2012
[17179569.184000]
[17179569.184000] The CPU feqenuce set to 320 MHz
[17179569.184000] CPU revision is: 0001964c
[17179569.184000] Determined physical RAM map:
[17179569.184000] memory: 02000000 @ 00000000 (usable)
[17179569.184000] Initrd not found or empty - disabling initrd
[17179569.184000] On node 0 totalpages: 8192
[17179569.184000] DMA zone: 64 pages used for memmap
[17179569.184000] DMA zone: 0 pages reserved
[17179569.184000] DMA zone: 8128 pages, LIFO batch:0
[17179569.184000] Normal zone: 0 pages used for memmap
[17179569.184000] Built 1 zonelists. Total pages: 8128
[17179569.184000] Kernel command line: console=ttyS1,57600n8 root=/dev/ram0
[17179569.184000] Primary instruction cache 32kB, physically tagged, 4-way, linesize 32 bytes.
[17179569.184000] Primary data cache 16kB, 4-way, linesize 32 bytes.
[17179569.184000] Synthesized TLB refill handler (20 instructions).
[17179569.184000] Synthesized TLB load handler fastpath (32 instructions).
[17179569.184000] Synthesized TLB store handler fastpath (32 instructions).
[17179569.184000] Synthesized TLB modify handler fastpath (31 instructions).
[17179569.184000] Cache parity protection disabled
[17179569.184000] cause = 800008, status = 1100ff00
[17179569.184000] PID hash table entries: 128 (order: 7, 512 bytes)
[17179569.184000] calculating r4koff... 00138800(1280000)
[17179569.184000] CPU frequency 320.00 MHz
[17179569.184000] Using 160.000 MHz high precision timer.
[17179569.188000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
[17179569.192000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
[17179569.200000] Memory: 28828k/32768k available (2371k kernel code, 3940k reserved, 297k data, 896k init, 0k highmem)
[17179569.204000] Calibrating delay loop... 212.99 BogoMIPS (lpj=425984)
[17179569.292000] Mount-cache hash table entries: 512
[17179569.296000] NET: Registered protocol family 16
[17179569.300000] NET: Registered protocol family 2
[17179569.304000] Time: MIPS clocksource has been installed.
[17179569.344000] IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
[17179569.348000] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
[17179569.352000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[17179569.356000] TCP: Hash tables configured (established 1024 bind 1024)
[17179569.360000] TCP reno registered
[17179569.376000] detected lzma initramfs
[17179569.380000] detected lzma initramfs
[17179569.384000] initramfs: LZMA lc=3,lp=0,pb=2,dictSize=1048576,origSize=3719168
[17179569.388000] LZMA initramfs by Ming-Ching Tiew .........................................................<6>squashfs: version 3.2-r2 (2007/01/15) Phillip Lougher
[17179570.928000] squashfs: LZMA suppport for slax.org by jro
[17179570.932000] io scheduler noop registered (default)
[17179570.936000] Ralink gpio driver initialized
[17179570.944000] HDLC line discipline: version $Revision: 1.1.1.1 $, maxframe=4096
[17179570.948000] N_HDLC line discipline registered.
[17179570.952000] Serial: 8250/16550 driver $Revision: 1.3 $ 2 ports, IRQ sharing disabled
[17179570.956000] serial8250: ttyS0 at I/O 0xb0000500 (irq = 37) is a 16550A
[17179570.960000] serial8250: ttyS1 at I/O 0xb0000c00 (irq = 12) is a 16550A
[17179570.964000] RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize
[17179570.968000] loop: loaded (max 8 devices)
[17179570.972000] rdm_major = 254
[17179570.984000]
[17179570.984000]
[17179570.984000] === pAd = c0000000, size = 495296 ===
[17179570.984000]
[17179570.988000] <-- RTMPAllocAdapterBlock, Status=0
[17179570.992000] block2mtd: version $Revision: 1.1.1.1 $
[17179570.996000] deice id : c2 20 15 c2 20 (2015c220)
[17179571.000000] mx25l3205d(c2 20160000) (4096 Kbytes)
[17179571.004000] mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
[17179571.008000] Creating 5 MTD partitions on "raspi":
[17179571.012000] 0x00000000-0x00400000 : "ALL"
[17179571.016000] 0x00000000-0x00010000 : "Bootloader"
[17179571.020000] 0x001f0000-0x00200000 : "Config"
[17179571.024000] 0x00010000-0x00020000 : "Factory"
[17179571.028000] 0x00020000-0x001f0000 : "Kernel"
[17179571.032000] TCP cubic registered
[17179571.036000] NET: Registered protocol family 1
[17179571.040000] NET: Registered protocol family 17
[17179571.044000] GDMA1_MAC_ADRH -- : 0x00000000
[17179571.048000] GDMA1_MAC_ADRL -- : 0x00000000
[17179571.052000] Ralink APSoC Ethernet Driver Initilization. v2.00 256 rx/tx descriptors allocated, mtu = 1500!
[17179571.056000] GDMA1_MAC_ADRH -- : 0x00000018
[17179571.060000] GDMA1_MAC_ADRL -- : 0x84f2a572
[17179571.064000] PROC INIT OK!
[17179571.084000] Freeing unused kernel memory: 896k freed
[17179571.104000] Algorithmics/MIPS FPU Emulator v1.5
[17179571.120000] devpts: called with bogus options
[17179572.916000]
[17179572.916000] phy_tx_ring = 0x01eb5000, tx_ring = 0xa1eb5000
[17179572.916000]
[17179572.916000] phy_rx_ring = 0x00000000, rx_ring = 0x00000000
[17179572.920000] RT305x_ESW: Link Status Changed
[17179572.924000] CDMA_CSG_CFG = 81000007
[17179572.928000] GDMA1_FWD_CFG = 710000
[17179577.256000] RX DESC a1ebb000 size = 2048
[17179577.264000] <-- RTMPAllocTxRxRingMemory, Status=0
[17179578.016000] Key1Str is Invalid key length(0) or Type(0)
[17179578.020000] Key2Str is Invalid key length(0) or Type(0)
[17179578.024000] Key3Str is Invalid key length(0) or Type(0)
[17179578.028000] Key4Str is Invalid key length(0) or Type(0)
[17179578.048000] 1. Phy Mode = 9
[17179578.052000] 2. Phy Mode = 9
[17179578.056000] 3. Phy Mode = 9
[17179578.060000] RTMPSetPhyMode: channel is out of range, use first channel=0
[17179578.064000] MCS Set = ff 00 00 00 00
[17179578.072000] SYNC - BBP R4 to 20MHz.l
[17179580.888000] Main bssid = 00:18:84:f2:a5:70
[17179580.892000] <==== rt28xx_init, Status=0
[17179580.896000] 0x1300 = 00064380
[17179581.184000] device ra0 entered promiscuous mode
[17179581.352000] device eth2 entered promiscuous mode
[17179582.332000] br0: port 2(eth2) entering learning state
[17179582.336000] br0: port 1(ra0) entering learning state
[17179582.940000] br0: port 2(eth2) entering disabled state
[17179582.944000] br0: port 1(ra0) entering disabled state
[17179582.956000] br0: port 2(eth2) entering learning state
[17179582.960000] br0: port 1(ra0) entering learning state
[17179584.884000] AP SETKEYS DONE - WPA2, AuthMode(7)=WPA2PSK, WepStatus(6)=AES, GroupWepStatus(4)=TKIP
[17179584.884000]
[17179588.888000] AP SETKEYS DONE - WPA2, AuthMode(7)=WPA2PSK, WepStatus(6)=AES, GroupWepStatus(4)=TKIP
[17179588.888000]
[17179597.960000] br0: topology change detected, propagating
[17179597.964000] br0: port 2(eth2) entering forwarding state
[17179597.968000] br0: topology change detected, propagating
[17179597.972000] br0: port 1(ra0) entering forwarding state