La Fonera Linux化計画。

11月 9th, 2008 · No Comments

日経Linuxに載ってて、前からやりたかったこともありついうっかりやってしまいました。
所有していた型番が2100番台だったので、「シリアルケーブル作らないとなぁ…」って思って敬遠してたのですが、
どうやらPDC時代の携帯用ケーブルでどうにかなるということを知り、Goサイン。

注意 守れそうもなかったらやらないこと。

やるときはすべて自己責任。
壊れても泣かない。
壊すのが怖かったら最初からやらない。
人のせいにしない。

この作業を行うことで何らかの損害が発生してもhizumiは一切責任を負いません。

必要なもの。

Windowsマシン
LaFonera (ないとお話にならない。+でもできるみたいですが、ここでは無印の2100番台を使います。)
PC-携帯のUSBケーブル(for PDC)
ピンヘッダx3個(はまれば何でもOK)
はんだ付け技術少々+工具
ネット環境
各種ソフト (Serialコンソール,ssh環境,TFTPサーバー等々)
(今回はシリアルとssh両方使えるという理由でputtyとPoor TFTP Serverを使用しました。)

あると便利なもの。

UNIX環境(Macでも可、起動できなくなった時用。)
細い先のとがったもの。(リセットボタンをぽちる時用)

ケーブル作成

LaFoneraの2100番には基盤の上にシリアル用のピンが立っています。

←コンデンサ メモリ→

..  1,2
..  3,4
..  5,6
..  7,8
 .   9,10

これのピン番号を上のように仮定すると

(1:VCC)
2:GND
6:Tx
8:Rx

となっているのでちょうどUSB-Serial機能ももってるPDC時代の携帯用通信ケーブルを用意し、即席シリアルケーブルを作成できるというわけ。

hizumiは携帯マスターというソフトに付属していたUP12を使用しました。
(どうやら海連のUP12Cと同等品のようなのでドライバをそのまま流用できるようです。)
また、ピンヘッダはASUS P5K-Proを買った時についていたIEEE1394のピン端子延長ヘッダを流用しました。
端子先端

こんな感じ。UP12,UP12Cを使うときは、GND:黒、Tx:白、Rx:緑とつなぎます。(赤は使用しない)

ソフトの準備

Poor TFTPServerをあらかじめ立ち上げておき、OpenWrtのWebページより、

openwrt-atheros-2.6-vmlinux.lzma
openwrt-atheros-2.6-root.squashfs

を用意しPoorTFTPServerと同じディレクトリに入れる。

シリアルでの作業

PuttyやTeraTermProなどを立ち上げシリアル関係の設定。
シリアル設定は以下の通り

ボーレート:9600
データ長:8bit
パリティ:なし
ストップビット:1bit
フロー制御:なし

シリアルケーブル、LANケーブルを繋ぎ(結構忘れがち)、ソフトの準備が整ったら作業開始。

以下[Ent]は改行とおきます。

まず電源ケーブルを入れる。
するとソフトの画面にだらだらと起動シークエンスが表示されるので
Ctrl+Cを押してキャンセルする。

^C
RedBoot>

すると上のように表示されて入力待ちの状態になります。
まずは、FWをTFTPで飛ばすので、IPアドレスの設定。
ここではFONが192.168.1.3/24、PCが192.168.1.100と仮定して作業しますので、環境が違う場合は適宜書き変えてコマンドを実行してください。

RedBoot> ip_address -l 192.168.1.3/24 -h 192.168.1.100[Ent]
IP: 192.168.1.3/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.100

次にフォーマット。途中で本当にフォーマットするか聞いてくるのでyをタイプ。

RedBoot> fis init[Ent]
About to initialize [format] FLASH image system – continue (y/n)? y[Ent]
*** Initialize FLASH Image System
… Erase from 0xa87e0000-0xa87f0000: .
… Program from 0x80ff0000-0x81000000 at 0xa87e0000: .

そして、ここでFWを1つTFTPで持ってくる。
エラーが出たらip_addressの確認、LANケーブルのチェック、TFTPServerの確認を行ってみてください。

RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-2.6-vmlinux.lzma[Ent]
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x801007ff, assumed entry at 0x80040800

領域の作成。

