Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424516
  • 博文数量: 131
  • 博客积分: 1990
  • 博客等级: 上尉
  • 技术积分: 996
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-24 12:15
文章分类
文章存档

2011年(4)

2010年(19)

2009年(108)

我的朋友

分类: 嵌入式

2009-12-25 21:54:08

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不久,讲的不对的地方还请高人多多指教!
阅读(1661) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~