static struct device_driver s3c2410fb_driver = {
.name = "s3c2410-lcd",
.bus = &platform_bus_type,
.probe = s3c2410fb_probe,
.suspend = s3c2410fb_suspend,
.resume = s3c2410fb_resume,
.remove = s3c2410fb_remove
};
int __devinit s3c2410fb_init(void)
{
return driver_register(&s3c2410fb_driver);
}
看过linux内核代码的人都知道,类似上面的结构体初始化方式叫做指定初始化,下面我针对S3C2410 lcd驱动的一段代码,讲一讲指定初始化结构体的调用过程。因为本人在做驱动的时候被这个问题困扰了很久,不知道其中的参数是怎么传进去的,在什么时候调用的。费话不多说,说一说s3c2410fb_probe()是怎样被调用的,流程如下:
driver_register()->bus_add_driver()->driver_attach()->bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);//注意__driver_attach哦,先不着急看它,接着看bus_for_each_dev()函数的实现过程,发现参数中有个int (*fn)(struct device *, void *),然后在函数体中发现error = fn(dev, data);大家一定看出来了吧,fn()既是__driver_attach,参数传进去了吧,然后跳到__driver_attach()函数的实现中,找到driver_probe_device()函数,然后找到ret = drv->probe(dev);这里的probe即是s3c2410fb_probe了,而drv->probe(dev);中的参数dev就是传给s3c2410fb_probe的参数了。这就实现了s3c2410fb_probe()函数的调用了。
本人也是刚接触linux不久,讲的不对的地方还请高人多多指教!
阅读(1665) | 评论(0) | 转发(0) |