I2C驱动开发

以添加设备(gsl3673为例):

设备树

&i2c6 {
    status = "okay";
    gsl3673: gsl3673@40 {
                compatible = "GSL,GSL3673";
                reg = <0x40>;
                screen_max_x = <1536>;
                screen_max_y = <2048>;
                irq_gpio_number = <&gpio4 RK_PC5 IRQ_TYPE_LEVEL_LOW>;
                rst_gpio_number = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
                };
    };

status:使能I2C6;

gsl3673: gsl3673@40:I2C6挂载的设备gsl3673,@40保持和reg一致;

compatible:用于和of_device_id匹配;

reg:I2C Slave地址;

gpio:设备的中断,IO控制;

驱动程序

路径”drivers/input/touchscreen/gsl3673.c”;

定义of_device_id:

static const struct of_device_id gsl_ts_ids[] = {
                   {.compatible = "GSL,GSL3673"},
                   { }
                            };

定义i2c_device_id:

static const struct i2c_device_id gsl_ts_id[] = {
                   {GSL3673_I2C_NAME, 0},
                   {}
                            };

定义i2c_driver:

static struct i2c_driver gsl_ts_driver = {
                .driver = {
                .name = GSL3673_I2C_NAME,
                .owner = THIS_MODULE,
                .of_match_table = of_match_ptr(gsl_ts_ids),
                      },
                .probe = gsl_ts_probe,
                .remove = gsl_ts_remove,
                .id_table = gsl_ts_id,
                     };

在系统启动时,I2C总线会在dts设备树种寻找和of_match_table匹配的设备,如果匹配成功,gsl_ts_driver的probe(gsl_ts_probe)就会被调用,做设备的初始化工作。

注:变量id_table指示该驱动所支持的设备。