AT24Cxx(EEPROM)子系统
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
接着,编写代码进行测试,如下:
- #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");
- }
代码结果如下:
AT24Cxx(EEPROM)子系统的更多相关文章
- I.MX6 AT24Cxx eeprom Linux i2c-gpio
/************************************************************************** * I.MX6 AT24Cxx eeprom L ...
- 嵌入式Linux内核I2C子系统详解
1.1 I2C总线知识 1.1.1 I2C总线物理拓扑结构 I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高 ...
- (6)s3c2440用I2C接口访问EEPROM
在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来, ...
- Linux usb子系统(一):子系统架构
一.USB协议基础知识 前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB) USB2.0版本速度480Mbps(高速USB). ...
- STM32驱动AT24CXX系列芯片
AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms, ...
- Linux usb子系统(一) _写一个usb鼠标驱动
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...
- AT24 I2C EEPROM解析及测试
关键词:AT24.I2C.nvmem.EEPROM. 1. AT24C介绍 AT24C是一款采用I2C通信的EEPROM,相关驱动涉及到I2C和nvmem. I2C是读写数据的通道,nvmem将AT2 ...
- AT24Cxx学习笔记
AT24Cxx是E2PRom的一个系列: 存储空间大小:AT24C02——2Kbit(256Bytes).AT24C04——4Kbit(512Bytes).AT24C08——8Kbit(1024Byt ...
- SPI子系统分析之四:驱动模块
内核版本:3.9.5 SPI控制器层(平台相关) 上一节讲了SPI核心层的注册和匹配函数,它是平台无关的.正是在核心层抽象了SPI控制器层的相同部分然后提供了统一的API给SPI设备层来使用.我们这一 ...
随机推荐
- 【转载】mysql配置模板(my-*.cnf)参数详细说明
原文:https://yq.aliyun.com/ziliao/142086 mysql 性能优化分享,好文章: http://www.jb51.net/article/28363.htm mysql ...
- vuex 温故而知新 mapState的使用
虽然早就知道 mapState 的存在,但还是极少使用.最近代码的computed变多才开始意识到好处. 原来的代码: computed: { findLastSixMonthAir () { ret ...
- JavaWeb 返回json数据的两种方式
1.说明 由于一般情况下,由浏览器(前端)发送请求,服务器(后台)响应json数据,所以这里结合js进行说明: A服务器发送请求至B服务器,并接收其返回的json数据,见文末推荐,这里不再赘述! 2. ...
- 【python】Python 资源大全中文版
申明:感谢原作者的整理与分享,本篇文章分享自:https://www.jianshu.com/p/9c6ae64a1bd7 GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常 ...
- 部署到Google App Engine时中途退出后引起的问题
如果部署GAE时正在upload files时退出,下次部署时会报错 Another transaction by user is already in progress for this app a ...
- 分享:三种取消选中单选框radio的方法
三种取消选中radio的方式,本文依赖于jQuery,其中第一种,第二种方式是使用jQuery实现的,第三种方式是基于JS和DOM实现的. <!DOCTYPE HTML> <html ...
- 云服务设置多台tomcat开机自启动
紧接此篇文章:http://www.cnblogs.com/leechenxiang/p/7091731.html 1. 修改profile,添加红框内6行代码 vim /etc/profile 代码 ...
- [na]wireshark排查打印机问题
抓包工具排除故障 前言:上网慢,可能是内网堵了.装上wireshark,可抓到广播包,多播包,以及发给自己的包.如果想抓lan内其他人之间的通信包,那就要在sw上做端口镜像. 1.背景 调试打印机的人 ...
- 【Unity】第12章 导航网格和寻路
开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 NavMesh(导航网格)是3D游戏世界中用于实现"动态"物体自动寻路的一 ...
- 深入理解Linux内核-内存寻址
1.逻辑地址怎么转换为线性地址的: 逻辑地址 = 段选择符(16bit)+偏移量(32bit) 段选择符又三部分组成:index(索引序号).T1(表指示器).RPL(request privileg ...