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; }