已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主讲内容 第8章嵌入式系统BootLoader技术第9章嵌入式Linux操作系统移植第10章嵌入式Linux设备驱动程序开发第11章嵌入式Linux应用程序设计 10 1嵌入式Linux驱动程序开发基础 10 1 1嵌入式Linux设备驱动程序分类静态加载的驱动程序动态加载的驱动程序Linux将设备按照功能特性划分为三种类型 字符设备 块设备和网络设备 10 1 2最简单的内核模块1 helloworld模块源代码2 模块的编译3 模块的加载和卸载 2 10 1嵌入式Linux驱动程序开发基础 10 2嵌入式Linux设备驱动重要技术10 2 1内存与I O端口 1 内核空间和用户空间 2 内核中内存分配内核中获取内存的几种方式如下 通过伙伴算法分配大片物理内存 通过slab缓冲区分配小片物理内存 非连续内存区分配 高端内存映射 固定线性地址映射 3 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驱动程序开发基础 4 10 2 2同步机制Linux内核中包含的同步机制包括 原子操作 信号量 semaphore 读写信号量 rw semaphore 自旋锁 spinlock 大内核锁 BigKernelLock BKL 读写锁 rwlock 读拷贝更新 Read CopyUpdate RCU 和seqlock 顺序锁 等 5 1 原子操作原子操作主要用于实现资源计数 很多引用计数 refcnt 就是通过原子操作实现的 原子类型定义如下 typedefstruct volatileintcounter atomic t 原子操作通常用于实现资源的引用计数2 信号量信号量在创建时需要设置一个初始值 3 读写信号量读写信号量有两种实现 一种是通用的 不依赖于硬件架构一种是架构相关的 6 读写信号量的相关API有 DECLARE RWSEM name 该宏声明一个读写信号量name并对其进行初始化 voidinit rwsem structrw semaphore sem 该函数对读写信号量sem进行初始化 voiddown read structrw semaphore sem 在Linux中 每一个进程都用一个类型为task t或structtask struct的结构来描述 7 4 自旋锁一个执行单元要想访问被自旋锁保护的共享资源 必须先得到锁 在访问完共享资源后 必须释放锁 自旋锁的API有 spin lock init x 8 10 2 3阻塞与非阻塞1 阻塞操作2 非阻塞操作10 2 4时间问题1 延时操作 1 长延时 2 短延时2 内核定时器内核提供给驱动许多函数来声明 注册 以及去除内核定时器 3 工作队列采用缺省工作者线程来实现工作队列的API INIT WORK work func data 9 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 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 11 函数的参数如下 unsignedintirq 请求的中断号 irqreturn t handler 安装的中断处理函数指针 unsignedlongflags 中断处理的属性 constchar dev name 这个传递给request irq的字串用在 proc interrupts来显示中断的拥有者 void dev id 用作共享中断的指针 12 2020 1 7 13 10 3字符设备驱动程序字符设备驱动程序可以分为三个主要组成部分 自动配置和初始化子程序 负责检测所要驱动的硬件设备是否存在和是否能正常工作 服务于I O请求的子程序 又称为驱动程序的上半部分 中断服务子程序 又称为驱动程序的下半部分 10 3 1字符设备驱动结构1 主次设备号 字符设备和块设备通过文件系统中的名子来存取 主编号标识设备相连的驱动 次编号被内核用来决定引用哪个设备 设备编号在驱动程序的内部具有固定的表示方式 在建立驱动时 需要做的第一件事是获取一个或多个设备编号来使用 在驱动程序执行的过程中 如果不希望在使用该设备 要及时的将设备编号释放 14 2 驱动相关数据结构大部分的基础性的驱动操作包括3个重要的内核数据结构 它们是file operations file 和inode 1 文件操作 file operations file operation结构表示了用户程序怎样对设备进行操作 这个结构 定义在中 是一个函数指针的集合structmodule owner 2 文件结构structfile定义于 是设备驱动中第二个最重要的数据结构 3 inode结构inode结构由内核在内部用来表示文件 15 3 自动配置和初始化 1 初始化 当驱动程序将被加载的时候 首先会调用初始函数进行自动配置 2 清除处理 4 中断处理如果需要驱动程序具有中断处理的能力 必须进行中断申请 从request irq返回给请求函数的返回值是0指示成功 为负表示错误码 中断处理可以在驱动初始化时安装或者在设备第一次打开时 在中断的使用过程中还可以对其进行使能和禁止操作 16 10 3 2字符设备驱动实例 LED驱动1 LED驱动程序分析本驱动程序文件名为led2440 c2 驱动模块加入内核使用命令 cp fled2440 c linux 2 6 32 4 drivers char 编辑Kconfig文件 修改Makefile文件 配置 编译内核执行makezImage内核映像和驱动程序模块会先后被编译完毕 将内核下载至开发板 将驱动程序模块加入到根文件系统后 下载至开发板 这样就可以调用驱动程序进行演示了 17 3 LED驱动演示 1 驱动程序模块加载到内核 进入驱动程序模块所在目录 执行 insmod fled2440 ko 2 建立设备节点 也就是建立用户程序关联到驱动程序的途径 3 演示程序 建立一个LED控制的简单演示程序led2440test 18 10 4网络设备驱动程序10 4 1Linux网络设备简介1 Linux网络驱动基础2 DM9000控制器10 4 2网络驱动核心数据结构分成几个方面对其进行介绍通用信息硬件描述信息协议相关信息设备操作函数接口 19 10 4 3网络驱动程序分析1 初始化 清理网络设备网络设备初始化的工作主要是确定硬件设备的存在 以及将硬件设备加载到设备链表中 为网络设备的激活做准备 需要注意这两个变量 name和owner 2 打开和关闭网络设备open函数主要用来完成对网络设备中断进行注册 通过配置物理接口初始化设备 以及为发送数据准备队列 20 3 中断处理网络驱动程序的中断处理函数在网络设备激活时进行注册 主要用于完成 现场保护及中断屏蔽 读取网络设备寄存器信息及判断中断原因并处理 恢复中断现场 函数首先需要获得自旋锁 然后将当前的寄存器地址保存下来 以便返回的时候继续进行被打断的作业 接着就是屏蔽所有的中断 读取中断状态寄存器并清除中断状态寄存器 然后就开始真正的中断处理了 当发生接收中断时 中断函数调用dm9000 rx 函数 4 sk buff结构sk buff的数据成员分为两部分 一部分是实际在网络中要传输的部分 数据区 Packetdatestorage 一部分由内核管理服务于结构链表 21 还有一些常用的成员如 sk buff tstamp sk buff dev sk buff protocol 内核提供了一系列用于操作sk buff数据结构的函数 用于分配 释放 复制 克隆 扩展等功能 下面介绍些常用的 structsk buff alloc skb unsignedintlen intpriority structsk buff dev alloc skb unsignedintlen 22 5 数据发送处理6 数据接收处理数据接收的主要工作有 检查接收的到的数据包是否正确 根据数据被长度在内核空间为数据包申请sk buff 把数据包复制到sk buff 填写相关成员后插入队列 释放网络芯片中分配的缓冲区 7 其它处理接口在网络设备结构中还有一些函数接口需要实现 如 1 get stats 2 set multicast list 3 tx tiemout 23 10 5设备驱动实例10 5 1ADC设备驱动实例ADC是比较简单的字符设备 在此直接给出ADC的驱动程序源代码和注释说明 10 5 2PWM设备驱动实例10 5 3触摸屏设备驱动实例1 输入子系统在Linux中 输入子系统 InputSubsystem 是由输入子系统设备驱动层 输入子系统核心层 InputCore 和输入子系统事件处理层 EventHandler 组成 24 设备的驱动的实现步
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年畜禽运输防疫考试题及答案
- 2025年初级会计考试《经济法》真题试卷及答案
- 2026事业单位工勤技能-新疆-新疆热处理工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-广西-广西舞台技术工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-广西-广西印刷工三级(高级工)历年参考题库含答案详解
- 2026事业单位工勤技能-广东-广东水工监测工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-广东-广东兽医防治员五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-山西-山西工程测量工一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-山东-山东水利机械运行维护工一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-天津-天津计算机文字录入处理员二级(技师)历年参考题库含答案详解
- 装修公司安全生产管理制度
- 2025学年八年级数学下学期期末必刷题1(易错60题22个考点专练)解析版
- 正高级职称退休政策
- 年产30万吨菱镁矿建设项目环境影响报告书
- 《新能源汽车动力电池及管理系统检修》全套教学课件
- 人员退休欢送会34
- 新高考物理一轮复习分层提升练习专题19 板块模型(原卷版)
- NB-T31004-2011风力发电机组振动状态监测导则
- 湿疹中医辨证百科知识讲座
- 2022年大同市云州区司法协理员招聘考试真题及答案
- 航空航天概论课件
评论
0/150
提交评论