mbedをADKクローンにしたい
 
    
        Page last updated  
03 Jun 2011 , by 
    makoto  abe  .
    
    
        
            
                
                    
                        12
                        replies
                    
                
             
         
    
          
        
            android 
        
    
 
    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
 
VIDEO 
 
とりあえずADKが動いたのですが、動作が不安定です(T_T) 
修正いただけるとありがたいです。
以下ソースです。
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をリセット後、一旦アプリを終了させて再起動で動作。
  
 
 
 
12 comments on mbedをADKクローンにしたい: 
     
     
    
    
        
            
                
 
                
                    
                    abe00makoto 
                    # 
                    
                        27 May 2011   
                    
                    
                 
                
             
            
                
                    
                       sendStringが機能してないようです。
仕様通りに値をセットしようとすると以下のようなログが
send_string start(1,0,Google, Inc.)  13 
USB_IRQHandler UnrecoverableError Please reset
USB_IRQHandler UnrecoverableError Please reset
 
                    
                 
                
             
         
     
 
     
     
    
    
        
            
            
                
                    
                       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)では、これで安定して接続が出来るようになりました。
                    
                 
                
             
         
     
 
     
     
    
    
        
            
                
 
                
                    
                    abe00makoto 
                    # 
                    
                        27 May 2011   
                    
                    
                 
                
             
            
                
                    
                       有難うございます。プログラムに反映させていただきました。
                    
                 
                
             
         
     
 
     
     
    
    
        
            
            
                
                    
                       NexusSでも起動できましたー.
対応お疲れ様です!
                    
                 
                
             
         
     
 
     
     
    
    
        
            
                
 
                
                    
                    abe00makoto 
                    # 
                    
                        28 May 2011   
                    
                    
                 
                
             
            
                
                    
                       
NexusSでも起動できましたー.
対応お疲れ様です! 
試していただいて有難うございます。
動いてよかったです。notebookに反映させていただきました
                    
                 
                
             
         
     
 
     
     
    
    
        
            
                
 
                
                    
                    abe00makoto 
                    # 
                    
                        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上でどう実装すればいいのか解らず放置しているのが原因かと。
                    
                 
                
             
         
     
 
     
     
    
    
        
            
            
                
                    
                       
現状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使ってもポーリングで検知していいのかな
                    
                 
                
             
         
     
 
     
     
    
    
        
            
                
 
                
                    
                    abe00makoto 
                    # 
                    
                        03 Jun 2011   
                    
                    
                 
                
             
            
                
                    
                       XOOMに対応して、ACCESSORY_STARTを送信したタイミングで USB_Initを呼び出すようにしてみました。 
バルク転送の使い方が分かっていないので、動作の不安定さは相変わらずです。 
 I do not understand the usage of the bulk transfer. Please teach someone.
                    
                 
                
             
         
     
 
     
     
    
    
        
            
            
                
                    
                       Doesn't work with Galaxy S2 i9100GT with XXKH3 2.3.4 
                    
                 
                
             
         
     
 
     
     
    
    
        
            
            
                
                    
                       興味津々で試してみました.
実機はHTC Desire (Softbank X06HT改 Rom:CM7 Nightly GRJ90 Gingerbread 2.3.5)です.
mbedのリセット,USBの挿抜,アプリの再起動を何度か繰り返していると数回に一回ですが動作しました.
あきらめずに粘って良かった・・・ ちなみにソースは無改造です.
                    
                 
                
             
         
     
 
     
     
    
    
        
            
            
                
                    
                       リセットを使わずに使えるようになったので報告します。まず、端末のアプリケーションの管理で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.
    
 
    
sendStringが機能してないようです。 仕様通りに値をセットしようとすると以下のようなログが