USB 24 usb滑鼠驅動驅動例項分析 2 管道

2021-10-24 11:51:51 字數 3914 閱讀 2454

端點是usb裝置的唯一可識別部分,其是主機和裝置之間的通訊流的終點。

管道,就是乙個usb主機和usb裝置端點之間的資料傳輸的通道。

站在主機的角度,它的目的是裝置的某個端點。

而管道這算是主機和端點之間的連線。

這裡我們先看一下管道在usb裡的定義

/*

* for various legacy reasons, linux has a small cookie that's paired with

* a struct usb_device to identify an endpoint queue. queue characteristics

* are defined by the endpoint's descriptor. this cookie is called a "pipe",

* an unsigned int encoded as:

** - direction: bit 7 (0 = host-to-device [out],

* 1 = device-to-host [in] ...

* like endpoint bendpointaddress)

* - device address: bits 8-14 ... bit positions known to uhci-hcd

* - endpoint: bits 15-18 ... bit positions known to uhci-hcd

* - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt,

* 10 = control, 11 = bulk)

** given the device address and endpoint descriptor, pipes are redundant.

*/

先看看管道,也就是這個整型值的構成, bit7 用來表示方向, bit8~14 表示裝置位址,bit15~18 表示端點號,早先說過,裝置位址用 7 位來表示,端點號用 4 位來表示,剩下來的 bit30~31 表示管道型別。

這裡我們先看一下usb協議中給出來的管道型別(屬性)的表示

#define pipe_isochronous		0

#define pipe_interrupt 1

#define pipe_control 2

#define pipe_bulk 3

#define usb_pipetype(pipe) (((pipe) >> 30) & 3) //用30和31bit來表示管道型別

#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == pipe_isochronous)

#define usb_pipeint(pipe) (usb_pipetype((pipe)) == pipe_interrupt)

#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == pipe_control)

#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == pipe_bulk)

接下來看一下usb中知道管道的如何辨別端點方向

/*

* usb directions

** this bit flag is used in endpoint descriptors' bendpointaddress field.

* it's also one of three fields in control requests brequesttype.

*/#define usb_dir_out 0 /* to device */

#define usb_dir_in 0x80 /* to host */

#define usb_pipein(pipe) ((pipe) & usb_dir_in) //第7位表示usb端點方向,1表示輸入端點

#define usb_pipeout(pipe) (!usb_pipein(pipe))

最後我們看一下知道管道,如何知道裝置位址和端點號

/* 8~14位表示裝置位址 */

#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)

/* 15~18位表示端點位址 */

#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)

當然也可以反過來。知道了其它資訊也可以得到管道資訊。

usb的端點有四種傳輸型別,2種方向,所以總共有8中組合

/* create various pipes... */

#define usb_sndctrlpipe(dev, endpoint) \

((pipe_control << 30) | __create_pipe(dev, endpoint))

#define usb_rcvctrlpipe(dev, endpoint) \

((pipe_control << 30) | __create_pipe(dev, endpoint) | usb_dir_in)

#define usb_sndisocpipe(dev, endpoint) \

((pipe_isochronous << 30) | __create_pipe(dev, endpoint))

#define usb_rcvisocpipe(dev, endpoint) \

((pipe_isochronous << 30) | __create_pipe(dev, endpoint) | usb_dir_in)

#define usb_sndbulkpipe(dev, endpoint) \

((pipe_bulk << 30) | __create_pipe(dev, endpoint))

#define usb_rcvbulkpipe(dev, endpoint) \

((pipe_bulk << 30) | __create_pipe(dev, endpoint) | usb_dir_in)

#define usb_sndintpipe(dev, endpoint) \

((pipe_interrupt << 30) | __create_pipe(dev, endpoint))

#define usb_rcvintpipe(dev, endpoint) \

((pipe_interrupt << 30) | __create_pipe(dev, endpoint) | usb_dir_in)

這裡的 __create_pipe也就是裝置位址和端點號放在pipe這個32bit變數的合適位置了。

static

inline

unsigned

int __create_pipe(struct usb_device *dev,

unsigned

int endpoint)

其實在usb協議傳輸時,這兩個東西也就是一塊傳輸的。

回到我們程式最使用的地方,很明顯通過端點號和裝置號,計算輸入型別的中斷管道。

pipe = usb_rcvintpipe(udev, endpoint->bendpointaddress);

端點是usb裝置的唯一可識別部分,其是主機和裝置之間的通訊流的終點。

USB驅動 USB列舉

一 列舉詳細過程 usb主機在檢測到usb裝置插入後,就要對裝置進行列舉了。為什麼要列舉呢?列舉就是主機host從裝置讀取一些資訊,知道裝置是什麼樣的裝置,如何進行通訊,這樣主機就可以根據這些資訊來載入合適的驅動程式。除錯usb裝置,很重要的一點就是usb的列舉過程,只要列舉成功了,那麼就已經成功大...

USB 滑鼠驅動原始碼分析

kernel kernel 3.4.39 uhci intel,低速 1.5mbps 全速 12mbps ohci microsoft 低速 全速 ehci 高速 480mbps usb匯流排驅動程式的作用 1 分配位址給usb裝置,同時將分配的位址發給usb裝置 最開始通訊位址是埠0 2 發出命令...

USB驅動初探

調了n久68013,最後還是放棄了,使用stm32的usb 調到驅動,建立驅動環境,win7調驅動總感覺格格不入,在xp下建立開發環境 vc6,xpddk 2600,driverstudio 3.2 先安裝vc6,安裝ddk,最後安裝driverstudio 安裝完後,開啟vc6,設定ddk bui...