嵌入式Linux操作系统的驱动程序开发要点

发布者:码梦小子最新更新时间:2007-09-24 来源: 赛迪网关键字:缓冲  函数  设备  硬件 手机看文章 扫描二维码
随时随地手机看文章

在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。

字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般紧接着发生。块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间用来等待。网络设备可以通过BSD套接口访问数据。

每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的、不同的硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问驱动程序。

系统调用时操作系统内核与应用程序之间的接口,设备驱动程序是操作系统内核与机器硬件之间的接口。设备驱动程序是内核的一部分,它完成以下功能:

对设备初始化和释放
把数据从内核传送到硬件和从硬件读取数据
读取应用程序传送给设备文件的数据和回送应用程序请求的数据
检测和处理设备出现的错误

MTD(Memory Technology Device)设备是闪存芯片、小型闪存卡、记忆棒之类的设备,它们在嵌入式设备中的使用正在不断增加。MTD驱动程序是在Linux下专门为嵌入式环境开发的新的一类驱动程序。相对于常规块设备驱动程序,使用MTD驱动程序的优点在于他们能更好的支持、管理给予闪存设备,有基于扇区的擦除和读/写操作的更好的接口。

驱动程序结构

Linux的设备驱动程序可以分为3个主要组成部分:

  1. 自动配置和初始化子程序,负责监测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化时被调用一次。

  2. 服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因而可以在其中调用sleep()等与进行运行环境有关的函数。

  3. 中断服务子程序,又称为驱动程序的下半部分。在Linux系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。

在系统内部,I/O设备的存/取通过一组固定的入口点来进行,这组入口点是由每个设备的驱动程序提供的。具体到Linux系统,设备驱动程序所提供的这组入口点由一个文件操作结构来向系统进行说明。file_operation结构定义于linux/fs.h文件中。

struct file_operation{
int (*lseek)(struct inode *inode, struct file *filp, off_t off, int pos);
int (*read)(struct inode *inode, struct file *filp, char *buf, int count);
int (*write)(struct inode *inode, struct file *filp, const char *buf, int count);
int (*readdir)(struct inode *inode, struct file *filp, struct dirent *dirent, int count);
int (*select)(struct inode *inode, struct file *filp, int sel_type, select_table *wait);
int (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned int arg);
int (*mmap)(void);
int (*open)(struct inode *inode, struct file *filp);
int (*release)(struct inode *inode, struct file *filp);
int (*fasync)(struct inode *inode, struct file *filp);
};


file_operation结构中的成员几乎全部是函数指针,所以实质上就是函数跳转表。每个进程对设备的操作都会根据major、minor设备号,转换成对file_operation结构的访问。

常用的操作包括以下几种:

lseek, 移动文件指针的位置,只能用于可以随机存取的设备。
read, 进行读操作,参数buf为存放读取结果的缓冲区,count为所要读取的数据长度。返回值为负表示读取操作发生错误;否则,返回实际读取的字节数。对于字符型,要求读取的字节数和返回的实际读取字节数都必须是inode-i_blksize的倍数。
write, 进行写操作,与read类似
readdir, 取得下一个目录入口点,只有与文件系统相关的设备程序才使用。
select, 进行选择操作。如果驱动程序没有提供select入口,select操作会认为设备已经准备好进行任何I/O操作。
ioctl, 进行读、写以外的其他操作,参数cmd为自定义的命令
mmap, 用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用
open, 打开设备准备进行I/O操作。返回0表示打开成功,返回负数表示失败。如果驱动程序没有提供open入口,则只要/dev/driver文件存在就认为打开成功。
release, 即close操作。

在用户自己的驱动程序中,首先要根据驱动程序的功能,完成file_operation结构中函数实现。不需要的函数接口可以直接在file_operation结构中初始化为NULL。file_operation变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operation结构中的函数指针。

Linux对中断的处理

在Linux系统里,对中断的处理是属于系统核心部分,因而如果设别与系统之间以中断方式进行数据交换,就必须把该设备的驱动程序作为系统核心的一部分。设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。它们被定义为:

#include
int request_irq(unsigned int irq,
void (*handler)(int irq, void dev_id, struct pt_regs *regs),
unsigned long flags,
const char *device,
void *dev_id);
void free_irq(unsigned int irq, void *dev_id);

