嵌入式接口技术与LINUX驱动开发
- 格式:doc
- 大小:52.50 KB
- 文档页数:7
嵌入式Linux驱动开发教程PDF嵌入式Linux驱动开发教程是一本非常重要和实用的教材,它主要介绍了如何在Linux操作系统上开发嵌入式硬件设备的驱动程序。
嵌入式系统是指将计算机系统集成到其他设备或系统中的特定应用领域中。
嵌入式设备的驱动程序是连接操作系统和硬件设备的关键接口,所以对于嵌入式Linux驱动开发的学习和理解非常重要。
嵌入式Linux驱动开发教程通常包括以下几个主要的内容:1. Linux驱动程序的基础知识:介绍了Linux设备模型、Linux内核模块、字符设备驱动、块设备驱动等基本概念和原理。
2. Linux驱动编程的基本步骤:讲解了如何编译和加载Linux内核模块,以及编写和注册设备驱动程序所需的基本代码。
3. 设备驱动的数据传输和操作:阐述了如何通过驱动程序与硬件设备进行数据的传输和操作,包括读写寄存器、中断处理以及与其他设备的通信等。
4. 设备驱动的调试和测试:介绍了常用的驱动调试和测试技术,包括使用调试器进行驱动程序的调试、使用模拟器进行驱动程序的测试、使用硬件调试工具进行硬件和驱动的联合调试等。
通常,嵌入式Linux驱动开发教程的PDF版本会提供示例代码、实验步骤和详细的说明,以帮助读者更好地理解和掌握嵌入式Linux驱动开发的核心技术和要点。
读者可以通过跟随教程中的示例代码进行实际操作和实验,深入了解和体验嵌入式Linux驱动开发的过程和方法。
总之,嵌入式Linux驱动开发教程是一本非常重要和实用的教材,对于想要在嵌入式领域从事驱动开发工作的人员来说,具有非常重要的指导作用。
通过学习嵌入式Linux驱动开发教程,读者可以系统地了解和学习嵌入式Linux驱动开发的基本原理和技术,提高自己在嵌入式Linux驱动开发方面的能力和水平。
第28卷第4期增刊 2007年4月仪 器 仪 表 学 报Chinese Jour nal of Scientif ic InstrumentVol.28No.4Apr.2007 嵌入式L inux 下GPIO 驱动程序的开发及应用3何 泉,贺玉梅(北京化工大学信息科学与技术学院 北京 100029)摘 要:嵌入式Linux 是一种适用于嵌入式系统的源码开放的占先式实时多任务操作系统,是目前操作系统领域中的一个热点,其重点与难点是驱动程序的开发。
开发嵌人式Linux 下的设备驱动程序,可以更好地利用新硬件特性,提高系统访问硬件的效率,改善整个应用系统的性能。
驱动程序修改非常方便,使应用系统非常灵活。
本文简要论述了基于A TM E L 公司嵌入式ARM 处理器芯片的嵌入式Linux 的GP IO 驱动程序的开发原理及流程。
关键词:嵌入式Linux ;ARM ;驱动程序;设备文件;GPIOInvest igat ion an d a pplicat ion of GP IO dr iver in t he embedded L inuxHe Quan ,He YuMei(School of I nf orma tion Science and Tec hnology BU CT ,Beij ing 100029,China )Abstract :Embedded Linu x ,w hich i s a full y real 2time kernel and applicable to embedded syst ems ,has bec o me a hot s 2po t in t he do main of op erati ng system at present.It s out line and difficult y is to investigat e drivers.Developi ng device dri vers o n embedded Lin ux can help using t he new devices ,and imp rovi ng t he e fficiency of access to t he new devices and t he p erformance cap abilit y.As drivers can be changed easil y ,t he system is very convenient and flexi ble.Thi s p a 2p er simpl y point s o ut t he element s and flow of t he GPIO driver in t he embedded Linux based o n t he A RM proces sor of A TMEL system.Key words :embedded Li nux ;A RM ;driver ;device file ;GPIO 3基金项目国家自然科学基金(6)、北京化工大学青年教师自然科学研究基金(QN 58)资助项目1 引 言随着半导体技术的飞速发展,嵌入式产品已经广泛应用于军事、消费电子、网络通信、工业控制等各个领域,这是嵌入式系统发展的必然趋势。
162010,31(1)计算机工程与设计Computer Engineering and Design0引言NVRAM (non-volatile random access memory ,非易失性随机访问存储器)是广泛应用于网络路由器的一种存储器件。
它如同PC 上的CMOS ,作用是存放路由器的配置参数。
目前常见的NVRAM ,大都是静态SRAM ,即带有备用电源的SRAM ,它的实现最简单,同普通内存操作一样。
但是在实际应用中,不是所有的开发板都配备有静态SRAM 。
在这种情况下,如果使用该方案开发网络路由器,重新加入配备电源的SRAM 必须要重新排版,布线。
开发周期与开发成本将会大大增加。
因此,可以考虑在现有的硬件资源基础上,通过新的方式来实现NVRAM [1]。
本文就是以神州龙芯开发的CQ8401开发板为硬件平台,在自行裁剪和移植的嵌入式Linux 平台下,利用Nor Flash 来实现网络路由器的NVRAM 功能。
1NVRAM 新的实现方案分析由于NVRAM 仅用于保存启动配置文件(Startup-Config ),故其容量较小,通常在路由器上只配置32KB~128KB 大小的NVRAM 。
配备电源的SRAM 速度较快,是目前读写最快的存储设备,而成本也比较高。
一般的开发板所配备的Nor Flash空间足够大,在系统性能得到满足的前提下,可以把Nor Flash 分出一个区来当作NVRAM 使用。
SRAM 和Nor Flash 的对比分析,如表1所示。
网络路由器中的NVRAM 用于存放配置参数。
正常启动路由器后,NVRAM 中的内容会拷贝到内存一份,我们对路由器的设置实际上就是修改内存中的参数。
所以内存和NVRAM 中的内容可以不一样,直到使用write memory 将内存设置保存到NVRAM 。
在系统起来以后,我们可以根据需要修改配备参收稿日期:2009-07-17;修订日期:2009-09-18。
1.为什么要选择LINUX:(1)面向服务,网络功能强大(2)源码开放,可移植性强(3)有大公司的支持,Intel,IBM,ARM(4)一个全新的世界(5)学术研究必不可少的平台(源码、算法、对比实验……)2.LINUX的驱动程序:(1)LINUX下对外设的访问只能通过驱动程序,uClinux下可以在应用层直接访问外设,操作寄存器,但是无法处理中断,DMA,抢占,原子操作等(2)LIUNX对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序Open,release,read,write,ioctl…(3) 驱动程序是内核的一部分,可以使用中断,DMA等操作注:uClinux是linux2.0核心的分支,是针对没有MMU管理单元的微控制器,uClinux不是实时操作系统(4)驱动程序需要在用户态和内核态之间传递数据(5)对于复杂的应用可以考虑是用mmap3. 在驱动程序中通过devfs_register()函数创建设备文件系统的特点;系统启动的时候mount 设备文件系统;所有需要的设备节点都由内核自动管理,/dev目录下只有挂载的设备。
4.设备驱动程序的作用:(1)设备驱动程序将复杂的硬件抽象成一个结构良好的设备,并通过提供统一的程序接口为其它部分提供使用设备的能力和方法。
(2)设备驱动程序(应该只是)为系统的其它部分提供各种使用设备的能力,使用设备的方法应该由应用程序决定。
5.设备驱动程序是内核代码的一部分;驱动程序的地址空间是内核的地址空间,应用程序通过操作系统的系统调用执行相应的驱动程序函数,中断则直接执行相应的中断程序代码。
6. linux内核加载过程:通常,linux内核是经过gzip压缩之后的映像文件(1)bootloader 复制压缩内核到内存空间(2)内核自解压(3)运行文件7.编译完成的linux内核在哪里:(1)./vmlinux,elf格式未压缩(2)arch/arm/boot/compressed/vmlinux,压缩以后的elf内核8.在ARM体系结构下,用户态对应了ARM的USR模式,内核态对应了SVC模式、多数操作系统都把内核和运行在其上的应用程序分为两个层次管理:“内核态”和“用户态”9.GCC是linux下的编译器:(1)可以编译内核,应用程序,bootloader&其它OS(2)ASNI C,GUN C,C99最初linux是一种只可以运行在PC机上免费的UNIX操作系统,如今linux已发展成为一种强大的操作系统10.我们可以使用crosstool,它是一个专门建立编译工具链的脚本,可以在很大程序上简化我们的工作。
11.构建toolchains必须的组件:Linux内核源码;gcc; glibc; glibc_linuxthreads POSIX线程序库;binutils。
Binutils中的常用工具:Addr2line把程序地址转换为文件名和行号;As主要用来编译gcc输出的汇编文件,产生的目标文件由连接器ld连接;Ld连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用;Objcopy把一种目标文件中的内容复制到另一种类型的目标文件中;Objdump显示一个或者更多目标文件的信息;Readelf显示elf格式可执行文件的信息;Strip丢弃目标文件中的全部或者特定符号。
12.linux内核被设计为必须使用GNU的C编译器gcc来编译,而不是任何一种C编译器都可以使用。
13.linux内核主体使用GUN C。
linux内核源码庞大,结构复杂:(1)对linux2.4内核的统计:1万个文件,6百万行代码(2)对linux2.6内核的统计:1.5万个文件,6百万行代码内核编程习惯(技巧)不同于应用程序。
14.每一个进程(或应用程序)都通过MMU建立独立寻址空间——用户空间。
一个进程是不可以随便修改(或者访问)另一个进程中的数据和代码的。
进程之间要想运行数据交互,要么经过内核传递,要么通过内核映射共享内存。
15.linux的设备文件以文件的形式存在/dev目录设备文件是特殊文件,使用LS/dev-1命令可以看到。
主设备号标识设备对应的驱动程序,一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法,系统增加一个驱动程序就要赋予它一个主设备号,这一赋值过程在驱动程序的初始化过程中。
16.设备已经注册到内核表中,对于设备的访问通过设备文件(设备文件与设备驱动程序的主设备号匹配),内核会调用驱动程序中的正确函数。
17.给程序一个它们可以请求设备驱动程序的名字,这个名字必须插入到目录/dev中,并与驱动程序的主设备号和次设备号相连。
18.动态分配的主设备号不能保证总是一样的无法事先创建设备节点;可以读取/proc/devices读取cat/proc/devices;利用脚本动态创建设备文件节点。
19.linux设备的分类:(1)字符设备(2)块设备(3)网络设备20.为实现这种用户文件操作到设备操作的转换,虚拟文件系统向下为设备驱动提供了一个标准化的文件操作实现接口。
这个接口由include/linux/fs.h 文件中的file_operations结构定义,设备驱动程序的file_operations结构体的地址被注册到内核中的设备链表中。
在设备驱动程序中file_operations结构体变量需在驱动程序加载时,向内核注册该结构体变量,这样用户对设备文件的操作就会通过虚拟文件系统转换为对驱动程序注册的file_operations结构中相应的接口函数调用。
21.Linux 下 devfs、sysfs、udevlinux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。
一、devfsdevfs是在2.4内核就出现了,它是用来解决linux中设备管理混乱的问题,你查看一下/dev下的设备文件就知道其中有许多是空的(也就是没有对应的硬件的),但是它们却必须存在,所以这给linux设备管理带来了很多麻烦,为了解决这个问题,linux内核开发人员开发了devfs,并用一个守护进程devfsd 来做一些与以前硬件驱动兼容的事情。
devfs和sysfs都是和proc一样,是一个虚拟的文件系统,向devfs注册的驱动程序,devfs将会在/dev下建立相应的设备文件;但是为了兼容,devfsd 这个守护进程将会在某个设定的目录中建立以主设备号为索引的设备文件,如果不这么做,以前的许多应用将不能运行。
在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。
但是devfs文件系统有一些缺点,例如:不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应 sdb;没有足够的主/辅设备号,当设备过多的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等。
二、sysfssysfs是Linux 2.6所提供的一种虚拟档案系统。
这个档案系统不仅可以把装置(devices)和驱动程式(drivers)的资讯从kernel space输出到user space,也可以用来对装置和驱动程式做设定。
sysfs的目的是把一些原本在procfs中的,关于装置的部份独立出来,以[装置阶层架构}(device tree)的形式呈现。
这个档案系统由Patrick Mochel所写,稍后Maneesh Soni撰写 "sysfs backing store path",以降低在大型系统中对内存的需求量。
sysfs一开始以ramfs为基础,也是一个只存在于内存中的档案系统。
ramfs 是在2.4核心处于稳定阶段时加入的。
ramfs是一个优雅的实做,证明了要在当时仍很新的虚拟档案系统(VFS)下写一个简单的档案系统是多么容易的一件事。
由于ramfs的简洁以及使用了VFS,稍后的一些内存形式的档案系统都以它作为开发基础。
sysfs刚开始被命名成ddfs(Device Driver Filesystem),当初只是为了要对新的驱动程式模型除错而开发出来的。
它在除错时,会把装置架构(device tree)的资讯输出到procfs档案系统中。
但在Linus Torvalds的急切督促下,ddfs被转型成一个以ramfs为基础的档案系统。
在新的驱动程式模型被整合进2.5.1 核心时,ddfs 被改名成driverfs,以更确切描述它的用途。
在2.5核心开发的次年,新的‘驱动程式模型’和‘driverfs’证明了对核心中的其他子系统也有用处。
kobjects被开发出来,作为核心物件的中央管理机制,而此时driverfs也被改名成sysfs。
正因为devfs上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟 devfs一样它也是一个虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互。
该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject 子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。
用户空间的工具 udev就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,而devfs却运行在内核空间,而且 udev不存在devfs那些先天的缺陷。
很显然,sysfs将是未来发展的方向。
三、udevudev是一种工具,它能够根据系统中的硬件设备的状况动态更新设备文件,包括设备文件的创建,删除等。
设备文件通常放在/dev目录下,使用 udev后,在/dev下面只包含系统中真实存在的设备。
它于硬件平台无关的,位于用户空间,需要内核sysfs和tmpfs的支持,sysfs为 udev提供设备入口和uevent 通道,tmpfs为udev设备文件提供存放空间。
22.字符设备驱动程序要解决的主要问题:输出:LED的linux驱动程序设计s34c2410平台上的源码输入:按键驱动程序设计23.关于OS移植层次:跨体系结构的移植、同体系结构下的移植、平台的移植24.read(),write(),ioctl(),open(),close()是一个字符设备驱动程序最基本的需要由驱动程序的作者完成的函数。