• Linux 内核usb_bulk_msg 接口


    usb_bulk_msg 创建一个 USB 块 urb 并且发送它到特定的设备, 接着在返回到调用者之 前等待完成. 它定义为:

    int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length,

    int timeout);

    这个函数的参数是:

    struct usb_device *usb_dev 发送块消息去的 USB 设备的指针

    unsigned int pipe

    这个块消息要发送到的 USB 设备的特定端点. 这个值被创建, 使用一个对 usb_sndbulkpipe 或者 usb_rcvbulkpipe 的调用.

    void *data

    如果这是一个 OUT 端点, 指向要发送到设备的数据的指针. 如果是一个 IN 端点, 这是一个在被从设备读出后数据应当被放置的地方的指针.

    int len

    被 data 参数指向的缓冲的长度 int *actual_length

    指向函数放置真实字节数的指针, 这些字节要么被发送到设备要么从设备中获取, 根据端点方向.

    int timeout

    时间量, 以嘀哒计, 应当在超时前等待的. 如果这个值是 0, 函数永远等待消息完 成.

    如果函数成功, 返回值是 0; 否则, 一个负错误值被返回. 这错误号匹配之前在"urb 结构 "一节中描述的错误号. 如果成功, actual_length 参数包含被传送或从消息中获取的字 节数.

    下面是一个使用这个函数调用的例子:

    /* do a blocking bulk read to get data from the device */ retval = usb_bulk_msg(dev->udev,

    usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),

    dev->bulk_in_buffer,

    min(dev->bulk_in_size, count), &count, HZ*10);

    /* if the read was successful, copy the data to user space */ if (!retval) {

    if (copy_to_user(buffer, dev->bulk_in_buffer, count)) retval = -EFAULT;

    else

    }


    retval = count;

    这个例子展示了一个简单的从一个 IN 端点的块读. 如果读取成功, 数据接着被拷贝到用 户空间. 这个典型地是在 USB 驱动的读函数中完成.

    usb_bulk_msg 函数不能被从中断上下文调用, 或者持有一个自旋锁. 还有, 这个函数不 能被任何其他函数取消, 因此当使用它时小心; 确认你的驱动的去连接知道足够多来等待 调用结束, 在允许它自己被从内存中卸载之前.

  • 相关阅读:
    生成随机数的三种方法
    老外最常说的二十句钻石级英语
    线性探查法实现的散列表(哈希表)类
    STL容器之间可以直接相互赋值使用
    用位向量实现集合抽象数据类型
    一个利用map统计一段英文文章中每个单词出现次数的小程序
    各种排序算法的稳定性和时间复杂度小结
    24佳句对译收藏
    SQL 将一个字段内用逗号分隔的内容分成多条记录
    SQL递归查询(with cte as)
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11147388.html
Copyright © 2020-2023  润新知