参数irq表示所要申请的硬件中断号;handler为向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数irq为中断号;dev_id为申请时告诉系统的设备标识;regs为中断发生时的寄存器内容;device为设备名,将会出现在/proc/interrupts文件里;flag是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序还是慢速处理程序。快速处理程序运行时,所有中断都被屏蔽,而慢速处理程序运行时,除了正在处理的中断外,其他中断都没有被屏蔽。在Linux系统中,中断可以被不同的中断处理程序共享。

作为系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc和free,而代之以调用kmalloc和kfree,它们被定义为:

#include
void *kmalloc(unsigned int len, int priority);
void kfree(void *obj);

参数len为希望申请的字节数;obj为要释放的内存指针;priority为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般用GFP_KERNEL。

关键字:缓冲  函数  设备  硬件 引用地址:嵌入式Linux操作系统的驱动程序开发要点

上一篇:基于μClinux的SoPC应用系统设计详解
下一篇:片上系统中断机制的可靠性设计

推荐阅读最新更新时间:2024-05-13 18:38

今年可穿戴设备销量3.1亿部 同比增长17%
  Gartner24日发布报告称,今年全球 可穿戴设备 销量将达到3.104亿部,同比增长16.7%。下面就随嵌入式小编一起来了解一下相关内容吧。   报告称,这3亿部 可穿戴设备 将带来305亿美元的营收,其中93亿美元将来自 智能手表 。当前,苹果公司在 智能手表 市场领先于三星等竞争对手。   Gartner预计,今年全球 智能手表 销量预计为4150万块,而2021年销量将达到8100万块,占整体 可穿戴设备 市场16%的份额。   价格方面,今年全球智能手表的平均销售价格预计为223.25美元,而2021年将降至214.99美元。   除了智能手表,其他智能可穿戴设备还包括头显、穿戴相机、蓝牙耳机、智能腕带和运动手表
[嵌入式]
腾讯这些智能硬件你造吗
     作为“BAT”组合的一员,中国互联网巨头腾讯在软件社交体验方面可谓是独孤求败一般的存在,既然已经没有对手了,那么发掘新的领域则是腾讯当下发力的项目。实际上,腾讯近年来真的也鼓捣过很多硬件。 1、游戏主机Ministation   MiniStation微游戏机是腾讯发布的跨屏全体验智能游戏机,能在电视上用手柄玩手机 Android 游戏,被认为是安卓平台进军客厅游戏市场的一个重要符号。 2、儿童管家手表BABYWRU   支持微信接入,能手机微信进行绑定连接,24小时追踪小孩子位置情况。   3、腾爱血糖仪   腾爱血糖仪,可迅速计算出血糖值,且精度高于传统的血糖仪,同时实时记录结果,并自动整理成表格。
[手机便携]
OBU怎么安装_ETC设备的普及速度与影响预测
现在主流的都是太阳能供电的OBU设备,安装步骤如下:    1、拆开电子标签,撕开背面胶纸,将电子标签紧贴在前挡风玻璃上方。(注:适当加热3M胶后,安装更加牢固;电子标签带防拆卸装置,如不慎 脱落 ,请前往营业厅重置。) 2、按下电子标签顶部的 蓝牙 按钮,插入卡片(连续拔插两次),电子标签屏幕显示【蓝牙已打开】。 3、打开手机蓝牙,进入微信小程序或者相关app。点击【办卡】-【激活电子标签】,蓝牙自动感应激活。 4、上传车辆正面照片,即可使用。 ETC设备的普及速度与影响预测    普及ETC的首要目的是节能减排,对于汽车用户而言最直观的感受是通勤效率的提升,在实际使用ETC的多年中已经很少遇到堵车了。理
[汽车电子]
OBU怎么安装_ETC<font color='red'>设备</font>的普及速度与影响预测
N76E003的中断向量函数
学习新唐 N76E003的中断向量函数 void UART0_ISR() interrupt 4 using 1 等价于 #pragma vector = 0x23 `串口0 中断IE4.4 的入口地址0x23 C51 中断向量表: 8051系列的MCU 基本结构包括: 32个I/O口(4组8bit端口); 两个16位定时计数器; 全双工串行通信; 6个中断源 (2个外部中断,2个定时/计数器中断、1个串口输入/输出中断) 两级中断优先级 128字节内置RAM 独立的64K 字节可寻址数据和代码区 中断入口地址被编译器放在中断向量种,中断向量位于代码段最低地址处,串口输入/输出中断共用一个中断向量。 8051的中断向量
[单片机]
冷静后的智能硬件行业,下一步该往哪走
  在“2017年中国风投论坛”的 智能硬件 专场上,来自这个领域的投资人和创业者们也对于 智能硬件 行业中存在的问题;以及初创企业们如何与成熟企业合作,从而更好地发展等议题,分别给出了各自的看法。下面就随嵌入式小编一起来了解一下相关内容吧。   深圳市凯意科技有限公司总裁万滨认为,目前 智能硬件 行业存在的最主要问题在于,不少创业者有着优秀的想法,但很多创意都没有走向市场,主要原因在于设计环节的不足。 冷静后的智能硬件行业,下一步该往哪走   “这个环节被称为DFM(Design for Manufacturing,量产可行性设计),得出创意并不难,难的是怎么把这些创意恰如其分地呈现在一部产品之中,这就是DFM的过
