1.配置内核

打开I2C功能:

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

2. 修改代码

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

增加如下代码片段:

  1. #include <linux/i2c/at24.h>
  2. static struct at24_platform_data at24c02 = {
  3. .byte_len   = SZ_2K / 8,
  4. .page_size  = 8,
  5. .flags      = 0,
  6. };
  7. static struct i2c_board_info __initdata smdk_i2c_devices[] = {
  8. /* more devices can be added using expansion connectors */
  9. {
  10. I2C_BOARD_INFO("24c02", 0x50),
  11. .platform_data = &at24c02,
  12. },
  13. };

在smdk2440_machine_init函数中增加如下:

  1. 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

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <sys/ioctl.h>
  5. #include <stdlib.h>
  6. #include <fcntl.h>
  7. #include <sys/io.h>
  8. int main(int argc, char **argv)
  9. {
  10. int ret, fd, i, j;
  11. char read_data[256];
  12. char write_data[256];
  13. char offset;
  14. fd = open("/sys/devices/platform/s3c2440-i2c/i2c-0/0-0050/eeprom", O_RDWR);
  15. if(fd < 0){
  16. printf("Open at24c02 fail\n");
  17. return -1;
  18. }
  19. ret = read(fd, &offset, 1);
  20. if(ret < 0){
  21. printf("Read error\n");
  22. return -1;
  23. }else if(ret < 1){
  24. perror("Incomplete read\n");
  25. printf("%d\n", ret);
  26. return -1;
  27. }
  28. for(i = 0; i < 256; i++)
  29. write_data[i] = offset+ 1 + i;
  30. lseek(fd, 0 , SEEK_SET);        //It's a must, or something wierd will happen
  31. ret = write(fd, write_data, 256);
  32. if(ret < 0){
  33. printf("Write error\n");
  34. return -1;
  35. }
  36. lseek(fd, 0 , SEEK_SET);     //It's a must, or something wierd will happen
  37. ret = read(fd, read_data, 256);
  38. if(ret < 0){
  39. printf("Read error\n");
  40. return -1;
  41. }else if(ret < 256){
  42. perror("Incomplete read\n");
  43. printf("%d\n", ret);
  44. return -1;
  45. }
  46. for(i = 0; i < 256; i++){
  47. if(i %16 == 0)
  48. printf("\n");
  49. printf(" %03d ", read_data[i]);
  50. }
  51. printf("\n");
  52. }

代码结果如下:

AT24Cxx(EEPROM)子系统的更多相关文章

  1. I.MX6 AT24Cxx eeprom Linux i2c-gpio

    /************************************************************************** * I.MX6 AT24Cxx eeprom L ...

  2. 嵌入式Linux内核I2C子系统详解

    1.1 I2C总线知识 1.1.1  I2C总线物理拓扑结构     I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高 ...

  3. (6)s3c2440用I2C接口访问EEPROM

    在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来, ...

  4. Linux usb子系统(一):子系统架构

    一.USB协议基础知识   前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB). ...

  5. STM32驱动AT24CXX系列芯片

    AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms, ...

  6. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

  7. AT24 I2C EEPROM解析及测试

    关键词:AT24.I2C.nvmem.EEPROM. 1. AT24C介绍 AT24C是一款采用I2C通信的EEPROM,相关驱动涉及到I2C和nvmem. I2C是读写数据的通道,nvmem将AT2 ...

  8. AT24Cxx学习笔记

    AT24Cxx是E2PRom的一个系列: 存储空间大小:AT24C02——2Kbit(256Bytes).AT24C04——4Kbit(512Bytes).AT24C08——8Kbit(1024Byt ...

  9. SPI子系统分析之四:驱动模块

    内核版本:3.9.5 SPI控制器层(平台相关) 上一节讲了SPI核心层的注册和匹配函数,它是平台无关的.正是在核心层抽象了SPI控制器层的相同部分然后提供了统一的API给SPI设备层来使用.我们这一 ...

随机推荐

  1. /usr 的由来及/usr目录结构 [转]

    一直好奇包罗众多程序的usr目录为什么叫usr呢?usr到底是什么的缩写,终于找到比较靠谱的答案了 /usr 的由来及/usr目录结构 作者 AN SHEN| 发布于 2011-11-05 在 lin ...

  2. Oracle中文乱码解决办法总结

    AMERICAN_AMERICA.WE8ISO8859P1,这个字符编码是西欧字符编码,对应于.Net的就是iso-8859-1字符编码,所以只需要改到系统的默认字符编码就行了. 解决方法: (1) ...

  3. Cmder 设置默认打开目录、解决中文乱码

    win + alt + p //打开设置 选择Startup-Task,修改{cmd::Cmder}项,把: *cmd /k "%ConEmuDir%\..\init.bat" - ...

  4. IOS 项目的瘦身工具

    http://maniacdev.com/2014/01/tool-a-ruby-gem-allowing-you-to-quickly-find-and-remove-unused-imports- ...

  5. MySQL 5.6学习笔记(函数)

    1. 数学函数 ABS(x)   返回x的绝对值BIN(x)     返回x的二进制(OCT返回八进制,HEX返回十六进制)CEIL(x)或CEILING(x)   返回大于x的最小整数值EXP(x) ...

  6. [hihoCoder] 第四十八周: 拓扑排序·二

    题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...

  7. Android Gradle 引入 aar 方式

    方式 1 File -> New -> New Module -> Import .JAR/.AAR Package Choose File Finish 在 build.gradl ...

  8. [na]IP分片抓包实验

    这两点比较重要 1.IP+ICMP+DATA = 1500字节 2.ping size指定的是data的大小. 3,可以ping大包+不分片检测mtu(分片发生在出口,如果包尺寸大于接口ip mtu, ...

  9. 【Unity】2.10 利用VS2015编辑Unity的C#脚本

    分类:Unity.C#.VS2015 创建日期:2016-03-31 一.简介 用VS2015编辑C#脚本时,如果让其"显示所有文件",就会看到VS2015解决方案资源管理器中项目 ...

  10. Windows系统环境变量path优先级测试报告

    转自:http://bluekylin.cnblogs.com/archive/2005/12/16/298797.html 总以为自己很已经会操作windows了,今天在它帮助中看到一大片还不知道的 ...