1、第,10,章,Linux,内核的移植,ARM,原理与应用,上讲知识回顾,GPIO,DMA,本讲学习内容,实验,8,简单的程序,12.1.1,设备驱动程序概述,1.,驱动程序定义及功能,设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,.,12.1,设备驱动程序基础,完成以下功能:,(1),对设备初始化和释放;,(2),对设备进行管理,包括实时参数设置,以及提供对设备的操作接口;,(3),读取应用程序传送给设备文件的数据或者回送应用程序请求
2、的数据;,(4),检测和处理设备出现的错误。,简单来说可以概括为:管理,I/O,设备,上层软件的抽象操作与设备操作的转换。,2.,设备驱动程序的概念,Linux,操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作,。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,,一般来说,是把设备映射为一个特殊的设备文件,,用户程序可以像对其他文件一样对此设备文件进行操作。,由于每一个设备至少有文件系统的一个文件代表,因而都有一个“文件名”。,应用程序,通常可以通过,Linux,系统调用,open(),打开设备文件,建立起与目标设备的连接。,打开了代表着目标设备
3、的文件,即,建立起与设备的连接后,,可以通过,read(),、,write(),、,ioctl,(),等常规的文件操作对目标设备进行操作。,设备文件的属性由三部分信息组成:,第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。,其中类型和主设备号结合在一起惟一地确定了设备文件驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。,由于,Linux,中将设备当做文件处理,所以对设备进行操作的调用格式与对文件的操作类似,主要包括,open(),、,read(),、,write(),、,ioctl,(),、,close(),等。,应用程序发出系统调用命令后,会从用户态转到
4、核心态,,通过内核将,open(),这样的系统调用转换成对物理设备的操作。,3.,驱动层次结构,Linux,下的设备驱动程序是内核的一部分,运行在,内核模式,,也就是说设备驱动程序为内核提供了一个,I/O,接口,用户使用这个接口实现对设备的操作。,下图所示,显示了典型的,Linux,输入,/,输出系统中各层次结构和功能。,4.,设备驱动程序与外界的接口,每种类型的驱动程序,不管是字符设备还是块设备都为内核提供相同的调用接口,因此内核能以相同的方式处理不同的设备。,Linux,为每种不同类型的设备驱动程序维护相应的数据结构,以便定义统一的接口并实现驱动程序的可装载性和动态性。,Linux,设备驱
5、动程序与外界的接口可以分为如下三个部分。,驱动程序与操作系统内核的接口:,这是通过数据结构,file_operations,来完成的。,驱动程序与系统引导的接口:,这部分利用驱动程序对设备进行初始化。,驱动程序与设备的接口:,这部分描述了驱动程序如何与设备进行交互,这与具体设备密切相关。,它们之间的相互关系如下图所示。,实验,8,简单的程序,一个,简单的测试驱动,C,程序,用户空间,-,应用程序,一个,简单的驱动程序,内核空间,-,字符设备驱动程序,该应用程序通过系统调用,open(),函数打开设备文件,该应用程序,通过,read(),、,write(),、,ioctl,(),等常规的文件操作
6、对目标设备进行操作,open(),、,read(),、,write(),、,ioctl,(),、,close,(),等函数均在底层驱动实现,但应用程序可以通过系统调用,open,()打开目标设备,调用这些函数与目标设备进行相关操作。,因此,应用程序可以通过修改程序,实现对设备的各种控制;而底层驱动程序只需具备一些基本的功能即可。,read(),、,write(),、,ioctl,(),函数在驱动程序中的实现,底层驱动程序特点:,实现简单易操作的动作,数据结构,-,驱动程序与操作系统内核的接口,注册字符设备,驱动程序的入口,要求修改程序实现,2,盏灯的交替亮和灭。,驱动程序中,(实现基本功能:亮和灭),Open(),函数中加,PB5678,输出属性初始化程序;,read(),函数中加一个,PB5,引脚亮的程序;,write(),函数中加一个,PB6,引脚亮的程序;,ioctl,(),函数中加一个,PB5678,引脚灭的程序。,应用程序中(实现亮灭的变化多样性),调用,read()write(),ioctl,(),函数。,应用程序修改处,如要实现,2,盏灯的跑马灯,如何修改?,提示:,底层驱动程序不用修改,只需修改上层应用程序,。,31,