ARM Linux 内核gpio模拟I2C(2)

在实际应用中,并没有强制规定数据接收方必须对于发送的8位数据做出回应,尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下,编程者可以事先约定数据传送的长度,不发送ACK,有时可以起到减少系统开销的效果。开发的过程当中,开发板上的I2C总线有限,如果I2C设备太多的话,就需要用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));


;

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxfsw.html