批量邮件传输USB Linux

时间:2015-02-17 16:23:33

标签: c linux kernel usb driver

我刚开始为dds生成器编写自己的Linux驱动程序。

当der Kernel调用probe函数时,我想向生成器写入2个批量消息。但我不知道如何调用usb_bulk_msg函数。我希望你能帮助我。

HSYNC

static int dds_probe(struct usb_interface *interface, const struct usb_device_id *id)
{
int retval = 0;

retval = usb_bulk_msg();

dev_info(&interface->dev, "DDS generator is now attached\n");
return 0;
}

1 个答案:

答案 0 :(得分:1)

内核是一个不言自明的项目,所以通常你可以在内核代码中找到答案。

功能用途

include / linux / usb.h :在这里你可以看到这个功能的签名

extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
                        void *data, int len, int *actual_length,
                        int timeout);

drivers / usb / core / message.c :在这里你可以看到这个函数的好描述(参数,返回值,如何使用它)

/**
 * usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion
 * @usb_dev: pointer to the usb device to send the message to
 * @pipe: endpoint "pipe" to send the message to
 * @data: pointer to the data to send
 * @len: length in bytes of the data to send
 * @actual_length: pointer to a location to put the actual length transferred
 *                 in bytes
 * @timeout: time in msecs to wait for the message to complete before
 *           timing out (if 0 the wait is forever)
 *
 * Context: !in_interrupt ()
 *
 * This function sends a simple bulk message to a specified endpoint
 * and waits for the message to complete, or timeout.
 *
 * Don't use this function from within an interrupt context, like a bottom half
 * handler.  If you need an asynchronous message, or need to send a message
 * from within interrupt context, use usb_submit_urb() If a thread in your
 * driver uses this call, make sure your disconnect() method can wait for it to
 * complete.  Since you don't have a handle on the URB used, you can't cancel
 * the request.
 *
 * Because there is no usb_interrupt_msg() and no USBDEVFS_INTERRUPT ioctl,
 * users are forced to abuse this routine by using it to submit URBs for
 * interrupt endpoints.  We will take the liberty of creating an interrupt URB
 * (with the default interval) if the target is an interrupt endpoint.
 *
 * Return:
 * If successful, 0. Otherwise a negative error number. The number of actual
 * bytes transferred will be stored in the @actual_length parameter.
 *
 */

实施例

如果您需要一些示例如何使用此功能,您也可以在内核代码中找到它们,例如:使用LXR site

如果您是USB驱动程序开发的新手,您可能也对某些教程感兴趣:

在评论中回答问题

  

当我插入我的生成器时,内核执行我的驱动程序,然后usbcore加载usbhid驱动程序,因为生成器是一个隐藏设备,并且在下次usbcore不执行我的“驱动程序”。

我知道有两种方法可以解决这个问题:

  1. 使用 usbhid 驱动程序的“怪癖”参数。

    将您的设备的供应商ID和产品ID提供为quirks模块的usbhid参数。您可以通过内核cmdline传递此参数。修改/etc/default/grub文件,将usbhid.quirks=0xdead:0xbeef:0x4添加到GRUB_CMDLINE_LINUX_DEFAULT,然后执行以下操作:

    $ sudo update-grub
    

    然后重启。

  2. 使用 udev

    使用ignore_device选项为您的设备创建udev规则。但似乎在新版本的udev中删除了此选项,因此您可能无法使用它。

  3. 详细说明:

    [1] https://unix.stackexchange.com/questions/55495/prevent-usbhid-from-claiming-usb-device/55590#55590

    [2] http://ubuntuforums.org/showthread.php?t=1175001&p=7548820#post7548820