基于嵌入式Linux系统设备驱动程序的开发

来源 :电子产品世界 | 被引量 : 0次 | 上传用户:BluePrince
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:阐述了在嵌入式Linux系统环境下设备驱动程序的开发,详细探讨了基于linux下设备驱动程序具体开发过程,最后说明了如何使用设备驱动程序。
  关键词:嵌入式系统;linux;驱动程序
  
  引言
  
  Linux是一个遵循POSIX标准的免费操作系统。具有BSD和SYSV的扩展特性。与其他操作系统相比,嵌入式Linux系统以其可应用于多种硬件平台、内核高效稳定、源码开放、软件丰富、网络通信和文件管理机制完善等优良特性而正被作为研究热点,越来越多的研究人员采用Linux平台来开发自己的产品。Linux设备驱动程序在Linux内核源代码中占有很大比例,从2.0、2.2到2.4版本的内核,源代码的长度日益增加,其实主要是设备驱动程序在增加。
  
  设备驱动程序的编写
  
  设备驱动程序是linux内核的一部分,是操作系统内核和机器硬件之间的接口,它由一组函数和一些私有数据组成,是连接应用程序与具体硬件的桥梁。Linux的一个基本特点是它对硬件设备的管理抽象化,系统中的每一个设备都用一个特殊的文件来表示。所有的硬件设备都像普通的文件一样看待,使用与操作系统相同的标准系统来进行打开、读写和关闭。
  在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备、网络设备。字符设备是指存取时没有缓存的设备。可像文件一样访问字符设备,字符设备驱动程序负责实现这些行为。系统的控制台和并口就是字符设备的例子,它们可以很好地用“流”来描述。块设备是文件系统的宿主,如磁盘。Linux允许像字符设备那样读取块设备——允许一次传输任意数目的字节。结果是,字符设备和块设备读取数方式一致。而网络设备不同于字符设备和块设备,它面向的上一层不是文件系统而是网络协议层,是通过BSD套接口访问数据。与设备相对应的是三类设备驱动程序,字符设备驱动程序、块设备驱动程序、网络设备驱动程序。
  字符设备驱动程序、块设备驱动程序与网络设备驱动程序的结构体是不同的。
  在linux源代码linux/include/linux/fs.h中定义了字符设备和块设备驱动程序中必须使用的file_operations结构,每个设备驱动都实现这个接口所定义的部分或全部函数。随着内核的不断升级,file_operations结构也越来越大,不同的版本的内核会稍有不同。
  


  


  应用程序只有通过对设备文件的open、release、read、write、ioctl等才能访问字符设备和块设备。用户自己定义好file_operations结构后,编写出设备实际所需要的各操作函数,对于不需要的操作函数用NULL初始化,这些操作函数将被注册到内核,当应用程序对设备相应的设备文件进行文件操作时,内核会找到相应的操作函数,并进行调用。如果操作函数使用NULL,操作函数就进行默认处理。
  对于字符设备而言,llseek(),read(),write(),ioctl(),open(),release()这些函数是不可缺的;对十块设备,open(),release(),ioctl(),check_media_change(),revalidate()是不可缺少的。
  网络设备结构体net_device定义在include\linuxhletdevice.h里,如下所示:
  


  


  定义好net_device结构体后,根据实际情况编写操作函数,其中hard_start_xmit()函数是用来发送数据的,set mac address()是进行网络参数设置的。
  当linux初始化时将调用初始化函数intdevice_init(),该函数包括以下内容:
  注册所用设备。linux用设备号来标识字符设备和块设备。设备号分为主设备号和从设备号,最终形成设备接点。设备节点在访问字符设备和块设备的设备驱动程序时将使用。通常主设备号标识设备对应的驱动程序,大多数设备是“一个主设备号对应一个驱动程序”,如:虚拟控制台和串口终端由驱动程序4管理。次设备号由内核使用,用于确定设备文件所指的设备。字符设备和块设备注册时必须先定义好设备号。
  字符设备注册函数如下:
  


  int register_chrdev(unsigned int major,constchar*name,struct file_oprations*fops);其中major是主设备号。
  由于对网络设备驱动程序的访问不需要设备节点,它的注册函数如下:
  int register_netdev(struct net_device*dev)
  注册设备所用的中断。中断在现代计算机结构中有重要的地位,操作系统必须提供程序响应中断的能力。一般是把一个中断处理程序注册到系统中去。操作系统在硬件中断发生后调用驱动程序的处理程序。
  注册中断所用的函数如下:其中,irq是中断向量;handler是中断处理函数;flags是中断处理中的掩码;devices是设备名;dev_id是在中断共享使用的id。
  当linux不使用该设备时,就要调用清除函
  


  编写服务子程序
  服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,只是用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因此可以在其中调用sleep等与进程运行环境有关的函数。
  中断服务子程序,又称为驱动程序的下半部分。在Linux系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境相关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务程序的时候,都带有一个或多个参数,以唯一标识请求服务的设备。
  
  设备驱动程序的使用
  
  直接将驱动程序编译进linux内核
  将设备驱动程序复制到linux/drivers相关的子目录下,比如字符设备驱动程序就放在linux/drivers/char下。
  修改linux/drivers相关的子目录的Makefile,
  如obj-$(config_dev_driver)+=dev_driver.o,这样在编译内核时将会编译dev_driver.c,生成dev_driver.o.
  对内核进行重新编译时,进行相关的配置,比如要使用AT91RM9200的UART,就要如下配置:
  Character devices->Serial drivers.>AT91RM9200 serial port suppot
  将驱动程序编译成驱动模块
  在设备驱动程序中要有两个重要函数:
  module_init(dev-init),module_exit(dev_exit)
  利用相应的交叉编译器以及编译命令将驱动程序dev_driver.c编译成dev_driver.o这样的动态驱动模块。利用insmod命令给系统安装驱动模块,如果在/dev目录下没有相应的设备文件,就可以使用mknod创建一个设备文件。利用rmmod命令卸载驱动模块,设备文件的删除可以用rm命令。
  
  结语
  
  设备驱动程序的开发是在Linux环境中最复杂的编程任务之一。它需要和硬件打交道,容易引起系统崩溃,而且很难调试。掌握设备驱动程序的开发技术,将使得开发嵌入式Linux的系统更为迅速和有效。
