LinuxでiPAQに関するメモ

by duh@ht.sfc.keio.ac.jp


目次


ディストリビューションに関して

現在iPAQ用のディストリビューションとして、以下のものがあります。

Familiar

もっとも広く使われているディストリビューション。WindowsCEを消して、FlashRAM上にインストールする。最新バージョンは0.6です。

Intimate

Familiarを拡張した形のディストリビューション。FlashRAMには入りきらないので、MicroDriveかNFSが必要になる。

Melon

CFからブートできる日本のディストリビューション。9/9からオープンソースになりました。

「Melon バージョン 2 より、オープンソースソフトウェアとしてのみ
公開することといたしました。 これに伴い弊社による製品販売、
及び今後の開発、本サイトの更新は終了させていただきます。


クロスコンパイル環境を作る

HandHelds.orgのFTPサイトからクロスコンパイル環境がダウンロードできる。また、emdebian (The Embedded Debian Project) "Cross Development Environments" から RPMやdebパッケージ になっているものを入手できる。

実際にコンパイルするときは、環境変数を設定する必要がある。

setenv AR /skiff/local/bin/arm-linux-ar
setenv AS /skiff/local/bin/arm-linux-as
setenv CC /skiff/local/bin/arm-linux-gcc
setenv CXX /skiff/local/bin/arm-linux-c++
setenv CPLUS /skiff/local/bin/arm-linux-g++
setenv GXX /skiff/local/bin/arm-linux-g++
setenv LD /skiff/local/bin/arm-linux-ld
setenv NM /skiff/local/bin/arm-linux-nm
setenv RANLIB /skiff/local/bin/arm-linux-ranlib
setenv STRIP /skiff/local/bin/arm-linux-strip
setenv CFLAGS -fpermissive

setenv OSTYPE linux
setenv MACHTYPE armv4l
setenv PLATFORM_TYPE linux_armv4l
setenv HOSTTYPE armv4l-linux

set path = ($path /skiff/local/bin)

CFLAGSに-fpermissive オプションを入れているのは、C++プログラムをコンパイルするときANSI完全準拠だとip_opts構造体問題にひっかかるため。
ip_opts構造体は、同じ名前のメンバー変数を持っている。ANSI Cでは問題ないが、C++だと駄目。


カーネルをコンパイルする

カーネルのtarballは、HandHelds.orgからCVSを使ってとってきましょう。

コンパイルは、上のクロスコンパイル環境を使います。

% cp arch/arm/def-config/h3600 .config

Familiar v0.5以降

/boot/

以下に適当な名前でコピーして,bootldrで

> set kernel_filname=/boot/filename

と指定します.

Familiar v0.4

コンパイルしたカーネルは、Familiarディストリビューションの時と同じく、FlashRAMに書き込みます。

ただ、Familiar0.4のインストールで設定するカーネル領域のサイズで512kBは小さすぎるので、768kBに設定しなおしましょう。rootも焼き直しです。


8-bitサウンド

Familiar v0.53以降

問題なく動きます

Familiar v0.4

iPAQのサウンドドライバは二種類ある。

旧:sa1100-uda1341.c

新:bitsy-uda1341.c、sa1100-audio.c

新しい方がヨサゲだが、8-bitサウンドを使おうとするとKernel Panicする。古い方なら一回だけ大丈夫なので、直接 .configファイルを編集して、

CONFIG_SOUND_UDA1341=m

を追加する。使うたびにrmmod&insmod必須。


ビデオ会議をする

iPAQで、Polycom社のViewstationや、Microsoft社のNetMeetingとビデオ会議をすることができます。

openh323.orgから、ohphone、h323、とpwlibライブラリのソースコードをダウンロードします。

この三つをクロスコンパイル環境でコンパイルすれば、ohphoneを使ってビデオ会議ができます。

私がコンパイルしたバイナリを置いておきます。

ohphone - 実行バイナリ

libh323 - ライブラリ

libpt - ライブラリ

LD_LIBRARY_PATHに入っている場所にlibh323とlibptをいれて、ohphoneを起動すれば動きます。詳しい使い方はohphoneのヘルプを見てください。

使う際は8-bitサウンドの項も見てください。


Dual-Sleeveを使う

Dual PCMCIA Card Sleeveが使えるようになったのは、カーネル2.4.6からで、Familiar0.4では使えません。モジュールは、h3600_generic_sleeve、h3600-sleeve、sa1100_csの三つ。

/etc/init.d/pcmciaのスクリプトに、

start)
中略
/sbin/insmod $PC/pcmcia_core.o $CORE_OPTS
/sbin/insmod $PC/$PCIC.o $PCIC_OPTS
/sbin/insmod h3600-sleeve
/sbin/insmod h3600_generic_sleeve

/sbin/insmod $PC/ds.o
中略
stop)
中略
/sbin/rmmod ds
/sbin/rmmod h3600_generic_sleeve
/sbin/rmmod h3600-sleeve
/sbin/rmmod $PCIC
/sbin/rmmod pcmcia_core

を追加する。


Prism社製のチップを載せた無線LANカードを使う「CIS補完計画」

Familiar v0.53以降

orinoco_csが使えます。

Familiar v0.4〜0.5.2

wlan-ngパッケージをダウンロードして、

#ipkg install ファイル名

