本文是參照了 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>