手里正好有个s3c2416的板子,因此就以s3c-hsudc.c为实例分析吧。 阅读内核驱动源码时, 首先要找到入口,再逐个击破,将各个函数以及模块间的调用关系梳理清楚。从
linux-3.4.77/drivers/usb/gadget/Makefile 第27行
obj-$(CONFIG_USB_S3C_HSUDC) += s3c-hsudc.o
可见
s3c-hsudc.c可以被编译成s3c-hsudc.ko, 但是我们到s3c-hsudc.c中却怎么也找不到熟悉的module_init, module_exit。
唯一可能相关的是1409行的
module_platform_driver(s3c_hsudc_driver); 好吧我们看看这里是不是入口,
在include/linux/platform_device.h中找到
#define module_platform_driver(__platform_driver) \
module_driver(__platform_driver, platform_driver_register, \
platform_driver_unregister)
在include/linux/device.h中找到
#define module_driver(__driver, __register, __unregister, ...) \
static int __init __driver##_init(void) \
{ \
return __register(&(__driver) , ##__VA_ARGS__); \
} \
module_init(__driver##_init); \
static void __exit __driver##_exit(void) \
{ \
__unregister(&(__driver) , ##__VA_ARGS__); \
} \
module_exit(__driver##_exit);
经过以上宏替换后module_platform_driver(s3c_hsudc_driver);
变成
static int __init s3c_hsudc_driver_init(void)
{
return platform_driver_register(&s3c_hsudc_driver);
}
module_init(s3c_hsudc_driver_init);
static void __exit s3c_hsudc_driver_exit(void)
{
platform_driver_unregister(&s3c_hsudc_driver);
}
module_exit(s3c_hsudc_driver_exit);
好吧,找到我们熟悉的入口了。 从
static struct platform_driver s3c_hsudc_driver = {
.driver
= {
.owner
= THIS_MODULE,
.name
= "s3c-hsudc",
},
.probe
= s3c_hsudc_probe,
};
|