一、首先简单介绍一下eeprom的特性 U盘和MP3里用的就是这种存储器。用作存储Bootloader以及操作系统或者程序代码,或者直接当硬盘使用(U盘)。Flash存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失。 1.1, EEPROM以单字节读写,FLASH部分芯片只能以块方式擦除(整片擦除),部分芯片可以单字节写入(编程),一般需要采用块写入方式。 1.2,FLASH比EEPROM读写速度更快,可靠性更高。 1.3,价格方面比较,FLASH比EEPROM贵。所以,我们的版卡参数信息,等一些固定的,小量的,不需要经常修改资料信息放在EEPROM中。而flash作为存储程序的存储器,存放操作系统代码等需要快速读写的,经常访问的数据。 二、设备树配置及介绍 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”,常称该值为“读地址”。 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 |
|
来自: charlie_linux > 《Linux》