分享

Linux系统下eeprom 驱动调试(一)

 charlie_linux 2021-07-29

一、首先简单介绍一下eeprom的特性

U盘和MP3里用的就是这种存储器。用作存储Bootloader以及操作系统或者程序代码,或者直接当硬盘使用(U盘)。Flash存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失。

1.1, EEPROM以单字节读写,FLASH部分芯片只能以块方式擦除(整片擦除),部分芯片可以单字节写入(编程),一般需要采用块写入方式。

1.2,FLASH比EEPROM读写速度更快,可靠性更高。

1.3,价格方面比较,FLASH比EEPROM贵。所以,我们的版卡参数信息,等一些固定的,小量的,不需要经常修改资料信息放在EEPROM中。而flash作为存储程序的存储器,存放操作系统代码等需要快速读写的,经常访问的数据。

二、设备树配置及介绍

eeprom 挂在 i2c总线上的0控制器上,使用 i2c 总线进行通讯

设备数配置:

hps_0_i2c0: i2c@0xffc04000 {

        ...

            eeprom: atmel,24c02@0x50{

                compatible = "atmel,24c02";

                reg = <0x00000050>;

pagesize = <8>;

            };

        };

eeprom 设备树参数介绍:

compatible: 用作匹配对应的设备驱动,一般写 “<设备商编号>, <设备类型>” ,如果没有特定的厂商驱动,就选择通用的  <设备类型> 的驱动

reg: eeprom 在 I2C 总线上的地址

pagesize: 页写的字节长度,一个错误的值可能造成数据丢失,如果没有给定的值,一般设为 “1” 比较安全,只是写入速度慢一点

三、驱动代码位置:

kernel 中驱动代码在于  drivers/misc/eeprom/

四、硬件原理图介绍

AT24C02的高4位是固定的,为1010b,低3位则由A0/A1/A2信号线的电平决定。按照我们此处的连接, A0/A1/A2 均为 0,所以EEPROM 的 7 位设备地址是: 1010 000b ,即 0x50。

    由于 I2C 通讯时常常是地址跟读写方向连在一起构成一个 8 位数,且当 R/W 位为 0 时,表示写方向,所以加上 7 位地址,其值为“ 0xA0”,常称该值为 I2C 设备的“写地址”;当 R/W 位为 1 时,表示读方向,加上 7 位地址,其值为“ 0xA1”,常称该值为“读地址”。

从上图看一看出最后一位为 R/W 位,在读写数据时用到,先不用管这个位,高 4 位定死为 10 ,那么决定 I2C 地址的只剩下 A2 A1 A0 。

综上所述:地址为 1010000 和原理图上的地址相符。

五、内核配置

make menuconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

Device Drivers  ---> 

    Misc devices  --->

        EEPROM support  ---> 

            <*> I2C EEPROMs / RAMs / ROMs from most vendors 

更新内核镜像系统启动后,可以查看出设备驱动是否已编进内核镜像里:

# ls /sys/bus/i2c/drivers/ at24/

六、测试

查看到设备驱动是否与设备树里描述的i2c设备匹配:

# ls /sys/bus/i2c/drivers/at24/

0-0050/  bind     uevent   unbind

设备驱动完成后,只需下面操作就可以访问eeprom了: 测试见下图

# echo "kkkk" > /sys/bus/i2c/devices/0-0050/eeprom 

 # cat /sys/bus/i2c/devices/0-0050/eeprom

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多