linux i2c驱动注册流程

以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通信情况,进行一些系列的初始化工作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值