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;
}
文章
原文地址:https://www.cnblogs.com/Ph-one/p/9023576.html