您的位置:首页 > 运维架构 > Linux

linux i2c驱动注册流程

2016-11-22 20:09 447 查看
以x210的触摸屏为例,分析一下i2c驱动注册的流程

1、在arch\arm\mach-s5pv210\mach-x210.c中

//新建一个i2c设备信息结构体

static struct i2c_board_info i2c_devs1[] __initdata = {
{
I2C_BOARD_INFO("gslX680", 0x40),
},
};


//把新的i2c设备信息结构体添加到__i2c_board_list链表中即把信息添加到id表中

i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));


2、在drivers/input/touchscreen\gslx680.c中

//注册设备驱动
static int __init gsl_ts_init(void)
{
int ret;
print_info("==gsl_ts_init==\n");
ret = i2c_add_driver(&gsl_ts_driver);
print_info("ret=%d\n",ret);
return ret;
}


驱动注册流程

i2c_add_driver

->i2c_register_driver

/* add the driver to the list of i2c drivers in the driver core*/
//driver指针指gsl_ts_driver即触摸屏的驱动结构体
driver->driver.owner = owner;
driver->driver.bus = &i2c_bus_type;
/* When registration returns, the driver core
* will have called probe() for all matching-but-unbound devices.
*/
res = driver_register(&driver->driver);


->driver_find          //查找该设备驱动是否已经存在
->bus_add_driver   //根据driver->driver.bus 类型,把驱动添加到相应的(i2c)总线上面


当驱动注册完成后,进行设备与驱动匹配

i2c_device_probe//注册完驱动后执行
->driver->probe    //执行驱动的probe,在prode的入口参数调用i2c_match_id
->i2c_match_id   //比较id表里面是否已经存在了该驱动对应的设备名   即对应第一步中i2c_register_board_info注册的信息,返回对应的struct i2c_device_id即设备名
->gsl_ts_probe  //driver->probe实际上对应g
4000
sl_ts_probe
->测试i2c通信情况,进行一些系列的初始化工作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: