USBデバイスドライバの開発の基本的な考え方

リンク:https://blog.csdn.net/zqixiao_09/article/details/50984074

、USBデバイスは、三個の機能モジュール、USBバスインタフェース、USBデバイスと論理機能ユニットで構成されています。

  • USBインターフェイス:USBデバイスのシリアルインターフェースエンジンSIE
  • USB論理デバイス:USBシステムソフトウェアは、エンドポイントのコレクションとして見られています
  • 機能単位:クライアント・ソフトウェアは、一連のインターフェイスとして見られています

第二に、デバイス、アーキテクチャの観点からUSBデバイスの数によって設定、インターフェイス、エンドポイントは、一つ以上の構成を含んでいてもよい、すなわち、USBデバイスは、デバイスディスクリプタに対応し、各コンフィギュレーションは、1つ以上のインターフェースを含んでいてもよいです各インターフェースは、エンドポイントの数を含んでいてもよいです。インターフェイスの設定はUSB抽象デバイス機能であり、実際のデータ転送は、エンドポイントによって完成される構成とUSB列挙におけるそれらの使用するインターフェイスを指定しなければなりません

三つは、USBデバイスがデバイス・アーキテクチャは、そのようなデバイスディスクリプタ、コンフィグレーションディスクリプタ、インタフェースディスクリプタ、エンド記述子、ストリング記述子として、それらは通常、一定のプログラムでUSBデバイスに格納されている記述子のさまざまな方法を使って説明します。

デバイス記述子は:それはコンフィギュレーションに含まれる数を示す全体的な装置と情報を説明するための、ある、1つ以上の構成からなる、USBデバイスを表すUSBデバイスは、デバイスディスクリプタを有することができます

図1は、 ストラクトusb_device_descriptor
 2  {
 3。      _ _u8容bLength; // ディスクリプタ長
4。      _ _u8 bDescriptorType; // 記述子タイプ番号
5。  
6。      _ _le16 bcdUSB; // USBバージョン
7。      _ _u8 bDeviceClass; // 割り当てられたデバイスクラスコードUSB 
8      _ _u8 bDeviceSubClass; // 割り当てサブクラスコードUSB 
9。      _ _u8 bDeviceProtocol; // プロトコルコードUSB割り当て
10      _ _u8 bMaxPacketSize0を; // エンドポイント0最大パケットサイズ
。11      _ _le16 idVendor; // メーカーID 
12     _Le16 idProduct _; // 番号
13である      _ _le16 bcdDevice; // デバイスシリアルナンバー
14      _ _u8 iManufacturer; // 説明インデックスベンダー列
15      _ _u8 iProduct ,; // 説明インデックス製品ストリング
16      _ _u8 iSerialNumber; / / 割出し装置は、シリアル番号文字列を記載
17。      _ _u8のbNumConfigurations; // 可能な構成の数
18である } _attribute_ _ _(()充填しました)。

2コンフィギュレーションディスクリプタ:USBデバイスと低電力モードのハイパワーモードは、インタフェースに含まれる数として、各構成の特徴を説明するためのUSBデバイスの構成に対応することができます。

1つの 構造体usb_config_descriptor
 2  {
 3      ; _ _u8容bLength // ディスクリプタ長
4。      _ _u8 bDescriptorType; // 記述子タイプ番号
5。     
6。      _ _le16 wTotalLength; // すべてのデータの構成のサイズが返さ
7。      _ _u8のbNumInterfaces; // 設定サポートされているインターフェースの数
8。      _ _u8 bConfigurationValue; // SET_CONFIGURATION所望のコマンドパラメータ値
9。      _ _u8のiConfiguration; // の指標値の設定について説明するストリング
10      _ _u8 bmAttributes; // 供給モードの選択
。11      _ _u8 bMaxPower。//バスから抽出されたデバイスの最大電流
12は _attribute_ _ _(()充填しました)}。

