linux下的I2C驱动记录

现在做的是RK平台的I2C驱动,不是说linux每个外设对应一个设备文件吗?可是找了一下一直没找到,今天特别搞了一下。I2C设备是注册为platform平台驱动的。

下面是我用adb命令查看的

linux的设备文件不一定只在dev/这个目录下面,像sys/ 目录下面也会有一些设备文件的

MID下面的I2C设备的设备文件

1|root@android:/ # ls sys/bus/i2c/drivers/                                     
RK610_CODEC/    gc0308/         ir-kbd-i2c/     sensors/        tps65910/    
act8846/        gc0328/         nt99340/        sp0838/         wm831x/      
dummy/          gc2035/         rk610_ctl/      sp2518/         
ft5x0x_touch/   gslX680/        rk610_hdmi/     sp2541/

MID下面的I2C设备的I2C地址

root@android:/ # ls sys/bus/i2c/devices/                                       
0-004c/ 1-002d/ 1-005a/ 2-0040/ 3-003c/ 4-0042/ 4-0060/ i2c-1/  i2c-3/  
1-0014/ 1-0034/ 2-0038/ 3-0021/ 4-0040/ 4-0046/ i2c-0/  i2c-2/  i2c-4/

在板级文件里面,我们可以看到我们的I2C设备地址是多少,代码如下,用i2c_register_board_info这个函数来注册i2c的device。 每一个I2C的硬件接口对应一个i2cX_info
static void __init rk30_i2c_register_board_info(void)
{
#ifdef CONFIG_I2C0_RK30
  i2c_register_board_info(0, i2c0_info, ARRAY_SIZE(i2c0_info));
#endif
#ifdef CONFIG_I2C1_RK30
  i2c_register_board_info(1, i2c1_info, ARRAY_SIZE(i2c1_info));
#endif
#ifdef CONFIG_I2C2_RK30
  i2c_register_board_info(2, i2c2_info, ARRAY_SIZE(i2c2_info));
#endif
#ifdef CONFIG_I2C3_RK30
  i2c_register_board_info(3, i2c3_info, ARRAY_SIZE(i2c3_info));
#endif
#ifdef CONFIG_I2C4_RK30
  i2c_register_board_info(4, i2c4_info, ARRAY_SIZE(i2c4_info));
#endif
#ifdef CONFIG_I2C_GPIO_RK30
  i2c_register_board_info(5, i2c_gpio_info, ARRAY_SIZE(i2c_gpio_info));
#endif
}

#if defined (CONFIG_TOUCHSCREEN_GSLX680)
    {
        .type           = "gslX680",
        .addr           = 0x40,
        .flags          = 0,
        .platform_data =&gslx680_info,
    },
#endif

然后看I2C的对应的设备驱动,下面给出一个TP的驱动的注册的地方,用i2c_add_driver这个函数去注册i2c的驱动driver

static const struct i2c_device_id gsl_ts_id[] = {
  {GSLX680_I2C_NAME, 0},
  {}
};
MODULE_DEVICE_TABLE(i2c, gsl_ts_id);


static struct i2c_driver gsl_ts_driver = {
  .driver = {
    .name = GSLX680_I2C_NAME,
    .owner = THIS_MODULE,
  },
#ifndef CONFIG_HAS_EARLYSUSPEND
  .suspend	= gsl_ts_suspend,
  .resume	= gsl_ts_resume,
#endif
  .probe		= gsl_ts_probe,
  .remove		= __devexit_p(gsl_ts_remove),
  .id_table	= gsl_ts_id,
};

static int __init gsl_ts_init(void)
{
    int ret;
  printk("==gsl_ts_init==\n");
  ret = i2c_add_driver(&gsl_ts_driver);
  printk("ret=%d\n",ret);
  return ret;
}
static void __exit gsl_ts_exit(void)
{
  printk("==gsl_ts_exit==\n");
  i2c_del_driver(&gsl_ts_driver);
  return;
}

module_init(gsl_ts_init);
module_exit(gsl_ts_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("GSLX680 touchscreen controller driver");
MODULE_AUTHOR("Guan Yuwei, guanyuwei@basewin.com");
MODULE_ALIAS("platform:gsl_ts");

好了。然后再看一下这里,可以看到 devices/和drivers/

1|root@android:/ # ls sys/bus/i2c/                                             
devices/            drivers_autoprobe   uevent              
drivers/            drivers_probe

再看一下这个,就很清楚的知道这个设备挂载在哪个I2C接口下面了

root@android:/ # ll sys/bus/i2c/drivers/gslX680/                               
lrwxrwxrwx root     root              2013-09-04 08:51 2-0040 -> ../../../../devices/platform/rk30_i2c.2/i2c-2/2-0040
--w------- root     root         4096 2013-09-04 08:51 bind
--w------- root     root         4096 2013-09-04 08:51 uevent
--w------- root     root         4096 2013-09-04 08:51 unbind
root@android:/ #

root@android:/ # ll sys/bus/i2c/devices/2-0040/                                
lrwxrwxrwx root     root              2013-09-04 08:55 driver -> ../../../../../bus/i2c/drivers/gslX680
drwxr-xr-x root     root              2013-09-04 08:55 input
-r--r--r-- root     root         4096 2013-09-04 08:55 modalias
-r--r--r-- root     root         4096 2013-09-04 08:55 name
drwxr-xr-x root     root              2013-09-04 08:55 power
lrwxrwxrwx root     root              2013-09-04 08:55 subsystem -> ../../../../../bus/i2c
-rw-r--r-- root     root         4096 2013-09-04 08:55 uevent
root@android:/ #

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值