usb_control_msg() -- 从设备读取各种信息

本文深入探讨了USB控制消息在设备通信中的应用,详细解释了各个参数的作用及其在实际操作中的意义。包括如何将请求、请求类型、值、索引、大小等参数加工成USB控件请求,并通过USB内部控制消息函数实现与目标设备的数据交互。重点分析了参数dev、pipe、requesttype、index、request、value、data、size和timeout在通信过程中的角色和使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

get_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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值