ARM Linux 内核gpio模拟I2C

例子1

1,kernel\arch\arm\mach-pxa\board-test.c 增加

/* i2c */
static struct i2c_gpio_platform_data i2c_bus_data = {
 .sda_pin = VIPER_RTC_I2C_SDA_GPIO,
 .scl_pin = VIPER_RTC_I2C_SCL_GPIO,
 .udelay  = 10,
 .timeout = 100,
};

 

static struct platform_device i2c_bus_device = {
 .name  = "i2c-gpio",
 .id  = 1, /* pxa2xx-i2c is bus 0, so start at 1 */
 .dev = {
  .platform_data = &i2c_bus_data,
 }
};

 

static struct i2c_board_info __initdata viper_i2c_devices[] = {
 {
  I2C_BOARD_INFO("ds1338", 0x68),
 },
};

第一个结构体中sda_pin和scl_pin是开发板上对应的gpio口(data线和clock线),udelay是与具体芯片时钟相关的参数,需要参考具体的datasheet。下面的两个open_drain是表明两个管脚是否是开漏电路,如果是则填1,否则填0。下面一个机构体中需要注意name应该填写i2c-gpio,另外id要注意设定为2,因为系统当中已经有两个I2C设备了。

添加上需要的头文件:#include <linux/i2c-gpio.h>。在头文件devices.h中添加上设备结构体的声明,extern struct platform_device gpio_device_i2c;

然后将gpio_device_i2c放在board-XXXX.c的数组devices中,形式请参考该数组中其他的设备。  

static struct platform_device *viper_devs[] __initdata = {
 &smc91x_device,
 &i2c_bus_device,    ///
 &serial_device,
 &isp116x_device,
 &viper_mtd_devices[0],
 &viper_mtd_devices[1],
 &viper_backlight_device,
};


 

 static void __init viper_init(void)

 i2c_register_board_info(1, ARRAY_AND_SIZE(viper_i2c_devices));


;

}


 

然后再用i2c_register_board_info对其进行注册:  

i2c_register_board_info(2, i2c_gpio_devices, ARRAY_SIZE(i2c_gpio_devices));  

这样就完成了模拟步骤,可以直接用系统的I2C相关的注册等方法对设备进行注册和读写操作。 


例子2

static struct i2c_gpio_platform_data ep93xx_i2c_data = {
 .sda_pin  = EP93XX_GPIO_LINE_EEDAT,
 .sda_is_open_drain = 0,
 .scl_pin  = EP93XX_GPIO_LINE_EECLK,
 .scl_is_open_drain = 0,
 .udelay   = 2,
};

static struct platform_device ep93xx_i2c_device = {
 .name   = "i2c-gpio",
 .id   = 0,
 .dev.platform_data = &ep93xx_i2c_data,
};

void __init ep93xx_register_i2c(struct i2c_board_info *devices, int num)
{
 i2c_register_board_info(0, devices, num);
 platform_device_register(&ep93xx_i2c_device);
}

 


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-03/33762p3.htm

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值