找回密码
 注册
搜索
查看: 2693|回复: 8

[讨论] 高通gpio模拟i2c

[复制链接]
发表于 2018-3-6 17:31:31 | 显示全部楼层 |阅读模式
有人有类似成功的经验吗?
用内核函数i2c_gpio.c  i2c_algo_bit.c i2c_core.c设置gpio为i2c pin
目前可以抓到设备i2c-0/00-0048/input/input5
但是sda scl一直为高
在程序里手工拉低pin可以实现gpiod_set_value((),0);
但是就是状态state一直不更新
gpiod_set_value((),state);
用gpio_set_value效果一样
dtsi配置
i2c@0{
i2c-gpio,open-sda-drain;
i2c-gpio,open-scl-drain;
compatible="i2c-gpio";
....
ts@48{
compatible="ts_touch";
irq_gpio=<&tlmm ..  0x00>;
....
}


}


52RD网友  发表于 2018-3-8 12:06:15
单片机没有I2C controller, 就是用IO模拟I2C时序,做软件入门习题
发表于 2018-3-8 17:44:43 | 显示全部楼层
对于高通的7x27平台,首先在文件devices-msm7x27.c中添加设备如下:  
151.          
152.        static struct i2c_gpio_platform_data resources_gpio_i2c[] = {  
153.            {  
154.                .sda_pin=xx,  
155.                .scl_pin=xx,  
156.                .udelay=xx,  
157.                .sda_is_open_drain=1,  
158.                .scl_is_open_drain=1,  
159.        }  
160.        };  
161.        struct platform_device gpio_device_i2c = {  
162.            .name        = "i2c-gpio",  
163.            .id        = 2,  
164.            .dev = {  
165.                   .platform_data = &resources_gpio_i2c,  
166.            },  
167.        };  
168.          
169.        其中第一个结构体中sda_pin和scl_pin正是开发板上对应的gpio口(data线和clock线),udelay是与具体芯片时钟相关的参数,需要参考具体的datasheet。下面的两个open_drain是表明两个管脚是否是开漏电路,如果是则填1,否则填0。下面一个机构体中需要注意name应该填写i2c-gpio,另外id要注意设定为2,因为系统当中已经有两个I2C设备了。可以在当前文件中找到,另外也可以在设备启动之后用adb shell进入文件系统进行查看。  
170.          
171.        另外需要在该文件中添加上需要的头文件:#include <linux/i2c-gpio.h>。在头文件devices.h中添加上设备结构体的声明,extern struct platform_device gpio_device_i2c;否则编译过程会报错  
172.          
173.        然后将gpio_device_i2c放在board-msm7x27.c的数组devices中,形式请参考该数组中其他的设备。  
174.          
175.        最后还需要在该文件中对相关设备进行注册,比如添加如下代码:  
176.          
177.        static struct i2c_board_info i2c_gpio_devices[] = {  
178.            {  
179.                I2C_BOARD_INFO("tritonFN", 0x39),  
180.                .irq           =  MSM_GPIO_TO_INT(107),  
181.            },  
182.        };  
183.        然后再用i2c_register_board_info对其进行注册:  
184.          
185.        i2c_register_board_info(2, i2c_gpio_devices, ARRAY_SIZE(i2c_gpio_devices));  
186.          
187.        这样就完成了模拟步骤,可以直接用系统的I2C相关的注册等方法对设备进行注册和读写操作。  
点评回复

使用道具 举报

 楼主| 发表于 2018-3-8 18:04:09 | 显示全部楼层
谢谢回复.现在的问题是i2c_gpio.c  i2c_algo_bit.c
里调用的gpio_set_value和gpio_get_value有时候貌似对pin不起作用
用的是msm8996
adapter注册到了设备。从设备也识别了adapter,
只是在传送数据时
write 都是okay
read 读出来都是0x00 ,0xff?
点评回复

使用道具 举报

 楼主| 发表于 2018-3-8 18:07:59 | 显示全部楼层
点评回复

使用道具 举报

 楼主| 发表于 2018-3-13 17:22:11 | 显示全部楼层
已经成功驱动touch了。虽然波形不好
点评回复

使用道具 举报

发表于 2018-4-4 17:15:01 | 显示全部楼层
哇塞  好厉害呀  膜拜一下
点评回复

使用道具 举报

发表于 2018-6-30 15:50:48 | 显示全部楼层
都是高手啊,崇拜一下!
点评回复

使用道具 举报

发表于 2019-4-13 15:53:59 | 显示全部楼层
zyt8512 发表于 2018-3-13 17:22
已经成功驱动touch了。虽然波形不好

请教用GPIO口驱动I2C,量产后有没有什么问题?
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-26 11:00 , Processed in 0.060155 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表