热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

I2C总线在Linux系统中的驱动设计

1引言Linux操作系统因具有源代码公开、便于裁减、有广泛的处理器支持等优点,成为当前嵌入式系统的热门选择。基于I2C总线的键盘扩展设备主要用于满足嵌入式设备中对多按键的需求,驱

1 引言
    
Linux操作系统因具有源代码公开、便于裁减、有广泛的处理器支持等优点,成为当前嵌入式系统的热门选择。基于I2C总线的键盘扩展设备主要用于满足嵌入式设备中对多按键的需求,驱动程序在系统启动时对硬件进行初始化。在系统启动后实现硬件和应用程序之间的数据交互。针对S3C2410微处理器和键盘扫描管理器件,深入讨论如何在嵌入式操作系统ARM Linux中实现ZLG7290的驱动。

2 I2C总线
    I2C总线是器件间串行传输总线,以其规范和带I2C接口的外围器件获得广泛应用。S3C2410处理器内置有I2C总线接口。I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,每个器件都有一个唯一的地址识别。I2C总线在传送数据过程中共有3种信号:(1)开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。(2)结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。(3)应答信号:接收数据的IC接收到8 bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判断。若未收到应答信号,则判断为受控单元出现故障。图1为S3C2410和ZLG7290的连接图。

3 驱动模块的结构
    
S3C2410A内嵌一个I2C总线控制器。在Linux操作系统中,该控制器的字符型驱动包括4个模块:(1)i2c-dev:源程序为i2c-dev.c,I2C总线字符型驱动,与具体使用的I2C控制器无关。(2)i2c-core:源程序为i2c-core.c,I2C总线操作核心函数,与具体使用的I2C控制器无关。(3)i2c-algo-s3c2410:源程序为i2c-algo-s3c2410.c,I2C总线控制器I2C驱动算法,与具体的控制器相关。(4)i2c-s3c2410:源程序为i2c-s3c2410.c,I2C总线控制器硬件抽象层,与具体的控制器相关。以上4个模块依次是底层与上层的关系,I2C驱动模块的层次结构如图2所示。

4 驱动源文件的编译
    
驱动源文件包括i2c-algo-s3c2410.c,i2c-dev.c,i2c-core.c,i2c-s3c2410.c4个源文件。将其编译为模块,则产生4个模块文件,编译工作由Makefile文件完成,其文件内容如下:

当需要使用I2C总线控制器驱动模块时,可以使用I2C总线控制器驱动的设备管理文件loadi2c。该管理文件运行后,将自动在Linux的/dev/目录下创建设备节点i2c。loadi2c文件内容如下:


    由于各模块间有上下层关系,则加载模块顺序应是从上到下,最先加载i2c-core,最后加载i2c-s3c2410。而卸载则顺序相反。加载模块i2c-algo-s3c2410时,必须延时1 s以等待该模块初始化完成,否则无法加载下一个模块i2c-s3c2410。

5 对驱动文件的使用
    
Linux的/dev/目录下创建设备节点i2c成功后,就可使用LINUX提供的一系列函数实现驱动,这些函数包括ioctl(),open(),close(),read()与write()等。
5.1 ioctl()函数的使用
    I2C总线控制器驱动(字符型)提供ioctl()函数用于设定I2C总线控制器的一些参数,该函数常用命令有:
    (1)I2C_SLAVE第2参数取值为I2C从机地址,用来设定I2C从机地址;I2C_SLAVE_FORCE:第2参数取值为I2C从机地址,用来修改I2C从机地址;I2C_TENBIT:第2参数取值为0:从机地址为7 bit;第2参数取值为1:从机地址为10bit。用来指定I2C从机地址的位数;I2C_S3C2410_SET_SPEED:第2参数取值为I2C总线控制器分频值。用来设置I2C总线控制器时钟频率;
    (2)常用设置设置I2c从机地址为0xA0,由于是7 bit地址,所以要右移1位:ret=ioctl(fd,I2C_SLAVE,0xA0>>1);指定从机地址为7 bit,ret=ioctl(fd,I2C_TENBIT,0)。
5.2 open(),close()的使用
    应用程序要使用本驱动来访问外部I2C器件,首先要通过open()来打开其驱动,使用完毕后使用close()将其关闭。打开与关闭I2C总线控制器驱动:


5.3 read()与write()函数的使用
    用read()与write()函数读/写I2C总线,常用设置如下:

    write(fd,&data,1);向I2C总线发送1字节数据data;
    假设子地址为0,向有子地址的FC器件写入8个字节:unsigned char sendbuf[9]={0,1,2,3,4,5,6,7,8);/*第1个字节0为子地址*/write(fd,sendbuf,9);/*写入8个字节,第1个字节为子地址*/从有子地址的I2C器件读取8个字节,假设子地址为0:
unsigned char suba=0;recbuf[8];
write(fd,&suba,1);/*发送子地址0*/
read(fd,recbuf,8);/*从子地址0开始读取8个字节*/

6 结束语
    
设备驱动程序是操作系统内核和机器硬件之间的接口,通过它可使设备文件化。本文首先介绍I2C总线接口的工作模式和特点,简要介绍I2C字符型驱动模块的特点,研究ARM Linux下的键盘扩展器件ZLG7290驱动程序,详细描述了基于I2C总线通信的键值读取过程,具有广泛的应用价值。


转载自:http://embed.21ic.com/software/linuxos/200912/18534_2.html


推荐阅读
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
author-avatar
肯尼亚hanhan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有