NDKでusb_setinterfaceを実装してみたのですが、いろいろ試してみたところAndroidのUSBホスト機能だけでもなんとかなることが判明。 結局JavaだけでTSを取り出すところまで出来ました。
はじめTSは取得出来ているのにデータの中身がぐちゃぐちゃで、なにかバグを埋め込んだかと悩みましたが、これはチューナーのチャンネルを設定した後、ある程度の時間を置いて安定するまでのデータを捨てることで解決。
ただ、処理が追いついていないせいか0.3%くらいのパケットがドロップしています。
次はワンセグの切り出しと、パフォーマンスチューニングかな。
2012年7月31日火曜日
2012年7月28日土曜日
Androidでけいあん!!
recfsusb2nのC++からAndroid Javaへの移植はほぼ完了したのですが、最後の最後でつまりました。
いろいろ初期化してチャンネル合わせて、最後にストリームの転送を開始するコマンドを送るところで、それを送るのに使われている usb_setinterface というAPIがサポートされていないことがわかりました。
面倒くさいのとCPU依存になってしまうのでいやだったのですが、しょうがないのでNDKにまで手を出すことに。
ざっと調べたところ、NDKだとioctlは使えるようだし、USBホスト機能側からファイルディスクリプタも取得出来るようなので、なんとかなりそう。
でも結局NDKにまで手を出すんだったら、はじめからそっちでやっておけば、わざわざ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はハードウェア寄りのコード書くのには向いていない気がします。
まだきちんと確認出来ていませんが、いちおうチューナーとカードリーダーの両方とも正常に初期化出来ているようです。
あたりまえと言えばあたりまえなのですが、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つ。
http://developer.android.com/guide/topics/connectivity/usb/host.html
FSUSB2がLinuxで使えるのは確認出来たので、今度はAndroidアプリから認識出来るか試してみたら、ハマってしまい何時間か無駄にしたのでメモしておきます。
ポイントは2つ。
- 本体で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ホスト機能を有効に出来ます。
- 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してみたら。
もう少し詳しく見てみようとlsusbしてみたら。
/system/bin/sh: lsusb: not foundこれは自分コンパイルして入れなきゃならんのかと思いかけたけど、そういえばbusyboxってのがあった事を思い出した。
/system/bin/busybox lsusbbusyboxを自分で入れた覚えはないんだけど、中華androidだから初めから入っていたのかな?
...
...
Bus 001 Device 005: ID 0511:0029
2012年6月10日日曜日
FSUSB2をカードライターとして使う (7)
PTやPLEXシリーズを持っていて、汎用カードリーダーは無いけどk-an!!は有るという、そんなユーザーっているのかな? いてもかなりの少数派でしょうね。 そんなわけで利用者は自分しかいないのかもしれませんが、VirtualPTのカードリーダーとしても使えるようにしてみたのでアップ。 あいかわらずの手抜き対応なので、常用には十分ご注意を。 http://ll.la/cbM@ 機能追加
|
2012年6月3日日曜日
FSUSB2をカードライターとして使う (6)
これでかなり安定するはず。 ツールによってカードへのアクセス方法がいろいろで、 全てのパターンに対応するのは難しそう。 修正内容
|
2012年6月2日土曜日
FSUSB2をカードライターとして使う (5)
やはり手元に実カードがないといろいろとやりづらい。
とは言っても何もテストしてないのはさすがにまずいので、
機能を追加した部分について、カードのエミュレータ作ってバグ出しをしてみた。
http://ll.la/KX.5
機能追加
とは言っても何もテストしてないのはさすがにまずいので、
機能を追加した部分について、カードのエミュレータ作ってバグ出しをしてみた。
機能追加
- 読み込みサイズが指定されていなかった場合に対応
- 書き込み単位が大きい場合に対応
- 読み込みサイズが指定されていなかった場合に間違ったアドレスのデータを取得していたのを修正
- 書き込み単位が大きい場合にループしていたのを修正
FSUSB2をカードライターとして使う (4)
読み込みサイズが指定されていなかった場合に対応書き込み単位が大きい場合に対応デバッグログ出力を追加
バグがいろいろと見つかったので削除。
カードのエミュレータ作ってバグ取りします…
2012年5月31日木曜日
FSUSB2をカードライターとして使う (3)
いくつか問題があったので修正。
これで使える範囲が広くなってるといいな。
なお、カードは必ず事前に挿入しておく必要があります。
修正内容
http://ll.la/YM~E
これで使える範囲が広くなってるといいな。
なお、カードは必ず事前に挿入しておく必要があります。
修正内容
- JPKI利用者ソフトでの動作確認が出来るように修正
(実際に正常動作を確認したわけではありません) - 読み込み単位が大きいと不安定なことがあったのを修正
2012年5月27日日曜日
FSUSB2をカードライターとして使う (2)
はまりどころが色々ありましたが、何とか完成。 手抜きまくりなので、常用は控えた方が良いかも。 内容: ・winscard.dllとして不足していたいくつかのAPIのダミーを追加 ・メモリの自動確保モードに嘘対応 ・カードステータスとして常に「挿入済」を返す ・カード内部での通信エラーを無視 利用手順: 0. KTV-FSUSB2をカードリーダーとして使えていることが前提 1. 元のwinscard.dllをwinscard-fsusb2.dllにリネーム 2. 同じフォルダにラッパーのwinscard.dllをコピー ◆WPjeGg6tSAさんに敬意を表しつつキーワードは第2期。 |
2012年5月26日土曜日
FSUSB2をカードライターとして使う (1)
http://tri.dw.land.to/fsusb2n/ で配布されていたwinscard.dllを使うと、KTV-FSUSB2をカードリーダーとして使えます。
KTV-FSUSB2のハードウェア的にはカードライターとしても使えるはずなのですが、このDLLがリーダーとして使うための最低限のAPIしかサポートしていないので、実際にはライターとしては使えませんでした。
それだと不便なこともあるということで、勉強もかねてwinscard.dllのラッパーDLLを作ってみる。
FSUSB2の使い方はwikiを参照
http://ktvwiki.sitemix.jp/index.php?BonDriver_FSUSB2N
KTV-FSUSB2のハードウェア的にはカードライターとしても使えるはずなのですが、このDLLがリーダーとして使うための最低限のAPIしかサポートしていないので、実際にはライターとしては使えませんでした。
それだと不便なこともあるということで、勉強もかねてwinscard.dllのラッパーDLLを作ってみる。
FSUSB2の使い方はwikiを参照
http://ktvwiki.sitemix.jp/index.php?BonDriver_FSUSB2N
登録:
投稿 (Atom)