一、 环境介绍
软件环境:openwrt稳定发行版 barrier_breaker
硬件环境:主控芯片 MT7620n eeprom 24c02
本文主要介绍,在openwrt环境下使用mt7620n芯片内置i2c模块操作eeprom
的方法。
二、 添加内核支持
#cd barrier_breaker/
#makemenuconfig
Kernelmodules --->
I2Csupport --->
<*>kmod-i2c-core
<*> kmod-i2c-algo-bit
<*>kmod-i2c-ralink
保存退出
#make kernel_menuconfig
DeviceDrivers --->
<*>I2C support --->
<*>I2C device interface
I2CHardware Bus support --->
<*>Ralink I2C Controller
保存退出
三、 修改dts内核树
#cdbarrier_breaker
#cdtarget/linux/ramips/dts/
#vim xxx.dts #编辑对应的dts文件
在palmbus下加入i2c总线加入:
palmbus@10000000{
i2c@900 {
compatible ="ralink,mt7620n-i2c", "ralink,rt2880-i2c";
reg= <0x900 0x100>;
resets = <&rstctrl 16>;
reset-names= "i2c";
#address-cells = <1>;
#size-cells= <0>;
status= "okay";
};
}
在pinctrl中将i2c引脚转换为i2c模式:
pinctrl {
state_default: pinctrl0 {
default {
ralink,group = "ephy","wled", "pa", "wdt", "uartf";
ralink,function = "gpio";
};
i2c_pins:i2c {
i2c{
lantiq,group= "i2c";
lantiq,function= "i2c";
};
};
}
保存退出
重新编译固件,烧写成功后发现/dev/下面多了一个设备文件/dev/i2c-0,这就说明i2c驱动加载成功了,下面将说明如何在应用层中使用i2c驱动。
四、 应用层中使用i2c驱动
1、打开文件
fd= open(“/dev/i2c-0”, O_RDWR);
if(fd< 0)
{
perror(“open”);
}
2、设置设备地址
这里假设设备地址为0xA0
ioctl(fd,IIC_SLAVE, (0xA0 >> 1));
IIC_SLAVE为设置设备地址命令,在本驱动中其值为0x0703(可在源码中求证),在实际程序中不知道IIC_SLAVE定义在那个头文件中所以以0x0703代替,这里如有哪位大神了解还望指教。
3、写数据
向24c02的0x14和0x15中写入两个数据0x55,0x17
Unsignedchar buf[3] = {0x14, 0x55,0x17};
Write(fd,buf, 3);
这个函数实际操作流程如下:
1)发送起始信号;
2)发送设备地址(0xA0)加写标志位;
3)发送操作地址0x14;
4)发送数据0x55、0x17;
5)发送停止信号。
(注意:每次操作read()或wirte()都会发送设备地址,上述程序中虽然参数上数据长度为3,但实际会发送4个数据,这点很关键。)
4、读取数据
从24c02的0x14和0x15中读出数据
unsignedchar buf[2];
unsignedchar addr = 0x14;
write(fd,&addr, 1);
read(fd,buf, 2);
这个函数实际操作流程如下:
Write部分:
1)发送起始信号;
2)发送设备地址(0xA0)加写标志位;
3)发送操作地址0x14;
4)发送停止信号。
Read部分:
5)发送起始信号;
6)发送设备地址(0xA0)加读标志位;
7)读出两个字节数据;
8)发送停止信号