RedBoot> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7[Ent]
… Erase from 0xa8030000-0xa80f0000: …………
… Program from 0x80040800-0x80100800 at 0xa8030000: …………
… Erase from 0xa87e0000-0xa87f0000: .
… Program from 0x80ff0000-0x81000000 at 0xa87e0000: .

空き領域の計算。0xA87E0000 – 0xA80F0000 = 0X006F0000

RedBoot> fis free[Ent]
0xA80F0000 .. 0xA87E0000            //差は0x006F0000

FW飛ばしその2

RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-2.6-root.squashfs[Ent]
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x801607ff, assumed entry at 0x80040800

領域作成その2。
ここの-l以降の16進数は先の空き領域に合わせて変更します。
たいていの場合は0x006F0000で問題ないと思います。

RedBoot> fis create -l 0x006F0000 rootfs[Ent]
… Erase from 0xa80f0000-0xa87e0000: …………………………………………………………………………………………………
… Program from 0x80040800-0x80160800 at 0xa80f0000: ………………
… Erase from 0xa87e0000-0xa87f0000: .
… Program from 0x80ff0000-0x81000000 at 0xa87e0000: .

そして再起動。

RedBoot> reset[Ent]

これでシリアルの作業はいったん終了。
そのあともつけっぱなしにしていると、OpenWrtの起動シークエンスが見れる。

長いので続く。

