我刚开始为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;
}
答案 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不执行我的“驱动程序”。
我知道有两种方法可以解决这个问题:
使用 usbhid 驱动程序的“怪癖”参数。
将您的设备的供应商ID和产品ID提供为quirks
模块的usbhid
参数。您可以通过内核cmdline传递此参数。修改/etc/default/grub
文件,将usbhid.quirks=0xdead:0xbeef:0x4
添加到GRUB_CMDLINE_LINUX_DEFAULT
,然后执行以下操作:
$ sudo update-grub
然后重启。
使用 udev 。
使用ignore_device
选项为您的设备创建udev规则。但似乎在新版本的udev中删除了此选项,因此您可能无法使用它。
详细说明:
[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