gr-sakuraのusbホスト機能で遊ぼう

22
GR-SAKURA の USB ののののののののの OSC 2012 Kansai@Kyoto 2012/8/4 2014/6/15 のの SAKURA ののののののの Yuuichi Akagawa

Upload: yuuichi-akagawa

Post on 30-Jun-2015

817 views

Category:

Devices & Hardware


1 download

DESCRIPTION

オープンソースカンファレンス2012京都で発表した 「GR-SAKURAのUSBホスト機能で遊ぼう」の資料です。 その後のライブラリ仕様変更等を反映のため、若干修正しています。

TRANSCRIPT

Page 1: GR-SAKURAのUSBホスト機能で遊ぼう

GR-SAKURA の USB ホスト機能で遊ぼう

OSC 2012 Kansai@Kyoto2012/8/4

2014/6/15 改訂SAKURA ボードユーザ会

Yuuichi Akagawa

Page 2: GR-SAKURAのUSBホスト機能で遊ぼう

自己紹介

Yuuichi Akagawa ( あかがわ ゆういち )

がじぇるねプロジェクトのベータテストに参画

仕組みを知ることが大好きなので、成果物がほとんどないのが特徴。

本職は某 SI 企業のインフラ担当。ツッコミ厳禁。

Copyright©2012 Yuuichi Akagawa

Page 3: GR-SAKURAのUSBホスト機能で遊ぼう

USB ホストと私  Android ADK をハックしていたら、  USB ホスト遊びが楽しくなってしまった。

STM32F4 Discovery で ADK

USB MIDI to レガシー MIDI 変換Harpy nano(Arduino 互換 ) 利用→ USBH_MIDI ライブラリhttps://github.com/YuuichiAkagawa/USBH_MIDI

LM3S3748 で ADKCQ 出版「超入門 ! 付属 ARM マイコンで始めるロボット製作」基板

★Arduino 用 ADK ライブラリ Yaoadk も絶賛公開中。 https://github.com/ADKstudyGroupTokyo/Yaoadk

Copyright©2012 Yuuichi Akagawa

Page 4: GR-SAKURAのUSBホスト機能で遊ぼう

GR-SAKURA の USB ホスト ( ハード )

Function と共用のため排他利用 (RX63N のUSB0)→ ホスト時は仮想 COM ポートが使えない。GR-SAKURA-FULL を買っても USB-A コネクタは未接続。

GR-SAKURA でも USB-A コネクタを接続すれば利用可能。

Copyright©2012 Yuuichi Akagawa

Page 5: GR-SAKURAのUSBホスト機能で遊ぼう

GR-SAKURA の USB ホスト ( ハード )

USB ホストを使うには、まずハンダ付けから。1. 基板裏面に USB-A コネクタをハンダ付け2. J13,J15( もしくは J12,J14) をハンダでショー

ト※後述の「 USB ホスト有効時の IO2,IO5 の取り扱い」参照

3. J1 をショートすると保護ダイオードがバイパスされる。必要に応じて。

Copyright©2012 Yuuichi Akagawa

J1 はお好みで。J13,15 を

ショート

Page 6: GR-SAKURAのUSBホスト機能で遊ぼう

GR-SAKURA の USB ホスト ( ハード )

printf デバッグは XBee 接続がオススメ

Copyright©2012 Yuuichi Akagawa

void setup(){ Serial.begin(9600,SCI_SCI2B); //XBee Serial.setDefault(); // printf を Serial に出力

if(tkusbh_init() != TKUSBH_OK){ printf("!!! USB Host Initialization ERROR !!!\n"); while(1); }}

※ 写真は評価版基板

Page 7: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリV1 ベース (RXduino) での話しです。厳密には RXduino の下にある特電 HAL の機能

ドキュメントは、関数リファレンスのみhttp://rx.tokudenkairo.co.jp/manual2/tkdnhal_desc.html#funclist_hal_usbhost

よくあるステートマシンを回すタイプではなく、同期処理っぽい作り。そのため、あんまり詳しくない人でも割と簡単に使える ( 超お手軽 ) 。詳しい人には痒いところに手が届かない。

