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个字节,描述的是接口号

usb_control_msg函数用法和说明的更多相关文章

  1. kmalloc/kfree,vmalloc/vfree函数用法和区别

    http://blog.csdn.net/tigerjibo/article/details/6412881 kmalloc/kfree,vmalloc/vfree函数用法和区别 1.kmalloc ...

  2. android studio没有浮现函数用法和属性说明?

    最近转用android studio,在使用eclipse和android studio时原本在鼠标停留处或智能提示能浮现文档相关内容,但我的是一直显示Fetching Documentation…… ...

  3. Python:匿名函数lambda的函数用法和排序用法

    一.介绍: Lambda函数,是一个匿名函数,创建语法: lambda parameters:express parameters:可选,如果提供,通常是逗号分隔的变量表达式形式,即位置参数. exp ...

  4. Signal ()函数用法和总结

    void(* signal(int sig,void(* func)(int)))(int); 设置处理信号的功能 指定使用sig指定的信号编号处理信号的方法. 参数func指定程序可以处理信号的三种 ...

  5. python内置函数sorted()及sort() 函数用法和区别

    python内置函数sorted(),sort()都有排序的意思,但是两者有本质的区别,sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作,list 的 sort ...

  6. Python 匿名函数用法和return语句

    匿名函数用法1.什么是匿名函数    函数定义过程中,没有给定名称函数,python中用lambda表达式创建匿名函数    lambda只是一个表达式,函数体比def简单    lambda主题是一 ...

  7. Python find函数用法和概念

    概念: Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返 ...

  8. 《APUE》中的函数整理

    第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...

  9. SQLServer之修改标量值函数

    修改标量值函数注意事项 更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数.存储过程或触发器. 不能用 ...

随机推荐

  1. 冲刺Two之站立会议3

    今天继续昨天的工作,对主界面进行设计优化,并成功将各个按钮和对应的功能模块连接了起来.并对服务器部分进行了部分改进,包括登录界面的美观性和服务器数据库部分的处理.

  2. 关于 error C2039: “create”: 不是“cocos2d::GLView”的成员的解决方法

    问题: 跑一个demo,因为是涉及3.x版本的引擎,不是很熟悉,在VS2013上运行,报错 error C2039: “create”: 不是“cocos2d::GLView”的成员 解决: 通过查阅 ...

  3. [Week2 作业] 代码规范之争

    这四个问题均是出自 http://goodmath.scientopia.org/2011/07/14/stuff-everyone-should-do-part-2-coding-standards ...

  4. Hyper-V下WINXP无网卡问题解决

  5. 4种PHP回调函数风格

    4种PHP回调函数风格 匿名函数 $server->on('Request', function ($req, $resp) use ($a, $b, $c) { echo "hell ...

  6. 淘宝卖家搜索器V1.6算法注册机。

    该软件的算法非常简单,适合小白练手.(E语言写的)1.OD加载该软件,输入bp MessageBoxA 2.点击注册 3.OD就会中断下来了 4.按ALT+K打开调用堆栈 5.往上翻,就来到算法处了 ...

  7. Spring之事务操作(注解)

    事务操作步骤: <!-- 第一步.配置事务管理器 --> <bean id="transactionManager" class="org.spring ...

  8. spring not_support 该方法被事务方法调用时 不会加入spring事务 只是执行jdbc普通的事务

  9. jenkins迁移升级简述

    1.迁移背景 原有jenkins版本为2.32.2,由于需要安装git parameter插件,插件安装失败,依赖暂时无法解决,因此决定升级jenkins版本,升级版本为2.121.2.   2.je ...

  10. MySQL5.7安装(RPM)笔记

    1. 检查MySQL是否安装,如果有安装,则移除(rpm –e 名称)[root@localhost ~]# rpm -qa | grep -i mysqlmysql-libs-xxxxxxxxxx. ...