+PHY ID is 0022:5521
Ethernet eth0: MAC address xx:xx:xx:xx:xx:xx
IP: 0.0.0.0/255.255.255.255, Gateway: 0.0.0.0
Default server: 0.0.0.0
RedBoot(tm) bootstrap and debug environment [ROMRAM]
Non-certified release, version v1.3.0 – built 16:57:58, Aug  7 2006
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
Board: ap51
RAM: 0x80000000-0x81000000, [0x80040450-0x80fe1000] available
FLASH: 0xa8000000 – 0xa87f0000, 128 blocks of 0x00010000 bytes each.
== Executing boot script in 1.000 seconds – enter ^C to abort
RedBoot> fis load -l vmlinux.bin.l7
Image loaded from 0x80041000-0x80290085
RedBoot> exec
Now booting linux kernel:
Base address 0x80030000 Entry 0x80041000
Cmdline :
Linux version 2.6.21.5 (nbd@ds10) (gcc version 4.1.2) #2 Sun Sep 30 20:16:16 CEST 2007
CPU revision is: 00019064
Determined physical RAM map:
memory: 01000000 @ 00000000 (usable)
Initrd not found or empty – disabling initrd
Built 1 zonelists.  Total pages: 4064
Kernel command line: console=ttyS0,9600 rootfstype=squashfs,jffs2 init=/etc/preinit
Primary instruction cache 16kB, physically tagged, 4-way, linesize 16 bytes.
Primary data cache 16kB, 4-way, linesize 16 bytes.
Synthesized TLB refill handler (20 instructions).
Synthesized TLB load handler fastpath (32 instructions).
Synthesized TLB store handler fastpath (32 instructions).
Synthesized TLB modify handler fastpath (31 instructions).
PID hash table entries: 64 (order: 6, 256 bytes)
Using 92.000 MHz high precision timer.
Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 13504k/16384k available (1955k kernel code, 2880k reserved, 292k data, 116k init, 0k highmem)
Mount-cache hash table entries: 512
NET: Registered protocol family 16
Radio config found at offset 0xf8(0x1f8)
Time: MIPS clocksource has been installed.
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 512 (order: 0, 4096 bytes)
TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 512 bind 512)
TCP reno registered
squashfs: version 3.0 (2006/03/15) Phillip Lougher
Registering mini_fo version $Id$
JFFS2 version 2.2. (NAND) (C) 2001-2006 Red Hat, Inc.
io scheduler noop registered
io scheduler deadline registered (default)
Serial: 8250/16550 driver $Revision: 1.90 $ 1 ports, IRQ sharing disabled
serial8250: ttyS0 at MMIO 0xb1100003 (irq = 37) is a 16550A
eth0: Dropping NETIF_F_SG since no checksum feature.
eth0: Atheros AR231x: 00:18:84:17:85:4c, irq 4
cmdlinepart partition parsing not available
Searching for RedBoot partition table in spiflash at offset 0x7d0000
Searching for RedBoot partition table in spiflash at offset 0x7e0000
5 RedBoot partitions found on MTD device spiflash
Creating 5 MTD partitions on “spiflash”:
0x00000000-0x00030000 : “RedBoot”
0x00030000-0x000f0000 : “vmlinux.bin.l7”
0x000f0000-0x007e0000 : “rootfs”
0x001f0000-0x007e0000 : “rootfs_data”
0x007e0000-0x007ef000 : “FIS directory”
0x007ef000-0x007f0000 : “RedBoot config”
nf_conntrack version 0.5.0 (128 buckets, 1024 max)
ip_tables: (C) 2000-2006 Netfilter Core Team
TCP vegas registered
NET: Registered protocol family 1
NET: Registered protocol family 17
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFS: Mounted root (squashfs filesystem) readonly.
Freeing unused kernel memory: 116k freed
eth0: Configuring MAC for full duplex
Warning: unable to open an initial console.
Algorithmics/MIPS FPU Emulator v1.5
– preinit –
jffs2 not ready yet; using ramdisk
mini_fo: using base directory: /
mini_fo: using storage directory: /tmp/root
– init –
init started:  BusyBox v1.4.2 (2007-09-29 07:21:40 CEST) multi-call binary
Please press Enter to activate this console. device eth0 entered promiscuous mode
br-lan: port 1(eth0) entering learning state
br-lan: topology change detected, propagating
br-lan: port 1(eth0) entering forwarding state
PPP generic driver version 2.4.2
wlan: 0.8.4.2 (svn r2568)
ath_hal: module license ‘Proprietary’ taints kernel.
ath_hal: 0.9.30.13 (AR5212, AR5312, RF2316, TX_DESC_SWAP)
ath_rate_minstrel: Minstrel automatic rate control algorithm 1.2 (svn r2568)
ath_rate_minstrel: look around rate set to 10%
ath_rate_minstrel: EWMA rolloff level set to 75%
ath_rate_minstrel: max segment size in the mrr set to 6000 us
wlan: mac acl policy registered
ath_ahb: 0.9.4.5 (svn r2568)
ath_pci: switching rfkill capability off
ath_pci: switching per-packet transmit power control off
wifi0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
wifi0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
wifi0: H/W encryption support: WEP AES AES_CCM TKIP
wifi0: mac 11.0 phy 4.8 radio 7.0
wifi0: Use hw queue 1 for WME_AC_BE traffic
wifi0: Use hw queue 0 for WME_AC_BK traffic
wifi0: Use hw queue 2 for WME_AC_VI traffic
wifi0: Use hw queue 3 for WME_AC_VO traffic
wifi0: Use hw queue 8 for CAB traffic
wifi0: Use hw queue 9 for beacons
wifi0: Atheros 2315 WiSoC: mem=0xb0000000, irq=3
jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
jffs2_build_filesystem(): unlocking the mtd device… done.
jffs2_build_filesystem(): erasing all blocks after the end marker… done.
mini_fo: using base directory: /
mini_fo: using storage directory: /jffs
//ここでストップするのでEnterキーを押す。
BusyBox v1.4.2 (2007-09-29 07:21:40 CEST) Built-in shell (ash)
Enter ‘help’ for a list of built-in commands.
_______                     ________        __
|       |.—–.—–.—–.|  |  |  |.—-.|  |_
|   –   ||  _  |  -__|     ||  |  |  ||   _||   _|
|_______||   __|_____|__|__||________||__|  |____|
|__| W I R E L E S S   F R E E D O M
KAMIKAZE (7.09) ———————————–
* 10 oz Vodka       Shake well with ice and strain
* 10 oz Triple sec  mixture into 10 shot glasses.
* 10 oz lime juice  Salute!
—————————————————
root@OpenWrt:/#

