linux i2c驱动注册流程

来源:互联网 发布:南风知我意在线阅读 编辑:程序博客网 时间:2024/05/01 11:06

以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实际上对应gsl_ts_probe    ->测试i2c通信情况,进行一些系列的初始化工作
0 0