KGDBを使って、Android組み込みボードをリモートデバッグしよう!【後編】〜USBガジェットドライバをデバッグする(2)〜実践しながら学ぶ Android USBガジェットの仕組み(4)(3/3 ページ)

» 2012年02月03日 00時00分 公開
[中垣内勇祐、森崇、中谷洋一(永和システムマネジメント),@IT MONOist]
前のページへ 1|2|3       

ドライバを作成する

 これから、これまで説明してきた内容をLinuxでどうやって実装していくのかを解説していきたいと思います。ただし、本解説では実装概要を述べるにとどめ、具体的な実装までは言及しておりません。

 そのため、今回作成したソース(dnw.zip)を公開しますので、細かな点に興味のある方はこちらを参照ください。ファイル構成としては、ユーザーのアプリケーション層(app)とドライバ層(knl)に分かれております(注5)。ここでは、knl側の解説をしています。


ディレクトリ 格納ファイル ファイル情報
app Makefile 「dnw.c」をコンパイルするmakeファイル
dnw.c データ転送用アプリケーション
knl Makefile 「androidbulk.c」をコンパイルするmakeファイル
androidbulk.c データ転送用USBデバイスドライバ
表1 USBデバイスドライバのソース

※注5:なお、トップディレクトリには、全モジュールをコンパイルする「Makefile」があります。


(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()」利用します。

※注6:登録するデバイス情報としては、ベンダーID、プロダクトIDを設定しますが、本ボードのデバイスの仕様の調査内容については、「USBデバイスの仕様は?」を参照ください。


(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」を参照ください。

※注7:usb_bulk_msg()の引数には、USBデバイスのどのバッファにデータ転送するかという情報(エンドポイント)が必要となります。エンドポイントの情報を知るには、USBデバイスの仕様を調査する必要があります。この調査内容については、「USBデバイスの仕様は?」を参照ください。




 今回は、再構築したカーネルイメージをターゲットボードにUSB転送するために必要となるUSBデバイスドライバの作成方法について解説しました。次回は、実際にこのドライバを使用して、ターゲットボードにデータを転送します。そして、カーネルを変更し、リモートデバッグを行います。お楽しみに! (次回に続く)


Android コーナー

Androidコーナー
「Android(アンドロイド)」の組み込み機器への適用からアプリ開発、レポート、ニュースなどさまざまな技術情報・最新動向をお届けする!!

>>コーナーTOPはこちらから


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.