usb_control_msg是没有用到urb的在USB中简单进行发送和接收的一种机制,用于少量的数据通信。原型为:
程序代码
linux+v2.6.35/drivers/usb/core/message.c 104/** 105 * usb_control_msg - Builds a control urb, sends it off and waits for completion 106 * @dev: pointer to the usb device to send the message to 107 * @pipe: endpoint "pipe" to send the message to 108 * @request: USB message request value 109 * @requesttype: USB message request type value 110 * @value: USB message value 111 * @index: USB message index value 112 * @data: pointer to the data to send 113 * @size: length in bytes of the data to send 114 * @timeout: time in msecs to wait for the message to complete before timing 115 * out (if 0 the wait is forever) 116 * 117 * Context: !in_interrupt () 118 * 119 * This function sends a simple control message to a specified endpoint and 120 * waits for the message to complete, or timeout. 121 * 122 * If successful, it returns the number of bytes transferred, otherwise a 123 * negative error number. 124 * 125 * Don't use this function from within an interrupt context, like a bottom half 126 * handler. If you need an asynchronous message, or need to send a message 127 * from within interrupt context, use usb_submit_urb(). 128 * If a thread in your driver uses this call, make sure your disconnect() 129 * method can wait for it to complete. Since you don't have a handle on the 130 * URB used, you can't cancel the request. 131 */ 132int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, 133 __u8 requesttype, __u16 value, __u16 index, void *data, 134 __u16 size, int timeout) 135{ 136 struct usb_ctrlrequest *dr; 137 int ret; 138 139 dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); 140 if (!dr) 141 return -ENOMEM; 142 143 dr->bRequestType = requesttype; 144 dr->bRequest = request; 145 dr->wValue = cpu_to_le16(value); 146 dr->wIndex = cpu_to_le16(index); 147 dr->wLength = cpu_to_le16(size); 148 149 /* dbg("usb_control_msg"); */ 150 151 ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout); 152 153 kfree(dr); 154 155 return ret; 156} 157EXPORT_SYMBOL_GPL(usb_control_msg);
一 般对于 struct usb_device *dev, unsigned int pipe, __u8 request,这前三个参数和void *data,__u16 size, int timeout后三个参数没有什么疑问,主要是中间几个__u8 requesttype, __u16 value, __u16 index, requesttype requesttype有三部分组成,见以前日志:requesttype 。在内核中为这个三部分分别作了宏定义,分别对应这个字段的三部分:
程序代码
linux+v2.6.35/include/linux/usb/ch9.h /* CONTROL REQUEST SUPPORT */ 41 42/* 43 * USB directions 44 * 45 * This bit flag is used in endpoint descriptors' bEndpointAddress field. 46 * It's also one of three fields in control requests bRequestType. 47 */ 48#define USB_DIR_OUT 0 /* to device */ 49#define USB_DIR_IN 0x80 /* to host */ 50 51/* 52 * USB types, the second of three bRequestType fields 53 */ 54#define USB_TYPE_MASK (0x03 << 5) 55#define USB_TYPE_STANDARD (0x00 << 5) 56#define USB_TYPE_CLASS (0x01 << 5) 57#define USB_TYPE_VENDOR (0x02 << 5) 58#define USB_TYPE_RESERVED (0x03 << 5) 59 60/* 61 * USB recipients, the third of three bRequestType fields 62 */ 63#define USB_RECIP_MASK 0x1f 64#define USB_RECIP_DEVICE 0x00 65#define USB_RECIP_INTERFACE 0x01 66#define USB_RECIP_ENDPOINT 0x02 67#define USB_RECIP_OTHER 0x03 68/* From Wireless USB 1.0 */ 69#define USB_RECIP_PORT 0x04 70#define USB_RECIP_RPIPE 0x05
value :2个字节,高字节是报告类型(1为输入,2为输出,3为特性);低字节为报告ID(预设为0)。例如: wValue.LowByte 00h Report ID wValue.HiByte 03h Feature Report index :索引字段是2个字节,描述的是接口号
|