S3C2440 Linux驱动移植——AT24C02(EEPROM)驱动

开发板:TQ2440

内核:Linux 2.6.32

PC OS:Ubuntu 11.04

1.配置内核

打开I2C功能:



打开杂项设备,该选项打开后,EEPROM也就打开了。

 

 

2. 修改代码


修改文件: linux/arch/arm/mach-s3c2440/mach-smdk2440.c

增加如下代码片段:

#include <linux/i2c/at24.h>
static struct at24_platform_data at24c02 = {
	.byte_len	= SZ_2K / 8,
	.page_size	= 8,
	.flags		= 0,
};

static struct i2c_board_info __initdata smdk_i2c_devices[] = {
	/* more devices can be added using expansion connectors */
	{
		I2C_BOARD_INFO("24c02", 0x50),
		.platform_data = &at24c02,
	},
};

在smdk2440_machine_init函数中增加如下:

i2c_register_board_info(0, smdk_i2c_devices, ARRAY_SIZE(smdk_i2c_devices));

注意:上面许多参数是根据at24c02的参数来设置的,at24c02使用8位地址,内存大小2K比特位,也就是256K字节,页大小为8字节。

最后,需要注意,手册中at24c02的设备地址是0b 1 0 1 0 0 0 0 R/W, 其最低位是读写标志位,

但是在Linux中,I2C设备地址的最高位为0,而低七位地址就是手册中去掉R/W的剩余7位。因此,地址为0b 01010000(0x50)

3. 测试代码

       系统启动后,如果一切正常。会在/sys文件系统下展示出该设备,如下:

 

[root@yj4230-0050]#pwd

/sys/devices/platform/s3c2440-i2c/i2c-0/0-0050

[root@yj4230-0050]#ls

bus        eeprom     name      subsystem

driver     modalias  power      uevent

[root@yj4230-0050]#cat name

24c02

 

其中eeprom即为驱动导出的bin属性,通过读写eeprom即可访问设备,如下:

 

[root@yj4230-0050]#cat eeprom

i2ci2c-0: master_xfer[0] W, addr=0x50, len=1

i2ci2c-0: master_xfer[1] R, addr=0x50, len=128

i2ci2c-0: master_xfer[0] W, addr=0x50, len=1

i2ci2c-0: master_xfer[1] R, addr=0x50, len=128

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬

 

接着,编写代码进行测试,如下:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/io.h>

int main(int argc, char **argv)
{
	int ret, fd, i, j;
	char read_data[256];
	char write_data[256];
	char offset;
	
	fd = open("/sys/devices/platform/s3c2440-i2c/i2c-0/0-0050/eeprom", O_RDWR);
	if(fd < 0){
		printf("Open at24c02 fail\n");
		return -1;
	}
	
	ret = read(fd, &offset, 1);
	if(ret < 0){
		printf("Read error\n");
		return -1;
	}else if(ret < 1){
		perror("Incomplete read\n");
		printf("%d\n", ret);
		return -1;
	}
	
	for(i = 0; i < 256; i++)
		write_data[i] = offset+ 1 + i;
	
	lseek(fd, 0 , SEEK_SET);		//It's a must, or something wierd will happen
	
	ret = write(fd, write_data, 256);
	if(ret < 0){
		printf("Write error\n");
		return -1;
	}
	
	lseek(fd, 0 , SEEK_SET);	 //It's a must, or something wierd will happen
	
	ret = read(fd, read_data, 256);
	if(ret < 0){
		printf("Read error\n");
		return -1;
	}else if(ret < 256){
		perror("Incomplete read\n");
		printf("%d\n", ret);
		return -1;
	}
	
	for(i = 0; i < 256; i++){
		if(i %16 == 0)
			printf("\n");
		printf(" %03d ", read_data[i]);

	}	
	printf("\n");					
}

代码结果如下:

 

 





  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
EEPROM存储器AT24C02驱动是一种用于控制和操作AT24C02 EEPROM芯片的软件程序。AT24C02是一种2K位串行电路编程只读存储器(EEPROM),能够以字节为单位进行读写操作。下面是一个简单的EEPROM存储器AT24C02驱动的实现示例: 首先,需要确定与AT24C02芯片通信的硬件接口。一般来说,AT24C02芯片使用I2C(TWI)总线进行通信。因此,需要确保控制器上的I2C总线控制器(如I2C模块)已正确配置和初始化。 其次,需要实现与AT24C02芯片通信的相关函数,如写入数据、读取数据等。这些函数可以通过在控制器上通过I2C总线传输控制字节和数据字节来执行相关的EEPROM操作。 例如,实现写入数据的函数,可以按照以下步骤进行: 1. 通过发出启动条件向AT24C02芯片发送设备地址。设备地址应包括芯片的固定地址和A0、A1和A2引脚的状态,用来识别芯片的物理位置。 2. 发送一个字节的内存地址,确定要写入数据的EEPROM存储器地址。 3. 发送要写入的数据字节。 4. 等待写操作完成,可以通过轮询芯片或等待I2C总线中断来检查。 5. 发送停止位,结束写操作。 同样,读取数据的函数也可以按照类似的步骤进行实现,只不过在发送内存地址之后需要切换到读操作模式,并在读取数据后保存数据字节。 在驱动程序的应用中,可以使用这些函数来存储和检索数据。通过提供适当的地址,可以将数据写入或读取到AT24C02芯片的特定地址中。此外,除了基本的读写功能之外,还可以实现其他操作,如块写入、页写入等。 总之,EEPROM存储器AT24C02驱动程序通过I2C总线控制器与AT24C02芯片进行通信,实现了对EEPROM芯片的读写操作。驱动程序应提供适当的函数来进行数据存储和检索,并可以根据应用需求扩展其他功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值