Linux 기본 소개-드라이버 개발 --USB

1. 기본 개념

USB 장치는 USB 버스 인터페이스, USB 논리 장치 및 기능 장치의 3 가지 기능 모듈로 구성됩니다. a.
USB 버스 인터페이스-USB 장치의 직렬 인터페이스 엔진 (SIE)을 나타냅니다
.b . USB 논리 장치는 USB 시스템 소프트웨어는 엔드 포인트 모음으로 간주됩니다
.c. 기능 단위는 인터페이스 모음으로 간주됩니다.

USB 장치의 특성을 더 잘 설명하기 위해 USB는 장치 아키텍처 개념을 제시합니다. 이러한 관점에서 USB 장치는 일부 구성, 인터페이스 및 끝점으로 구성되어 있다고 볼 수 있습니다. 즉, USB 장치에는 하나 이상의 구성이 포함될 수 있으며 각 구성에는 하나 이상의 인터페이스가 포함될 수 있습니다. 각 인터페이스에서 여러 엔드 포인트를 포함 할 수 있습니다. 그중 구성 및 인터페이스는 USB 장치 기능의 추상화이며 실제 데이터 전송은 엔드 포인트에서 완료됩니다. USB 장치를 사용하기 전에 구성 및 인터페이스를 지정해야합니다. 이 단계는 일반적으로 장치가 호스트에 연결될 때 장치가 열거 될 때 완료됩니다. 이러한 장치 간의 관계는 다음과 같습니다.
USB 아키텍처 다이어그램
USB 장치는 장치 설명자, 구성 설명자, 인터페이스 설명자, 끝점 설명자 및 문자열 설명자를 포함하여 장치 아키텍처를 설명하기 위해 다양한 설명자를 사용하며 일반적으로 USB 장치에 저장됩니다. 펌웨어 프로그램에서.

2. 구성 구조

2.1 장치 설명자

장치는 하나 이상의 구성으로 구성된 USB 장치를 나타냅니다. 장치 설명자는 장치의 전체 정보를 설명하고 포함 된 구성 수를 나타내는 데 사용됩니다. USB 장치에는 하나의 장치 설명 자만있을 수 있습니다.

2.2 구성 설명자

USB 장치는 하나 이상의 구성을 포함 할 수 있습니다. 예를 들어 USB 장치의 저전력 소비 모드 및 고전력 소비 모드는 각각 하나의 구성에 대응할 수 있습니다. USB 장치를 사용하기 전에 적절한 구성을 선택해야합니다. 구성 설명자는 구성에 포함 된 인터페이스 수와 같은 USB 장치의 각 구성 특성을 설명하는 데 사용됩니다. USB 장치의 모든 구성에는 구성 설명자가 있어야합니다.

2.3 인터페이스 설명자

구성에는 하나 이상의 인터페이스가 포함될 수 있습니다. 예를 들어 광 드라이브의 경우 파일 전송에 사용되는 경우 대용량 저장 인터페이스가 사용되고 CD 재생에 사용되는 경우 오디오 인터페이스가 사용됩니다. 인터페이스는 하나 이상의 교체 가능한 설정을 포함 할 수있는 끝점 모음입니다. 사용자는 USB가 구성 상태에있을 때 현재 인터페이스의 수와 특성을 변경할 수 있습니다. 인터페이스 설명자는 인터페이스가 속한 장치 클래스 및 해당 하위 클래스와 같이 장치에있는 각 인터페이스의 특성을 설명하는 데 사용됩니다. USB 장치의 모든 인터페이스에는 인터페이스 설명자가 있어야합니다.

2.4 끝점 설명자

