求助宋老师各位朋友:i2c-gpio使用

94 views
Skip to first unread message

xiewen202

unread,
Jun 30, 2010, 9:36:35 PM6/30/10
to Linux设备驱动开发
宋老师,各位朋友大家好:
由于需要用两个gpio模拟i2c,现在我使用linux自带的i2c-gpio.c,我的注册信息如下:
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 = 2,
.dev = {
.platform_data = &i2c3_data,
},
};
static struct platform_device *platform_devs_pre[] __initdata = {
&pnx_wavex_gpio_device,
& i2c3_device,//注册
};
static struct i2c_board_info i2c_devices[] = {
{
I2C_BOARD_INFO("lis35de", 0x1C),
},

};
int __init pnx67xx_devices_init(void)
{
pr_debug("%s()\n", __func__);
platform_add_devices(platform_devs_pre,
ARRAY_SIZE(platform_devs_post));
i2c_register_board_info(1, i2c_devices, ARRAY_SIZE(i2c_devices));
return 0;
}
在我的lis35de驱动中:
static const struct i2c_device_id lis35de_id[] = {
{ "lis35de", 0 },
{ }
};

static struct i2c_driver st_lis35de_driver = {
.probe = st_lis35de_probe,
.remove = st_lis35de_remove,
.suspend = st_lis35de_suspend,
.resume = st_lis35de_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_driver);
}

static void __exit st_lis35de_exit(void)
{
i2c_del_driver(&st_lis35de_driver);
}

module_init(st_lis35de_init);
module_exit(st_lis35de_exit);
,现在我在我的st_lis35de_probe中我该如何初始化i2c_client,然后使用i2c_transfer或
i2c_master_send发送数据啊。i2c_transfer或i2c_master_send有什么区别啊?请教宋老师

chris

unread,
Jul 1, 2010, 8:04:48 AM7/1/10
to linux...@googlegroups.com
"现在我在我的st_lis35de_probe中我该如何初始化i2c_client,然后使用i2c_transfer或
i2c_master_send发送数据啊。i2c_transfer或i2c_master_send有什么区别啊?请教宋老师"
这两个的程序在什么地方呀,你不写出来怎么分析呀!!!
 
i2c的协议看了吗?不是很难吧,


 


>宋老师,各位朋友大家好: >     由于需要用两个gpio模拟i2c,现在我使用linux自带的i2c-gpio.c,我的注册信息如下: >     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 = 2, > .dev = { > .platform_data = &i2c3_data, > }, >}; >static struct platform_device *platform_devs_pre[] __initdata = { > &pnx_wavex_gpio_device, >               & i2c3_device,//注册 >}; >static struct i2c_board_info i2c_devices[] = { > { > I2C_BOARD_INFO("lis35de", 0x1C), > }, > >}; >int __init pnx67xx_devices_init(void) >{ > pr_debug("%s()\n", __func__); > platform_add_devices(platform_devs_pre, >ARRAY_SIZE(platform_devs_post)); > i2c_register_board_info(1, i2c_devices, ARRAY_SIZE(i2c_devices)); > return 0; >} >在我的lis35de驱动中: >static const struct i2c_device_id lis35de_id[] = { > { "lis35de", 0 }, > { } >}; > >static struct i2c_driver st_lis35de_driver = { > .probe = st_lis35de_probe, > .remove = st_lis35de_remove, > .suspend = st_lis35de_suspend, > .resume = st_lis35de_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_driver); >} > >static void __exit st_lis35de_exit(void) >{ > i2c_del_driver(&st_lis35de_driver); >} > >module_init(st_lis35de_init); >module_exit(st_lis35de_exit); >,现在我在我的st_lis35de_probe中我该如何初始化i2c_client,然后使用i2c_transfer或 >i2c_master_send发送数据啊。i2c_transfer或i2c_master_send有什么区别啊?请教宋老师 > >--  >_______________________________________________ >Linux设备驱动开发邮件列表 linux...@googlegroups.com >http://groups.google.gr/group/linuxdriver?hl=zh-CN >退订请使用原订阅邮箱发邮件至:linuxdriver...@googlegroups.com


xiewen202

unread,
Jul 1, 2010, 9:08:04 AM7/1/10
to linux...@googlegroups.com
chris谢谢你的回复,使用i2c_transfer或i2c_master_send不需要关心i2c发送细节,我是使用i2c子系统,i2c_client是内核生成的数据结构,我不是太明白怎么初始化。
>退订请使用原订阅邮箱发邮件至:linuxdriver+unsub...@googlegroups.com


--
_______________________________________________
Linux设备驱动开发邮件列表 linux...@googlegroups.com
http://groups.google.gr/group/linuxdriver?hl=zh-CN
退订请使用原订阅邮箱发邮件至:linuxdriver+unsub...@googlegroups.com


jiangmin7790594

unread,
Jul 1, 2010, 12:28:52 PM7/1/10
to linuxdriver
1. 你这是属于i2c的probe方式,在csdn 刘洪涛老师说的明白,在平台文件中声明i2c_board_info,再注册i2c_register_board_info(1 );
2. 初始化i2c_client,你可以自己为这个设备新建一个设备结构体,将struct i2c_client *client封装在里面,先进行一些必要有初始化,申请空间.用i2c_check_functionality 检测,最终调用
3. 使用i2c_transfer来发送数据,int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
                        int num); 要知道该client绑定的adapter,在adapter中已经实现算法,从而发送数据, 你这个用i2c_register_board_info(1 );说明ID是1, 可以用i2c_get_adapter(1) 来获取adapter,从页实现发送
