KGDBを使って、Android組み込みボードをリモートデバッグしよう!【後編】〜USBガジェットドライバをデバッグする(2)〜:実践しながら学ぶ Android USBガジェットの仕組み(4)(3/3 ページ)
KGDBを使ってAndroid搭載の組み込みボードをリモートデバッグする。【後編】第2弾の今回は、再構築したカーネルイメージをターゲットボードにUSB転送するために必要となる“USBデバイスドライバの作成方法”について解説する。
ドライバを作成する
これから、これまで説明してきた内容をLinuxでどうやって実装していくのかを解説していきたいと思います。ただし、本解説では実装概要を述べるにとどめ、具体的な実装までは言及しておりません。
そのため、今回作成したソース(dnw.zip)を公開しますので、細かな点に興味のある方はこちらを参照ください。ファイル構成としては、ユーザーのアプリケーション層(app)とドライバ層(knl)に分かれております(注5)。ここでは、knl側の解説をしています。
ディレクトリ | 格納ファイル | ファイル情報 |
---|---|---|
app | Makefile | 「dnw.c」をコンパイルするmakeファイル |
dnw.c | データ転送用アプリケーション | |
knl | Makefile | 「androidbulk.c」をコンパイルするmakeファイル |
androidbulk.c | データ転送用USBデバイスドライバ | |
表1 USBデバイスドライバのソース |
(1)「ドライバの登録/解除」の要件
ドライバをUSBコアに登録するためには、USBコアが要望している要件:(3)(4)(5)を満たす必要があります。USBコアは、そのためのデータ構造として「USBドライバ情報(usb_driver構造体)」を用意してくれています。
USBドライバ情報として定義する内容を以下に示します。
- 本ドライバが対象とするデバイス情報(id_table)
⇒デバイス情報(注6)を設定することで、「(3)本ドライバが扱えるUSBデバイスかをチェックする」を実現 - デバイス登録用の関数実装(probe())
⇒本関数を設定することで、「(4)本ドライバに接続されたUSBデバイスを登録する」を実現。なお、このタイミングでデバイスファイルを作成する - デバイス切断用の関数実装(disconnect())
⇒本関数を設定することで、「(5)本ドライバから切断されたUSBデバイスを削除する」を実現。なお、このタイミングでデバイスファイルを削除する
これで、USBドライバ情報の準備ができました。後は登録するだけですね。USBコアはドライバの登録関数として、「usb_register()」を用意してくれていますので、これを利用します。一方、解除の場合は、「usb_deregister()」利用します。
(2)「データ転送する」
USBデバイスにデータ転送するには、USBデバイスファイルを使用する必要があります。
そのため、「probe()」処理にてデバイスファイルを作成するときには、USBコアが提供している「USBデバイス情報(usb_class_driver構造体)」に必要な情報を設定した上で、USBコアのデバイス登録関数(usb_register_dev())を呼び出します。なお、デバイスファイルを削除する場合は「usb_deregister_dev()」を使用します。
デバイスファイル情報として定義する内容は、以下の通りです。
- デバイスファイル名(name)
⇒デバイス用のファイルシステム(/dev配下)上に配置され、ユーザーがデータ転送する際に使用するデバイスファイルの名前 - デバイスファイル操作関数テーブル(fops)
⇒デバイスファイルに対する操作関数群の実装を設定。今回使用する操作関数としては、「オープン関数(open())」「クローズ関数(release())」「書き込み関数(write())」となる。write()の実装では、ユーザーが指定したデータをターゲットボードに転送する処理を実装する必要があり、その方式にはUSBバルク転送方式を使用する。USBバルク転送を行うには、USBコアが提供している「USBバルク転送関数(usb_bulk_msg())(注7)」を利用することで容易に実装できる
これで、要件を満たす実装内容についての解説は終わりです。各実装箇所について詳細が気になる場合は、実際に実装した「androidbulk.c」を参照ください。
今回は、再構築したカーネルイメージをターゲットボードにUSB転送するために必要となるUSBデバイスドライバの作成方法について解説しました。次回は、実際にこのドライバを使用して、ターゲットボードにデータを転送します。そして、カーネルを変更し、リモートデバッグを行います。お楽しみに! (次回に続く)
関連キーワード
組み込みAndroid開発 | 実践しながら学ぶ Android USBガジェットの仕組み | USB | Android | 組み込み | Androidケータイ | アプリケーション開発 | Androidがもたらす組み込み開発の新たな可能性 | 組み込み開発 | 作りながら理解するファイルシステムの仕組み
Copyright © ITmedia, Inc. All Rights Reserved.