高通sdm660普通gpio模拟I2C功能
sdm660-blsp.dtsi中配置如下:
aliases {
...
i2c9 = &i2c_9;
}
i2c_9: i2c_9 {
compatible = "i2c-gpio";
#address-cells = <1>;
#size-cells = <0>;
gpios= <&tlmm 38 0>, <&tlmm 39 0>;
i2c-gpio,delay-us = <2>;
i2c-gpio,timeout-ms = <20>;
pinctrl-names = "default";
pinctrl-0 = <&i2c_9_active>;
status = "okay";
};
sdm660-pinctrl.dtsi 中配置对应的gpio
i2c_9_active: i2c_9_active {
mux {
/* CLK, DATA */
pins = "gpio38","gpio39";
function = "gpio";
};
config {
pins = "gpio38","gpio39";
bias-pull-up; /* PULL UP*/
drive-strength = <2>; /* 2 MA */
};
};
i2c_9_suspend: i2c_9_suspend {
mux {
/* CLK, DATA */
pins = "gpio38","gpio39";
function = "gpio";
};
config {
pins = "gpio38","gpio39";
bias-pull-down; /* PULL DOWN */
drive-strength = <2>; /* 2 MA */
};
};
具体驱动代码中I2C 读写函数
static int aw2015_write(struct aw2015_led *led, u8 reg, u8 val){
int ret = 0;
struct i2c_client *i2c = led->client;
struct i2c_msg xfer[2];
if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_NOSTART))
return -ENOTSUPP;
xfer[0].addr = i2c->addr;
xfer[0].flags = 0;
xfer[0].len = 1;
xfer[0].buf = (void *)®
xfer[1].addr = i2c->addr;
xfer[1].flags = I2C_M_NOSTART;
xfer[1].len = 1;
xfer[1].buf = (void *)&val;
ret = i2c_transfer(i2c->adapter, xfer, 2);
if (ret == 2)
return 0;
if (ret < 0)
return ret;
else
return -EIO;
}
static int aw2015_read(struct aw2015_led *led, u8 reg, u8 *val){
int ret = 0;
struct i2c_client *i2c = led->client;
struct i2c_msg xfer[2];
xfer[0].addr = i2c->addr;
xfer[0].flags = 0;
xfer[0].len = 1;
xfer[0].buf = (void *)®
xfer[1].addr = i2c->addr;
xfer[1].flags = I2C_M_RD;
xfer[1].len = 1;
xfer[1].buf = val;
ret = i2c_transfer(i2c->adapter, xfer, 2);
if (ret == 2)
return 0;
else if (ret < 0)
return ret;
else
return -EIO;
}