Openwrt环境下I2C操作

一、          环境介绍

软件环境: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)发送停止信号

 

 

你可能感兴趣的:(openwrt)