目的:对USB作深入学习,在此留下笔记。欢迎讨论。
[Linux 3.2] [driver/usb/core/devio.c]
定义:usbfs_driver
[Linux 3.2] [include/linux/usb.h]
函数:usb_register();
[Linux 3.2] [driver/usb/core/driver.c]
函数:usb_register_driver();
此函数主要功能实现是通过driver_register实现。后面会详细分析。
其余功能如下:
1. usbfs_update_special() ==> 跟usb文件系统相关,暂时不分析。
2. usb_create_newid_file() ==> 创建newid属性文件,在/sys/bus/usb/drivers/usbfs/下面可以看到此文件。
3. usb_create_removeid_file() ==> 创建removeid 性文件,在/sys/bus/usb/drivers/usbfs/下面可以看到此文件。
4. 输出信息:usbcore: registered new interface driver usbfs
问题:newid与removeid属性文件的作用是什么?
回答:等待解答。
现在分析driver_register功能:
1. 首先判断,些驱动所属bus的subsys_private结构有没有初始化。如果没有,报bug信息。
2. 判断需要注册的driver和driver所属的bus是否都有probe, remove, shutdown函数。如有,打印kernel warning信息。
3. 判断此driver已经在driver所属的bus上面注册过了。如果注册过了,打印错误信息,并返回。
4. 调用bus_add_driver来注册driver。
5. 调用driver_add_groups来添加组属性。
6. 返回。
最后对bus_add_driver进行分析。
其功能是向bus中添加一个driver。
1. bus_get() ==> bus的计数加1;
2. kzalloc,分配driver_private内存空间。
3. 初始化此driver的klist_devices链表。
4. kobject_init_and_add() ==> 在/sys/bus/usb/drivers/下面创建usbfs文件夹。
5. 如果总线支持drivers_autoprobe,调用driver_attach。(USB 总线支持)
6. driver_create_file ==> 在/sys/bus/usb/drivers/usbfs下面创建uevent属性文件。
7. driver_add_attrs() ==> 将总线的属性也加到/sys/bus/usb/drivers/usbfs
8. add_bind_files() ==> 在/sys/bus/usb/drivers/usbfs创建bind和unbind属性文件。
9. kobject_uevent() ==> 发送一个KOBJ_ADD的事件。
在/sys/bus/usb/drivers/usbfs下面的文件:
bind module new_id remove_id uevent unbind