끝점은 USB 장치의 실제 물리적 장치이며 USB 데이터 전송은 호스트와 USB 장치의 각 끝점간에 수행됩니다. 엔드 포인트는 일반적으로 USB 인터페이스 칩에서 제공합니다. USB 장치의 각 엔드 포인트에는 고유 한 엔드 포인트 번호가 있습니다. 각 엔드 포인트에서 지원하는 데이터 전송 방향은 일반적으로 입력 (IN) 또는 출력 (OUT)으로 결정됩니다. ). 일부 칩에서 제공하는 엔드 포인트의 데이터 방향은 데이터 송수신을위한 두 개의 엔드 포인트 인 엔드 포인트 1과 엔드 포인트 2를 포함하여 구성 할 수 있습니다. 이 중 엔드 포인트 1은 데이터 전송에만 사용할 수 있습니다. 즉, 입력 (IN) 작업을 지원하고, 엔드 포인트 2는 데이터 전송 및 데이터 수신에 사용할 수 있습니다. 즉, 입력 (IN) 및 출력 (OUT) 작업을 지원합니다.
장치 주소, 끝점 번호 및 전송 방향을 사용하여 끝점을 지정하고 통신 할 수 있습니다. 엔드 포인트의 전송 특성은 호스트와 통신 할 때 사용되는 전송 유형도 결정합니다. 예를 들어 제어 엔드 포인트는 제어 전송 만 사용할 수 있습니다. 끝점의 다른 목적에 따라 끝점은 끝점 0과 0이 아닌 끝점의 두 가지 범주로 나눌 수 있습니다.
끝점 0은 특별하며 데이터 입력 IN과 데이터 출력 OUT의 두 가지 물리적 단위가 있으며 제어 전송 만 지원할 수 있습니다. 모든 USB 장치에는 기본 제어 파이프로 사용되는 끝점 번호 0이 있어야합니다. USB 시스템 소프트웨어는이 파이프를 사용하여 USB 논리 장치와 통신합니다. 엔드 포인트 0은 USB 장치가 연결된 후에 사용할 수 있지만 엔드 포인트 0 이외의 엔드 포인트는 구성 후에 사용해야합니다.
특정 애플리케이션의 요구에 따라 USB 장치에는 엔드 포인트 0 이외의 여러 엔드 포인트도 포함될 수 있습니다. 저속 장치의 경우 추가 끝점 수는 최대 2 개이고, 전속 / 고속 장치의 경우 추가 끝점 수는 최대 15 개입니다.

2.5 문자열 설명자

USB 장치에는 일반적으로 제조업체 이름, 장치 일련 번호 등과 같은 일부 특수 정보를 설명하는 문자열 설명자가 포함되어 있습니다. 내용은 유니 코드 형식으로 제공되며 클라이언트 소프트웨어에서 읽을 수 있습니다. USB 장치의 경우 문자열 설명자는 선택 사항입니다.

3. 파이프 라인

USB 시스템 구조에서 데이터 전송은 USB 호스트 소프트웨어와 USB 장치의 각 끝점간에 직접 수행되며 이들 간의 연결을 파이프라고합니다. 파이프는 USB 장치 구성 중에 설정됩니다. 파이프는 USB 호스트와 USB 장치 간의 통신 흐름을 추상화 한 것입니다. 즉, USB 호스트의 데이터 버퍼와 USB 장치의 끝점 사이에 논리적 데이터 전송이 있으며 실제 데이터 전송은 USB 버스 인터페이스 계층에 의해 완료됩니다.
파이프는 USB 장치의 끝점에 일대일로 해당합니다. USB 장치에 포함 된 엔드 포인트 수, USB 호스트와 통신 할 때 사용할 수있는 파이프 수, 엔드 포인트 유형에 따라 파이프의 데이터 전송 유형이 결정됩니다. 예를 들어 인터럽트 엔드 포인트는 인터럽트 파이프에 해당하고 파이프는 인터럽트 만 가능합니다. . 파이프 라인의 수에 관계없이 각 파이프 라인의 데이터 전송은 서로 독립적입니다.

4. 종점 분류

가장 기본적인 형태의 USB 통신은 엔드 포인트를 통하는 것입니다. USB 엔드 포인트는 호스트에서 장치 (출력 엔드 포인트라고 함)로 또는 장치에서 호스트 (입력 엔드 포인트라고 함)로 한 방향으로 만 데이터를 전송할 수 있습니다. 끝점은 단방향 파이프로 볼 수 있습니다. 데이터 전송 방법이 다른 4 가지 유형의 USB 엔드 포인트가 있습니다.

4.1 제어

