bit_data->getscl = i2c_gpio_getscl; bit_data->getsda = i2c_gpio_getsda; sda读写 gpiod_set_value_cansleep设置GPIO sda数据为0/1 gpiod_get_value_cansleep获取GPIO sda数据的值 static void i2c_gpio_setsda_val(void *data, int state) { struct i2c_gpio_private_data *priv = data; gpio...
先通过对i2c-gpio所定义的结构体初始化(包括初始化i2c的2条线,频率,timeout等)并将i2c-gpio模块编译进内核,实现用GPIO_X,GPIO_Y 2条GPIO线注册新的i2c总线。此时这个模块对i2c设备是透明的,及挂在这2条GPIO线的i2c设备可以直接使用Linux内核通用的i2c设备注册,传输和注销等方法。 步骤: 首先确认在注册i2c-gpio...
I2C的gpio模拟用的platform_data struct i2c_gpio_platform_data { unsigned int sda_pin; unsigned int scl_pin; int udelay; int timeout; unsigned int sda_is_open_drain:1; unsigned int scl_is_open_drain:1; unsigned int scl_is_output_only:1; };...
static int __devinit i2c_gpio_probe(struct platform_device *pdev) { struct i2c_gpio_platform_data *pdata; struct i2c_algo_bit_data *bit_data; struct i2c_adapter *adap; int ret; pdata = pdev->dev.platform_data; if (!pdata) return -ENXIO; ret = -ENOMEM; adap = kzalloc(sizeof(...
在drivers/i2c/busses/i2c-gpio.c中 static int __devinit i2c_gpio_probe(struct platform_device *pdev) { struct i2c_gpio_platform_data *pdata; struct i2c_algo_bit_data *bit_data; struct i2c_adapter *adap; int ret; pdata = pdev->dev.platform_data; ...
of_i2c_gpio_get_props作用是从设备树中读取I2C GPIO模拟总线的相关属性,这些属性包括时延、超时时间以及SDA和SCL引脚的特性,然后将这些属性值保存到平台数据结构体中,供后续的初始化和配置使用。 static void of_i2c_gpio_get_props(struct device_node *np, struct i2c_gpio_platform_data *pdata) { u32 reg...
注意这里的id将它赋值了0,至于到底有什么用,后面再来细看。这个结构里面还包含一个最重要的数据i2c_gpio_adapter_data,它struct i2c_gpio_platform_data结构类型变量,这个结构体类型定义在include/linux/i2c-gpio.h中。 [html] view plaincopyprint? 1.1. struct i2c_gpio_platform_data {...
这属于platform驱动,而非I2C设备驱动。在Linux系统中,无论是x86还是arm架构,都可以直接使用现成的i2c-gpio.ko驱动来实现GPIO模拟I2C Bus。加载该驱动后,可以通过i2cdetect命令扫描总线下存在的I2C设备。驱动分析:1.判断使用of或者platform获取GPIO信息,例如of,使用of_property_read_u32和of_property_...
在这一步的工作中,可以控制相关的GPIO进行摄像头使能,控制RESET及POWERON来让摄像头正常工作。 GC0328的上电时序如下图所示: 第二步:给摄像头提供时钟 这一步也比较的关键,对于摄像头来说,其时钟就是心跳,如果要让摄像头正常的工作,则需要x1000的CIM提供24MHz的时钟给摄像头。
首先来看一下I2C总线,在讲platform的时候就说过,platform是虚拟出来的一条总线,目的是为了实现总线、设备、驱动框架。对于I2C而言,不需要虚拟出一条总线,直接使用I2C总线即可。I2C总线驱动重点是I2C适配器(也就是SOC的I2C接口控制器)驱动,这里要用到两个重要的数据结构:i2c_adapter和i2c_algorithm,Linux内核将...