基于ARMLinux下IIC设备驱动程序设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

主效应分析
主效应分析
利用拉丁方方法得到的运算结果 ,构建响应面模型 ,建立逼
近模型 。根据运算结果当 p2保持在其平均值的情况下即 p2 =
0. 6989时 , p1和 p3对效率的响应面模型如图 5所示 。p1和 p3
主机负责 IIC总线的初始化 、数据传输 、产生时钟信号等工 作 。 IIC总线传输的时序 [2 ]是 : 从 START (开始位 ) 开始传输 , STOP (结束位 )结束传输 。传送到 SDA 上的每一个字节必须是 8位 ,每次传送的字节数不限 ,每一个字节后面必须跟一个应答 位 。如果在传输过程中 ,从设备不能一次接收完一个字节 ,此时 它就会使时钟置为低电平 ,迫使主设备等待 ;当从设备能接收下 一个数据字节后 ,将释放 SCL 线 ,继续后面的数据传输 。数据 传输的时序如图 1所示 。
{…
Init_ Iic ( ) ;
/ /初始化 IIC总线
RdBy_ Iic ( 0xde, 0x30, & ( rdata) ) ;
/ /读秒钟寄存器
dbuf[ 0 ] = rdata;
RdBy_ Iic ( 0xde, 0x31, & ( rdata) ) ;
/ /读分钟寄存器
dbuf[ 1 ] = rdata; …
Abstract To design credible drivers, the frame of driver in embedded L inux and the time sequence of data transm ission on IIC bus are in2 troduced. Then, the difficulties in the design of IIC drivers based on ARML inux are analyzed, and finally, an app roach to the design of RTC drivers based on X1227 is introduced.
在嵌入式系统中 ,一般都要使用到实时时钟电路 。很多嵌 入式系统选用 X1227作时钟芯片 ,它支持 IIC总线 ,与 s3c2410 连接电路如图 4 所示 。当使用 L inux操作系统时 ,要为 X1227 芯片的 RTC设计驱动程序 。 RTC 设备地址是 1101111X,其中 最低位是读写标志 。RTC驱动程序主要由 6个模块组成 ,其中 打开和释放模块 [4 ]只是建立和释放连接 ,所以可以将它们写成 2个空的函数 ,驱动程序的关键是设计初始化 、读和写模块 。
图 3 IIC总线读数据时序图
3 ARM 9嵌入式 L inux 系统 IIC 设备驱动程 序的设计
IIC设备 (属于字符设备 )驱动程序按功能可分为 6个主要
模块 [3 ] :初始化 、退出处理 、打开 、释放 、读和写模块 。在 ARM9
嵌入式系统中 ,连接在 IIC总线上的设备 ,必须按照 IIC总线时
图 1 IIC总线数据传输时序图
2. 1 IIC 总线写操作时序
IIC总线写操作主要有二种方式 :字节写和页面写 。字节写 是指 :每次在指定位置写入一个字节数据 。它的时序如图 2 ( a) 所示 ,首先主机向从机发送启动信号和“从机地址 +写 ”,然后 等待应答信号 ;当应答信号来到之后再发一个器件内部地址 ,然
成相应的函数 。如 :将图 2 ( a)所示的“字节写 ”时序设计成 W r2
By_ Iic ( )函数 ,具体实现函数如下 :
W rBy_ Iic (U8 slvAddr, U8 addr, U8 wdata)
{…
IICDS = slvAddr&0xfe;
/ /从地址 +写标记
IICSTAT = 0xf0;
图 4 x1227电路图
4. 1 设备初始化模块
主要功能是 :映射地址 、初始化设备 、申请资源 、向内核注册 等 。具体实现函数如下 :
rtc_init( ) {… address_map ( ) ; …
/ /地址映射
ret = register_chrdev( 0, DEV ICE_NAME, &iic_fop s) ; / /申请主设备号
摘 要 为了设计出稳定可靠的驱动程序 ,首先介绍了嵌入式 L inux系统驱动程序的框架结构和 IIC总线数据传输的时序 ,然后 分析了基于 ARML inux系统 IIC设备驱动程序设计的技术难点及解决方法 ,最后介绍了基于 X1227芯片 RTC设备驱动程序的实现 步骤 。 关键词 ARM L inux IIC总线 驱动程序
函数如下 :
rtc_write ( struct file 3 filep , char 3 buffer, size_t length)
{…
copy_from _user( dbuf, buffer, length) ;
/ /数据从用户态到内核态
Init_ Iic ( ) ;
/ /初始化 IIC总线
data = dbuf[ ic + 2 ] ; W rBy_ Iic ( 0xde, reg, data) ; }
…}
(下转第 72页 )
72
计算机应用与软件
2008年
发现其对效率和最小压力系数的影响曲线基本上和实际的经验 相吻合 。
图 3 p1 /p2 /p3对 eta的
图 4 p1 /p2 /p3对 cpm in的
D ES I GN AND IM PL EM ENTAT IO N O F I IC D R I VERS BASED O N ARML I NUX
Zhu Huasheng
(D epa rtm en t of Com pu ter S cience and Technology, N anchang Institu te of Tochnology, N anchang 330099, J iangxi, Ch ina)
devfs_register(NULL , ″iic″, …) ;
/ /注册字符型设备文件
…}
4. 2 读数据模块
读数据模块的主要功能是用来读取 RTC寄存器中的时间
和日期 。具体实现函数如下 :
rtc_read ( struct file 3 filep , char 3 buffer, size_t length)
RdBy_ Iic ( )函数 、“连续读 ”设计成 RdCo_ Iic ( )函数 。当设计具 体读写模块时 ,可从这些函线写数据时序图
2. 2 IIC 总线读操作时序
IIC总线读操作主要有 2种方式 :指定位置读和连续读 。指 定位置读时序如图 3 ( a)所示 ,首先主机向从机发送启动信号和 “从机地址 +写 ”,在接收到应答信号之后马上发送一个器件内 部地址 ,然后再次等待应答信号 ;当应答信号来到之后发送一个 启动信号和“从机地址 +读 ”,然后再次等待应答信号 ;当应答 信号来的时候就可以接收到需要读取位址的字节数据 ,接收完 成后发送一个停止信号 。连续读时序如图 3 ( b)所示 ,当接收到 一个字节数据后 ,不发停止信号 ,而发一个应答信号 ;当从机收 到应答信号后其自动将地址加 1,然后继续发送该地址对应的 数据 ,直到收到一个停止信号 。
第 25卷第 3期 2008年 3月
计算机应用与软件 Computer App lications and Software
Vol125 No. 3 M ar. 2008
基于 ARML inux下 I IC设备驱动程序设计与实现
朱华生
(南昌工程学院计算机系 江西 南昌 330099)
/ /开始传输
Run_ IicPoll( ) ;
/ /等待应答信号

IICDS = addr;
/ /设备内部地址
IICCON = 0xaf;
/ /继续传输

IICDS =wdata;
/ /待写数据

IICSTAT = 0xd0;
/ /停止传输
…}
将“页面写 ”设计成 W rPa_ Iic ( )函数 、“指定位置读 ”设计成
1 嵌入式 L inux驱动程序的框架
在嵌入式 L inux系统中设备驱动程序是内核的一部分 ,完 成对设备初始化 、读写操作和控制等功能 。驱动程序隐藏了硬 件设备的具体细节 ,对不同的设备提供一致的接口 ,这些接口通 过 file_operations结构 [1 ]来定义 ,设计驱动程序的大部分工作就 是根据硬件结构来“填写 ”结构体中定义的函数 。主要的函数 包括 open ( ) 、read ( ) 、w rite ( ) 、ioctl( )和 release ( )等等 。
Keywords ARM L inux IIC bus D rivers
0 引 言
IIC总线是 Philip s公司首先推出的新一代串行扩展总线 , 在嵌入式系统中得到了广泛的应用 。嵌入式 L inux操作系统因 具有免费 、开放源代 、强大的网络功能等特点 ,在嵌入式产品中 正在得到广泛的应用 。本文主要研究 ARML inux系统 IIC设备 驱动程序的设计方法 。
Open ( )函数的主要功能是提供给驱动程序初始化能力 ,为 以后的设备操作做好准备 。 read ( )函数的主要功能是读设备数 据 。w rite ( )函数的主要功能是写设备数据 。 ioctl( )函数的主要 功能是执行读 、写之外的操作 ,如 :配置设备 。 release ( )函数功 能与 open ( )函数相反 。
收稿日期 : 2006 - 01 - 06。江西省自然科学基金资助 ( 0510062 ) 。 朱华生 ,副教授 ,主研领域 :嵌入式系统开发与应用 。
第 3期
朱华生 :基于 ARML inux下 IIC设备驱动程序设计与实现
55
后再次等待应答信号 ;当应答信号来到之后立即发送待写数据 , 当应答信号来到之后发送停止信号 。页面写和字节写操作很类 似 ,只是主机在完成第一轮资料传送之后不发送停止信号 ,而继 续发送待写的数据 ,它的时序如图 2 ( b)所示 。
序传输 。由于 IIC总线有多种时序 ,这就为驱动程序的设计带
来一定的难度 。在各种时序中 ,数据传输的开始和结束操作都
是相同的 ,所以驱动程序的初始化 、退出处理 、打开和释放模块
都相同 。不同的时序只是读和写方式有所区别 ,因此要设计不
同的读写模块 。
为了方便驱动程序的设计 ,可以将 IIC总线的 4 种时序写
除以上几个函数以外 ,还有 2个非常重要的函数 module_init ( )和 module_exit( ) ,驱动程序是从 module_init ( )函数开始执行 , 它是在加载模块时执行的 。它的功能是 :将初始化函数加入内核 全局初始化函数列表中 ,在内核初始化时执行驱动的初始化函 数 ,从而完成驱动的初始化和注册 ,之后驱动便停止等待被应用
软件调用 。module_exit( )函数的功能刚好和 module_init( )相反 。
2 ARM 9嵌入式系统 IIC总线的工作时序
在 ARM9 嵌 入 式 系 统 IIC 总 线 中 , 一 般 微 处 理 器 (如 : S3C2410)是总线上的主机 ,其它是从机 。 IIC总线上可同时接 多个从机 ,每个从机都有一个唯一的地址 。

W rBy_ Iic ( 0xde, 0x003f, 0x02) ; for( ic = 0; ic < length; ic + = 3)
/ /写状态寄存器 / /将传来的数据写入相应的寄存器
{m reg = dbuf[ ic ] ; lreg = dbuf[ ic + 1 ] ; reg = m reg < < 8 lreg;
RdBy_ Iic ( 0xde, 0x35, & ( rdata) ) ; dbuf[ 5 ] = rdata; copy_to_user( buffer, dbuf, 6) ; …}
/ /读年数据寄存器 / /数据从内核态到用户态
4. 3 写数据模块
写数据模块的主要功能是用来设置时间和日期 。具体实现
相关文档
最新文档