ChapLinux设备驱动程序.pptx
《ChapLinux设备驱动程序.pptx》由会员分享,可在线阅读,更多相关《ChapLinux设备驱动程序.pptx(110页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 主要内容版级支持包 BSP嵌入式系统初始化以及BSP的设计Linux系统驱动程序开发第1页/共110页BSP的概念 BSP全称“板级支持包”(Board Support Packages),说的简单一点,就是一段启动代码,和计算机主板的BIOS差不多,但提供的功能区别就相差很大在Windows CE中,BSP是驱动程序、OEM适应层(OEM Adaptation Layers,OAL)、硬件抽象层(HAL)以及启动设备和使外设正常工作所需BIOS文件的集合。第2页/共110页BSP和BIOS区别 BIOS主要是负责在电脑开启时检测、初始化系统设备(设置栈指针,中断分配,内存初始化.)、装入操
2、作系统并调度操作系统向硬件发出的指令。BSP是和操作系统绑在一起运行,尽管BSP的开始部分和BIOS所做的工作类似,但是 BSP还包含和系统有关的基本驱动 BIOS程序是用户不能更改,编译编程的,只能对参数进行修改设置,但是程序员还可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP中 第3页/共110页不同系统中的BSP 一个嵌入式操作系统针对不同的CPU,会有不同的BSP即使同一种CPU,由于外设的一点差别BSP相应的部分也不一样 第4页/共110页BSP的特点与功能 硬件相关性因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与
3、硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法。操作系统相关性不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式第5页/共110页BSP的设计与实现 为实现上述两部分功能,设计一个完整的为实现上述两部分功能,设计一个完整的BSPBSP需要完成两部分工作:需要完成两部分工作:设计初始化过程,完成嵌入式系统的初始化;设计初始化过程,完成嵌入式系统的初始化;设计硬件相关的设备驱动,完成操作系统及应用程序对具体硬件设计硬件相关的设备驱动,完成操作系统及应用程序对具体硬件的操作。的操作。第6页/共110页嵌入式系统初始化以及BSP的功能 嵌入式系统的初始化
4、过程是一个同时包括硬嵌入式系统的初始化过程是一个同时包括硬件初始化和软件初始化的过程;而操作系统件初始化和软件初始化的过程;而操作系统启动以前的初始化操作是启动以前的初始化操作是BSPBSP的主要功能之一的主要功能之一 初始化过程总可以抽象为三个主要环境,按初始化过程总可以抽象为三个主要环境,按照自底向上、从硬件到软件的次序依次为:照自底向上、从硬件到软件的次序依次为:片级初始化片级初始化板级初始化板级初始化系统级初始化系统级初始化第7页/共110页初始化过程 片级初始化:片级初始化:主要完成主要完成CPUCPU的初始化的初始化设置设置CPUCPU的核心寄存器和控制寄存器的核心寄存器和控制寄存
5、器CPUCPU核心工作模式核心工作模式CPUCPU的局部总线模式等的局部总线模式等片级初始化把片级初始化把CPUCPU从上电时的缺省状态逐步设置成为系统所要求的工作状态从上电时的缺省状态逐步设置成为系统所要求的工作状态这是一个纯硬件的初始化过程这是一个纯硬件的初始化过程第8页/共110页初始化过程(续1)板级初始化:完成CPU以外的其他硬件设备的初始化同时还要设置某些软件的数据结构和参数,为随后的系统级初始化和应用程序的运行建立硬件和软件环境这是一个同时包含软硬件两部分在内的初始化过程第9页/共110页初始化过程(续2)系统级初始化:这是一个以软件初始化为主的过程,主要进行操作系统初始化BSP
6、将控制转交给操作系统,由操作系统进行余下的初始化操作:包括加载和初始化与硬件无关的设备驱动程序建立系统内存区加载并初始化其他系统软件模块(如网络系统、文件系统等)最后,操作系统创建应用程序环境并将控制转交给应用程序的入口第10页/共110页硬件相关的设备驱动程序 BSPBSP另一个主要功能是硬件相关的设备驱动另一个主要功能是硬件相关的设备驱动与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用而是在系统初始化过程中由BSP把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中
7、由通用的设备驱动程序调用,实现对硬件设备的操作。第11页/共110页BSP开发的前提和步骤 开发的前提:熟悉硬件方面:使用CPU等熟悉工具方面:电表,示波器,逻辑分析仪,硬件仿真器,仿真调试环境等语言方面:汇编语言,C语言BSP开发的一般步骤如下:硬件主板研制,测试操作系统的选定,BSP编程上层应用程序的开发第12页/共110页编写BSP函数 BSP对板卡中每个芯片的操作都通过多个函数来完成 如果应用程序对板卡的操作都直接通过调用BSP中的函数来完成,那将很不利于源程序的调试,并降低了程序的可移植性把能完成某个特定功能的函数封装在一个库文件中,并放在应用程序与BSP之间 对每个芯片来说,都应当
8、有初始化函数和状态读取函数 第13页/共110页设计实现BSP的一般方法 BSP的开发需要具备一定的硬件知识 要求掌握操作系统所定义的BSP接口两种快捷方法 以经典BSP为参考 使用操作系统提供的BSP模板 设计实现BSP两部分功能时应采用以下两种不同方法“自底向上”地实现BSP中的初始化操作“自顶向下”地设计硬件相关的驱动程序第14页/共110页LinuxLinux设备驱动程序及开发设备驱动程序及开发第15页/共110页Linux设备驱动程序概述LinuxLinux设备驱动程序是处理或操作硬件控制器的设备驱动程序是处理或操作硬件控制器的软件,被集成在内核中,是常驻内存的低级硬软件,被集成在内
9、核中,是常驻内存的低级硬件处理程序的共享库,设备驱动程序是系统对件处理程序的共享库,设备驱动程序是系统对设备的抽象管理与控制。设备的抽象管理与控制。LinuxLinux允许设备驱动程序作为内核可加载模块实允许设备驱动程序作为内核可加载模块实现,即除了可以在系统启动时进行注册外,还现,即除了可以在系统启动时进行注册外,还可以在启动后进行加载注册。可以在启动后进行加载注册。第16页/共110页Linux驱动程序开发建立嵌入式Linux平台,移植和编写驱动程序往往是最具挑战的工作驱动程序的开发周期一般较长,对产品的面世时间有着重要影响驱动程序质量的好坏,直接关系到系统工作效能和稳定性,对项目的成败起
10、着关键作用第17页/共110页设备驱动程序主要功能设备驱动程序主要完成如下功能:设备驱动程序主要完成如下功能:检测设备和初始化设备检测设备和初始化设备使设备投入运行和退出服务使设备投入运行和退出服务从设备接收数据并提交给内核从设备接收数据并提交给内核从内核接收数据送到设备从内核接收数据送到设备检测和处理设备错误检测和处理设备错误第18页/共110页Linux设备驱动程序分类 LinuxLinux中所有设备被抽象出来,都看成文件中所有设备被抽象出来,都看成文件 设备的读写和普通文件一样设备的读写和普通文件一样LinuxLinux系统的设备分为如下三类:系统的设备分为如下三类:字符设备字符设备(c
11、har device)(char device)块设备块设备(block device)(block device)网络设备网络设备(network device)(network device)字符设备是指存取时没有缓存的设备字符设备是指存取时没有缓存的设备块设备的读写都有缓存来支持,且块设备必块设备的读写都有缓存来支持,且块设备必须能够随机存取须能够随机存取(randomaccess)网络设备在网络设备在LinuxLinux里做专门的处理里做专门的处理 第19页/共110页Linux设备驱动程序分类网络设备在网络设备在LinuxLinux里做专门的处理里做专门的处理LinuxLinux的网
12、络系统主要是基于的网络系统主要是基于BSD unixBSD unix的的socket socket 机制。在系统和驱动程序之间定义有机制。在系统和驱动程序之间定义有专门的数据结构专门的数据结构(sk_buff)(sk_buff)进行数据的传递进行数据的传递系统里支持对发送数据和接收数据的缓存,系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持提供流量控制机制,提供对多协议的支持 第20页/共110页Linux设备驱动程序分类典型的字符设备包括鼠标,键盘,串行口等典型的字符设备包括鼠标,键盘,串行口等块设备主要包括硬盘、软盘设备、块设备主要包括硬盘、软盘设备、CD-ROM
13、CD-ROM等等一个文件系统要安装进入操作系统必须在块设备上一个文件系统要安装进入操作系统必须在块设备上第21页/共110页Linux驱动程序介绍嵌入式嵌入式LinuxLinux驱动已经支持的设备门类齐全,已驱动已经支持的设备门类齐全,已成为其相对其他嵌入式操作系统的一大优势成为其相对其他嵌入式操作系统的一大优势工业控制常用的串口,并口工业控制常用的串口,并口人机输入设备如鼠标、键盘,触摸屏人机输入设备如鼠标、键盘,触摸屏彩色、黑白液晶显示输出彩色、黑白液晶显示输出网络的完善支持,包括网络的完善支持,包括tcp/iptcp/ip,udpudp,firewallfirewall,WLANWLAN
14、,ip forwardingip forwarding,ipsecipsec,vpnvpnUsbUsb的全面支持,包括的全面支持,包括usbusb硬盘、硬盘、u u盘,盘,usbusb摄像头摄像头支持丰富的文件系统,包括支持丰富的文件系统,包括FAT32FAT32,NTFSNTFS第22页/共110页嵌入式设备框图第23页/共110页驱动程序的功用1 1、驱动程序直接操控硬件、驱动程序直接操控硬件收发通讯数据读写存储介质,比如flash或硬盘操作输出设备和执行机构,例如打印,开关门禁等第24页/共110页驱动程序的功用(续)2 2、驱动程序提供软件访问硬件的机制、驱动程序提供软件访问硬件的机制
15、应用软件通过驱动程序安全高效的访问硬件驱动程序文件可以方便的提供访问权限控制驱动程序作为一个隔离的中间层软件,将底 层细节隐藏起来,提高了软件的可移植性第25页/共110页访问Linux设备驱动的方法设备提供dev文件系统节点和proc文 件系统节点应用程序通过dev文件节点访问驱动 程序应用程序通过proc文件节点可以查 询设备驱动的信息第26页/共110页驱动程序位置驱动程序位于驱动程序位于driversdrivers目录下目录下通常驱动程序占通常驱动程序占kernelkernel代码的代码的50%50%LinuxLinux设备驱动程序在设备驱动程序在LinuxLinux的内核源代码中占有
16、很大的的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。比例,源代码的长度日益增加,主要是驱动程序的增加。在在LinuxLinux内核的不断升级过程中,驱动程序的结构还是相内核的不断升级过程中,驱动程序的结构还是相对稳定。对稳定。在到的变动里,驱动程序的编写做了一些改变,但是从在到的变动里,驱动程序的编写做了一些改变,但是从的驱动到的移植只需做少量的工作。的驱动到的移植只需做少量的工作。第27页/共110页Linux驱动程序的加载方式驱动程序直接编译入内核驱动程序在内核启动时就已经在内存中可以保留专用存储器空间驱动程序以模块形式存储在文件系 统里,需要时动态载入内核驱动
17、程序按需加载,不用时节省内存驱动程序相对独立于内核,升级灵活第28页/共110页Linux驱动程序模块加载第29页/共110页Linux驱动程序开发的任务规划硬件资源的使用分离硬件相关和硬件无关的代码划分驱动程序的抽象层次移植驱动程序到新的平台第30页/共110页Linux驱动程序开发的任务规划硬件资源的使用CPU时间片分配中断处理系统存储器空间映射第31页/共110页设备存储器的映射第32页/共110页Linux驱动程序开发的任务分离硬件相关和硬件无关的代码划分驱动程序的抽象层次第33页/共110页设备驱动程序的代码驱动程序的注册与注销驱动程序的注册与注销register_chrdev()r
18、egister_blkdev()设备的打开与释放设备的打开与释放open()release()设备的读写操作设备的读写操作read()write()设备的控制操作ioctl()第34页/共110页设备驱动的加载使用模块的方式动态加载驱动使用模块的方式动态加载驱动int func_init(void)func_init(void)Makefile:Makefile:insmod lsmodrmmod 将驱动静态编译到内核里面将驱动静态编译到内核里面 int _init func_init(void)int _init func_init(void)Makefile:Makefile:启动时自动加
19、载第35页/共110页内核模块 模块是内核的一部分,但是并没有被编译到内核里去。它们被分别编译和连接成目标文件。用命令insmod插入一个模块到内核中,用命令rmmod卸载一个模块 在Linux内核中,以下内容一般编译成模块:大多数的驱动程序大多数的驱动程序。包括SCSI设备,CD-ROM,网络设备,不常用的字符设备,如打印机,watchdog等。大多数文件系统,理论上除了根文件系统不能是模块,其他文件系统都可以是模块。一些内核支持的不常用的可执行文件格式,如binfmt_misc。第36页/共110页 kmod 和高级模块化 Linux 提供了对模块自动加载和卸载的支持 要利用这一特性,在编
20、译内核前进行的配置中,必须打开对 kmod 的支持选项。一旦内核试图访问某种资源并发现该资源不可用时,它会对 kmod 子系统进行一次特殊的调用而不仅仅是返回一个错误 按需加载的例子:ALSA(Advanced Linux Sound Architecture)声卡驱动程序组的实现第37页/共110页常用的系统支持 内存申请和释放 中断时钟 I/O 中断打开关闭 输出信息注册驱动程序 第38页/共110页内存申请和释放 include/里声明了kmalloc()和kfree()。用于在内核模式下申请和释放内存。与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的
21、整次方。可以申请的最大长度也有限制。另外kmalloc()有priority参数 Kfree()释放的内存必须是kmalloc()申请的 第39页/共110页申请中断和释放中断 request_irq()、free_irq()是驱动程序申请中断和释放中断的调用。在include/里声明第40页/共110页时钟 时钟的处理类似中断,也是登记一个时间处理函数,在预定的时间过后,系统会调用这个函数。在include/linux/里声明使用时钟,先声明一个timer_list结构,调用init_timer对它进行初始化。Time_list结构里expires是标明这个时钟的周期,单位采用jiffies
22、的单位。第41页/共110页I/O I/O端口的存取使用:inline unsigned int inb(unsigned short port);inline unsigned int inb_p(unsigned short port);inline void outb(char value,unsigned short port);inline void outb_p(char value,unsigned short port);在include/里定义 第42页/共110页中断打开关闭 系统提供给驱动程序开放和关闭响应中断的能力 是在include/asm/#define cli()
23、_asm_ _volatile_(cli:)#define sti()_asm_ _volatile_(sti:)第43页/共110页输出信息 驱动程序要输出信息使用printk()include/linux/里声明第44页/共110页注册驱动程序 如果使用模块(module)方式加载驱动程序,需要在模块初始化时把设备注册到系统设备表里去不再使用时,把设备从系统中卸除 定义在drivers/net/里的两个函数完成这个工作Int register_netdev(struct device*dev);void unregister_netdev(struct device*dev);第45页/共
24、110页调试调试很多Linux的驱动程序都是编译进内核的,形成一个大的内核文件。但对调试来说,这是相当麻烦的。调试驱动程序可以用module方式加载。支持模块方式的驱动程序必须提供两个函数:int init_module(void)和void cleanup_module(void)。init_module()在加载此模块时调用,在这个函数里可以register_netdev()注册设备。init_module()返回0表示成功,返回负表示失败。cleanup_module()在驱动程序被卸载时调用,清除占用的资源,调用unregister_netdev()。第46页/共110页模块可以动态地
25、加载、卸载。在版本里,还有kerneld自动加载模块,但是中已经取消了kerneld。手工加载使用insmod命令,卸载用rmmod命令,看内核中的模块用lsmod命令。编译驱动程序用gcc,主要命令行参数-DKERNEL-DMODULE。并且作为模块加载的驱动程序,只编译成obj形式(加-c参数)。编译好的目标文件放在下,在启动文件里用insmod加载 第47页/共110页编译驱动程序第48页/共110页应用程序第49页/共110页编译应用程序第50页/共110页背景知识:背景知识:Linux设备管理设备管理第51页/共110页主要内容概述驱动程序基础中断处理辅助函数设备驱动程序模块编程基础
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ChapLinux 设备 驱动程序
限制150内