ahwei的笔记 https://bbs.21ic.com/?368563 [收藏] [复制] [RSS]

日志

Linux gadget 驱动分析之udc驱动

已有 1295 次阅读2014-4-23 14:46 |系统分类:嵌入式系统| Linux

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










路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)