以上。

それ以外

wlan-ngというプロジェクトのソースが必要です。Handheld.orgからもCVSで取ってこれるが、古くてコンパイルできない。本元から取ってくる必要あり。また、コンパイルするためにpcmcia-csも必要。

コンパイルしたカードはDual-sleeveだと動くけど、他のsleeveだと以下のメッセージが出て動かない場合がある。

cardmgr[74]: initializing socket 0
cardmgr[74]: socket 0: CF WLI
cardmgr[74]: executing: 'modprobe prism2_cs'
init_module: prism2_cs.o: 0.1.10 Loaded
init_module: dev_info is: prism2_cs
prism2_cs: GetNextTuple: No more items
prism2sta_config: NextTuple failure? It's probably a Vcc mismatch.
prism2sta_event: prism2_cs: Initialization failed!
cardmgr[74]: get dev info on socket 0 failed: Resource temporarily unavailable

これはその他のsleeveが、各カードにかかる電圧を報告しないため[1]。そのため、CIS(Card Information Structure)が不完全になり、初期化ができない。

解決するには、別の方法でCIS情報を補完する必要がある。pcmcia-csパッケージに含まれているdebug-toolsの、dump_cisとpack_cisを使う。

まずDual-sleeveにカードを刺し、dump_cisでカードのCIS情報をとる。

 Socket 0:
dev_info
NULL 0ns, 512b
attr_dev_info
SRAM 500ns, 1kb
vers_1 5.0, "BUFFALO", "WLI-CF-S11G", "", ""
manfid 0x026f, 0x030b
funcid network_adapter
lan_technology wireless
lan_speed 34 mb/sec
lan_speed 35 mb/sec
lan_speed 39 mb/sec
lan_speed 44 mb/sec
lan_media 2.4_GHz
lan_node_id 00 07 40 0f 02 73
lan_connector Closed connector standard
config base 0x03e0 mask 0x0001 last_index 0x01
cftable_entry 0x01 [default]
Vcc Vnom 3300mV Vmin 3V Vmax 3600mV Iavg 300mA Ipeak 300mA Idown 10mA io 0x0000-0x003f [lines=6] [16bit] irq mask 0xffff [level] [pulse] [shared]

強調した部分が問題で、ここの情報がうまく取れないため失敗する。

このファイルの必要な部分だけを取り出してカード名.cisを作る。

WLI-CF-S11G.cis
# The card doesn't need this for dual-sleeve,
# but won't work on single sleeve or CF sleeve.
# This is because those sleeves do not report
# what voltages were requested by the card.

vers_1 5.0, "BUFFALO", "WLI-CF-S11G", "", ""
config base 0x03e0 mask 0x0001 last_index 0x01
cftable_entry 0x01 [default]
# This is what is in the card's cis
# Vcc Vnom 3300mV Vmin 3V Vmax 3600mV Iavg 300mA
Vcc Vnom 5V io 0x0000-0x003f [lines=6] [16bit] irq mask 0xffff [level] [pulse] [shared][duh@region2-a ~/ipaq]

電圧は、cardctl statusなどで確認。pcmciaで利用するためには、まずこのファイルをpack_csで圧縮する。

# pack_cis -o カード名.dat カード名.cis

datファイルを/etc/pcmcia/cisにコピーして、/etc/pcmcia/configのカードのエントリでファイルを指定する。

WLI-CF-S11Gの場合
card "BUFFALO WLI-CF-S11G 11Mb/s WLAN Card"
cis "cis/WLI-CF-S11G.dat" manfid 0x026f, 0x030b bind "prism2_cs"

*これをすると逆にDual-sleeveで動かなくなります。根本的な解決方法は、pcmcia-csのソースをいじくることです。


CF-GPSを使う

CF-GPSはノートブックのLinuxなどでは設定の必要なく動きます。

iPAQで問題なのは、刺したときにデバイスファイルを作るMAKEDEVと、シリアルのコンフィギュレーションをするsetserialがないことです。

MAKEDEV

これはただのシェルスクリプトで、指定されたデバイス名でデバイスファイルを作成します。中身はmknodを呼び出しているだけです。ノートのLinuxに刺したときにできるノードと、同じものを作ります。

#mknod /dev/ttyS0 c 4 64

setserial

ソースをとってきて、クロスコンパイル環境で./configureとmakeをすればOKです。単純なプログラムなので、すんなりコンパイルが通ります。

バイナリ

これで、/dev/ttyS0をcatすると、NMEA-0183形式でデータが流れてきます。実際に使う時は、gpsdなどを通して利用するといいかもしれません。


jffs2イメージを作る

iPAQのFlashRAM上で使われているファイルシステムはjffs2(Journaling Flash FileSystem 2)。mkfs.jffs2というツールで、このファイルシステムのイメージを作れる。MTDのCVSからとってくるか、ここからバイナリをとってくるか。

使い方:

# mkfs.jffs2 -r dir-to-image -o output-file.jffs2 -e 0x40000 -l -p

「-e 0x40000」と指定しているのは、iPAQでのflashRAMのブロックサイズは256kBのため。


その他のソフトウェア

java

Blackdownのサイトにruntimeあり。
Familiar v0.53からipkgでインストールできる。

Q Palmtop Environment

特に問題なくインストールできる。

式神

調査中…