当USB设备被正确识别,并加载相关驱动,驱动程序的probe函数就会被调用,USB的probe函数对应struct usb_driver中的probe函数指针,在该函数中完成相关的初始化,固件加载等相关工作。该函数的原型为:
int (*probe)(struct usb_interface *intf, const struct usb_device_id *id)
intf对应当前USB接口的Interface,id对应该与该USB设备匹配的struct usb_device_id 即之前的定义的cy68013_table[0]
在probe函数中完成的工作有:
- 初始化驱动的相关的数据元素,锁,互斥量等;
- 更改USB接口的相关设置,获取接口的相关端点信息等;
- 如果USB设备有固件程序,通过USB接口加载相关的设备固件;
- 调用usb_set_intfdata函数保存该接口的到驱动的私有结构体中,供以后使用;
- 调用usb_register_dev函数注册USB设备(只有USB设备不隶属于任何一种类作为字符设备使用的时候才用该函数)
使用usb_register_dev函数需要定义一个struct usb_class_driver 结构提供相关的信息给USB core:
- char *name 设备的名称,该名称将出现在sysfs文件系统中;
- struct file_operations *fops 字符设备的函数操作指针;
- int minor_base 设备驱动的次编号,当作为字符设备的时候主编号固定为180
- 711 /*
-
712 * usb class driver info in order to get a minor number from the usb core,
-
713 * and to have the device registered with the driver core
-
714 */
-
715 static struct usb_class_driver cy68013_class = {
-
716 .name = "cy68013",
-
717 .fops = &cy68013_fops,
-
718 .minor_base = USB_CY68013_MINOR_BASE,
-
719 };
阅读(936) | 评论(0) | 转发(0) |