usb_control_msg() -- 從設備讀取各種信息


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表示願意睡眠等待傳輸完成的時間
------------------------------------------------------
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;
}

 

文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM