高通sdm660普通gpio模拟I2C功能

高通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 *)&reg;

 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 *)&reg;

 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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值