




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、EEPROM读写技术一、 确定任务1、 掌握基本的字符设备的驱动程序设计。2、 掌握基本的文件操作。3、 掌握在操作系统下的IIC驱动程序的原理。二、 学习内容 1、 阅读S5PV210数据手册,熟悉IIC控制器的原理。2、 熟悉EEPROM器件FM24CL04的数据手册。3、 编写makefile文件。4、 下载并调试操作FM24CL04的应用程序。三、基础知识1、 硬件原理:a) 原理图:·b) 寄存器简介:· 系统框图:I2C控制器的主要作用是在SCL时钟的同步下,将数据逐位移出IO引脚。I2C时序图请读者自行查看FM24CL04数据手册。寄存器I2CCON主要最用是
2、设置分频比。I2CSTAT状态寄存器主要用于设置控制器的工作模式,设置起始与结束条件。I2CADD地址寄存器,用于保存从机地址。I2CDS数据移位寄存器,主要用于发送和接收数据。四、基本原理1、 I2C协议介绍:请读者详细查看AT24C系列EERPOM的数据手册及IIC总线规范相关资料。2、 驱动原理:a) Linux系统对I2C总线具有很好的支持。与硬件物理连接相对应的,Linux的I2C框架中各个部分的关系如下图所示:b) 从上图中,可以看出 Linux中,IIC的实现结构分为四个层次:· IIC核心服务层,图中i2c-core的地方,具体的实现代码文件是在 /$(K
3、ERNEL_DIR)/drivers/i2c/i2c-core.c中。这一层主要的功能是向上、下两层提供设备管理的服务,这些服务与具体的硬件底层无关,下层的IIC总线控制器驱动(图中Adapter)可以调用它的核心服务来向系统加入对该IIC总线的支持。而上层的具体与连接在该总线上的设备,如EEPROM,通讯的驱动程序可以调用核心层的服务与硬件设备进行读写等通讯。从这里我们可以看出这层主要起一个桥接的作用。· IIC总线驱动层,图中Adapter的地方,在GEC210实验板上,具体的实现代码文件是在/$(KERNEL_DIR)/drivers/i2c/busses/i2c-s3c241
4、0.c中。这一层主要实现对具体的IIC总线控制器的驱动。具体控制器芯片的IIC控制方式不同,所以对不同的控制器要有不同的驱动,而对S5PV210 CPU来讲,它的驱动就是i2c-s3c2410.c。该文件主要实现对控制器的初始化,然后调用核心服务层把S5PV210的IIC总线加入到 Linux Kernel中。· IIC设备驱动层,图中client和i2c-dev的地方,具体的实现代码在/$(KERNEL)/drivers/i2c/i2c-dev.c和/$(KERNEL)/drivers/i2c/chips目录下的文件。这一层主要是调用核心服务层实现对在总线上的设备的操作。另外实现了
5、提供给用户级应用程序的用户操作总线的接口,如read、write和ioctl等。在GEC210实验板中,i2c-dev.c实现的字符设备名为:/dev/i2c/0。表示的是系统的IIC总线0。应用程序可以通过该设备对这条总线上的设备进行控制。· 用户应用程序,图中program的地方,实验中具体的对EEPROM的测试程序的读写测试程序是I2c_test.c。该应用程序,打开 /dev/i2c/0设备,通过ioctl对EEPROM地址进行设置。然后调用write系统调用写EEPROM,再调用read 读EEPROM对数据进行校验。五、代码设计 3、 驱动代码简析(详细代码请读者查看/d
6、river/i2c/i2c-dev.c文件) ,I2C主控设备驱动程序节点,实现字符设备的打开、关闭、读/写、ioctrl等函数a) 设备注册函数static int _init i2c_dev_init(void)res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops); /注册名为“I2C”的设备i2c_dev_class = class_create(THIS_MODULE, "i2c-dev"); /创建I2C类设备res = i2c_add_driver(&i2cdev_driv
7、er); /注册I2C总线驱动程序释放设备函数:static void _exit i2c_dev_exit(void)i2c_del_driver(&i2cdev_driver);class_destroy(i2c_dev_class);unregister_chrdev(I2C_MAJOR, "i2c");打开设备函数:static int i2cdev_open(struct inode *inode, struct file *file)unsigned int minor = iminor(inode); /得到次设备号i2c_dev = i2c_dev_
8、get_by_minor(minor); /通过次设备号找到相应设备adap = i2c_get_adapter(i2c_dev->adap->nr); /得到与该次设备相关联的IIC总线设配器client->adapter = adap;file->private_data = client; /传递给ioctl控制设备函数:static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)struct i2c_client *client = file->privat
9、e_data; /open函数传递过来switch (cmd) case I2C_SLAVE: /不适用了,为了向前兼容case I2C_SLAVE_FORCE:case I2C_TENBIT: /设置标志,启动(禁止)10位模式if (arg)client->flags |= I2C_M_TEN;elseclient->flags &= I2C_M_TEN;return 0;return 0;读设备函数:static ssize_t i2cdev_read(struct file *file, char _user *buf, size_t count,loff_t *o
10、ffset)struct i2c_client *client = file->private_data; /open函数传递ret = i2c_master_recv(client, tmp, count); /启动总线,从器件读数据ret = copy_to_user(buf, tmp, count) ? -EFAULT : ret; /将读取的数据返回给用户空间写设备函数:static ssize_t i2cdev_write(struct file *file, const char _user *buf,size_t count, loff_t *offset)struct i
11、2c_client *client = file->private_data;if (copy_from_user(tmp, buf, count) /将用户空间的数据拷贝到内核空间ret = i2c_master_send(client, tmp, count); /启动总线,将要写的数据发送到器件1、 drivers/i2c/i2c-core.c,I2C核心驱动程序,实现I2C设备(包括I2C总线适配器和I2C从设备)的注册、删除、通信等功能,主要函数如下:int i2c_add_driver(struct i2c_driver *driver),注册IIC总线驱动程序。int i2
12、c_add_adapter(struct i2c_adapter *adap),注册I2C控制器。int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num),启动I2C总线,进行具体的读写操作。2、 drivers/i2c/busses/i2c-s3c2410.c,针对S5PV210的I2C控制器的驱动程序,主要代码如下:a) 在调用 driver_register()的过程中,当找到一个合适的设备后,总线驱动程序调用该函数:static int s3c24xx_i2c_probe(struct devi
13、ce *dev).i2c->clk = clk_get(&pdev->dev, "i2c");clk_enable(i2c->clk); /使能I2C控制器的时钟i2c->ioarea = request_mem_region(res->start, (res->end-res->start)+1, pdev->name); .i2c->regs = ioremap(res->start, (res->end-res->start)+1); /映射寄存器,从物理空间映射到虚拟空间.ret = s
14、3c24xx_i2c_init(i2c); /初始化.ret = request_irq(i2c->irq, s3c24xx_i2c_irq, IRQF_DISABLED, dev_name(&pdev->dev), i2c); /向系统申请中断ret = i2c_add_numbered_adapter(&i2c->adap);/向内核注册IIC适配器b) IIC控制器初始化函数: static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c)unsigned long iicon = S3C2410_IICCON_
15、IRQEN | S3C2410_IICCON_ACKEN;pdata->cfg_gpio(to_platform_device(i2c->dev); /设置GPIO口的功能为SDA和SCLwriteb(pdata->slave_addr, i2c->regs + S3C2410_IICADD); /设置控制器的从机地址writel(iicon, i2c->regs + S3C2410_IICCON);if (s3c24xx_i2c_clockrate(i2c, &freq) != 0) /设置时钟writel(0, i2c->regs + S3C24
16、10_IICCON);dev_err(i2c->dev, "cannot meet bus frequency requiredn");return -EINVAL;中断函数:static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id)status = readl(i2c->regs + S3C2410_IICSTAT); /读IIC状态i2s_s3c_irq_nextbyte(i2c, status); 根据状态进行下一步的处理,如继续读、写或终止总线的操作 c) 重要数据结构:/* i2c bus r
17、egistration info */static const struct i2c_algorithm s3c24xx_i2c_algorithm = .master_xfer= s3c24xx_i2c_xfer,/IIC总线通信传输算法,管理IIC控制器,实现IIC总线数据的发送和接收.functionality= s3c24xx_i2c_func,;3、 驱动程序的编译:a) 进入内核目录,#make menuconfig -I2C support然后按下图进行设置:进入I2C Hardware Bus support:b) 编译生成内核镜像,将其烧写到实验箱上。4、 测试代码编写:#d
18、efine CHIP_ADDR 0x50#define PAGE_SIZE0x08#define I2C_DEV_PATH "/dev/i2c/0" /设备路径static int read_eeprom(int fd, char buff, int addr, int count)int res;if(write(fd, &addr, 1) != 1)return -1;res=read(fd, buff, count);printf("read %d byte at 0x%.2xn", res, addr);return res;static
19、 int write_eeprom(int fd, char buff, int addr, int count)int res;int i;char sendbufferPAGE_SIZE+1;memcpy(sendbuffer+1, buff, count);sendbuffer0=addr; res= write(fd, sendbuffer, count+1); printf("write %d byte at 0x%.2xn", res ,addr);int main(void)int fd, n, res;unsigned char bufPAGE_SIZE;f
20、d = open(I2C_DEV_PATH, O_RDWR); /打开I2C设备if(fd < 0)printf("#i2c test device open fail#n");return (-1);printf("success, i2c open file device %d n",fd);res = ioctl(fd, I2C_TENBIT,0);/设置不使用10位地址模式res = ioctl(fd, I2C_SLAVE_FORCE, CHIP_ADDR);/设置从器件的地址printf("ioctl I2C_SLAVE_FORCE msg NO:%dn",res);for(n=0; n<PAGE_SIZE; n+)bufn=n;write_eeprom(f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安庆市第二人民医院招聘2人模拟试卷及答案详解(网校专用)
- 2025河南郑州大桥医院社区医院招聘51人模拟试卷带答案详解
- 2025辽宁抚顺市龙晟保安服务有限责任公司招聘拟聘用人员模拟试卷附答案详解(典型题)
- 2025年甘肃科源电力集团有限公司高校毕业生招聘40人(第三批)考前自测高频考点模拟试题及答案详解(全优)
- 2025湖南湘潭市纪委监委所属事业单位选调15人模拟试卷附答案详解(模拟题)
- 2025甘肃交建中油能源有限责任公司加油(气)员招聘13人模拟试卷及答案详解一套
- 2025年药店继续教育培训试题(附答案)
- 2025年湖州安吉县面向社会公开招聘城市社区专职工作者20人考前自测高频考点模拟试题及完整答案详解1套
- 2025湖北省红文旅游投资集团有限公司招聘4人考前自测高频考点模拟试题含答案详解
- 2025年上半年浙江杭州高新区(滨江)劳动保障监察专职人员招聘6人模拟试卷及一套完整答案详解
- 箱变应急预案与响应方案
- 肿瘤患者家庭肠内营养护理
- 《拒绝沉迷手机远离“垃圾快乐”》班会课件
- 沉井顶管施工方案
- 锅炉设备更换技术方案
- 班次调度冲突解决
- 管理会计学 第10版 课件 第1、2章 管理会计概论、成本性态与变动成本法
- 领导科学之领导用人(经典)
- 大米先生管理制度
- 手术室仪器设备管理PPT
- 高中政治课程标准解读
评论
0/150
提交评论