Linuxの基礎の紹介-ドライバー開発--USB
1.基本的な概念
USBデバイスは、3つの機能モジュールで構成されています:USBバスインターフェイス、USBロジックデバイス、および機能ユニット:
a。USBバスインターフェイス-USBデバイスのシリアルインターフェイスエンジン(SIE)を参照します;
b。USBロジックデバイス-is USBシステムソフトウェアはエンドポイントの集まりと見なされます;
c。機能ユニット-インターフェイスの集まりと見なされます。
USBデバイスの特性をよりよく説明するために、USBはデバイスアーキテクチャの概念を提唱しています。この観点から、USBデバイスはいくつかの構成、インターフェイス、およびエンドポイントで構成されていると考えることができます。つまり、USBデバイスは1つ以上の構成を含むことができ、各構成は1つ以上のインターフェイスを含むことができます。各インターフェースで複数のエンドポイントを含めることができます。その中でも、構成とインターフェースはUSBデバイス機能の抽象化であり、実際のデータ送信はエンドポイントによって完了されます。USBデバイスを使用する前に、その構成とインターフェイスを指定する必要があります。この手順は通常、デバイスがホストに接続されているときにデバイスが列挙されると完了します。これらのユニット間の関係は次のとおりです
。USBデバイスは、デバイス記述子、構成記述子、インターフェース記述子、エンドポイント記述子、文字列記述子など、さまざまな記述子を使用してデバイスアーキテクチャを記述します。これらは通常USBデバイスに格納されます。ファームウェアプログラム。
2.構成の構造
2.1デバイス記述子
デバイスは、1つ以上の構成で構成されるUSBデバイスを表します。デバイス記述子は、デバイスの全体的な情報を記述し、デバイスに含まれる構成の数を示すために使用されます。USBデバイスは、1つのデバイス記述子のみを持つことができます。
2.2構成記述子
USBデバイスは、1つ以上の構成を含むことができます。たとえば、USBデバイスの低消費電力モードと高消費電力モードは、それぞれ1つの構成に対応できます。USBデバイスを使用する前に、そのデバイスに適した構成を選択する必要があります。構成記述子は、構成に含まれるインターフェイスの数など、USBデバイスの各構成の特性を記述するために使用されます。USBデバイスのすべての構成には、構成記述子が必要です。
2.3インターフェース記述子
構成には1つ以上のインターフェースを含めることができます。たとえば、光学式ドライブの場合、ファイル転送に使用する場合は大容量ストレージインターフェースが使用され、CDの再生に使用する場合はオーディオインターフェースが使用されます。インターフェースは、1つ以上の交換可能な設定を含むことができるエンドポイントのコレクションです。ユーザーは、USBが構成状態のときに、現在のインターフェースの数と特性を変更できます。インターフェイス記述子は、インターフェイスが属するデバイスクラスやそのサブクラスなど、デバイス内の各インターフェイスの特性を記述するために使用されます。USBデバイスのすべてのインターフェイスには、インターフェイス記述子が必要です。
2.4エンドポイント記述子
エンドポイントはUSBデバイスの実際の物理ユニットであり、USBデータ転送はホストとUSBデバイスの各エンドポイントの間で実行されます。エンドポイントは通常、USBインターフェイスチップによって提供されます。USBデバイスの各エンドポイントには一意のエンドポイント番号があります。各エンドポイントでサポートされるデータ転送方向は、通常、入力(IN)または出力(OUT)のいずれかで決定されます。 )。一部のチップによって提供されるエンドポイントのデータ方向は、データを送受信するための2つのエンドポイント(エンドポイント1とエンドポイント2)を含めて構成可能です。その中でも、エンドポイント1はデータ送信にのみ使用できます。つまり、入力(IN)操作をサポートします。エンドポイント2は、データ送信とデータ受信に使用できます。つまり、入力(IN)および出力(OUT)操作をサポートします。
デバイスアドレス、エンドポイント番号、および送信方向を使用して、エンドポイントを指定し、通信することができます。エンドポイントの伝送特性は、ホストとの通信時に使用される伝送のタイプも決定します。たとえば、制御エンドポイントは制御伝送のみを使用できます。エンドポイントの目的に応じて、エンドポイントは、エンドポイント0とゼロ以外のエンドポイントの2つのカテゴリに分類できます。
エンドポイント0は特別で、データ入力INとデータ出力OUTの2つの物理ユニットがあり、制御送信のみをサポートできます。すべてのUSBデバイスには、デフォルトの制御パイプとして使用されるエンドポイント番号0が含まれている必要があります。USBシステムソフトウェアは、このパイプを使用してUSBロジックデバイスと通信します。エンドポイント0はUSBデバイスが接続された後に使用できますが、エンドポイント0以外のエンドポイントは構成後に使用する必要があります。
特定のアプリケーションのニーズに応じて、USBデバイスにはエンドポイント0以外の複数のエンドポイントを含めることもできます。低速デバイスの場合、追加のエンドポイントの数は最大2であり、フルスピード/高速デバイスの場合、追加のエンドポイントの数は最大15です。
2.5文字列記述子
USBデバイスには通常、製造元の名前、デバイスのシリアル番号などの特別な情報を示す文字列記述子も含まれています。その内容はUNICODEの形式で提供され、クライアントソフトウェアで読み取ることができます。USBデバイスの場合、文字列記述子はオプションです。
3.パイプライン
USBシステム構造では、USBホストソフトとUSBデバイスの各エンドポイント間で直接データ伝送が行われ、両者間の接続をパイプと呼んでいると考えることができます。パイプは、USBデバイスの構成中に確立されます。パイプは、USBホストとUSBデバイス間の通信フローを抽象化したものです。つまり、USBホストのデータバッファーとUSBデバイスのエンドポイントの間で論理データ転送が行われ、実際のデータ転送はUSBバスインターフェイスレイヤーによって完了します。
パイプは、USBデバイスのエンドポイントに1対1で対応します。USBデバイスに含まれるエンドポイントの数、USBホストと通信するときに使用できるパイプの数、およびエンドポイントのタイプによってパイプ内のデータ送信のタイプが決まります。たとえば、割り込みエンドポイントは割り込みパイプに対応し、パイプは割り込みのみが可能です。 。パイプラインがいくつ存在していても、各パイプラインのデータ伝送は互いに独立しています。
4.エンドポイント分類
USB通信の最も基本的な形式は、エンドポイントを介したものです。USBエンドポイントは、ホストからデバイス(出力エンドポイントと呼ばれる)またはデバイスからホスト(入力エンドポイントと呼ばれる)への一方向でのみデータを送信できます。エンドポイントは一方向のパイプと見なすことができます。データ転送方法が異なる4種類のUSBエンドポイントがあります。
4.1制御
制御エンドポイントは、USBデバイスのさまざまな部分へのアクセスを制御するために使用されます。通常、デバイスの構成、デバイス情報の取得、デバイスへのコマンドの送信、またはデバイスステータスレポートの取得に使用されます。これらのエンドポイントは通常小さいです。すべてのUSBデバイスには、「エンドポイント0」と呼ばれる制御エンドポイントがあります。これは、USBコアがプラグイン時にデバイスを構成するために使用されます。USBプロトコルは、制御エンドポイントがデバイスにデータを転送するのに常に十分な帯域幅があることを保証します。
4.2割り込み割り込み
USBホストがデバイスからデータを要求するときはいつでも、割り込みエンドポイントは固定レートで少量のデータを送信します。これは、USBキーボードとマウスの主なデータ転送方法です。また、USBデバイスにデータを転送してデバイスを制御するためにも使用されます。通常、大量のデータの転送には使用されません。USBプロトコルは、割り込みエンドポイントがデータをデバイスに転送するのに常に十分な帯域幅があることを保証します。
4.3バルクバルク
バルクエンドポイントは、大量のデータを転送するために使用されます。これらのエンドポイントは通常、割り込みエンドポイントよりもはるかに大きいです。データが失われない状況で一般的に使用されます。USBプロトコルは、特定の時間内に転送が完了することを保証しません。バス上にBULKパケット全体を送信するのに十分なスペースがない場合、送信用に複数のパケットに分割されます。これらのエンドポイントは、プリンター、USBマスストレージ、USBネットワークデバイスで一般的に使用されています。
4.4アイソクロナスISOCHRONOUS
アイソクロナスエンドポイントも大量のデータをバッチで送信しますが、このデータの配信は保証されていません。これらのエンドポイントは、データ損失を処理できるデバイスで使用され、オーディオデバイスやビデオデバイスなど、継続的なデータストリームの維持に依存しています。
4.5違い
制御およびバルクエンドポイントは非同期データ転送に使用されますが、割り込みおよびアイソクロナスエンドポイントは定期的です。つまり、これらのエンドポイントは一定の時間に継続的にデータを送信するように設定されており、USBコアは対応する帯域幅を予約します。
5.バス
USBホストコントローラーには、OHCI(オープンホストコントローラーインターフェイス)、UHCI(ユニバーサルホストコントローラーインターフェイス)、EHCI(拡張ホストコントローラーインターフェイス)の3つの仕様があります。OHCIドライバーは、非PCシステムおよびSiSおよびALiチップセットを搭載したPCマザーボードでUSBチップをサポートするために使用されます。UHCIドライバーは、他のほとんどのPCマザーボード(IntelやViaを含む)でUSBチップをサポートするために主に使用されます。EHCIはUSB 2.0仕様で提案されており、OHCIおよびUHCIと互換性があります。UHCIのハードウェア回路はOHCIよりもシンプルであるため、コストは低くなりますが、より複雑なドライバーが必要になり、CPUの負荷がわずかに高くなります。
6.関連ドキュメント
ファイル | 意味 |
---|---|
/ sys / kernel / debug / usb / devices | デバイス情報 |
/ sys / bus / usb | ツリー構造 |
lsusb | USB関連デバイス情報 |
mount -t usbfs none / proc / bus / usb | マウント |
/ proc / bus / usb / devices | USBデバイス情報を表示する |
6.1デバイス情報
コマンドcat / sys / kernel / debug / usb / devicesを使用してデバイス情報を取得します
。情報の詳細な分析については、LinuxソースコードのDocumentation / usb / proc_usb_info.txtファイルを参照してください。以下は、フォーマットの詳細な説明の抜粋です。
T = 拓扑结构
B = 带宽(仅适用于USB主机控制器,它被虚拟化为根集线器)
D = 设备描述符信息
P = 产品ID信息
S = 字符串描述符
C = 配置描述符信息
I = 接口描述符信息
E = 端点描述符信息
说明:
d = 十进制数
x = 十六进制数
s = 字符串
拓扑结构:
T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd
| | | | | | | | |__MaxChildren
| | | | | | | |__Device Speed in Mbps
| | | | | | |__DeviceNumber
| | | | | |__Count of devices at this level
| | | | |__Connector/Port on Parent for this device
| | | |__Parent DeviceNumber
| | |__Level in topology for this bus
| |__Bus number
|__Topology info tag
Speed可能是:
1.5 Mbit/s for low speed USB
12 Mbit/s for full speed USB
480 Mbit/s for high speed USB (added for USB 2.0);
also used for Wireless USB, which has no fixed speed
5000 Mbit/s for SuperSpeed USB (added for USB 3.0)
Port号总是减去1显示。例如,插入Port 4的设备将显示“Port=03”。
带宽信息:
B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd
| | | |__Number of isochronous requests
| | |__Number of interrupt requests
| |__Total Bandwidth allocated to this bus
|__Bandwidth info tag
带宽分配是一帧(毫秒)占用多少的近似值。它只反映周期性传输,这是唯一保留带宽的传输。控制和批量传输使用所有其他带宽,
包括不用于传输的保留带宽(例如用于短数据包)。
百分比是指有多少“预留”带宽是由这些传输计划的。对于一个低或全速总线(松散地,“USB 1.1”),90%的总线带宽被保留。
对于高速总线(松散地说,“usb2.0”)80%是保留的。
设备描述符信息:
D: Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
| | | | | | |__NumberConfigurations
| | | | | |__MaxPacketSize of Default Endpoint
| | | | |__DeviceProtocol
| | | |__DeviceSubClass
| | |__DeviceClass
| |__Device USB version
|__Device info tag #1
产品ID信息:
P: Vendor=xxxx ProdID=xxxx Rev=xx.xx
| | | |__Product revision number
| | |__Product ID code
| |__Vendor ID code
|__Device info tag #2
字符串描述符:
S: Manufacturer=ssss
| |__Manufacturer of this device as read from the device.
|__String info tag
S: Product=ssss
| |__Product description of this device as read from the device.
|__String info tag
S: SerialNumber=ssss
| |__Serial Number of this device as read from the device.
|__String info tag
配置描述符信息:
C:* #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA
| | | | | |__MaxPower in mA
| | | | |__Attributes
| | | |__ConfiguratioNumber
| | |__NumberOfInterfaces
| |__ "*" indicates the active configuration (others are " ")
|__Config info tag
USB设备可能有多种配置,每一种都有不同的行为。例如,总线供电的配置可能比自供电的配置能力差得多。
一次只能有一个设备配置处于活动状态;大多数设备只有一种配置。
每个配置由一个或多个接口。每个接口服务一个不同的“功能”,这通常是绑定到一个不同的USB设备驱动程序。
一个常见的例子是带有用于回放的音频接口的USB扬声器,以及用于软件音量控制的HID接口。
接口描述符信息:
I:* If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss
| | | | | | | | |__Driver name
| | | | | | | | or "(none)"
| | | | | | | |__InterfaceProtocol
| | | | | | |__InterfaceSubClass
| | | | | |__InterfaceClass
| | | | |__NumberOfEndpoints
| | | |__AlternateSettingNumber
| | |__InterfaceNumber
| |__ "*" indicates the active altsetting (others are " ")
|__Interface info tag
给定接口可能有一个或多个“备用”设置。例如,默认设置可能只使用少量的周期带宽。
为了使用总线带宽的重要部分,驱动程序必须选择一个非默认的alt配置。
一个接口一次只能有一个设置是活动的,而且一次只能有一个驱动程序绑定到一个接口。大多数设备每个接口只有一个备用设置。
端点描述符信息:
E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddss
| | | | |__Interval (max) between transfers
| | | |__EndpointMaxPacketSize
| | |__Attributes(EndpointType)
| |__EndpointAddress(I=In,O=Out)
|__Endpoint info tag
对于所有周期端点(中断或同步),时间间隔都是非零的。对于高速端点,传输间隔可以用微秒而不是毫秒来测量。
对于高速周期端点,“MaxPacketSize”反映每微帧的数据传输大小。
对于“高带宽”端点,每个端点可以反射2或3个数据包(每125 usec最多可反射3KBytes)。
对于Linux-USB堆栈,周期性带宽保留使用urb提供的传输间隔和大小,可以小于端点描述符中的传输间隔和大小。
7.フレーム
USBドライバーは2つの角度から見ることができます。1つはホスト側で、もう1つはデバイス側です。Linux USBドライバーの全体的なフレームワークを次の図に示し
ます。ホスト側から、usbドライバーは4つのレイヤーに分割できます:USBホストコントローラーハードウェアボトムレイヤー、USBホストコントローラードライバー、USBコアおよびUSBデバイスドライバー。ホスト側に実装されるドライバーは、主に2つのカテゴリに分かれています。USBホストコントローラードライバーとUSBデバイスドライバーです。ホストコントローラードライバーは挿入されたUSBデバイスの制御を担当し、USBデバイスドライバーは主にUSBデバイスとホスト間の通信を担当します。USBコアは、デバイスドライバーの上向きのプログラミングインターフェイスとUSBコントローラードライバーの下向きのプログラミングインターフェイスを提供し、USBデバイス情報全体を維持し、デバイスのホットプラグ制御とバスデータ送信制御を完了します。このデバイスドライバー、コアレイヤー、ホストコントローラードライバーの3層構造は、3層のドライバーフレームワークであることがわかります。Linuxカーネルは、ホストコントローラーのドライバーをペリフェラル側のドライバーから分離し、コアレイヤーを介して特定のバスプロトコルが採用されています。抽象化のために、ペリフェラルドライバーはコアレイヤーAPIを呼び出し、間接的にホストドライバーのtransfer関数呼び出しに移行します。
注意:
上記の記事に不明確な説明がある場合は、コメント欄にコメントしてください。時間があれば、できるだけ早く返信します。ありがとうございます!