goodbye Fon .Hello,Wireless FREEDOM!(何

telnet,ssh上での作業

ここからはtelnetが使えるのでそちらに移行。(シリアルで続けても問題ありません)
その場合は

> telnet 192.168.1.1[Ent]

でログイン

まずはrootのパスワードを設定
(これをやると次回からネットワーク越しのloginはsshを使わないと入れなくなります。)

root@OpenWrt:/#passwd[Ent]

そしてネットワーク周りの設定
まずは有線側(数字は環境に合わせて適当に変えてください)
ここでは先ほどのFW書き換えの時の設定を引き継がせます。

root@OpenWrt:/#uci set network.lan.proto=static[Ent]
root@OpenWrt:/#uci set network.lan.ipaddr=192.168.1.3[Ent]
root@OpenWrt:/#uci set network.lan.netmask=255.255.255.0[Ent]
root@OpenWrt:/#uci set network.lan.gateway=192.168.1.1[Ent]
root@OpenWrt:/#uci set network.lan.dns=192.168.1.1[Ent]

ここまで来たら設定を保存

root@OpenWrt:/#uci commit network[Ent]

設定を適用。

root@OpenWrt:/#ifup -a && wifi[Ent]
root@OpenWrt:/#/etc/init.d/firewall restart[Ent]

次に無線の設定。
前の設定でIPが変わり、telnetを落とされた場合はsshを使ってログインする。
ex:ssh 192.168.1.3 -l root

root@OpenWrt:/#uci set wireless.wifi0.disabled=0[Ent]
root@OpenWrt:/#uci set wireless.wifi0.txpower=10[Ent]    //電波法の関係上、絶対必要
root@OpenWrt:/#uci set wireless.cfg2.ssid=hogehoge[Ent]

以下はWEPで暗号化するときの設定。
root@OpenWrt:/#uci set wireless.cfg2.encryption=wep[Ent]
root@OpenWrt:/#uci set wireless.cfg2.key1=16進表記のwepキー[Ent]
root@OpenWrt:/#uci set wireless.cfg2.key=1[Ent]

WPAも追加パッケージを導入すれば使用できますがここでは割愛。
そして設定保存、適用。

root@OpenWrt:/#uci commit wireless[Ent]
root@OpenWrt:/#wifi[Ent]

ここまでの作業で、無線APとして機能するようになりました。
楽しいのはここから…(何

設定に失敗したとき

本体のの裏側にはリセットスイッチがありますが、これを長押ししたからと言ってFWが初回起動時の状態に戻るわけではありません。
これは起動時のとあるタイミングでしかリセットモードが起動しないようになっているためで、そのタイミングを知るためにはunix環境が必要になります。
(自分がMac持ってて良かったと思った瞬間でもありました。)

同じネットワークにつながったunixマシン(MacでもOK)のターミナル上で

% nc -u -l 4919[Ent]

とタイプしudpの4919番ポートを監視します。(Firewallなどは切っておく。)
そのあと電源を入れなおしてしばらく経つと、

Press reset now,to enter Failsafe!

と表示されるので、すぐにリセットボタンを長押しします。
うまくいくとFONにtelnetでログインできるようになるので、192.168.1.1にtelnetでログインします。
ただし、Failsafeモードではファイルの書き換えができないので、

root@(none):/# /sbin/mount_root[Ent]

を実行すると書き変えられるようになります。
めんどくさいという方は

root@(none):/# firstboot[Ent]
root@(none):/# sync[Ent]

でFW書き変え直後の状態に戻ります。

パッケージの追加

OpenWrtは追加パッケージを導入することで機能拡張できるipkgが導入されています。
(いわゆるapt-getやdarwinportsみたいなもの)

ここではX-Wrtというhttp上でルーターの管理ができるIFを導入してみます。

まずはipkgの設定を開きます。

root@OpenWrt:/#vi /etc/ipkg.conf[Ent]

そして、次の1行を追加します。

src X-Wrt http://downloads.x-wrt.org/xwrt/kamikaze/7.09/atheros-2.6/packages

保存した後、ipkgのデータベースを更新します

root@OpenWrt:/#ipkg update[Ent]

んでインストール(ついでにntpclientもインストール)

root@OpenWrt:/#ipkg install ntpclient[Ent]
root@OpenWrt:/#ipkg install webif[Ent]

これでhttp://ルーターのアドレス/でX-Wrtが動作するようになりました。
なお、ログイン時の認証はroot/passwdで設定したパスワードでログインできます。

とりあえず普通の無線LAN機能を盛り込んだところで今回はここまで。
なぜかSDカードスロットが家に余ってるので、そこまで実装したいところ…

Tags: gadget · La Fonera · W52T · レポート · 写真 · 改造 · 更新

0 responses so far ↓

  • There are no comments yet...Kick things off by filling out the form below.

Leave a Comment