mbedをADKクローンにしたい

2011/05/26 初版
2011/05/27 read/write両方試しました。
2011/05/28 sendStringの動作についてfutabaさんに修正いただきましたm(_ _)m
 その他XOOM(and nexus S)への動作対応を図りました。
2011/06/04 Android Open Accessory のライブラリ化+demokitに。
watanabeさんから頂いたソースを元にしていますm(_ _)m



とりあえずADKが動いたのですが、動作が不安定です(T_T)
修正いただけるとありがたいです。

以下ソースです。

Import programAndroidAccessory

Android Open Accessory Library化してみました。 バルク転送の使い方が分かっていないため、相変わらず動作は不安定。 I do not understand the usage of the bulk transfer. Please teach someone.

old program
p21〜p23までをスイッチをつなげてみました。
mode(PullUp)にしてます。

動かし方について

nexus oneで完璧に動かす方法を見つけ出しました。w

  • demokitを起動しているならメニューからQuitを選択し終了しておくこと
  • android本体をmbedと接続する
  • mbedのリセットを押してmbedが起動するまで待つ。(10sくらい)
  • demokitを起動
  • demokitを遊びきったら必ずメニューからQuitを選択して終了すること

現在の状況

  • Nexus One 2.3.4 成功
  • Nexus S 2.3.4成功!
  • XOOM XOOMと接続状態でmbedをリセット後、一旦アプリを終了させて再起動で動作。


Report

12 comments on mbedをADKクローンにしたい:

27 May 2011

sendStringが機能してないようです。 仕様通りに値をセットしようとすると以下のようなログが

send_string start(1,0,Google, Inc.)  13 
USB_IRQHandler UnrecoverableError Please reset
USB_IRQHandler UnrecoverableError Please reset
27 May 2011

abeさんのプログラム試させて頂きました。
僕自信、良く理解していない状態で申し訳ないのですが、

sendStringの const char *str を、そのままUSBControlTransferに渡すのではなく、 バッファを作ってコピーしてから渡すとHOST_TO_DEVICEが動きました。

    u8 buffer[255];
    strcpy((char*)buffer,str);
    
    USBControlTransfer(device,
                       HOST_TO_DEVICE |REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE,
                       ACCESSORY_SEND_STRING,
                       0,//value
                       index, //index
                       buffer,
                       strlen(str)+1);


こんな感じです。
僕の環境(Nexus One)では、これで安定して接続が出来るようになりました。

27 May 2011

有難うございます。プログラムに反映させていただきました。

28 May 2011

NexusSでも起動できましたー. 対応お疲れ様です!

28 May 2011

Tomo Watanabe wrote:

NexusSでも起動できましたー. 対応お疲れ様です!

試していただいて有難うございます。 動いてよかったです。notebookに反映させていただきました

28 May 2011

現状XOOMがちゃんと動かないっす。

    sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
    sendString(addr, ACCESSORY_STRING_MODEL, model);
    sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
    sendString(addr, ACCESSORY_STRING_VERSION, version);
    sendString(addr, ACCESSORY_STRING_URI, uri);
    sendString(addr, ACCESSORY_STRING_SERIAL, serial);

    usb.ctrlReq(addr, 0,
                USB_SETUP_HOST_TO_DEVICE |
                USB_SETUP_TYPE_VENDOR |
                USB_SETUP_RECIPIENT_DEVICE,
                ACCESSORY_START, 0, 0, 0, 0, NULL);

    while (usb.getUsbTaskState() != USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
        max.Task();
        usb.Task();
    }

上記のコードはarduinoのソースの抜粋なんですが、 while()のコード部分がmbed上でどう実装すればいいのか解らず放置しているのが原因かと。

28 May 2011

makoto abe wrote:

現状XOOMがちゃんと動かないっす。

    sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
    sendString(addr, ACCESSORY_STRING_MODEL, model);
    sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
    sendString(addr, ACCESSORY_STRING_VERSION, version);
    sendString(addr, ACCESSORY_STRING_URI, uri);
    sendString(addr, ACCESSORY_STRING_SERIAL, serial);

    usb.ctrlReq(addr, 0,
                USB_SETUP_HOST_TO_DEVICE |
                USB_SETUP_TYPE_VENDOR |
                USB_SETUP_RECIPIENT_DEVICE,
                ACCESSORY_START, 0, 0, 0, 0, NULL);

    while (usb.getUsbTaskState() != USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
        max.Task();
        usb.Task();
    }

上記のコードはarduinoのソースの抜粋なんですが、 while()のコード部分がmbed上でどう実装すればいいのか解らず放置しているのが原因かと。

USBホストのステータスフラグのポーリングですよね・・・
mbedのUSB HostはDMAとか持っててややこしくなってますよね.コントロール転送の時にDMA使っているとすればDMA割り込みで検知するのが本来なのですが,実際どうやってるんでしょう
僕はその辺で挫折しました...DMA使ってもポーリングで検知していいのかな

03 Jun 2011

XOOMに対応して、ACCESSORY_STARTを送信したタイミングで USB_Initを呼び出すようにしてみました。
バルク転送の使い方が分かっていないので、動作の不安定さは相変わらずです。
I do not understand the usage of the bulk transfer. Please teach someone.

02 Sep 2011

とりあえず acerのICONIA TAB A500(Android 3.1)でも動作したことを報告します~。

http://jksoft.cocolog-nifty.com/blog/2011/09/mbedusb-android.html

ADKに対応していないAndroid端末でもmbedとつなげられるMicroBridgeの私が移植したライブラリとくっつけて、 対応しているI/Fでつながるライブラリを作ろうと思っています。 http://jksoft.cocolog-nifty.com/blog/2011/08/mbedusb-microbr.html

06 Sep 2011

Doesn't work with Galaxy S2 i9100GT with XXKH3 2.3.4

30 Sep 2011

興味津々で試してみました.

実機はHTC Desire (Softbank X06HT改 Rom:CM7 Nightly GRJ90 Gingerbread 2.3.5)です.

mbedのリセット,USBの挿抜,アプリの再起動を何度か繰り返していると数回に一回ですが動作しました.

あきらめずに粘って良かった・・・ ちなみにソースは無改造です.

02 Oct 2011

リセットを使わずに使えるようになったので報告します。まず、端末のアプリケーションの管理でdemokitを選び、「設定を消去」します。起動時にUSBアクセサリのデフォルトとなっているとうまくつながらないようです。ですので、チェックボックスははずしたまま毎回OKボタンを押すようにします。次にmbedのソースでログをprintf出力しているところを全てコメントアウトするか、AndroidAccesory.hのADKLOGを0に変更します。USBHost.cppのUSBLOGも0に変更します。mbedのログ出力をやめるだけです。次に端末のアプリdemokit.apkのソースのDemoKitActivity.javaのopenAccesory()とonResume()でnullとなる場合にすぐにreturnしている部分を修正し、while文で待つようにすると、USBを指したときにdemokitが起動して、動作するようになります。 /media/uploads/androidfun/demokitactivity-changed.txt

Please log in to post comments.