USB串行口Linux驱动器
USB串口登记
USB串口驱动器登记
驱动器定义
static int __init ir_init(void)
{
...
return usb_serial_register_drivers(serial_drivers, KBUILD_MODNAME, ir_id_table);
}
static const struct usb_device_id ir_id_table[] = {
{
USB_DEVICE(0x050f, 0x0180) }, /* KC Technology, KC-180 */
{
USB_DEVICE(0x08e9, 0x0100) }, /* XTNDAccess */
{
USB_DEVICE(0x09c4, 0x0011) }, /* ACTiSys ACT-IR2000U */
{
USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, USB_SUBCLASS_IRDA, 0) },
{
} /* Terminating entry */
};
static struct usb_serial_driver ir_device = {
.driver = {
.owner = THIS_MODULE,
.name = "ir-usb",
},
.description = "IR Dongle",
.id_table = ir_id_table,
.num_ports = 1,
.set_termios = ir_set_termios,
.attach = ir_startup,
.open = ir_open,
.prepare_write_buffer = ir_prepare_write_buffer,
.process_read_urb = ir_process_read_urb,
};
登记驱动器
多个不同的类似设备可以用同一个usb_serial_driver。具体是哪些设备由ir_id_table表指定。
static struct usb_serial_driver * const serial_drivers[] = {
&ir_device,
NULL
};
usb_serial_register_drivers(serial_drivers, KBUILD_MODNAME, ir_id_table);
usb_serial_register_drivers 能够登记多个USB串行口设备驱动器,usb_serial_driver。
一个usb_serial_driver指针数组定义具体哪些设备驱动器。
usb_serial_register_drivers登记驱动器
usb_serial_register_drivers从存储器分配一个struct usb_driver结构变量udriver。初始化这个结构变量。
初始化USB驱动器
struct usb_driver *udriver;
udriver->name = name;
udriver->no_dynamic_id = 1;
udriver->supports_autosuspend = 1;
udriver->suspend = usb_serial_suspend;
udriver->resume = usb_serial_resume;
udriver->probe = usb_serial_probe;
udriver->disconnect = usb_serial_disconnect;
使用这个usb_driver结构变量,登记一个USB驱动器。
rc = usb_register(udriver);
使用usb_serial_register_drivers函数进行驱动器登记的所有USB串行口驱动器,有相同的USB驱动器函数。
- usb_serial_suspend
- usb_serial_resume
- usb_serial_probe
- usb_serial_disconnect
登记USB设备驱动器
udriver->drvwrap.for_devices = 0;
udriver->drvwrap.driver.name = udriver->name;
udriver->drvwrap.driver.bus = &usb_bus_type;
udriver->drvwrap.driver.probe = usb_probe_interface;
udriver->drvwrap.driver.remove = usb_unbind_interface;
udriver->drvwrap.driver.owner = owner;
udriver->drvwrap.driver.mod_name = mod_name;
...
retval = driver_register(&udriver->drvwrap.driver);
usb_driver的定义如下:
struct usb_driver {
const char *name;
...
const struct usb_device_id *id_table;
const struct attribute_group **dev_groups;
struct usb_dynids dynids;
struct usbdrv_wrap drvwrap;
unsigned int no_dynamic_id:1;
unsigned int supports_autosuspend:1;
unsigned int disable_hub_initiated_lpm:1;
unsigned int soft_unbind:1;
};
struct usbdrv_wrap {
struct device_driver driver;
int for_devices;
};
usb_register, 即usb_register_driver,使用driver_register登记设备驱动器,其参数包含在usb_driver的结构定义之中。
int driver_register(struct device_driver *drv)
登记usb_serial_driver设备驱动器
usb_serial_register登记所有的usb_serial_driver驱动器。
usb_serial_register登记包括
- 初始化
- 将驱动器加入到驱动器表usb_serial_driver_list中
- 按总线类型usb_serial_bus_type,登记设备驱动器
USB串口登记流程图
USB串口驱动器登记包括
- 登记一个USB驱动器
- 登记一组USB串口驱动器
- 链接设备与设备驱动器
驱动器登记,driver_register
bus的数据结构
struct bus_type {
const char *name;
const char *dev_name;
struct device *dev_root;
const struct attribute_group **bus_groups;
const struct attribute_group **dev_groups;
const struct attribute_group **drv_groups;
...
const struct dev_pm_ops *pm;
const struct iommu_ops *iommu_ops;
struct subsys_private *p;
struct lock_class_key lock_key;
bool need_parent_lock;
};
struct subsys_private {
struct kset subsys;
struct kset *devices_kset;
struct list_head interfaces;
struct mutex mutex;
struct kset *drivers_kset;
struct klist klist_devices;
struct klist klist_drivers;
struct blocking_notifier_head bus_notifier;
unsigned int drivers_autoprobe:1;
struct bus_type *bus;
struct kset glue_dirs;
struct class *class;
};
所有同一bus的驱动器被保存在下列的kset结构中。
struct kset *devices_kset;
登记流程图
driver_register函数的定义如下:
int driver_register(struct device_driver *drv);
将设备驱动器加到bus的drivers_kset中,如果没有登记,则登记驱动器。
- 在bus的drivers_kset,检查驱动器是否已经登记
- 如果还没有登记,则登记驱动器,并将驱动器加到drivers_kset