et_port_status() --> usb_control_msg()
usb_get_descriptor() --> usb_control_msg()
/usr/src/linux-2.6.21.5/drivers/usb/core/message.c
將request, requesttype, value, index, size加工成usb_ctrlrequest,然后調用usb_internal_control_msg()
dev 參數dev指向目標設備的usb_device數據結構
pipe pipe是個32位無符號整數,其最高兩位表示傳輸的類型(實時/中斷/控制/批量),其余各位包括對方的端口號以及設備號,以及設備是否為全速(或者低度)。
requesttype requesttype其最高位表示傳輸的方向,最低5位則表明傳輸終極對象的類別(設備/接口/端口/其他)
index, request, value index則指明具體的單元,這就是終極的操作對象。針對這個操作對象,request說明了需要進行的具體操作,而value則是參數
data, size 如果有更多的數據需要傳遞(讀/寫),則通過緩沖區data進行,其大小為size。 這些都是從用戶空間傳下來的參數,而傳輸的目的正是要把這些信息發送給目標設備
timeout 參數timeout表示願意睡眠等待傳輸完成的時間
------------------------------------------------------
usb_get_descriptor() --> usb_control_msg()
/usr/src/linux-2.6.21.5/drivers/usb/core/message.c
將request, requesttype, value, index, size加工成usb_ctrlrequest,然后調用usb_internal_control_msg()
dev 參數dev指向目標設備的usb_device數據結構
pipe pipe是個32位無符號整數,其最高兩位表示傳輸的類型(實時/中斷/控制/批量),其余各位包括對方的端口號以及設備號,以及設備是否為全速(或者低度)。
requesttype requesttype其最高位表示傳輸的方向,最低5位則表明傳輸終極對象的類別(設備/接口/端口/其他)
index, request, value index則指明具體的單元,這就是終極的操作對象。針對這個操作對象,request說明了需要進行的具體操作,而value則是參數
data, size 如果有更多的數據需要傳遞(讀/寫),則通過緩沖區data進行,其大小為size。 這些都是從用戶空間傳下來的參數,而傳輸的目的正是要把這些信息發送給目標設備
timeout 參數timeout表示願意睡眠等待傳輸完成的時間
------------------------------------------------------
int usb_control_msg( struct usb_device *dev, unsigned int pipe, __u8 -request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout) { struct usb_ctrlrequest *dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); int ret; if (!dr) return -ENOMEM; dr->bRequestType= requesttype; dr->bRequest = request; dr->wValue = cpu_to_le16p(&value); dr->wIndex = cpu_to_le16p(&index); dr->wLength = cpu_to_le16p(&size); ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout); kfree(dr); return ret; }