端點是usb裝置的唯一可識別部分,其是主機和裝置之間的通訊流的終點。
管道,就是乙個usb主機和usb裝置端點之間的資料傳輸的通道。
站在主機的角度,它的目的是裝置的某個端點。
而管道這算是主機和端點之間的連線。
這裡我們先看一下管道在usb裡的定義
先看看管道,也就是這個整型值的構成, bit7 用來表示方向, bit8~14 表示裝置位址,bit15~18 表示端點號,早先說過,裝置位址用 7 位來表示,端點號用 4 位來表示,剩下來的 bit30~31 表示管道型別。/*
* 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.
*/
這裡我們先看一下usb協議中給出來的管道型別(屬性)的表示
接下來看一下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 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_pipe也就是裝置位址和端點號放在pipe這個32bit變數的合適位置了。/* 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)
其實在usb協議傳輸時,這兩個東西也就是一塊傳輸的。static
inline
unsigned
int __create_pipe(struct usb_device *dev,
unsigned
int endpoint)
回到我們程式最使用的地方,很明顯通過端點號和裝置號,計算輸入型別的中斷管道。
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...