2009年12月15日

ns001u with android on SmartQ

先週の速報の続き。

カーネルモジュールを無理やり突っ込んでttyデバイスの作成に成功したものの、phs dialerは動作しなかった。今週は、色々いじってみたけれどやっぱり動かなかったという報告。

phs dialerのパッケージが1.2MByteとかあるので、さぞかし難しい処理をしているのだろうと思いきや、ほとんど全ての容量はアイコン類のファイルで占められていることが判明。apkファイルは実際にはzipである。このあたりはjarと同じ。プログラム本体であるdex(dalvic classファイル)はたった一つである。おそらく、pppデーモンを立ち上げるために存在しているのだろう。

それならということで、/etc/pppディレクトリ以下をubuntuで動作実績のあるファイルで入れ替えてしまう。pppdのデバッグ出力を有効にして pppdをtelnetコンソールからダイレクトに叩く。が、無常にもダイヤル(ATDT0570xxxxxのこと)の途中でタイムアウトしてしまう。

ATDT(ダイヤル)コマンドには全くと言っていいほど反応しないが、ATZ(リセット)やAT@@LNK(電波状態)などのコマンドには普通に反応する(しないときもある)。ttyデバイスがまったくもって死んでいるというわけではないらしい。このあたりの検証も実にバカバカしく再現性安定性の欠片もない方法(echoとddを交互に打ち込む)を使っているので、良く分からないことが多い。ああ、screenコマンドを使いたい。

WSIMはRX420(青耳とか言うらしい)なのだが、こいつのリセット直後の挙動が怪しいことが、原因分析をさらに難しくしている。

posted by yuji_at_radiance at 23:25| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2009年12月07日

android on smartQ5にns001uをつないでみる(速報)

前エントリで紹介したとおり、ubuntuのカーネルモジュールを無理やりinsmodすることで、USB接続のCDROMドライブを動かすことが出来た。これを応用すればwillcomの通信アダプタns001uを動かすことができるんじゃ無いだろうかと考え、試してみた。結論から言うと、あと少し(?)のところで失敗した。ただひとこと言い訳をするならば、ubuntu on smartQ5では動いているので、全くの無駄銭というわけではない。

covia版androidはPHS/3G dialerというアプレットを使って、限られた種類のUSB通信ドングルを扱うことができる。ネットで流れている情報を整理すると、サポート対象のドングルは全て、pl2303というUSB-Serial変換の石を経由して無線モジュールを操作しているらしい。で、pl2303ドライバが適用されたデバイスは/dev/ttyUSB0という形で見えるらしい。

一方、ns001u他の通信ドングルはUSB-Serial変換の石を使っておらず、USB CDC ACMクラスのデバイスとして認識されるという。ちなみにCDC ACMクラスドライバはubuntuには含まれているが、covia版androidには含まれていない。

linuxにおけるネットワークの処理については全くの素人だが、大体のところ、関門は次の4つくらいではないかと考えられる。

  • ns001uがACMデバイスとして認識される。/dev/ttyACM0が作られる
  • /dev/ttyACM0を何らかの形でいじり、/dev/ttyUSB0に見せかける。おそらくPHS dialerは/dev/ttyUSBを決めうちにしているはず。
  • /dev/ttyACM0 (ns001u)をたたくコマンド(ATコマンド?)が/dev/ttyUSB0(動作実績のあるドングル)と互換性がある
  • PPPサービスが正常に動く
ACMデバイスとして認識させるのは、ubuntuからドライバをもらってくれば良いとする。実際のところ、上手く行った。次のttyUSB0を作るところはとりあえずシンボリックリンクを張るだけにした。ネットのどこかで、シンボリックリンクでごまかした事例を見たような気がする。それ以降に関しては、良く分からない。障害がおきたら都度対処するしかないだろう。

シンボリックリンクを張る前と後では、PHS dialerでconnect命令を出してからエラーするまでの時間が明らかに違う(まあ、ダメなことに変わりはないのだが)。とりあえず、何かしらのシグナルが送られているのだと思われる。ubuntuでns001uが動いたときに働いていたカーネルモジュールを手当たり次第に放り込んでみたが、上手く行かなかった。アプローチを変えて試してみる必要があるだろう。とりあえず、ATコマンドが通るかぐらいは試してみよう。

posted by yuji_at_radiance at 23:47| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2009年12月06日

Android on SmartQ5にUSB CDROMを接続する

covia版androidのUSBホスト機能で使えるデバイスは、USBキーボード、USBメモリ(HDD/カードリーダ)、一部の3G/PHS通信モジュール(12月度アップデートより)である。ちなみにUSBメモリを使うためにはtelnetログインしてmountする必要があり、androidの枠内で扱えるわけではない。それ以外のデバイスはlinuxで使えるものであっても認識されない。

では、USB接続のCDROMドライブはどうか?実は使えない。linuxではUSB-CDROMのデバイスドライバはUSBメモリのデバイスドライバと別扱いであり、covia版androidにはドライバがインストールされていないのである。

