已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验五 设备驱动程序 2 实验内容 5 1内核驱动设计入门 模块方式驱动实验在PC机上编译虚拟硬件驱动程序并进行调试 实验驱动的各个接口函数的实现 分析并理解驱动与应用程序的交互过程交叉编译虚拟硬件驱动程序 挂载到开发版加载测试分析触摸屏驱动 在 arm2410s kernel 2410s drivers char s3c2410 ts c 剖析它的结构和工作原理 3 实验目的 学习在Linux下进行驱动设计的原理掌握使用模块方式进行驱动开发调试的过程 4 实验步骤 实验指导书P223 225编译驱动模块及测试程序cd arm2410s exp drivers demo make如果编译的时候出现问题 可能在 usr src下没有建立一个linux连接 可以使用下面的命令 cd usr src ln sflinux 2 4 20 8linuxls查看目录文件 可见有如下文件 debuglinuxlinux 2 4linux 2 4 20 8redhat 5 实验步骤 建立设备节点 mknod dev democ2540插入驱动模块 rootdemo insmoddemo o执行命令进行测试 rootdemo test demo 6 实验步骤 运行结果 7 概要 设备驱动程序的作用设备驱动程序的分类设备驱动程序在操作系统中的位置设备驱动程序的基本结构设备驱动程序如何被使用一个简单设备驱动程序实例 8 设备驱动程序的作用 设备驱动程序将复杂的硬件抽象成一个结构良好的设备 并通过提供统一的程序接口为系统的其它部分提供使用设备的能力和方法 设备驱动程序 应该只是 为系统的其它部分提供各种使用设备的能力 使用设备的方法应该由应用程序决定 9 Linux下对外设的访问只能通过驱动程序Linux对于驱动程序有统一的接口 以文件的形式定义系统的驱动程序 Open Release read write ioctl 驱动程序是内核的一部分 可以使用中断 DMA等操作驱动程序需要在用户态和内核态之间传递数据 10 设备驱动程序的分类 字符设备驱动程序各种串行接口 并行接口等 块设备驱动程序磁盘设备等网络设备驱动程序网卡等 杂项设备驱动程序不属于上述三种设备之外的一些设备 如SCSI 时钟等 11 在操作系统中的位置 设备驱动程序是内核代码的一部分 驱动程序的地址空间是内核的地址空间 驱动程序的代码直接对设备硬件 实际是设备的各种寄存器 进行控制 实际就是读写操作 应用程序通过操作系统的系统调用执行相应的驱动程序函数 中断则直接执行相应的中断程序代码 设备驱动程序的file operations结构体的地址被注册到内核中的设备链表中 块设备和字符设备以设备文件的方式建立在文件系统中的 dev目录下 而且每个设备都有一个主设备号和一个次设备号 12 块设备驱动程序 字符设备驱动程序 网络设备驱动程序 13 ls l devcrw r 1rootroot1 1Jan100 00memcrw r 1rootroot1 2Jan100 00kmemcrw rw rw 1rootroot1 3Jan100 00nullcrw r 1rootroot1 4Jan100 00portcrw rw rw 1rootroot1 5Jan100 00zerocrw rw rw 1rootroot1 7Jan100 00fullcrw r r 1rootroot1 8Jan100 00randomcrw r r 1rootroot1 9Jan100 00urandomcrw rw rw 1rootroot5 0Jan100 00ttycrw 1rootroot5 1Jan100 00consolecrw rw rw 1rootroot5 2Jan100 00ptmxdrwxr xr x1rootroot0Jan100 00ptydrwxr xr x2rootroot0Jan100 00ptsdrwxr xr x1rootroot0Jan100 00rddrwxr xr x1rootroot0Jan100 00mtddrwxr xr x1rootroot0Jan100 00mtdblockcrw 1rootroot4 64Jan100 15ttyS0crw 1rootroot4 65Jan100 00ttyS1crw 1rootroot4 66Jan100 00ttyS2crw 1rootroot4 67Jan100 00ttyS3crw 1rootroot4 68Jan100 00ttyS4drwxr xr x1rootroot0Jan100 00misc c 字符设备b 块设备 主设备号 次设备号 14 设备驱动程序源代码的基本结构 驱动程序简单说明 驱动程序的作用 这是一个字符设备驱动程序的基本框架结构 被驱动设备的简单描述 将使用AT91RM9200的PB端口为例进行说明 一些特殊的考虑等 如PB21作为可以产生中断的输入引脚 本例未实现 版本 创建日期 作者等 1 0版 2006年1月6日 ifndef KERNEL define KERNEL endif ifndefMODULE defineMODULE endif include include include 表明这个模块将用于内核 也可以在编译时通过 D选项指定 如gcc D KERNEL 参见Makefile 内核头文件 需要根据具体驱动程序和用到的内核模块确定 表明这个驱动程序将以模块的方式编译和使用 也可以在编译时通过 D选项指定 如gcc DMODULE 参见Makefile 15 驱动程序中使用的各种函数的原型声明 标准的作法是将函数原型声明 放在一个头文件中 然后在该文件开始处使用 include引用 并在该 文件中定义 这里我们将函数的声明和定义放在一起 所以下面的代码既是函数的声明 也是函数的定义 staticssize tspioc read structfile filp char buffsize tcnt loof t off 这里是read函数的代码 returnret staticssize tspioc write structfile filp char buffsize tcnt loff t off 这里是write函数的代码 returnret 16 staticintspioc ioctl structinode inode structfile filpunsignedintcmd unsignedlongarg 这里是ioctl函数的代码 它的一般格式为一个switch分支语句 switch cmd caseCMD1 break caseCMDn break default break returnret ioctl 函数用于控制驱动程序本身的一些特性和参数 如设定驱动程序使用的缓冲区的大小 设定串行通讯的速率等 17 staticintspioc open structinode inode structfile filp 这里是open函数的代码 returnret staticintspioc close structinode inode structfile filp 这里是close函数的代码 returnret 上述5个函数 既read write ioctl open close 是一个字符设备驱动程序最基本的需要由驱动程序的作者完成的函数 这5个函数将对应于相应的5个系统调用 read spioc read write spioc write ioctl spioc ioctl open spioc open close spioc close 系统调用 驱动程序函数 18 staticstructfile operationsspioc fops read spioc read write spioc write ioctl spioc ioctl open spioc open release spioc close file operations是一个结构体类型 定义在include linux fs h中 上述代码定义了一个file operations类型的结构体spioc fops 并将其中的一些成员赋了初值 由于spioc fops是一个静态变量 所以其他成员的初值是 零 结构体spioc fops将作为一个参数在注册一个设备驱动程序时传递给内核 内核使用设备链表维护各种注册的设备 不同类型的设备使用不同的链表 19 structfile operations structmodule owner loff t llseek structfile loff t int ssize t read structfile char size t loff t ssize t write structfile constchar size t loff t int readdir structfile void filldir t unsignedint poll structfile structpoll table struct int ioctl structinode structfile unsignedint unsignedlong int mmap structfile structvm area struct int open structinode structfile int flush structfile int release structinode structfile int fsync structfile structdentry intdatasync int fasync int structfile int int lock structfile int structfile lock ssize t readv structfile conststructiovec unsignedlong loff t ssize t writev structfile conststructiovec unsignedlong loff t ssize t sendpage structfile structpage int size t loff t int unsignedlong get unmapped area structfile unsignedlong unsignedlong unsignedlong unsignedlong structfile operations include linux fs h 20 staticint initspioc init void 设备初始化代码等 if register chrdev SPIOC MAJOR spioc 21 module init spioc init module exit spioc exit 这两个函数 module init 和module exit 用于告诉内核 当一个驱动程序加载和退出 或撤消 时 需要执行的操作 不同驱动程序在加载和退出时 除了基本的向内核注册设备驱动程序外 还有各自的针对具体设备的操作 22 要点总结 宏 KERNEL MODULE VERSION KERNEL 表明这将是用于内核的代码 否则很多内核过程将无法使用 MODULE 如果是以模块方式编译 需要定义这个宏 VERSION 定义这个宏则需要驱动程序的内核版本要和内核版本一致 module init module exit spioc init spioc exit 每个驱动程序都要有这两个函数 它们分别用于设备驱动程序的加载和撤消 staticstructfile operationsspioc fops 每个驱动程序都要有这样的结构体 可能不止一个 用register chrdev 注册驱动程序时这个结构体的起始地址被传送到内核的设备表中 SPIOC MAJOR 每个设备驱动程序有一个主设备号 majornumber 不同设备驱动程序不能使用相同的主设备号 一个设备驱动程序可以管理不同的 但一般是同一类的 设备 通过次设备号 minornumber 区分 spioc open close read write ioctl 根据具体驱动程序定义和使用 一般open close 总是需要的 而且open 和close 一定要成对出现 23 设备驱动程序的使用 驱动程序模块的动态链接和静态链接创建设备文件使用设备 24 设备驱动程序被静态编译到内核中的情况 module init 指示内核在启动过程中运行设备的初始化函数 如spioc init 函数 驱动程序的加载随内核的启动一起完成 静态编译的内核模块不能被动态卸载 只有到系统关闭时由内核执行相应的卸载函数 如spioc exit 嵌入式操作系统一般使用静态内核模块以减少系统的尺寸和复杂性 驱动程序模块的加载 设备驱动程序被动态加载到内核中的情况 首先 驱动程序需要被编译成目标文件 如spioc o 在操作系统运行之后 使用insmod命令将驱动程序模块动态加载到内核中 insmodspioc o使用insmod命令动态加载的内核模块可以使用rmmod命令动态地从内核中卸载 rmmodspioc o使用内核的动态模块加载 卸载功能需要内核支持kmod功能 25 创建设备文件 Linux操作系统将字符设备和块设备作为一种特殊的文件对待 这就是设备文件 使用mknod命令建立设备文件 mknodc210 dev spioc c 字符设备b 块设备 主设备号 次设备号 设备文件 crw 1rootroot21 0Jan100 15spioc dev 26 使用设备驱动程序 应用程序 系统调用 设备驱动程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青岛农场永久转让合同
- 沿街商铺租房协议合同
- 立体车位安装租赁合同
- 2025年高速铁路建设合同质量控制协议
- 钢结构焊接施工合同(3篇)
- 梳理化学粘合非织造布制作工安全宣贯强化考核试卷含答案
- 海洋生物调查员安全知识宣贯评优考核试卷含答案
- 四川省成都市双流区双流棠湖中学2025年高一上生物期末学业质量监测试题含解析
- 服装及纺织品整烫工操作水平考核试卷含答案
- 绢人工岗位工艺技术规程
- 2026届高三二轮复习试题数学专题突破练6求数列的通项公式
- 2025年煤气证考试题附答案
- 诈骗罪的课件
- 电子专用设备装调工复试强化考核试卷含答案
- (2025年)教育系统后备干部试题附答案
- 2025至2030中国晶体行业项目调研及市场前景预测评估报告
- 2026-2031中国轨道交通市场深度调研及投资策略分析报告
- 2025药品流通配送医疗机构服务行业市场发展深度研究及配送网络优化和医药物流管理规划方案报告
- 法布尔昆虫记螳螂课件
- GB 46768-2025有限空间作业安全技术规范
- 20-DI-2025005968-移动电源安全技术规范
评论
0/150
提交评论