其他文献
uClinux上C2H加速的JPEG压缩  按JPEG标准进行的图像压缩大小为640x400。libjpeg的前向式DCT函数被加速器取代;该加速器使用C2H编译器开发而成,可以在uClinux环境中进行访问。将C2H加速器与uClinux结合非常重要,因为它要与其它任务同时运行。对libjpeg(标准库)进行加速使我们可以无需增加额外的DSP片或任何常见的软件就能获得性能的提升。使用libjpe
期刊
3月15日,由教育部高等教育司、信息产业部人事司主办,上海市教委和上海交通大学承办,英特尔(中国)有限公司协办的“2008年英特尔杯大学生电子设计竞赛嵌入式系统专题邀请赛”正式拉开帷幕。本次比赛是自2002年发起以来邀请范围最广的一届,来自亚太、美国的高校首次组队参加比赛,使得此次竞赛真正成为一项国际大赛。迄今,已有来自中国大陆、香港地区、东南亚、以及美国的68所高校、156支参赛队、450多名学
期刊
3月18日,电量传感器制造商LEM的全资子公司北京莱姆电子有限公司(简称北京莱姆),参加了于3月18日-20日在上海举办的第七届慕尼黑电子展,并在展会上发布了其高效、环保的新型表面贴装传感器HMS,进一步扩充了其由单一5V供电的电流传感器家族系列产品。LEM集团工业行业副总裁Hans Dieter Huber为此专程访华,表达了LEM对中国市场的重视。  本次向中国市场发布的HMS传感器是LEM表
期刊
WiMedia超宽带(UWB)技术将为现在的多媒体增强设备之间提供高速无线数据连接。该技术有望实现480Mbit/s的数据传输速率,从而集合各种各样高速移动的应用。但是,UWB技术不是没有缺点,它并不是像Wi-Fi和蓝牙那样的成熟技术,目前UWB仍处于开发阶段。  就利润型便携设备市场而言,UWB本身的某些因素使它无法普及和被广泛采用。缺乏信令技术、可靠的安全性、强大的匹配能力以及功率等问题,使得
期刊
锂离子充电电池为便携式消费电子产品带来了许多优势,但它们需要非常精确的充电电流和输出电压,以优化电池寿命和提升性能。为了满足这一需求,飞思卡尔半导体公司日前推出了一系列锂离子电池充电器IC产品,以提供业界最高的性能和精确度,以及卓越的配置灵活性。  作为产品系列中的第一批产品,MC34671、MC34673和MC34674锂离子电池充电器IC使生产商可以根据他们独特的应用规格轻松定制自己的电池充电
期刊
摘要:为了降低TD-SCDMA信号的峰平比,本文提出一种可以在FPGA_k,实现的加窗峰值相消的方法,并对削峰算法中关键滤波器的性能进行了仿真。在以FPGA为中心的实际硬件平台上测试,表明本削峰算法可以有效地改善TD-SCDMA信号的高峰平比特性。  关键词:TD-SCDMA;功率放大器;削峰;峰均比    我国提出的TD-SCDMA标准的商用实验正在逐步展开,与恒包络的GSM信号不同,TD-SC
期刊
一直以来,8位MCU是低端市场的主流,32位MCU增长最快,而16位MCU受到8位和32位产品的双重挤压,处境尴尬。但近几年的发展表明,16位MCU应用,呈现出高速增长的势头,各大MCU厂商如Microchip都加大了在16位MCU的推进力度,利用大奖赛的形式吸引更多的爱好者。  Microchip大中华区资深应用工程师经理夏宇红认为16位MCU在很多应用比如电机控制、汽车电子领域依然有强大的生命
期刊
摘要:本文描述了一种基于GPRS通信方式的路灯监控器设计。  关键词:GPRS;路灯监控    引言    随着城市夜景照明设施的迅猛发展和人们生活品味的提高,对于城市的灯光设施建设提出了更高的要求。道路照明路灯,装饰彩灯、灯光喷泉、彩灯草坪、大厦射灯等各种各样的特色灯光构成了美丽的城市灯光夜景系统。但是,在这些美丽的灯光后面,我们的路灯管理部门担负着沉重的灯光设备维护管理工作。随着亮化工程脚步的
期刊
摘要:本文探讨了手机设计从GSM到3G所面临的射频方面的诸多新问题,并给出了完整的解决方案,从而大幅提升3G手机的射频集成性能。  关键词: 射频;3G;手机;IC集成    时间对手机设计人员来说始终是一种稀缺商品,而手机射频部分的集成一直耗费着过多的宝贵开发资源。随着手机复杂性的增长,射频IC集成的负担也在不断加重。然而,随着无线手机OEM厂商开始在他们的产品中增加EDGE和3G支持,射频组
期刊
摘要:本文论述了飞思卡尔公司32位处理器MPC5200B的PCI接口设计要点,阐述了PCI仲裁器逻辑扩展设计及方法。经过CPLD仿真及实际应用证明,该电路设计正确,针对MPC5200B有效地扩展了PCI仲裁器逻辑,增加了PCI总线上主设备个数。  关键词:PCI仲裁器;逻辑扩展;MPC5200B    PCI总线是现今最为流行的控制总线之一,它广泛地应用在计算机中,目前嵌入式设备中的很多解决方案都
期刊