Copyright©2012 Yuuichi Akagawa

Page 8: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリ ( 続 )

USB ホスト有効時の IO2,IO5 の取り扱いgUsbHostGpioPulldown で設定可能

ジャンパの設定も必要デフォルトは 0 に設定されている

USB の仕様としては 1 の動作が正しい実際には問題なく動作することが多いので 0 でも

OK ?tkusbh_init() の前に設定しておく必要あり

Copyright©2012 Yuuichi Akagawa

gUsbHostGpioPulldown IO2 IO5 ジャンパ設定0 GPIO GPIO J13,J15

1 USB0_DPRPD USB_DRPD J12,J14

Page 9: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリ ( 続 )

関数一覧関数名 機能

tkusbh_init() USB ホストモジュールを初期化するtkusbh_is_connected() ターゲットが接続されているかどうかを調べる tkusbh_connect() ターゲットに接続する tkusbh_disconnect() ターゲットを切断する。切断されるまで待つ。tkusbh_get_descriptor() 接続されているターゲットのディスクリプタを取得する tkusbh_get_string() 接続されているターゲットのストリングディスクリプタを

取得する tkusbh_control_msg() コントロールトランザクションを発行する tkusbh_set_configuration() SET CONFIGURATION を実行する tkusbh_bulk_write() バルク OUT 転送を実行する tkusbh_bulk_read() バルク IN 転送を実行する tkusbh_start_interrupt_trans() インタラプト転送を行う ( 開始する )

tkusbh_interrupt_write() インタラプト OUT 転送で送信されるデータを登録する tkusbh_interrupt_read() インタラプト IN 転送で受信したデータを取得する

Copyright©2012 Yuuichi Akagawa

Page 10: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリ ( 続 )

サポート状況大分類 中分類 サポート 備考

転送タイプ コントロール転送 ○

バルク転送 ○ エンドポイントは IN/OUT 1 つずつ。

インタラプト転送 ○ エンドポイントは IN/OUT 1 つずつ。受信割り込み無し

アイソクロナス転送 × RX63N には機能あり。Speed - LS

FS HS は未対応

クラスドライバ

- × 何にも無いよ。

HUB 対応 - ×

その他 ディスクリプタのパース

× 支援なし。自力でがんばる。

Copyright©2012 Yuuichi Akagawa

Page 11: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリ ( 続 )

たったこれだけで、 USB の接続処理が完了。tkusbh_init();

tkusbh_connect();

でも、エンドポイント番号は自分でディスクリプタをパースしないとわからない。 USB 詳しくない人はここでつまづくはず。ディスクリプタをパースしてデバイスを確認するのが定石だけど、しないのもアリなのかも。

あとは、 bulk_read なり bulk_write するだけ。

Copyright©2012 Yuuichi Akagawa

Page 12: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリ ( 続 )

tkusbh_connect() を実行すると…Get Device Descriptor(先頭 8 バイト )Get Device Descriptor(ALL)Set AddressGet String Descriptor(0)Get Configuration Descriptor(先頭 9 バイト )Get Configuration Descriptor(ALL)Get String Descriptor(1)Get String Descriptor(2)Get String Descriptor(3)

ここまでやってくれる。 ( 介入はできない ) ※ でも、 Get Configuration Descriptor の結果は残らない。

Copyright©2012 Yuuichi Akagawa

Page 13: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリ ( 続 )

自分は以下の感じで使うようにしてみた。bool connected = false;void setup(){ tkusbh_init();}

