嵌入式 第6章 嵌入式Linux驱动程序开发

发布时间:2024-08-31

嵌入式练习

第6章 嵌入式Linux驱动程序开发 嵌入式Linux的设备管理 设备驱动程序开发过程 应用实例

197

嵌入式练习

1. 嵌入式Linux的设备管理 设备管理概述 设备类型 设备号 Linux驱动程序概念 驱动程序结构 用户访问接口 Linux对中断的处理 设备驱动的初始化 设备驱动初始化函数主要功能198

嵌入式练习

1.1 设备管理概述linux 将所有的设备看作具体的文件,通过 第六章 文件系统层对设备进行访问。这样可以很好的 做到“设备无关性”。可以把Linux对设备的管 1 2 3 嵌设应 理划分成四个层次:用户进程 文件系统层 设备驱动层 硬件层 入备用 式驱实 动例 程 的序 设开 备发 管过 理程 Linux

它们之间的关系如右 图所示:

199

嵌入式练习

1.1 设备管理概述用户进程 用户进程一般位于内核之外,当它需要操 作设备时,可以就像访问普通文件一样,通过调用 第六章 read(),write()等文件操作系统调用来完成对设备文 1 2 3 件的访问和控制。 嵌设应 文件系统层:向用户提供一组统一的用户接口。它 入 备 用 位于用户进程层下面,属于内核空间,基本功能是 式 驱 实 动例 执行适合于所有设备的输入输出功能,使用户透明 程 的访问文件。在用户进程发出系统调用要求输入输 的序 出操作时,由文件系统层就处理请求的权限。 设开 设备驱动层:用于屏蔽具体设备的细节,设备驱动 备 发 过 程序位于内核中,它根据文件系统层的输入输出请 管 程 求来操作硬件上的设备控制器,完成设备的初始 理 化、打开释放设备以及数据在内核和设备间的传递 等操作。 Linux200

嵌入式练习

1.2 设备类型Linux 中的设备可以分为三类:字符设备:数据的处理是以字节为单位按顺序进 第六章 行的,没有数据缓冲区,也不支持随机读写。嵌 1 2 3 入式系统中简单的按键、触摸屏、手写板都属于 嵌 设 应 字符设备。 入备用 块设备:是指那些在输入/输出时数据处理以块为 式 驱 实 动例 单位的设备,它一般都采用了缓存技术,支持数 程 据的随机读写。典型的块设备有硬盘、cd-rom 等。对用户来说块设备和字符设备的访问接口都 的 序 是一样的,区别仅在内核和驱动程序的软件接口 设 开 上。 备发 管过 网络设备:实现方法不同于以上两种设备,它面 理程 向的上一层不是文件系统层而是网络协议层,内 核和网络设备驱动程序间的通信,与字符设备和 块设备也完全不同。 Linux201

嵌入式练习

1.3 设备号传统的设备管理上,除了设备类型外,linux 第六章 内核还需要一对被称作为主设备号、次设备号 1 2 3 的参数,才能唯一的标识设备。主设备号:标识设备对应的驱动程序。系统中不 同的设备可以有相同的主

设备号,主设备号相同 的设备使用相同的驱动程序,内核利用主设备号 将设备与相应的驱动程序对应起来。 次设备号:用来区分具体驱动程序的实例。从上 面可以知道,一个主设备号可能有多个设备与之 对应,这多个设备正是在驱动程序内通过次设备 号来进一步区分的。次设备号只能由设备驱动程 序使用,内核的其他部分仅将它作为参数传递给 驱动程序。

嵌设应 入备用 式驱实 动例 程 的序 设开 备发 管过 理程

Linux

202

嵌入式练习

1.4 Linux驱动程序概念设备驱动程序是操作系统内核与机器硬件之 间的接口,设备驱动程序为应用程序屏蔽了硬 件的细节,从应用程序来看,硬件设备只是一 个设备文件,应用程序可以向操作普通文件一 样对硬件设备进行操作,设备驱动程序属于内 核,主要功能有:对设备初始化和释放。 把数据从内核传送到硬件和从硬件读取数据。 传送应用程序和设备文件之间的数据 检测和处理设备出现的错误。

第六章1 2 3

嵌设应 入备用 式驱实 动例 程 的序 设开 备发 管过 理程

Linux

设备驱动程序的开发方式主要有两种:基于 内核的方式和基于模块的方式。203

嵌入式练习

1.5 驱动程序结构Linux的设备驱动程序分为三个主要部分:自动配臵和初始化子程序:负责监测所要驱动的 第六章 硬件设备是否存在和能否正常工作。仅在初始化 1 2 3 时被调用一次。 嵌设应 服务于I/O请求的子程序:也称为驱动程序的上半 入 备 用 部分。这部分程序由系统调用执行,和调用进程 式 驱 实 动例 属于同一个进程, 具有调用进程的运行环境,只 程 是由用户态变成了核心态。 中断服务子程序:也称为驱动程序的下半部分。 的 序 开 由Linux系统接收,再由系统调用中断服务子程 设 发 备 序。 管过 中断可以在任何一个进程运行时产生,因而中 理 程 断应该独立于任何进程。 同一个中断可以服务于多个设备,因而应该为 中断程序提供请求服务设备的标示参数。 Linux204

嵌入式练习

