• / 28
  • 下载费用:10 金币  

嵌入式系统原理及应用教程第10章00

关 键 词:
嵌入式系统原理与应用 嵌入式系统及应用 嵌入式系统原理 嵌入式系统原理与 00嵌入式系统 嵌入式系统应用
资源描述:
信息与电电气工程学院 电电子信息工程 杨杨健 嵌入式系统软统软 件开发发 主讲讲内容 第8章 嵌入式系统统Boot Loader技术术 第9章 嵌入式Linux操作系统统移植 第10章 嵌入式Linux设备驱动设备驱动 程序开发发 第11章 嵌入式Linux应应用程序设计设计 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.1.1 嵌入式Linux设备驱动设备驱动 程序分类类 l静态态加载载的驱动驱动 程序 l动态动态 加载载的驱动驱动 程序 Linux将设备设备 按照功能特性划分为为三种类类型:字符 设备设备 ,块设备块设备 和网络设备络设备 。 10.1.2 最简单简单 的内核模块块 1.helloworld模块块源代码码 2.模块块的编译编译 3.模块块的加载载和卸载载 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.1 嵌入式Linux驱动驱动 程序开发发基础础 10.2 嵌入式Linux设备驱动设备驱动 重要技术术 10.2.1 内存与I/O端口 (1)内核空间间和用户户空间间 (2)内核中内存分配 内核中获获取内存的几种方式如下。 ①通过过伙伴算法分配大片物理内存 ②通过过slab缓缓冲区分配小片物理内存 ③非连续连续 内存区分配 ④高端内存映射 ⑤固定线线性地址映射 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 (3)I/O端口 根据CPU体系结结构的不同,CPU对对IO端口的编编址方 式有两种:I/O映射方式(I/O-mapped)和内存映射 方式(Memory-mapped)。 下面主要讨论讨论 一下内存映射方式访问访问 I/O端口的方法 ,我们们称之为为I/O内存操作。 l I/O 内存区必须须在使用前分配 l I/O内存映射 l 访问访问 I/O内存 l 映射到用户户空间间 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.2.2 同步机制 Linux内核中包含的同步机制包括:原子操作、信号 量(semaphore)、读读写信号量(rw_semaphore )、自旋锁锁(spinlock)、大内核锁锁(Big Kernel Lock,BKL)、读读写锁锁(rwlock)、读读拷贝贝更新( Read-Copy Update,RCU)和seqlock(顺顺序锁锁) 等。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 1.原子操作 原子操作主要用于实现资实现资 源计计数,很多引用计计数(refcnt)就 是通过过原子操作实现实现 的。 原子类类型定义义如下: typedef struct { volatile int counter; } atomic_t; 原子操作通常用于实现资实现资 源的引用计计数 2.信号量 信号量在创创建时时需要设设置一个初始值值. 3.读读写信号量 读读写信号量有两种实现实现 : l一种是通用的,不依赖赖于硬件架构 l 一种是架构相关的 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 读读写信号量的相关API有: DECLARE_RWSEM(name) 该该宏声明一个读读写信号量name并对对其进进行初始化。 void init_rwsem(struct rw_semaphore *sem); 该该函数对读对读 写信号量sem进进行初始化。 void down_read(struct rw_semaphore *sem); 在Linux中,每一个进进程都用一个类类型为为task_t或 struct task_struct的结结构来描述 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 4.自旋锁锁 一个执执行单单元要想访问访问 被自旋锁锁保护护的共享资资源, 必须须先得到锁锁,在访问访问 完共享资资源后,必须释须释 放锁锁 。 自旋锁锁的API有: spin_lock_init(x); 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.2.3 阻塞与非阻塞 1.阻塞操作 2.非阻塞操作 10.2.4 时间问题时间问题 1.延时时操作: (1)长长延时时。 (2)短延时时 2.内核定时时器 内核提供给驱动许给驱动许 多函数来声明、注册、以及去除内核定时时器。 3.工作队队列 采用缺省工作者线线程来实现实现 工作队队列 的API: ①INIT_WORK(_work, _func, _data) 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 ② int schedule_work(struct work_struct *work) ③int schedule_delayed_work(struct work_struct *work, unsigned long delay) ④void flush_scheduled_work(void) ⑤int cancel_delayed_work(struct work_struct *work) 创创建自己的工作者线线程和工作队队列,API: ①struct workqueue_struct *create_workqueue(const char *name) ② int queue_work(struct workqueue_struct *wq, struct work_struct *work) ③int queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay) ④void flush_workqueue(struct workqueue_struct *wq) ⑤void destroy_workqueue(struct workqueue_struct *wq) 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.2.5 中断处处理 在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); 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 函数的参数如下。 unsigned int irq:请请求的中断号。 irqreturn_t (*handler) :安装的中断处处理函数指针针。 unsigned long flags:中断处处理的属性。 const char *dev_name:这这个传递给传递给 request_irq的 字串用 在/proc/interrupts来显显示中断的拥拥有 者。 void *dev_id:用作共享中断的指针针。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.3 字符设备驱动设备驱动 程序 字符设备驱动设备驱动 程序可以分为为三个主要组组成部分: 1,自动配置和初始化子程序,负责检测 所要驱动 的硬件设备 是否存在 和是否能正常工作。 2,服务于I/O请求的子程序,又称为驱动 程序的上半部分。 3,中断服务子程序,又称为驱动 程序的下半部分。 10.3.1 字符设备驱动结设备驱动结 构 1.主次设备设备 号 :字符设备设备 和块设备块设备 通过过文件系统统中的名子来存取。 主编编号标识设备标识设备 相连连的驱动驱动 。 次编编号被内核用来决定引用哪个设备设备 。 设备编设备编 号在驱动驱动 程序的内部具有固定的表示方式。 在建立驱动时驱动时 ,需要做的第一件事是获获取一个或多个设备编设备编 号来使用。 在驱动驱动 程序执执行的过过程中,如果不希望在使用该设备该设备 ,要及时时的将设备设备 编编号释释放: 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 2.驱动驱动 相关数据结结构 大部分的基础础性的驱动驱动 操作包括3个重要的内核数据结结构, 它们们是file_operations,file,和inode。 (1)文件操作(file_operations) file_operation 结结构表示了用户户程序怎样对设备进样对设备进 行操作 。 这这个结结构,定义义在中,是一个函数指针针的集合 struct module *owner。 (2)文件结结构 struct file定义义于,是设备驱动设备驱动 中第二个最重 要的数据结结构。 (3)inode 结结构 inode 结结构由内核在内部用来表示文件。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 3.自动动配置和初始化 (1)初始化。当驱动驱动 程序将被加载载的时时候,首先会调调 用初始函数进进行自动动配置。 (2)清除处处理。 4.中断处处理 如果需要驱动驱动 程序具有中断处处理的能力,必须进须进 行 中断申请请。 l从request_irq返回给请给请 求函数的返回值值是0指示成功 ,为负为负 表示错误码错误码 。 l中断处处理可以在驱动驱动 初始化时时安装或者在设备设备 第一次 打开时时。 l在中断的使用过过程中还还可以对对其进进行使能和禁止操作 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.3.2 字符设备驱动实设备驱动实 例——LED驱动驱动 1.LED驱动驱动 程序分析 本驱动驱动 程序文件名为为led2440.c 2.驱动驱动 模块块加入内核 l使用命令:cp -f led2440.c /linux-2.6.32.4/drivers/char/ l编辑编辑 Kconfig文件: l修改Makefile文件: l配置、编译编译 内核 执执行make zImage内核映像和驱动驱动 程序模块块会先后 被编译编译 完毕毕。将内核下载载至开发发板;将驱动驱动 程序模 块块加入到根文件系统统后,下载载至开发发板。这样这样 就可 以调调用驱动驱动 程序进进行演示了。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 3.LED驱动驱动 演示 (1)驱动驱动 程序模块块加载载到内核。 进进入驱动驱动 程序模块块所在目录录,执执行: insmod -f led2440.ko (2)建立设备节设备节 点。 也就是建立用户户程序关联联到驱动驱动 程序的途径 (3)演示程序。 建立一个LED控制的简单简单 演示程序led2440test 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.4 网络设备驱动络设备驱动 程序 10.4.1 Linux 网络设备简络设备简 介 1.Linux网络驱动络驱动 基础础 2.DM9000控制器 10.4.2 网络驱动络驱动 核心数据结结构 分成几个方面对对其进进行介绍绍 l通用信息 l硬件描述信息 l协议协议 相关信息 l设备设备 操作函数接口 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.4.3 网络驱动络驱动 程序分析 1.初始化、清理网络设备络设备 网络设备络设备 初始化的工作主要是确定硬件设备设备 的存在,以 及将硬件设备设备 加载载到设备链设备链 表中,为为网络设备络设备 的激活做 准备备。 需要注意这这两个变变量:name和owner。 2.打开和关闭闭网络设备络设备 open函数主要用来完成对对网络设备络设备 中断进进行注册、通过过 配置物理接口初始化设备设备 ,以及为发为发 送数据准备队备队 列。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 3.中断处处理 网络驱动络驱动 程序的中断处处理函数在网络设备络设备 激活时进时进 行注册,主要用 于完成:现场现场 保护护及中断屏蔽、读读取网络设备络设备 寄存器信息及判断中 断原因并处处理、恢复中断现场现场 。 函数首先需要获获得自旋锁锁,然后将当前的寄存器地址保存下来,以便 返回的时时候继续进继续进 行被打断的作业业;接着就是屏蔽所有的中断,读读 取中断状态态寄存器并清除中断状态态寄存器,然后就开始真正的中断处处 理了。 当发发生接收中断时时,中断函数调调用dm9000_rx()函数。 4.sk_buff结结构 sk_buff的数据成员员分为为两部分: l一部分是实际实际 在网络络中要传输传输 的部分,数据区(Packet date storage) ; l一部分由内核管理服务务于结结构链链表。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 还还有一些常用的成员员如: sk_buff-tstamp: sk_buff-dev: sk_buff-protocol: 内核提供了一系列用于操作sk_buff数据结结构的函数, 用于分配、释释放、复制、克隆、扩扩展等功能,下面介 绍绍些常用的。 struct sk_buff *alloc_skb(unsigned int len,int priority) struct sk_buff *dev_alloc_skb(unsigned int len) 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 5.数据发发送处处理 6.数据接收处处理 数据接收的主要工作有:检查检查 接收的到的数据包是否正确;根据数据 被长长度在内核空间为间为 数据包申请请sk_buff;把数据包复制到sk_buff ,填写相关成员员后插入队队列;释释放网络络芯片中分配的缓缓冲区。 7.其它处处理接口 在网络设备结络设备结 构中还还有一些函数接口需要实现实现 ,如: (1)get_stats (2)set_multicast_list (3)tx_tiemout 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.5 设备驱动实设备驱动实 例 10.5.1 ADC设备驱动实设备驱动实 例 ADC是比较简单较简单 的字符设备设备 ,在此直接给给出ADC的驱动驱动 程序源代码码和注释说释说 明。 10.5.2 PWM设备驱动实设备驱动实 例 10.5.3 触摸屏设备驱动实设备驱动实 例 1.输输入子系统统 在Linux中,输输入子系统统(Input Subsystem)是由输输入子 系统设备驱动层统设备驱动层 、输输入子系统统核心层层(Input Core)和输输 入子系统统事件处处理层层(Event Handler)组组成。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 设备设备 的驱动驱动 的实现实现 步骤骤如下: ①在驱动驱动 模块块加载载函数中设设置Input设备设备 支持input子 系统统的哪些事件; ②将Input设备设备 注册到input子系统统中; ③在Input设备发设备发 生输输入操作时时(如:键盘键盘 被按下/抬起 、触摸屏被触摸/抬起/移动动、鼠标标被移动动/单击单击 /抬起时时 等),提交所发发生的事件及对应对应 的键值键值 /坐标标等状态态。 在提交输输入设备设备 的事件后必须须用下列方法使事件同 步,让让它告知input系统统,设备驱动设备驱动 已经发经发 出了一个完 整的报报告:void input_sync(struct input_dev *dev) 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 2.触摸屏驱动实现驱动实现 S3C2440A芯片内部集成了触摸屏接口并与ADC接口相连连。 S3C2440A提供的触摸屏接口有4种处处理模式,分别别是:正 常转换转换 模式、单单独的X/Y位置转换转换 模式、自动动X/Y位置转转 换换模式和等待中断模式,在此实现实现 自动动X/Y位置转换转换 模式 和等待中断模式。 a、驱动驱动 的加载载和卸载载: b、中断服务务以及触摸屏状态态、坐标标的转换转换 。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 触摸屏转换过转换过 程为为: l第一步,如果触摸屏接收到触摸,则进则进 入updown_ISR,如果 能获获取ADC_LOCK则调则调 用touch_timer_fire,启动动ADC; l第二步ADC转换转换 ,如果小于四次继续转换继续转换 ,如果四次完毕毕 后,启动动1个时间时间 滴答的定时时器,停止ADC, 也就是说说在这这个 时间时间 滴答内,ADC是停止的,这样这样 可以防止屏幕抖动动; l第三步,如果1个时间时间 滴答到时时候,触摸屏仍然处处于触摸状 态则态则 上报转换报转换 数据,并重启ADC,重复第二步; 如果触摸笔释释放了,则则上报释报释 放事件,并将触摸屏重新设设置 为为等待中断状态态。 10.1 嵌入式Linux驱动驱动 程序开发发基 础础 10.6 本章小结结 本章介绍绍了Linux2.6内核驱动驱动 程序的相关技术术和一 般开发发方法。讲讲述了Linux驱动驱动 程序的功能、分类类, 通过过一个简单简单 的Helloworld模块块来引入Linux2.6内 核的模块块运行机制,说说明了驱动驱动 程序的同模块块的关 系,以及内核模块块和驱动驱动 程序的加载载使用方法。详详 细阐细阐 述了开发驱动发驱动 程序所需技术术,通过实过实 例详细讲详细讲 述了字符设备驱动设备驱动 程序的开发过发过 程;对对网络驱动络驱动 程 序进进行了分析。
展开阅读全文
  麦档网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:嵌入式系统原理及应用教程第10章00
链接地址:https://www.maidoc.com/p-15691708.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

[email protected] 2018-2020 maidoc.com版权所有  文库上传用户QQ群:3303921 

麦档网为“文档C2C模式”,即用户上传的文档所得金币直接给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的金币归上传人(含作者)所有。
备案号:蜀ICP备17040478号-3  
川公网安备:51019002001290号 

本站提供办公文档学习资料考试资料文档下载


收起
展开