1.吐槽
最近公司项目【Android 7.0 MTK8321平台】换新的地磁af133[afx8133j],又遇到坑了!报了这个错误,真奇葩!!!
报错如下
afx133err->[1243][@afx133_create_attr] driver_create_file (daemon) = -17
错误一:一开始遇到的是i2c报错,通信失败。
1.检查i2c地址有没有配对
地址有2个,0x1C和0x1E
从规格书中看,地址取决于A0叫接地还是接电源。
A0脚-接地的话:地址为0x1C
A0脚-接AVDD或者DVDD【就是接电源】的话:地址为0x1E*
2.检查reset有没有拉高
从规格书来看,地址是低有效,因此我们默认要拉高,跟硬件和fae沟通,要配置成output,并且拉高[outhigh],但是很奇葩的是,原理图上
【查看GPIO表,硬件上ENIT8[AH26]对应的就是GPIO8】
硬件原理图上接的是enit,因此配置的时候,配成中断拉高即可!这样通信才不会报错,配成out拉高还是无法通信!
报错二:driver_create_file (daemon) = -17
afx133err->[1243][@afx133_create_attr] driver_create_file (daemon) = -17
afx133err->[2384][@afx133_i2c_probe] create attribute err = -17
afx133err->[2478][@afx133_i2c_probe] err = -17
这个错误是真的奇葩,跟踪代码,最后发现
错误是-EEXITST,其实就是ERROR-EXITST,表示的是该节点存在了!!!
错误码查询网址
思考良久,怀疑是不是驱动代码有问题,找fae换了一份新的代码就ok了!
问题根源
注释掉这行代码就可以了,驱动就正常了。我把地址打印出来,发现赋值前后地址不同!!!
这里打印的格式不同,前面打印的%x,后面打印的是%d,
转换成16进制就是
i2c_addr[0]=0x1e,client->addr=0x0d
i2c_addr[0]=0x1e,client->addr=0x1e
代码中
client->addr = hw->i2c_addr[0]进行赋值,就改变了client->addr(设备地址),导致错误!