日期:2014-05-16  浏览次数:20785 次

有个驱动加载的问题,请教一下。
static struct device_driver s3c2410ts_driver = {
.name = DEVICE_NAME,
.bus = &platform_bus_type,
.probe = s3c2410ts_probe,//这个函数什么时候被执行呢?
#ifdef CONFIG_PM
.suspend = s3c2410ts_suspend,
.resume = s3c2410ts_resume,
#endif
};




static int __init s3c2410ts_init(void)//这个函数在系统启动加载的时候被执行
{
int ret;

printk("s3c2410ts init\n");

  ret = driver_register(&s3c2410ts_driver);//问题,什么时候执行.probe = s3c2410ts_probe
if(ret)
printk("register %s driver failed, return code is %d\n", DEVICE_NAME, ret);
return ret;
}


------解决方案--------------------
每当内核加载一个driver ,或者新注册一个device,都会在对应的bus上执行一次匹配(match)判断

如果device和driver匹配,就执行driver的probe
------解决方案--------------------
platform_bus 是通过名字匹配的, 在注册驱动的时候,如果匹配成功就会调用 probe.

PS: 楼上的兄弟还在啊,呵呵。
------解决方案--------------------
在你的 s3c2410ts_probe 函数里加一句 
dump_stack(); 就能看到完整的调用关系了。
------解决方案--------------------
struct platform_device s3c_device_ts = {
.name = "s3c2410-ts", //跟name匹配的话,就会去probe
.id = -1,
.dev.parent = &s3c_device_adc.dev,
.num_resources = ARRAY_SIZE(s3c_ts_resource),
.resource = s3c_ts_resource,
};