IrDA模块与HCG8HC908AP64的红外系统设计_第1页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、irda模块与hcg8hc908ap64的红外系统设计 随着系统及技术的飞快进展,针对移动手持终端的专用芯片获得了长足进展。芯片的ram和rom的容量越大,在上面跑操作系统也越来越简单。是当今流行的操作系统之一。因为其内核茁壮、运行高效、源码开放,并且linux是免费的操作系统,再加上其良好的可移植性等技术优势,使其已经成为嵌入式操作系统的主流。设备驱动程序是linux操作系统中的一个重要的组成部分,现在不断升级的linux内核中,增强最多的就是驱动程序。因为linux是开放源代码的,给我们提供了一个绝好的机会来分析和改造设备驱动程序,使其满足自己的特别应用,这样在嵌入式产品中,就可以为自己特

2、有的外围设备编写一个设备驱动程序。因为irda技术的蓬勃进展,提供了各种信息家电设备之间的无线衔接的最佳挑选,数据传输,成本低廉、衔接便利、容易易用、结构紧凑,在小型嵌入式移动设备中也得到了广泛的应用。配备有红外技术移动电话、个人数字助理、笔记本电脑都已登陆市场,因此,嵌入式设备的irda模块的开发有着广大的市场前景。本文将具体讲解基于inte1的pxa255处理器的sitsang开发平台红外模块的设计,其中包括linux下的irda驱动程序的开发和基于mc68hc908ap64红外放射器的软硬件设计两个部分。1 linux下irda模块的设计1.1 linux下的设备驱动程序简介系统调用是操

3、作系统内核和应用程序之间的接口,驱动程序是操作系统内核和机器硬件之间的接el,也是应用层和实际硬件设备之间的软件。一个驱动程序就是一个函数和数据结构的集合,它的目的就是实现一个容易的管理设备的接口。内核用这个接口哀求驱动程序控制设备的io操作。设备驱动程序为应用程序屏蔽了硬件的详情,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作一般文件一样对硬件设备举行操作。linux操作系统支持三种不同类型的设备,即字符设备、块设备和网络接口,相应地有三种类型的设备驱动程序。本文主要研究字符型设备的驱动程序。设备驱动程序是内核的一部分,主要完成以下的功能:对设备初始化和释放;把数据从内核传

4、送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序哀求的数据;检测和处理设备浮现的错误。因为应用程序是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如open、read、write、close等等。linux操作系统是通过一组固定的接口把系统调用和驱动程序关联起来的。这组入口点是由每个设备的设备驱动程序组成了一个数据结构来向系统提供的,它提供了字符型设备驱动程序所需的操作。这是一个十分关键的数据结构:struet file_operationsstruct modul*owner;loft t(*llseek)(struet file*10flf_

5、t,int);ssize t(*read)(struct file*,char*,size_t,10ff_t);ssize tf*write)(struct file*,const char*size_t,10ff_t*);int f*readdir)(struct file*,void*,filldir_t);unsigned int(*poll)(struct file*,struct poll_table_struct*);int(*ioctl)(struct inode*struct file*,unsigned int,unsigned long);int(*mmap)(struet

6、 file*,struct vm_area_struct*)int(*open)(struct inode*,stmct file*);int(*flush)(struct nle*);int(*release)(struct inode*,stmct file*);这个结构的每一个成员的名字都对应着一个系统调月。应用程序利用系统调用在对设备文件举行诸如readwrite操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。既然是这样,编写设备驱动程序的主要工作就是编写子函数,并填充

7、me_operations的各个域。多数状况下,只需为上面结构中的少数办法编写服务函数,其它均设为null。已经提到,应用程序是通过设备文件来与实际的硬件打交道的。每个设备文件都有其文件属性(cb),表示是字符设备还是块设备。另外每个文件都有两个设备号:第一个是主设备号,标识驱动程序;其次个是从设备号,标识用法同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区别它们。设备文件的主设备号必需与设备驱动程序在记下时申请的主设备号全都,否则用户进程将无法拜访到驱动程序。1.2 irda模块驱动程序irda是一种便宜、近距离、无线、低功耗、保密性强的通信技术,适合于低成本、跨平台

8、、点对点高速数据衔接,尤其是嵌入式系统;主要应用于无线数据传输,有时也用于无线网络接入和近程遥控。irda制定了无数红外通信协议,其中irda1.0协议基于异步uart,最高通信速率在115 2kbps,简称sir(seria infrared,串行红外协议),采纳31 6 endec编解码机制。我们所要实现的就是基于sir的irda驱动。它的放射强度与接收敏捷度因不同器件、不同应用设计而强弱不一,用法时只能以半双工方式举行红外通信。我们的设计思想是sitsang板只作为接收端,而基于mc68hc908ap64红外放射器作为发送端。其中file_operations结构中的ioctl()函数可

