本文是参照了 stone8761 的一篇文章
我想在Linkit Smart MT7688上使用I2C访问PCF8563,使用的内核版本OpenWrt,chaos_calmer
15.05固件,该固件可以直接在/dev下看到i2c-0该文件节点,所以可以忽略内核修改部分。
直接修改dts文件即可,dts文件位置/home/wei/openwrt/target/linux/ramips/dts/LINKIT7688.dts
/home/wei/应换成自己的目录。
找到dts文件的palmbus@10000000,里面有
i2c@900 {
status = "okay";
};
修改为
i2c@900 {
status = "okay";
rtc@51 {
compatible = "nxp,pcf8563";
reg = <0x51>;
};
};
PCF8563文档中指出写地址为0xA2,读地址0xA3。linux识别的地址范围是0x03~0x77(i2ctools ./i2cdetect -r -y 0
测出)。0xA2右移一位后即是0x51。
make V=s
编译固件后即可访问i2c-0
测试代码:
#include <linux/i2c-dev.h>
void main(void)
{
int fd;
fd= open("/dev/i2c-0", O_RDWR);
if(fd< 0)
{
printf("“open”\n");
}
ioctl(fd, I2C_SLAVE, (0xA2 >> 1));//0x0703
unsigned char buf;
unsigned char addr = 0x02;//02为PCB8563的秒寄存器,每次读取都会看到变化
write(fd,&addr, 1);
read(fd,&buf, 1);
printf("[%2d]\n", buf);
}
上述博客中提到的I2C_SLAVE(作者笔误写成了IIC_SLAVE)定义问题,在这个头文件内#include <linux/i2c-dev.h>