实验三. 基于IIC总线的EEPROM驱动移植实验
实验目的
实验环境
- 硬件:CBT-EMB-MIP 实验平台,PC机;
- 软件:VMware,Linux OS;
实验内容
实验原理
- AT24CXX芯片简介
AT24CXX是美国ATMEL公司的低功耗CMOS串行EEPROM,典型的型号有AT24C01A/02/04/08/16等5种,它们的存储容量分别是1024/2048/4096/8192/16384位;也就是128/256/512/1024/2048字节;使用电压级别有5V,2.7V,2.5V,1.8V。
- 平台主板外设原理图
AT24CXX的1、2、3脚是三条地址线,用于确定芯片的硬件地址(因为只有一块器件平台主板中直接接地);第8脚和第4脚分别为正、负电源。第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,SDA和SCL都需要和正电源间各接一个5.1K的电阻上拉。第7脚为WP写保护端,接地时允许芯片执行一般的读写操作。接电源端时不允许对器件写。
AT24CXX中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。
5. 实验步骤
配置内核
- 打开I2C支持
Location:
│ -> Device Drivers │
│ -> I2C support (I2C [=y])
- 打开杂项设备,该选项打开后,EEPROM也就打开了。
Location:
│ -> Device Drivers │
│ -> Misc devices │
│ -> EEPROM support
行内代码块 code
修改代码,在内核板级支持包中增加AT24CXX设备配置
linux-3.5内核中已经包含at24cxx芯片的驱动源码,具体位置为:
include/linux/i2c/at24.h
/drivers/misc/eeprom/at24.c
修改板级支持包文件: arch/arm/mach-exynos/mach-tiny.c
增加如下代码:
#ifdef CONFIG_EEPROM_AT24
#include <linux/i2c/at24.h>
static struct at24_platform_data at24c02 = {
.byte_len = SZ_2K / 8,
.page_size = 8,
.flags = 0,
};
#endif
static struct i2c_board_info smdk4x12_i2c_devs0[] __initdata = {
#ifdef CONFIG_EEPROM_AT24
{
I2C_BOARD_INFO("24c02", 0x50),
.platform_data = &at24c02,
},
#endif
};
代码说明:AT24CXX使用8位地址,内存大小2K比特位,也就是256K字节,页大小为8字节。
手册中AT24CXX的设备地址是
1 | 0 | 1 | 0 | A2 | A1 | A0 | R/W |
---|---|---|---|---|---|---|---|
其最低位是读写标志位,但是在Linux中,I2C设备地址的最高位为0,而低七位地址就是手册中去掉R/W的剩余7位。在实验原理中可知A2 A1 A0引脚接GND,因此,地址为0b 01010000(0x50)。
编译并烧写内核
按照Android光盘配套烧写文档将新生成的内核镜像文件zImage 烧写到Android平台设备中(Android系统如何安装详见Android光盘\IMG\Cortex-A9系统烧写说明.pdf)
在终端中查看eeprom设备
新内核烧写成功后启动Android 实验平台,可以在串口终端中查看生成的eeprom
设备。
root@android:cd /sys/bus/platform/devices/s3c2440-i2c.0/i2c-0/0-0050
root@android:/sys/bus/platform/devices/s3c2440-i2c.0/i2c-0/0-0050 # ls
driver
eeprom
modalias
name
power
subsystem
uevent