SOC:RK3568
模块:tef6686
系统:Android12
1.首先目前tef6686只有单片机才有驱动,Linux要集成只需要控制模块内部的i2c地址的顺序
从github下载tef6686 Andruino的代码 https://github.com/tehniq3/TEF6686
解压进入TEF6686-master\TEF6686_1602i2c_v6beta
这时候你可以发现TEF6686_1602i2c_v5.ino 和其他C++文件
.ino 里的 void setup() 和 void loop()
分别是Andruino 的执行函数和循环函数
由于我的tef6686挂载在i2c-5 设备树 记得打开
会产生节点/dev/i2c-5
&i2c5 {
status = "okay";
...
tef6686: tef6686@64 {
status = "okay";
compatible = "radio_tef6686";
reg = <0x64>;
};
...
};
由于保密关系,全部代码不好展示。
像里面的串口和LCD都得通通删掉,只保留tef6686相关的逻辑代码即可
我们主要修改点是Andruino I2C的实现方法,Linux下I2C应用控制主要如下
Tuner_Interface.cpp
unsigned char Tuner_WriteBuffer(unsigned char *buf, uint16_t len)
{
uint16_t i;
uint8_t r;
if (fd < 0) {
ALOGD("error fd < 0");
return -1;
}
struct i2c_msg msgs[1] = {
{I2C_ADDR, 0, len, buf},
};
struct i2c_rdwr_ioctl_data idata = {
.msgs = msgs,
.nmsgs = 1,
};
if (ioctl(fd, I2C_RDWR, &idata) < 0)
{
ALOGD(" ioctl I2C_RDWR error %d",fd);
return -1;
}
usleep(1 * 1000);
return 1;
}
unsigned char Tuner_ReadBuffer(unsigned char *addr,uint16_t addrLen,unsigned char *buf, uint16_t len)
{
if (fd < 0) {
ALOGD("chenjx fd < 0");
return -1;
}
unsigned char reg = 0;
uint16_t i =1;
struct i2c_msg msgs[2] = {
{I2C_ADDR, 0, addrLen, addr},
{I2C_ADDR, I2C_M_RD, len, buf},
};
struct i2c_rdwr_ioctl_data idata = {
.msgs = msgs,
.nmsgs = 2,
};
if (ioctl(fd, I2C_RDWR, &idata) < 0)
{
ALOGD(" I2C_RDWR error");
return -1;
}
return 1;
}
void Tuner_I2C_Init()
{
// Wire.begin();
fd = open("/dev/i2c-5", O_RDWR);
if (fd < 0){
ALOGD("open %s false","/dev/i2c-5");
return ;
}
ALOGD("open %s succuss","/dev/i2c-5");
}
tef6686目前常用的有9.216 M和12 M晶振,要确认自己板卡的晶振是多少,根据下图进行配置
例如我的是9.216 M
修改9, 0x40,0x04,0x01,0x00,0x8C,0xA0,0x00,0x00,0x00,//APPL_Set_ReferenceClock
晶振没配对,只能搜出杂音
上层应用程序或者APP打开i2c-5记得给权限chmod 777 i2c-5。
本片完