제어 끝점은 USB 장치의 다른 부분에 대한 액세스를 제어하는 ​​데 사용됩니다. 일반적으로 장치 구성, 장치 정보 가져 오기, 장치에 명령 보내기 또는 장치 상태 보고서 가져 오기에 사용됩니다. 이러한 끝점은 일반적으로 작습니다. 모든 USB 장치에는 "Endpoint 0"이라는 제어 엔드 포인트가 있으며, 이는 USB 코어가 연결될 때 장치를 구성하는 데 사용됩니다. USB 프로토콜은 제어 엔드 포인트가 데이터를 장치로 전송하기에 충분한 대역폭이 항상 있음을 보장합니다.

4.2 인터럽트 인터럽트

USB 호스트가 장치에서 데이터를 요청할 때마다 인터럽트 엔드 포인트는 고정 된 속도로 소량의 데이터를 전송합니다. USB 키보드 및 마우스의 주요 데이터 전송 방법입니다. 또한 장치를 제어하기 위해 데이터를 USB 장치로 전송하는 데 사용됩니다. 일반적으로 많은 양의 데이터를 전송하는 데 사용되지 않습니다. USB 프로토콜은 인터럽트 엔드 포인트가 데이터를 장치로 전송하기에 충분한 대역폭을 항상 보장합니다.

4.3 벌크 벌크

대량 엔드 포인트는 대량의 데이터를 전송하는 데 사용됩니다. 이러한 엔드 포인트는 일반적으로 인터럽트 엔드 포인트보다 훨씬 큽니다. 일반적으로 데이터가 손실 될 수없는 상황에서 사용됩니다. USB 프로토콜은 특정 시간 프레임 내에 전송이 완료되는 것을 보장하지 않습니다. 버스에 전체 BULK 패킷을 전송할 공간이 충분하지 않으면 전송을 위해 여러 패킷으로 분할됩니다. 이러한 엔드 포인트는 일반적으로 프린터, USB 대용량 저장소 및 USB 네트워크 장치에 사용됩니다.

4.4 등시성 등시성

등시성 엔드 포인트도 대량의 데이터를 일괄 적으로 전송하지만이 데이터가 전달된다는 보장은 없습니다. 이러한 엔드 포인트는 데이터 손실을 처리 할 수있는 장치에서 사용되며 오디오 및 비디오 장치와 같은 지속적인 데이터 스트림 유지에 더 많이 의존합니다.

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 없음 / 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 드라이버는 두 가지 각도에서 볼 수 있습니다. 하나는 호스트 측이고 다른 하나는 장치 측입니다. Linux USB 드라이버의 전체 프레임 워크는 다음 그림에 나와 있습니다.    
틀
호스트 측에서 USB 드라이버는 USB 호스트 컨트롤러 하드웨어 하단 계층, USB 호스트 컨트롤러 드라이버, USB 코어 및 USB 장치 드라이버의 네 계층으로 나눌 수 있습니다. 호스트 측에서 구현되는 드라이버는 주로 USB 호스트 컨트롤러 드라이버와 USB 장치 드라이버의 두 가지 범주로 나뉩니다. 호스트 컨트롤러 드라이버는 삽입 된 USB 장치를 제어하고 USB 장치 드라이버는 주로 USB 장치와 호스트 간의 통신을 담당합니다. USB 코어는 위쪽으로 장치 드라이버를위한 프로그래밍 인터페이스를 제공하고 아래쪽으로 USB 컨트롤러 드라이버를위한 프로그래밍 인터페이스를 제공하고 전체 USB 장치 정보를 유지하며 장치 핫 플러그 ​​제어를 완료하고 버스 데이터 전송 제어를 완료합니다. 디바이스 드라이버, 코어 레이어, 호스트 컨트롤러 드라이버의 3 계층 구조는 3 계층 드라이버 프레임 워크임을 알 수있다. 리눅스 커널은 호스트 컨트롤러의 드라이버와 주변기기의 드라이버를 분리하고, 코어 레이어를 통해 특정 버스 프로토콜을 채택한다. 추상화를 위해 주변 드라이버는 코어 계층 API를 호출하고 간접적으로 호스트 드라이버 전송 함수 호출로 전환합니다.

알림 :
위의 글에 불명확 한 내용이 있으면 댓글란에 댓글을 남겨주세요. 시간이 있으시면 최대한 빨리 답변 해 드리겠습니다. 감사합니다!

추천

출처blog.csdn.net/qq_20677327/article/details/107445050