当前位置: 技术问答>linux和unix
有个驱动加载的问题,请教一下。
来源: 互联网 发布时间:2017-02-18
本文导语: 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...
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 initn");
ret = driver_register(&s3c2410ts_driver);//问题,什么时候执行.probe = s3c2410ts_probe
if(ret)
printk("register %s driver failed, return code is %dn", DEVICE_NAME, ret);
return ret;
}
.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 initn");
ret = driver_register(&s3c2410ts_driver);//问题,什么时候执行.probe = s3c2410ts_probe
if(ret)
printk("register %s driver failed, return code is %dn", DEVICE_NAME, ret);
return ret;
}
|
每当内核加载一个driver ,或者新注册一个device,都会在对应的bus上执行一次匹配(match)判断
如果device和driver匹配,就执行driver的probe
如果device和driver匹配,就执行driver的probe
|
platform_bus 是通过名字匹配的, 在注册驱动的时候,如果匹配成功就会调用 probe.
PS: 楼上的兄弟还在啊,呵呵。
PS: 楼上的兄弟还在啊,呵呵。
|
在你的 s3c2410ts_probe 函数里加一句
dump_stack(); 就能看到完整的调用关系了。
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,
};
.name = "s3c2410-ts", //跟name匹配的话,就会去probe
.id = -1,
.dev.parent = &s3c_device_adc.dev,
.num_resources = ARRAY_SIZE(s3c_ts_resource),
.resource = s3c_ts_resource,
};