void loop(){ if( isConnected() == false ){ delay(100); return; } // 接続済みなので、送受信する if(tkusbh_bulk_read(…) > 0 ){ // 受信データを処理 } //何か送信 if(tkusbh_bulk_write(…) < 0 ){ // 送信エラー } delay(); // デバイス側に指定があれば。}

bool isConnected (){ TKUSBH_RESULT rcode; //Check the disconnect state if(connected && tkusbh_is_connected() == TKUSBH_DISCONNECT){ tkusbh_disconnect(TIMEOUT_INFINITE); isPollEnable = false; return false; } if(connected) //Already connected return true; if(tkusbh_connect(500) != TKUSBH_OK){//Start Enumeration return false; } if(!parseConfigDescr()){ return false; } connected = true; return true;}bool parseConfigDescr(){ エンドポイント情報をパース }

Copyright©2012 Yuuichi Akagawa

Page 14: GR-SAKURAのUSBホスト機能で遊ぼう

GR の USB ホストライブラリ ( 続 )Configuration Descriptor

Configuration Descriptor bLength

bDescriptorType

wTotalLength 全体のサイズbNumInterfaces Interface 数bConfigurationValue

iConfiguration

bmAttributes

bMaxPower

Interface Descriptor bLength

bDescriptorType

bInterfaceNumber

bAlternateSetting

bNumEndpoints Endpoint 数bInterfaceClass USB クラスbInterfaceSubClass USB サブクラスbInterfaceProtocol

Endpoint Descriptor bLength

bDescriptorType

bEndpointAddress エンドポイント番号bmAttributes

wMaxPacketSize パケットサイズbInterval ポーリングインターバル

コンフィギュレーションディスクリプタはtkusbh_get_descriptor(CONFIG_DESCRIPTOR_TYPE, 0, buf, 128);

で取得できる。

これをパースしてエンドポイント番号なりを取得する。

デバイスで決め打ち出来るのであればデバイスディスクリプタの・ idVendor・ idProductの値を見れば良い。tkusbh_connect() が成功していれば、・ USBHostInfo.DeviceDesc.idVendor・ USBHostInfo.DeviceDesc.idProductに代入されている。

Page 15: GR-SAKURAのUSBホスト機能で遊ぼう

作例

Copyright©2012 Yuuichi Akagawa

Page 16: GR-SAKURAのUSBホスト機能で遊ぼう

もちろん GR-SAKURA でも ADK

6/12 に待望の USB ホストライブラリが公開され、 6/16 のプロデューサミーティングに間に合わせるべく ADK の実装に着手。USB ホストライブラリの不具合修正を依頼しつつ、なんとか当日動かせた。

http://japan.renesasrulz.com/gr_user_forum_japanese/w/wiki/75.android-adk-for-gr-sakura.aspx

Copyright©2012 Yuuichi Akagawa

Page 17: GR-SAKURAのUSBホスト機能で遊ぼう

USBH_MIDI

Arduino 用に作った USB-MIDI クラスドライバを GR-SAKURA にも移植。

音楽用ではないのでタイミング制御的なものは無く、 MIDI メッセージの送受信が出来るというもの。

Copyright©2012 Yuuichi Akagawa

Monaka と接続USB-MIDI to シリアル MIDI 変換 USB-MIDI コントローラで LED操作

http://japan.renesasrulz.com/gr_user_forum_japanese/w/wiki/69.usb-midi-usbh-midi-for-gr-sakura.aspx

Page 18: GR-SAKURAのUSBホスト機能で遊ぼう

USB マウスサンプルとして作成

Copyright©2012 Yuuichi Akagawa

http://japan.renesasrulz.com/gr_user_forum_japanese/w/wiki/43.usb.aspx

Page 19: GR-SAKURAのUSBホスト機能で遊ぼう

他のメンバーの作例

Copyright©2012 Yuuichi Akagawa

Page 20: GR-SAKURAのUSBホスト機能で遊ぼう

USB Bluetooth アダプタ@hrdakinori さんの Bluetooth(btstack の移植 )

Copyright©2012 Yuuichi Akagawa

http://d.hatena.ne.jp/hrdakinori/20120729/1343542201

Page 21: GR-SAKURAのUSBホスト機能で遊ぼう

USB NFC リーダ@KazuyukiEguchi さんの NFC リーダ

Copyright©2012 Yuuichi Akagawa

読み取ったデータを Bluetooth Bee経由で Android端末に送信

Page 22: GR-SAKURAのUSBホスト機能で遊ぼう

おしまい

Copyright©2012 Yuuichi Akagawa