先看入口函数usb_kbd_init
/**
在入口函数中,只做了注册键盘驱动 一件事情。
*/
static int __init usb_kbd_init(void)
{
/**
既然是注册驱动,那么底层一定会经过driver_register()这个函数。
优先会调用bus上提供的probe()函数(原理:请见我的另一篇博文)
如果bus没有提供probe()函数,那么就会调用驱动提供的probe()函数
usb总线:
struct bus_type usb_bus_type = {
.name = "usb",
.match = usb_device_match,
.uevent = usb_uevent,
};
usb总线没有提供probe函数,那么就会调用驱动中提供的probe函数:
static struct usb_driver usb_kbd_driver = {
.name = "usbkbd",
.probe = usb_kbd_probe,
.disconnect = usb_kbd_disconnect,
.id_table = usb_kbd_id_table,
};
usb_kbd_probe()函数会被调用
*/
int result = usb_register(&usb_kbd_driver);//注册usb键盘驱动
/**
usb_register会调用usb_register_driver()函数向usb 核心注册一个usb接口驱动。
成功 返回 0 ,失败返回负数
*/
if (result == 0)
{
printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"DRIVER_DESC "\n");
}
return result;
}
probe()调用简略过程:
本文详细解析了USB键盘驱动的加载过程,从入口函数usb_kbd_init开始,介绍了如何通过usb_register函数向USB核心注册驱动,并说明了在注册过程中probe函数的作用及调用流程。
8509

被折叠的 条评论
为什么被折叠?