ではどうしたらよいか。無ければ作るか、どこからか持ってくればよいだけのこと。バージョンをそろえたカーネルソースを持ってきて、カーネルモジュールをビルドすればよいのでは? と、ここまで考えた所で天啓が浮かぶ。「SmartQ向けUbuntuのカーネルモジュールが流用できるんじゃね。」カーネルのバージョンを調べてみると、12月度リリースのandroidと最新ubuntuのバージョンが見事に一致する(どちらも2.6.24.7)。

カーネルビルド時のオプションが違うのだから、到底上手く行きそうにないが、とりあえず検証してみることにする。倉庫に眠っていたUSB-DVDROMドライブにCentOSのインストールディスクを挿して、androidに接続する。

以降、android上の作業はtelnet経由で行う。LANで接続しても良いし、telnetクライアントをandroid上で立ち上げても良い。接続が安定しているならLAN経由がオススメ。android上のクライアントとしては、「Telnet」(koushikdutta.telnet)を使う。他のターミナルソフトと違い、確実にソフトキーボードで動作する。これで履歴機能が使えれば大満足なのに。あと、ESC/Ctrlキーを渡せないので、下手にcatとかすると端末が制御を受け付けなくなる。

ともあれ、DVDドライブを接続してdmesgをかける。デバイス「sg0」が作られたとレポートされる。これは「/dev/block/sg0」に対応する。記憶デバイス絡みは大体「/deb/block」以下に配置される。一本目のUSBメモリならば「/dev/block/sda」だ。

記憶デバイスをマウントするときは通常mountコマンドを使う。USBメモリをマウントするならば次のように打つ

mount -t ext3 /dev/block/sda /media
では、sg0をマウントできるか?マウントできない。USB CD-ROMドライブは、「USBデバイス」→「SCSIデバイス(sg0)」→「ブロックデバイスCD-ROM(sr0)」の3段階で認識することで、初めてsr0をマウントすることができる。SCSIデバイスの段階までは認識されているようなので、CD-ROMドライブとして認識するデバイスドライバが必要なのだが、covia版androidにはドライバが含まれていない。

それでは実験、ドライバをubuntu for SmartQから抽出する。このあたりの手順はThe Life with Gadgetほかが詳しい。「smartQ、デュアルブート」で検索すると、色々と知識が得られるはず。本実験に手順をリストアップすると、

  1. 北京智器のサイトからsmartQextractorと、ファームウェアをダウンロードしてくる
  2. smartQextractorで、smartQ5のインストールイメージをアンパックする。幾つかのtgzファイルが出てくるはずだが、用があるのはrootfs.tar.gzである。
  3. rootfs.tar.gzを解凍する。linuxマシンでやってもよいし、Cygwinでもよいし、windows用の解凍ソフトを使ってもよい
  4. 用があるのは、/lib/modules/2.6.24.7/kernel以下だけである。kernelのサブディレクトリをSDカードにコピーする。
これで、linux2.6.24.7 (ARM)のカーネルモジュールがandroidの/sdcard/kernel以下に置かれたはずである。

で、ふたたびtelnetに戻る。カーネルモジュールを強制的に読み込ませるコマンドはinsmod、活動中のカーネルモジュールをリストするコマンドはlsmodである。一般的なlinuxマシンでlsmodすると、「sr0」が出現するには、kernel/drivers/cdrom/cdrom.koとkernel/drivers/scsi/sr_mod.koが必要らしい。なので、足してやる。

insmod /sdcard/kernel/drivers/cdrom/cdrom.ko
insmod /sdcard/kernel/drivers/scsi/sr_mod.ko
もう一度/dev/blockディレクトリを調べると、デバイス「sr0」が追加されている。成功である。ubuntuのドライバはandroidに流用できる。

さて、ここまで来たらマウントしたくなるのが人情。DVD-ROMは読み込みデバイスなのでrオプションをつける。

mkdir /cdrom
mount -r -t iso9660 /dev/block/sr0 /cdrom
あれれ、何故かsr0は存在しないと出る。確かにあるはずなのに。-t ext3とすると、しばらくドライブが唸った後に、-tオプションの誤りを指摘する。もしかして、iso9660は有効なオプションではないのか? 賢明な方はお気づきだろうが、実はiso9660のファイルシステムを扱うドライバが欠落しているのである。対応するファイルは、kernel/fs/isofs/isofs.koである。
insmod /sdcard/kernel/fs/isofs/isofs.ko
ではもう一度。今度はmountに成功し、/media上にDVD-ROMの中身が置かれる。

本実験により、covia版android未サポートのデバイスを無理やり動かす方法に光明が見えた。次はCDC-ACMドライバを試してみたい。これはUSBデータ通信モジュールのドライバであり、上手くはまれば12月時点で未サポートのUSB通信ドングルを動かせる可能性がある。ていうか何としても動かしたいNS001U。

(注意)本稿の内容を実行した場合、そこそこ悪いケースとしてandroidの設定が破壊される可能性があります。クリーンインストールで復旧できるはずですが、重要なデータを退避した後に実験してください。また、最悪のケースとしてデバイスドライバを操作する関係上、SmartQ5に不可逆の損傷を与える可能性があります。危険性を理解したうえで実験を行ってください。
posted by yuji_at_radiance at 16:09| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。