1.5 用户访问接口对用户程序而言,设备驱动程序隐藏了设备 的具体细节,对各种不同设备提供了一致的接 口,I/O 设备的存取可以通过一组固定的入口点 来进行,这组入口点是由每个设备的设备驱动 程序提供的。主要包括:open 入口点:打开设备准备I/O 操作。 release 入口点:关闭由open()函数打开的文件 read 入口点:从设备上读数据。对于有缓冲区的 I/O 操作,一般是从缓冲区里读数据。 write 入口点:往设备上写数据,对于有缓冲区 的I/O 操作,一般是把数据写入缓冲区里。 ioctl 入口点:执行读、写之外的操作,主要是一 些自定义的命令。

第六章1 2 3

嵌设应 入备用 式

驱实 动例 程 的序 设开 备发 管过 理程

Linux

205

嵌入式练习

1.5 用户访问接口Lseek入口点:移动文件指针的位臵,用于随机 第六章 存取的设备。 Readdir入口点:取得下一个目录入口点,只有 1 2 3 与文件系统相关的设备驱动程序才使用。 嵌设应 Select入口点:进行选择操作。如果驱动程序没 入 备 用 式驱实 有提供select入口,select操作将会认为设备已经 动例 准备好进行任何的I/O操作。 程 这些入口点由用户驱动程序提供,在Linux 的 序 设开 系统中,使用file_operations结构组织入口点, 备发 其中的成员全部是函数指针,所以实质上就是 管 过 理程 函数跳转表,每个进程对设备的操作,都会根 Linux

据主次设备号,转换成对该结构的访问。 file_operations的结构如下:206

嵌入式练习

1.5 用户访问接口struct file_operations { int (*lseek) (struct inode *, struct file *, off_t, int); int (*read) (struct inode *, struct file *, char *, int); int (*write) (struct inode *, struct file *, const char *, int); int (*readdir) (struct inode *, struct file *, void *, filldir_t); int (*select) (struct inode *, struct file *, int, select_table *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*open) (struct inode *, struct file *); void (*release) (struct inode *, struct file *); ………… };

第六章1 2 3

嵌设应 入备用 式驱实 动例 程 的序 设开 备发 管过 理程

Linux

207

嵌入式练习

1.6 Linux对中断的处理 中断是发挥硬件尤其是cpu 性能的一个重要 方面,在linux 中为中断的管理提供了很好的接 第六章 口,从应用编程角度来看编写一个中断处理程 1 2 3 序主要做两件事, 嵌设应根据具体应用实现中断服务子程序。 利用一系列 Linux API 函数向内核注册该服务子 程序,而具体的中断调度处理由linux 内部实现。 入备用 式驱实 动例 程 的序 设开 备发 管过 理程 Linux

注册中断处理程序向内核注册中断处理程序主要实现两个功能,一 是注册中断号,二是注册中断处理函数。 注册函数为:int request_irq(unsigned int irq,voi d (*handler)(int, void *, struct pt_regs *),…..) 释放函数为:void free_irq(unsigned int irq,…)

208

嵌入式练习

1.7 设备驱动的初始化设备驱动程序所提供的入口点,必须向系统 第六章 进行登记,以便系统在适当的时候调用,这个 过程称为设备驱动的初始化,在Linux系统中对 1 2 3 嵌设应 字符型设备提供了两个相关函数:extern int register_chrdev(unsigned int major, const char *name,struct file_operations *fops); 用来注册驱动程序,它根据提供的主设备号、设 备名及相关的入口点结构向系统注册该设备驱动 程序并完成相关的初始化工作。 extern int unregister_chrdev(unsigned int major, const char *name); 用来卸载设备驱动程序。

它 根据主设备号和设备名,对该设备的驱动程序进 行卸载操作。 入备用 式驱实 动例 程 的序 设开 备发 管过 理程 Linux

209

嵌入式练习

1.8 设备驱动初始化函数主要功能对驱动程序管理的硬件进行必要的初始化:对硬 件寄存器进行设臵,如设臵串口的工作方式、并 第六章 口的数据方向等。 1 2 3 初始化设备驱动相关的参数:每个设备都有用于 嵌 设 应 入备用 保存设备相关参数的变量,必须初始化。 式驱实 在内核中注册设备:每个驱动程序都有唯一的主 动例 设备号,内核必须记录设备的主设备号及其驱动 程 程序以便于调用。在Linux文件系统的/proc下的 的 序 devices文件保存着主设备号及其设备名。 设开 发 注册中断:如果设备需要IRQ支持,则要注册中 备 过 管 断。 理程 其 他 初 始 化 工 作 : 比 如 给 设 备 分 配 I/O 、 申 请 DMA通道等。 Linux210

嵌入式练习

2. 设备驱动程序开发过程 设备驱动程序开发流程 模块化驱动程序设计 字符设备驱动程序举例

211

嵌入式练习

2.1 设备驱动程序开发流程定义主、次设备号,也可以动态获取。 实现驱动初始化和清除函数。如果驱动程序采用 第六章 1 2 3 模块方式,则要实现模块初始化和清除函数。 设计所要实现的文件操作,定义file_operations 嵌 设 应 入备用 结构。 式驱实 实现所需要的文件调用,如read、write等 动例 程 实现中断服务函数并向内核注册。 的序 将驱动编译到内核或编译成模块并加载。 设开 生成设备节点文件。 备发 管过 理程 Linux

212

嵌入式 第6章 嵌入式Linux驱动程序开发.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219