S5PV210 I2C设备驱动

本文介绍了在S5PV210平台上进行I2C设备驱动的移植过程,包括使用板载I2C总线和GPIO模拟I2C两种方式。内容涉及i2c_board_info结构体的配置,设备注册到平台设备总线,以及通过i2c_register_board_info将设备挂载到I2C总线。同时,对比了直接使用GPIO模拟I2C时序与利用i2c-gpio模块的差异。
摘要由CSDN通过智能技术生成

      对于一个i2c设备来说,其设备文件是最简单也是最复杂的,说它简单是因为很设备厂商会提供linux下的代码,这样就简单了;但是也有很多厂商它不提供或不完整提供linux下的代码,这样的话当然就复杂了。那么这个我现在这里就不说了,下面说说做了几个I2C设备(以ISA1200为例)后发现,不管设备文件如何总是要自己来做的一些事情,这大概就是所谓的移植吧。

       当然这个工作都是在板文件中进行的。以mach-s5pv210.c为例来说一下:

       先说下用板子自己带的I2C实现驱动加载:

       首先在板文件中建立ISA1200的信息:

static int isa1200_power(int on)
 
{     

       if(on){
 
              gpio_direction_output(S5PV210_GPJ3(1), 1);
 
              gpio_direction_output(S5PV210_GPJ3(0), 1);
 
       }else{
 
              gpio_direction_output(S5PV210_GPJ3(1), 0);
 
              gpio_direction_output(S5PV210_GPJ3(0), 0);
 
       }
 
       return 0;
 
}
 
 
 
static struct isa1200_platform_data isa1200_1_pdata = {
 
       .name = "isa1200",
 
       .power_on = isa1200_power,
 
       .pwm_ch_id = 1, 

       .hap_en_gpio = S5PV210_GPH3(1),
 
       .max_timeout = 60000,
 
};
 
 
 
static void isa1200_init(void)
 
{
 
       gpio_direction_output(S5PV210_GPJ3(7), 1);
 
       gpio_direction_output(S5PV210_GPJ3(1), 1);
 
       gpio_direction_output(S5PV210_GPJ3(0), 1);
 
       

       /*i2c_register_board_info(3, isa1200_board_info,
 
              ARRAY_SIZE(isa1200_board_info));*/
 
       return;
 
}

以及i2c_board_info结构体:

{
 
              I2C_BOARD_INFO("isa1200_1", 0x90>>1),/*这个是I2C设备的从机地址*/
 
              .platform_data = &isa1200_1_pdata,
 
       },

然后在以下三个I2C总线中找到一条如i2c_devs1[]

/* I2C0 */
 
static struct i2c_board_info i2c_devs0[] __initdata = {
 
       {
 
              I2C_BOARD_INFO("act8937", 0x5B),
 
              .platform_data = &act8937_platform_data,
 
       },
 
       {
 
              I2C_BOARD_INFO("wm8580", 0x1b),
 
       },
 
};
 
 
 
/* I2C1 */
 
static struct i2c_board_info i2c_devs1[] __initdata = {
 
#ifdef CONFIG_VIDEO_TV20
 
       {
 
              I2C_BOARD_INFO("s5p_ddc", (0x74>>1)),
 
       },
 
#endif
 
};
 
 
 
/* I2C2 */
 
static struct i2c_board_info i2c_devs2[] __initdata = {
 
#ifdef CONFIG_REGULATOR_MAX8698
 
       {
 
              /* The address is 0xCC used since SRAD = 0 */
 
              I2C_BOARD_INFO("max8698", (0xCC >> 1)),
 
              .platform_data = &max8698_platform_data,
 
       },
 
#endif

将i2c_boa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值