2012年7月31日火曜日

iCou 8はまだ来ない

注文してから、そろそろ2ヶ月。
届く気配はまったくありません。
悲しい予想が当たりそう…

Androidでけいあん!!!

NDKでusb_setinterfaceを実装してみたのですが、いろいろ試してみたところAndroidのUSBホスト機能だけでもなんとかなることが判明。 結局JavaだけでTSを取り出すところまで出来ました。

はじめTSは取得出来ているのにデータの中身がぐちゃぐちゃで、なにかバグを埋め込んだかと悩みましたが、これはチューナーのチャンネルを設定した後、ある程度の時間を置いて安定するまでのデータを捨てることで解決。

ただ、処理が追いついていないせいか0.3%くらいのパケットがドロップしています。

次はワンセグの切り出しと、パフォーマンスチューニングかな。

2012年7月28日土曜日

Androidでけいあん!!

recfsusb2nのC++からAndroid Javaへの移植はほぼ完了したのですが、最後の最後でつまりました。

いろいろ初期化してチャンネル合わせて、最後にストリームの転送を開始するコマンドを送るところで、それを送るのに使われている usb_setinterface というAPIがサポートされていないことがわかりました。

面倒くさいのとCPU依存になってしまうのでいやだったのですが、しょうがないのでNDKにまで手を出すことに。
ざっと調べたところ、NDKだとioctlは使えるようだし、USBホスト機能側からファイルディスクリプタも取得出来るようなので、なんとかなりそう。

でも結局NDKにまで手を出すんだったら、はじめからそっちでやっておけば、わざわざJavaへの移植しなくても良かったのにというのはあります…

2012年7月22日日曜日

Androidでけいあん!

AndroidでUSBホスト機能が使えるようになったので、recfsusb2n Linux版を参考にしてFSUSB2の初期化ロジックまで作ってみました。

まだきちんと確認出来ていませんが、いちおうチューナーとカードリーダーの両方とも正常に初期化出来ているようです。

あたりまえと言えばあたりまえなのですが、AndroidのUSB機能のAPIは、ほぼLinuxのAPIと同じなので、いまのところの作業としてはC++のコードをJavaに移植しているだけに近いです。そのためbyteとintの相互変換が多くなっていて、Java的にはかなりパフォーマンスが悪そうなので、後でチューニングの必要がありそうです。

unsignedな数値型が無いことも含めて、やはりJavaはハードウェア寄りのコード書くのには向いていない気がします。

2012年7月20日金曜日

AndroidのUSBホスト機能

Androidの3.1以降ではUSBホスト機能がサポートされたので、比較的簡単にUSB機器と通信するプログラムが書けるようになっています。
http://developer.android.com/guide/topics/connectivity/usb/host.html

FSUSB2がLinuxで使えるのは確認出来たので、今度はAndroidアプリから認識出来るか試してみたら、ハマってしまい何時間か無駄にしたのでメモしておきます。

ポイントは2つ。
  1. 本体でUSBホスト機能が有効になっていなかった。

    カーネルはUSB機器が接続されたことを認識しているのに、Android側に何もメッセージが飛んでないので、原因を調べるのに随分かかりました。わかってしまえばなんのこともない。

    これはD70Wがそうだっただけなのかもしれませんが、Android 3.1以降でもUSBホスト機能が有効になっていないことがあるみたいです。

    下記の内容のファイルを android.hardware.usb.host.xml という名前で作成しておいて 、
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <feature name="android.hardware.usb.host" />
    </permissions>
    このファイルをAndroidの /system/etc/permission ディレクトリに置いてからリブートすれば、USBホスト機能を有効に出来ます。

  2. USB機器を特定するためのIDの指定が10進数だった。

    AndroidアプリがFSUSB2に特定して反応するように device_filter でベンダーIDとプロダクトIDを指定するわけですが、ここに16進数でIDを指定していたのでメッセージが受け取れていませんでした。

    lsusbの出力にしろ、あちこちに出てくるメッセージにしろ、IDは16進数で表示されているので、それをそのまま設定していたのが敗因でした。
    これは16進数を10進数になおして設定すれば良いです。
以上で、AndroidアプリからFSUSB2を認識するところまでは確認出来ました。

2012年7月2日月曜日

Androidでlsusb

試しにD70WにFSUSB2繋いでみたら、なんか普通に認識してるっぽいメッセージ。
もう少し詳しく見てみようとlsusbしてみたら。
/system/bin/sh: lsusb: not found
 これは自分コンパイルして入れなきゃならんのかと思いかけたけど、そういえばbusyboxってのがあった事を思い出した。
/system/bin/busybox lsusb
...
...
Bus 001 Device 005: ID 0511:0029
busyboxを自分で入れた覚えはないんだけど、中華androidだから初めから入っていたのかな?