linux内核GPIO模拟I2C实例
linux内核GPIO模拟I2C实例 2010-10-11 作者:cvip302814来源:cvip302814的blog 前言:在许多情况下,我们并没有足够的I2C总线,本文主在介绍如何利用Linux内核中的i2c-gpio模块,利用2条GPIO线模拟i2c总线,并挂载设备。思路:
linux内核GPIO模拟I2C实例 | ||||||||
linux gpio模拟i2c的使用/用GPIO模拟I2C总线驱动模块使用I2C总线范例 | ||||||||
2010-10-11 作者:cvip302814来源:cvip302814的blog | ||||||||
| ||||||||
|
例子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中,形式请参考该数组中其他的设备。
<p style="padding-top:0px; padding-right:0px; padd
附:
| xiewen202 |
10-7-1
|
由于需要用两个gpio模拟i2c,
static struct i2c_gpio_platform_data i2c3_data = {
.sda_pin = GPIO_F7,
.scl_pin = GPIO_F8,
.udelay = 0,
.timeout = 0,
.sda_is_open_drain = 1,
.scl_is_open_drain = 1,
.scl_is_output_only = 0,
};
static struct platform_device i2c3_device = {
.name = "i2c-gpio",
.id
.dev = {
.platform_
},
};
static struct platform_device *platform_devs_pre[] __initdata = {
&pnx_wavex_gpio_
& i2c3_device,//注册
};
static struct i2c_board_info i2c_devices[] = {
{
I2C_BOARD_
},
};
int __init pnx67xx_devices_init(void)
{
pr_debug("%s()\n", __func__);
platform_add_devices(
ARRAY_SIZE(platform_devs_post)
i2c_register_board_
return 0;
}
在我的lis35de驱动中:
static const struct i2c_device_id lis35de_id[] = {
{ "lis35de", 0 },
{ }
};
static struct i2c_driver st_lis35de_driver = {
.probe
.remove
.suspend = st_lis35de_suspend,
.resume
.id_table = lis35de_id,
.driver
.name = "lis35de",
},
};
static int __devinit st_lis35de_init(void)
{
printk(KERN_INFO "st_lis35de_init\n");
return i2c_add_driver(&st_lis35de_
}
static void __exit st_lis35de_exit(void)
{
i2c_del_driver(&st_
}
module_init(st_lis35de_init);
module_exit(st_lis35de_exit);
,现在我在我的st_lis35de_
i2c_master_send发送数据啊。i2c_
| chris |
10-7-1
|
i2c_master_send发送数据啊。i2c_
send有什么区别啊?请教宋老师 > >-- >_____________________________- 显示引用文字 -__________________ >Linux设备驱动开发邮件列表 linux...@ googlegroups.com >http://groups.google.gr/ group/linuxdriver?hl=zh-CN >退订请使用原订阅邮箱发邮件至:linuxdriver+ unsubscribe@googlegroups.com
| xiewen202 |
10-7-1
|
在 2010-07-01 20:04:48,chris < chris_...@
| jimmy |
10-7-2
|
int num); 要知道该client绑定的adapter,
| xiewen202 |
10-7-2
|
.detach_client= pca953x_detach_client,//
在 2010-07-02 00:28:52,jiangmin7790594 < jian
更多推荐
所有评论(0)