单片机
返回首页

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

2017-09-23 来源:eefocus

开发板:TQ2440

内核:Linux 2.6.32

PC OS:Ubuntu 11.04


1.配置内核

打开I2C功能:



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

 

 

2. 修改代码



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

增加如下代码片段:


  1. #include   

  2. static struct at24_platform_data at24c02 = {  

  3.     .byte_len   = SZ_2K / 8,  

  4.     .page_size  = 8,  

  5.     .flags      = 0,  

  6. };  

  7.   

  8. static struct i2c_board_info __initdata smdk_i2c_devices[] = {  

  9.     /* more devices can be added using expansion connectors */  

  10.     {  

  11.         I2C_BOARD_INFO('24c02', 0x50),  

  12.         .platform_data = &at24c02,  

  13.     },  

  14. };  



在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

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

 

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


  1. #include   

  2. #include   

  3. #include   

  4. #include   

  5. #include   

  6. #include   

  7. #include   

  8.   

  9. int main(int argc, char **argv)  

  10. {  

  11.     int ret, fd, i, j;  

  12.     char read_data[256];  

  13.     char write_data[256];  

  14.     char offset;  

  15.       

  16.     fd = open('/sys/devices/platform/s3c2440-i2c/i2c-0/0-0050/eeprom', O_RDWR);  

  17.     if(fd < 0){  

  18.         printf('Open at24c02 fail\n');  

  19.         return -1;  

  20.     }  

  21.       

  22.     ret = read(fd, &offset, 1);  

  23.     if(ret < 0){  

  24.         printf('Read error\n');  

  25.         return -1;  

  26.     }else if(ret < 1){  

  27.         perror('Incomplete read\n');  

  28.         printf('%d\n', ret);  

  29.         return -1;  

  30.     }  

  31.       

  32.     for(i = 0; i < 256; i++)  

  33.         write_data[i] = offset+ 1 + i;  

  34.       

  35.     lseek(fd, 0 , SEEK_SET);        //It's a must, or something wierd will happen  

  36.       

  37.     ret = write(fd, write_data, 256);  

  38.     if(ret < 0){  

  39.         printf('Write error\n');  

  40.         return -1;  

  41.     }  

  42.       

  43.     lseek(fd, 0 , SEEK_SET);     //It's a must, or something wierd will happen  

  44.       

  45.     ret = read(fd, read_data, 256);  

  46.     if(ret < 0){  

  47.         printf('Read error\n');  

  48.         return -1;  

  49.     }else if(ret < 256){  

  50.         perror('Incomplete read\n');  

  51.         printf('%d\n', ret);  

  52.         return -1;  

  53.     }  

  54.       

  55.     for(i = 0; i < 256; i++){  

  56.         if(i %16 == 0)  

  57.             printf('\n');  

  58.         printf(' %03d ', read_data[i]);  

  59.   

  60.     }     

  61.     printf('\n');                     

  62. }  


代码结果如下:

 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章