首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux gadget 驱动分析之udc驱动

Linux gadget 驱动分析之udc驱动

手里正好有个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,
};
返回列表