4. 总而言知,声明client,无疑是对一些变量初始化,检测设备地址, 申请空间,绑定client 调用i2c_set_client_data, 然后发送时注意client依付的adapter,
这是我的理解,有不对的,请大家指点
 
2010-07-02

jiangmin7790594

发件人: xiewen202
发送时间: 2010-07-01  21:43:51
收件人: linuxdriver
抄送:
主题: Re:Re:[linux-driver] 求助宋老师各位朋友:i2c-gpio使用
chris谢谢你的回复,使用i2c_transfer或i2c_master_send不需要关心i2c发送细节,我是使用i2c子系统,i2c_client是内核生成的数据结构,我不是太明白怎么初始化。

在 2010-07-01 20:04:48,chris <chris_...@163.com> 写道:
"现在我在我的st_lis35de_probe中我该如何初始化i2c_client,然后使用i2c_transfer或
i2c_master_send发送数据啊。i2c_transfer或i2c_master_send有什么区别啊?请教宋老师"
这两个的程序在什么地方呀,你不写出来怎么分析呀!!!
 
i2c的协议看了吗?不是很难吧,


 


>宋老师,各位朋友大家好: >     由于需要用两个gpio模拟i2c,现在我使用linux自带的i2c-gpio.c,我的注册信息如下: >     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 = 2, > .dev = { > .platform_data = &i2c3_data, > }, >}; >static struct platform_device *platform_devs_pre[] __initdata = { > &pnx_wavex_gpio_device, >               & i2c3_device,//注册 >}; >static struct i2c_board_info i2c_devices[] = { > { > I2C_BOARD_INFO("lis35de", 0x1C), > }, > >}; >int __init pnx67xx_devices_init(void) >{ > pr_debug("%s()\n", __func__); > platform_add_devices(platform_devs_pre, >ARRAY_SIZE(platform_devs_post)); > i2c_register_board_info(1, i2c_devices, ARRAY_SIZE(i2c_devices)); > return 0; >} >在我的lis35de驱动中: >static const struct i2c_device_id lis35de_id[] = { > { "lis35de", 0 }, > { } >}; > >static struct i2c_driver st_lis35de_driver = { > .probe = st_lis35de_probe, > .remove = st_lis35de_remove, > .suspend = st_lis35de_suspend, > .resume = st_lis35de_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_driver); >} > >static void __exit st_lis35de_exit(void) >{ > i2c_del_driver(&st_lis35de_driver); >} >
>
>-- 
>_______________________________________________
>Linux设备驱动开发邮件列表 linux...@googlegroups.com
>http://groups.google.gr/group/linuxdriver?hl=zh-CN
>退订请使用原订阅邮箱发邮件至:linuxdriver+unsub...@googlegroups.com


--
_______________________________________________
Linux设备驱动开发邮件列表 linux...@googlegroups.com
http://groups.google.gr/group/linuxdriver?hl=zh-CN
退订请使用原订阅邮箱发邮件至:linuxdriver+unsub...@googlegroups.com

xiewen202

unread,
Jul 1, 2010, 9:13:50 PM7/1/10
to linux...@googlegroups.com
jiangmin7790594谢谢,我是和你一样理解的,我去看了刘洪涛老师的csda.
我看了他的例子client是自己分配和初始化的,并且实现了:
attach_adapter= pca953x_attach_adapter, //调用适配器连接设备
.detach_client= pca953x_detach_client,//让设备脱离适配器
但是在i2c-gpio中我看原码好是内核分配的,attach_adapter和detach_client也用内核自带的。
 
其实我的驱动我已实现了但是这个client 还是不能理解.
Reply all
Reply to author
Forward
0 new messages