3つのインタフェースディスクリプタ:CD-ROM、ファイル転送、ユーザはCDを再生するときに使用されるオーディオインタフェースに使用される大容量記憶インターフェース用。インターフェースは、エンドポイントの集まりである、1つ以上の代替設定を含んでもよく、ユーザは、USBインターフェースの数および特性の設定状態の変化であってもよく、現在の時刻が含まれ、それはデバイスが属するような、各ユーザインタフェース記述USBデバイスの特徴でありますクラスとそのサブクラス。

1  構造体usb_interface_descriptor
 2  {
 3。      _ _u8容bLength;            // ディスクリプタ長
4。      _ _u8 bDescriptorType; // ディスクリプタタイプ
5は、     
図6      _ _u8 bInterfaceNumber;    // インターフェイスの数
7。      _ _u8 bAlternateSetting; // 予備インタフェースディスクリプタ番号
8      _u8 bNumEndpoints _;       // インタフェースのエンドポイントは0包括的ではない
9。      _ _u8 bInterfaceClass;     // インタフェースタイプ
10      _ _u8 bInterfaceSubClass; // インターフェイスサブタイプ
。11      _ _u8 bInterfaceProtocol; //続いインターフェースプロトコル
12は      _ _u8メソッドはIInterface; // インタフェースの説明文字列のインデックス値
13は _attribute_ _ _((パック))}。

4エンドポイントディスクリプタ、エンドポイントは、USBデバイス内の実際の物理的な単位であり、即ち、USBデータ転送は、USBデバイスと、各エンドポイント・ホストとの間で行われます。各エンドポイントは、データ送信方向の各エンドポイントは、一般的に、すなわち、入力INと出力OUT、デバイスアドレスの使用、およびエンドポイントの数は、送信方向のエンドポイントを指定することができ、エンドポイントの固有番号サポート決定されました。0特殊なエンドポイントが、それはデータの2つの物理ユニットのOUTデータIN入力と出力を持ち、かつ唯一のエンドポイント0の数が含まれている必要があり、すべてのUSBデバイスの伝送をサポートすることができます制御は、デフォルトコントロールパイプとして使用され、USBシステムソフトウェアは、の使用であります通信中の配管構成とUSBロジックデバイス; 0エンドポイントだけでなく、後の構成で使用しなければなりません。低速デバイスは、フルスピード/高速デバイスのために、二つの追加のエンドポイントまで含むため、USBデバイスのエンドポイントは、15個の追加のエンドポイントまでを含む、非ゼロの複数を含んでいてもよいです。

1  構造体usb_endpoint_descriptor
 2  {
 3。      _ _u8容bLength; // ディスクリプタ長
4。      _ _u8 bDescriptorType; // ディスクリプタタイプ
5。      _ _u8 bEndpointAddress; // エンドポイントアドレス:0〜3のエンドポイント番号であるが、7ビット方向(0 -OUT、IN- 1)。
6。      _ _u8 bmAttributes; // エンドポイント属性:ビット[0:1]割り込みとして、00の制御値を示している01が同期を示し、量02として表さ、03 
。7      _ _le16 wMaxPacketSize; / // /エンドポイントの最大パケットサイズを送信または受信に応じて
8。      _ _u8 bInterval; // 時間間隔のポーリングデータは、エンドポイント送信
 9                             // バルク転送エンドポイント、及び送信制御のエンドポイントを、このフィールドは無視される
 10                          // ためアイソクロナス転送エンドポイントは、このフィールドは1でなければなりません
。11     _ _u8 bRefresh。
12      _ _u8のbSynchAddress。
13 } _ _attribute_ _((パック))。

5ストリング・ディスクリプタ:そのようなメーカー名、シリアル番号などのいくつかの具体的な情報の説明、その内容は、文字列記述子はオプションでクライアントソフトウェアで読み取ることができたUnicodeの形で与えられています。

1  構造体usb_string_descriptor
 2  {
 3。      _ _u8容bLength; // ディスクリプタ長
4。      _ _u8 bDescriptorType; // 記述型
。5      
。6      _ _le16 WDATA [ 1 ];
 7 } _ _ _attribute_(()充填)。

IV。

第五に、

おすすめ

転載: www.cnblogs.com/bo1990/p/11424342.html