[嵌入式]
NIWEEK 2018——更强大的软硬件造就未来
5月22日,美国奥斯汀,美国国家仪器(National Instruments)举办了NIWEEK 2018年度盛宴,此次NIWEEK以“加速到来的未来(Future Faster)”为主题,旨在通过提供NI最新的软硬件平台,为客户解决未来问题。此次NIWEEK规模盛大,共有3300名听众参加了230场以上的课程培训,而在展览会上共有106个展商,NI也在展位上提供了104个Demo可让观众更直观的体验NI的产品和解决方案。 “为什么我们一再强调未来?虽然现今的挑战已然很大,但随着系统越来越复杂,未来对测试复杂度的需求将会越来越多,我们作为基础技术供应商,需要提前为客户做好储备。”NI总裁兼CEO Alex Davern在NI
[测试测量]
NIWEEK 2018——更强大的软<font color='red'>硬件</font>造就未来
arm驱动linux设备地址映射到用户空间
linux设备地址映射到用户空间》涉及内核驱动函数二个,内核结构体二个,分析了内核驱动函数二个;可参考的相关应用程序模板或内核驱动模板二个,可参考的相关应用程序模板或内核驱动四个 一、问题描述:一般情况下,用户空间是不可能也不应该直接访问设备的,但是,设备驱动程序中可实现mmap()函数,这个函数可使用户空间直接访问设备的物理地址。 1、mmap()函数工作原理:mmap()实现了这样的一个映射过程,它将用户的内存空间的一般内存(准确来说是执行mmap进程的映射区域内存)与设备内存关联,当用户访问用户空间的这段地址范围时,实际上会转化为对设备的访问(linux上一切皆文件)。 文件内存映射原理图示 a 2、mmap优点:1、
[单片机]
arm驱动linux<font color='red'>设备</font>地址映射到用户空间
台湾晶圆双雄营收下滑 设备采购意兴阑珊
  台晶圆代工12寸厂扩产动作出现急冷冻,由于半导体景气持续低迷,设备商明显感受到晶圆厂采购日趋谨慎,半导体设备业者指出,目前联电南科12B厂设备仍处于闲置,台积电Fab12厂虽仍按计画建厂,但对设备采购态度非常保守,至于新加坡特许(Chartered)则已延缓12寸厂Fab7扩产计画,使得短期内既定12寸晶圆代工新厂恐呈现「空有建物、没有内涵」景象。   全球半导体景气趋缓,从台积电、联电单月营收逐渐走下坡见端倪,联电8月营收新台币81.65亿元已见衰退,世界先进亦微幅下降,业界预估台积电单月营收也将从8~9月开始步入下滑。另外,北美半导体设备订单金额7月来到历史低点,代表所有半导体设备商面向客户下单趋保守,要有勒紧腰带度寒冬
[焦点新闻]
台湾晶圆双雄营收下滑 <font color='red'>设备</font>采购意兴阑珊
小广播
最新应用文章
换一换 更多 相关热搜器件

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 医疗电子 工业控制

词云: 1 2 3 4 5 6 7 8 9 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved