我是Linux内核的新手,我正在学习USB设备驱动程序。 我写了一个简单的USB驱动程序,带有探针回调和断开回调函数。
在探测回调中,我尝试显示传递给它的struct usb_device_id参数的值。问题是结构变量将产品ID和供应商ID显示为0。
这是什么原因?我做得还好吗?
来自驱动程序的代码片段是
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/usb.h>
int probe_callback(struct usb_interface *intf, const struct usb_device_id *id);
void disconnect_callback(struct usb_interface *intf);
struct usb_device_id usb_ids[]={
{.driver_info=42},
{}
};
struct usb_driver USB_DRIVER={
.name="NEW USB",
.id_table=usb_ids,
.probe=probe_callback,
.disconnect=disconnect_callback
};
//PROBLEM IS IN THE FUNCTION BELOW .....................
int probe_callback(struct usb_interface *intf, const struct usb_device_id *id)
{
printk(KERN_ALERT "probe callback\n");
__u16 vendor_id=id->idVendor;
__u16 product_id=id->idProduct;
printk("product id : %x vendor id : %x\n", product_id, vendor_id);
return 0;
}
//..........................
void disconnect_callback(struct usb_interface *intf)
{
printk(KERN_ALERT "disconnect callback\n");
}
static int start(void)
{
printk(KERN_ALERT "module registered\n");
int result;
result=usb_register(&USB_DRIVER);
if(result)
{
printk("error in registering usb driver...Error code = %d\n", result);
}
return result;
}
static void stop(void)
{
printk(KERN_ALERT "module unregistered\n");
usb_deregister(&USB_DRIVER);
}
module_init(start);
module_exit(stop);
执行dmesg时得到的日志是
[ 1539.714265] probe callback
[ 1539.714277] product id : 0 vendor id : 0
提前感谢您提供任何帮助
答案 0 :(得分:2)
您的usb_id
表格不包含供应商和产品ID。传递给id
的{{1}}指针指向与被探测设备匹配的probe_callback
元素。
您需要正确填写usb_id
表的元素以匹配您感兴趣的设备,例如使用usb_id
宏。