9、以举行发送或接收的状态切换。原sitsang板载linux系统所带的irda驱动程序是作为网络部分编写的,用法过于复杂,且在处理数据收发时需要做一些自己的处理和验证规章,所以我们用法标准串口在linux下自己编写了一个irda的设备驱动程序。这样在用法时,可以按照自己的需要作相应的更改,比较灵便。在irda驱动程序中主要实现了s_r_read()、s_r_write()、silopen()、sir_close()、silioctl()及sir_handle_irq()中断处理程序六个函数。相应的接口结构如下所示:static struct file_operations silfops=ioc

10、tl: sir ioctl,read: siread,write: sir_write,open: slr_open,release:sir close1.2.1 sir_handle_irq函数用户空间进程通过接口函数进入到内核,内核再调用驱动程序相应的io函数。irda驱动程序是字符类型的驱动程序,我们用中断的方式实现内核与设备之间的数据传输。当驱动程序在启动后设备就挂起自己,直到串口完成操作并发出一个中断哀求(irq)。当irq产生时,注册的中断处理程序sir_handlejrq得以运行。在sir_handle_irq中,程序通过相应的寄存器操作得到接收的数据,并将数据存入到一个内部缓冲

11、中。1.2.2 sir open和sir_ciose函数sir_open函数的主要功能就是递增用法计数和设备初始化操作。这里把设置并初始化sitsang板上的红外设备放在了sir_open函数中,这样在每次打开irda设备时,红外设备都会被正确地设置,确保了红外硬件的正常工作。另外,把申请设备中断号的工作也放到了sir_open函数中,这样irda设备所占用的中断号,在没有用法irda设备时也可以被其它设备分享。static int sir sopen(struct inode*inode,struet *filp)计数器加1;申请设备中断号;设置sitsang板上的红外设备并初始化;sir_

12、close()函数所作的工作与sir_open()的正巧相反,计数器减1,注销设备中断号。1.2.3 sir_ioctl函数因为所用法的红外收发器hsdl-3200只能以半双工方式举行红外通信,所以就需要指令举行接收和发送状态的转换。ioctl函数的主要功能就是对硬件设备举行控制,因此在sirioctl函数中实现了这一功能。static int silioctl(stmctitlode*inode,structfile*mp,unsigned_int cmd,unsignedlogarg)swltell(cmd)case接收:设置接收寄存器;break:case发送:设置发送寄存器;break

13、;default:1.2.4 sir_read和sir_write函数这两个函数主要完成读取应用程序传送给内核设备文件的数据和回送应用程序哀求的数据,并把数据从内核传送到硬件和从硬件读取数据的通信过程。这也是在囫囵驱动程序中最重要的部分。当用户调用read()函数时,内核相应地调用sir_read()函数。在sir_read()中,通过推断硬件寄存器是否有新数据到来而打算是否从设备读取数据,然后用法内核提供的copy touser(void*to,const void*from,unsigned long count)函数将数据返回应用程序。write()函数的实现与read()函数的实现过程

14、正巧相反。在sir_write()中,通过调用copy_from user_form_user(void*to,const void*from,unsigned long count,)函数来完成把数据从用户的应用程序传送给硬件设备。1.2.5实现模式设备驱动程序的主体完成了,现在要把驱动程序嵌入内核。实现llnux下irda设备驱动功能主要有两种形式:一是通过内核来举行加载,需要用户在etcrc.d名目中定义的初始启动脚本中写入指令,当内核启动的时候,就开头加载irda设备驱动程序,内核启动完成之后,irda驱动功能也随即实现了,但是增大了内核;其次是通过模块加载的形式。比较两者,其次种形式

15、越发灵便,在此着重对模块加载形式举行研究。模块设计是llnux中特有的技术,它使linux内核功能更简单扩展。采纳模块来设计linux设备驱动程序会很轻松,并且能够形成固定的模式。任何人只要依照这个模式去设计,都能设计出优良的设备驱动程序。先简要概述一下基于模块加载的设备驱动程序的设计步骤。首先每一个可装配的设备驱动程序都必需有init_module和cleanup module两个函数,装载和卸载设备时内核自动调用这两个函数。前者在insmod的时候执行,后者在rmmod的时候执行。通过模块加载指令insmod来把irda设备驱动程序插入到内核之中。在init_module中,除可以对硬件设

16、备举行检查和初始化外,还必需调用reglster_*函数将设备记下到系统中。本例中是通过register_chrdev来记下的,假如是块设备或网络设备则应当用reglstei_blkdev和register_netdev来记下。registet_chrdev的主要功能是将设备名和结构flle operatioons记下到系统的设备控制块中。最后可以通过执行模块卸载指令rmmod,调用irda驱动程序中的cleanup_module()函数,来对irda驱动程序模块卸载,详细实现过程1所示。2 基于mc68hc908ap64红外放射器的设计2.1 红外放射器的硬件设计为了可以检测sitsang板端的irda设备能否正常工作,设计了一个irda放射器。放射器的体积为l3cm×10cm,安装灵便便利。在放射器上有一个拨位开关,可以用来设置放射

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论