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

  • 相关阅读:
    CocoStudio基础教程(4)骨骼动画的动态换肤
    CocoStudio基础教程(3)在程序中处理cocoStudio导出动画
    CocoStudio基础教程(2)关联程序逻辑与cocoStudio导出文件
    CocoStudio基础教程(1)创建UI并载入到程序中
    LeetCode:盛最多水的容器【11】
    LeetCode:反转字符串中的元音字母【345】
    LeetCode:验证回文串【125】
    LeetCode:颜色分类【75】
    LeetCode:删除排序数组中的重复项||【80】
    LeetCode:移动零【283】
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11147388.html
Copyright © 2011-2022 走看看