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

上传人:max****ui 文档编号:8442641 上传时间:2020-03-29 格式:PPT 页数:28 大小:858KB
返回 下载 相关 举报
嵌入式系统原理及应用教程第10章.ppt_第1页
第1页 / 共28页
嵌入式系统原理及应用教程第10章.ppt_第2页
第2页 / 共28页
嵌入式系统原理及应用教程第10章.ppt_第3页
第3页 / 共28页
点击查看更多>>
资源描述
主讲内容 第8章嵌入式系统BootLoader技术第9章嵌入式Linux操作系统移植第10章嵌入式Linux设备驱动程序开发第11章嵌入式Linux应用程序设计 10 1嵌入式Linux驱动程序开发基础 10 1 1嵌入式Linux设备驱动程序分类静态加载的驱动程序动态加载的驱动程序Linux将设备按照功能特性划分为三种类型 字符设备 块设备和网络设备 10 1 2最简单的内核模块1 helloworld模块源代码2 模块的编译3 模块的加载和卸载 10 1嵌入式Linux驱动程序开发基础 10 2嵌入式Linux设备驱动重要技术10 2 1内存与I O端口 1 内核空间和用户空间 2 内核中内存分配内核中获取内存的几种方式如下 通过伙伴算法分配大片物理内存 通过slab缓冲区分配小片物理内存 非连续内存区分配 高端内存映射 固定线性地址映射 3 I O端口根据CPU体系结构的不同 CPU对IO端口的编址方式有两种 I O映射方式 I O mapped 和内存映射方式 Memory mapped 下面主要讨论一下内存映射方式访问I O端口的方法 我们称之为I O内存操作 I O内存区必须在使用前分配I O内存映射访问I O内存映射到用户空间 10 1嵌入式Linux驱动程序开发基础 10 2 2同步机制Linux内核中包含的同步机制包括 原子操作 信号量 semaphore 读写信号量 rw semaphore 自旋锁 spinlock 大内核锁 BigKernelLock BKL 读写锁 rwlock 读拷贝更新 Read CopyUpdate RCU 和seqlock 顺序锁 等 1 原子操作原子操作主要用于实现资源计数 很多引用计数 refcnt 就是通过原子操作实现的 原子类型定义如下 typedefstruct volatileintcounter atomic t 原子操作通常用于实现资源的引用计数2 信号量信号量在创建时需要设置一个初始值 3 读写信号量读写信号量有两种实现 一种是通用的 不依赖于硬件架构一种是架构相关的 读写信号量的相关API有 DECLARE RWSEM name 该宏声明一个读写信号量name并对其进行初始化 voidinit rwsem structrw semaphore sem 该函数对读写信号量sem进行初始化 voiddown read structrw semaphore sem 在Linux中 每一个进程都用一个类型为task t或structtask struct的结构来描述 4 自旋锁一个执行单元要想访问被自旋锁保护的共享资源 必须先得到锁 在访问完共享资源后 必须释放锁 自旋锁的API有 spin lock init x 10 2 3阻塞与非阻塞1 阻塞操作2 非阻塞操作10 2 4时间问题1 延时操作 1 长延时 2 短延时2 内核定时器内核提供给驱动许多函数来声明 注册 以及去除内核定时器 3 工作队列采用缺省工作者线程来实现工作队列的API INIT WORK work func data intschedule work structwork struct work intschedule delayed work structwork struct work unsignedlongdelay voidflush scheduled work void intcancel delayed work structwork struct work 创建自己的工作者线程和工作队列 API structworkqueue struct create workqueue constchar name intqueue work structworkqueue struct wq structwork struct work intqueue delayed work structworkqueue struct wq structwork struct work unsignedlongdelay voidflush workqueue structworkqueue struct wq voiddestroy workqueue structworkqueue struct wq 10 2 5中断处理在Linux系统里 对中断的处理是属于系统核心部分 因而如果设别与系统之间以中断方式进行数据交换 就必须把该设备的驱动程序作为系统核心的一部分 设备驱动程序通过调用request irq函数来申请中断 通过free irq来释放中断 它们被定义为 includeintrequest irq unsignedintirq void handler intirq voiddev id structpt regs regs unsignedlongflags constchar device void dev id voidfree irq unsignedintirq void dev id 函数的参数如下 unsignedintirq 请求的中断号 irqreturn t handler 安装的中断处理函数指针 unsignedlongflags 中断处理的属性 constchar dev name 这个传递给request irq的字串用在 proc interrupts来显示中断的拥有者 void dev id 用作共享中断的指针 10 3字符设备驱动程序字符设备驱动程序可以分为三个主要组成部分 自动配置和初始化子程序 负责检测所要驱动的硬件设备是否存在和是否能正常工作 服务于I O请求的子程序 又称为驱动程序的上半部分 中断服务子程序 又称为驱动程序的下半部分 10 3 1字符设备驱动结构1 主次设备号 字符设备和块设备通过文件系统中的名子来存取 主编号标识设备相连的驱动 次编号被内核用来决定引用哪个设备 设备编号在驱动程序的内部具有固定的表示方式 在建立驱动时 需要做的第一件事是获取一个或多个设备编号来使用 在驱动程序执行的过程中 如果不希望在使用该设备 要及时的将设备编号释放 2 驱动相关数据结构大部分的基础性的驱动操作包括3个重要的内核数据结构 它们是file operations file 和inode 1 文件操作 file operations file operation结构表示了用户程序怎样对设备进行操作 这个结构 定义在中 是一个函数指针的集合structmodule owner 2 文件结构structfile定义于 是设备驱动中第二个最重要的数据结构 3 inode结构inode结构由内核在内部用来表示文件 3 自动配置和初始化 1 初始化 当驱动程序将被加载的时候 首先会调用初始函数进行自动配置 2 清除处理 4 中断处理如果需要驱动程序具有中断处理的能力 必须进行中断申请 从request irq返回给请求函数的返回值是0指示成功 为负表示错误码 中断处理可以在驱动初始化时安装或者在设备第一次打开时 在中断的使用过程中还可以对其进行使能和禁止操作 10 3 2字符设备驱动实例 LED驱动1 LED驱动程序分析本驱动程序文件名为led2440 c2 驱动模块加入内核使用命令 cp fled2440 c linux 2 6 32 4 drivers char 编辑Kconfig文件 修改Makefile文件 配置 编译内核执行makezImage内核映像和驱动程序模块会先后被编译完毕 将内核下载至开发板 将驱动程序模块加入到根文件系统后 下载至开发板 这样就可以调用驱动程序进行演示了 3 LED驱动演示 1 驱动程序模块加载到内核 进入驱动程序模块所在目录 执行 insmod fled2440 ko 2 建立设备节点 也就是建立用户程序关联到驱动程序的途径 3 演示程序 建立一个LED控制的简单演示程序led2440test 10 4网络设备驱动程序10 4 1Linux网络设备简介1 Linux网络驱动基础2 DM9000控制器10 4 2网络驱动核心数据结构分成几个方面对其进行介绍通用信息硬件描述信息协议相关信息设备操作函数接口 10 4 3网络驱动程序分析1 初始化 清理网络设备网络设备初始化的工作主要是确定硬件设备的存在 以及将硬件设备加载到设备链表中 为网络设备的激活做准备 需要注意这两个变量 name和owner 2 打开和关闭网络设备open函数主要用来完成对网络设备中断进行注册 通过配置物理接口初始化设备 以及为发送数据准备队列 3 中断处理网络驱动程序的中断处理函数在网络设备激活时进行注册 主要用于完成 现场保护及中断屏蔽 读取网络设备寄存器信息及判断中断原因并处理 恢复中断现场 函数首先需要获得自旋锁 然后将当前的寄存器地址保存下来 以便返回的时候继续进行被打断的作业 接着就是屏蔽所有的中断 读取中断状态寄存器并清除中断状态寄存器 然后就开始真正的中断处理了 当发生接收中断时 中断函数调用dm9000 rx 函数 4 sk buff结构sk buff的数据成员分为两部分 一部分是实际在网络中要传输的部分 数据区 Packetdatestorage 一部分由内核管理服务于结构链表 还有一些常用的成员如 sk buff tstamp sk buff dev sk buff protocol 内核提供了一系列用于操作sk buff数据结构的函数 用于分配 释放 复制 克隆 扩展等功能 下面介绍些常用的 structsk buff alloc skb unsignedintlen intpriority structsk buff dev alloc skb unsignedintlen 5 数据发送处理6 数据接收处理数据接收的主要工作有 检查接收的到的数据包是否正确 根据数据被长度在内核空间为数据包申请sk buff 把数据包复制到sk buff 填写相关成员后插入队列 释放网络芯片中分配的缓冲区 7 其它处理接口在网络设备结构中还有一些函数接口需要实现 如 1 get stats 2 set multicast list 3 tx tiemout 10 5设备驱动实例10 5 1ADC设备驱动实例ADC是比较简单的字符设备 在此直接给出ADC的驱动程序源代码和注释说明 10 5 2PWM设备驱动实例10 5 3触摸屏设备驱动实例1 输入子系统在Linux中 输入子系统 InputSubsystem 是由输入子系统设备驱动层 输入子系统核心层 InputCore 和输入子系统事件处理层 EventHandler 组成 设备的驱动的实现步骤如下 在驱动模块加载函数中设置Input设备支持input子系统的哪些事件 将Input设备注册到input子系统中 在Input设备发生输入操作时 如 键盘被按下 抬起 触摸屏被触摸 抬起 移动 鼠标被移动 单击 抬起时等 提交所发生的事件及对应的键值 坐标等状态 在提交输入设备的事件后必须用下列方法使事件同步 让它告知input系统 设备驱动已经发出了一个完整的报告 voidinput sync structinput dev dev 2 触摸屏驱动实现S3C2440A芯片内部集成了触摸屏接口并与ADC接口相连 S3C2440A提供的触摸屏接口有4种处理模式 分别是 正常转换模式 单独的X Y位置转换模式 自动X Y位置转换模式和等待中断模式 在此实现自动X Y位置转换模式和等待中断模式 a 驱动的加载和卸载 b 中断服务以及触摸屏状态 坐标的转换 触摸屏转换过程为 第一步 如果触摸屏接收到触摸 则进入updown ISR 如果能获取ADC LOCK则调用touch timer fire 启动ADC 第二步ADC转换 如果小于四次继续转换 如果四次完毕后 启动1个时间滴答的定时器 停止ADC 也就是说在这个时间滴答内 ADC是停止的 这样可以防止屏幕抖动 第三步 如果1个时间滴答到时候 触摸屏仍然处于触摸状态则上报转换数据 并重启ADC 重复第二步 如果触摸笔释放了 则上报释放事件 并将触摸屏重新设置为等待中断状态 10 6本章小结本章介绍了Linux2 6内核驱动程序的相关技术和一般开发方法 讲述了Linux驱动程序的功能 分类 通过一个简单的Helloworld模块来引入Linux2 6内核的模块运行机制 说明了驱动程序的同模块的关系 以及内核模块和驱动程序的加载使用方法 详细阐述了开发驱动程序所需技术 通过实例详细讲述了字符设备驱动程序的开发过程 对网络驱动程序进行了分析
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!