互联网采用TCP/IP协议并不是ISO规定的标准协议,但是作为应用最广泛的协议已经成为大规模网络通信的事实标准。TCP/IP协议实际上是由一组协议组成的,通常也称作TCP/IP协议簇。图10.10IPv4协议头部从图中可以看出这是个复杂的结构,最常用字段是源地址和目的地址,用来寻址和查路由。如图10.9所示,TCP协议位于网络互联层后,是IP协议的上层协议。......
2023-11-19
1.Linux设备
设备驱动针对的对象是存储器和外设,因此Linux将存储器和外设分为三个基础大类。
●字符设备
字符设备通常指不需要缓冲就能够直接读写的设备,它们以字节为单位进行读写,如串行口、并行口、虚拟控制台等。
●块设备
块设备通常指仅能以块为单位读写的设备,典型的块大小为512B或1024B,它的读取是通过缓冲区来进行的,诸如磁盘、内存、Flash等存储设备。
●网络设备
网络设备通常指网络设备访问的接口,如网卡等,它们由内核中网络子系统驱动,负责接收和发送数据包。
嵌入式Linux将这三大类设备都当做文件进行处理,即字符设备文件、块设备文件和网络接口设备文件。三类设备中使用较多为字符设备和块设备,二者的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O操作就发生了;块设备则不然,它需要利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。而块设备主要针对磁盘等慢速设备设计的,主要是为了避免耗费过多的CPU时间来等待。
2.设备驱动程序
任何一个计算机系统的运转都是系统中软硬件共同努力的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则只是一堆废铁;硬件是底层基础,是所有软件得以运行的平台,代码最终落实为硬件上的组合逻辑与时序逻辑;软件则实现了具体的应用,它按照各种不同的业务需求设计,最终完成用户的需求。
对设备驱动最通俗的解释就是“驱使硬件设备行动”。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备轮询、中断处理、通信,进行物理内存到虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能够显示文字和画面,让存储设备能够记录文件和数据。由此可见,设备驱动充当了硬件和软件之间的纽带,负责硬件和应用软件之间的沟通。(www.chuimin.cn)
嵌入式Linux内核采用可加载的模块化设计方式,即将最基本的核心代码编译在内核中,其他的代码若有必要则编译成内核的模块文件。常见的设备驱动程序则作为内核模块动态的加载,比如声卡驱动程序和网卡驱动程序等。因此,驱动程序的设计,要求开发人员熟悉Linux的内核机制、驱动程序和用户级应用程序的接口关系、系统中对设备的并发操作,同时要求开发人员非常熟悉所开发硬件的工作原理。
往往对一个设备进行访问和操作的程序由两部分组成,一个是设备驱动程序,一个是应用程序;但两者又是不同的,设备驱动程序是用户应用程序与硬件之间的一个中间软件层,其层次结构如图9.1所示。
图9.1 设备驱动的层次结构
应用程序一般都有一个main函数,从头到尾执行一个任务,而设备驱动程序没有main函数,它通过用户空间的insmod命令将设备驱动程序的初始化函数加入到内核中,在内核空间执行驱动程序的初始化函数,完成驱动程序的初始化和注册,之后驱动便停止下来,一直等待被应用程序调用。因此,设备驱动程序有时简称为驱动。
嵌入式Linux中的设备驱动程序有以下三个方面的特点。
(1)内核代码:设备驱动程序是内核的一部分,如果设备驱动程序出错,则有可能导致系统崩溃。
(2)内核接口:设备驱动程序必须为内核或者其子系统提供一个标准接口。
(3)可动态装载:大多数嵌入式Linux设备驱动程序都可以在需要时动态地装载进内核,在不需要时从内核中卸载。
设备驱动程序运行在内核空间,而用户应用程序则运行在用户空间;嵌入式操作系统通过系统调用和硬件中断来完成从用户空间到内核空间的控制转移。
有关ARM嵌入式系统原理与应用的文章
互联网采用TCP/IP协议并不是ISO规定的标准协议,但是作为应用最广泛的协议已经成为大规模网络通信的事实标准。TCP/IP协议实际上是由一组协议组成的,通常也称作TCP/IP协议簇。图10.10IPv4协议头部从图中可以看出这是个复杂的结构,最常用字段是源地址和目的地址,用来寻址和查路由。如图10.9所示,TCP协议位于网络互联层后,是IP协议的上层协议。......
2023-11-19
GPIO是一组可编程控制的引脚,由多个寄存器同时控制。应用程序都能够通过相应的接口使用GPIO。GPIO驱动主要作用就是读取GPIO口的内容,或者设置GPIO口的状态。GPIO与硬件体系密切相关,在Linux内核目录下的相关文件中我们可以发现针对不同硬件芯片的GPIO定义和使用方法,如本书涉及的S5PV210芯片Linux内核中也有相应的驱动程序支持。本章主要讲的就是如何使用Linux内核封装好的GPIO接口函数在驱动开发中需要操作GPIO时候的使用。......
2023-11-19
对一个打开的文件而言,最常用到的就是对文件的读写操作,在Linux系统中,提供了系统调用函数实现文件的读写操作。读取文件数据时,文件的当前读写位置会向后移。以下几种读取文件数据情况下,返回的字节数会小于count值。......
2023-11-19
上面介绍了字符设备驱动程序的重要的数据结构,那么如何设计一个字符设备驱动程序的数据结构?字符设备驱动程序的初始化流程一般可以用如下的过程来表示:定义相关的设备文件结构体[如file_operation()中的相关成员函数的定义]。向内核申请主设备号。内核提供了三个函数来注册一组字符设备编号,这三个函数分别是:alloc_chrdev_region()、register_chrdev_region()和register_chrdev()。所以在一般的字符设备驱动程序中,不会看到对cdev的操作。这里举出字符设备驱动程序的常见的两种编程架构。......
2023-11-19
用户应用程序调用设备的功能都是在设备驱动程序中定义的,也就是设备驱动程序中所定义的功能入口点函数。struct file_operations{};struct inode{};struct file{};编写设备驱动程序,很大一部分工作就是“填写”结构体中定义的函数。取得目录入口点,只用于与文件系统相关的设备驱动程序。一般编写设备驱动程序时并不一定要全部定义以上函数,只需定义对设备有意义的接口函数。fie结构主要是与文件系统对应的设备驱动程序使用。......
2023-11-19
2.开发模式嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。表1.2常用嵌入式开发工具......
2023-11-19
Linux软件开发一直在Internet环境下讲行。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。Linux程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。......
2023-11-19
具体来说,嵌入式系统是以应用为中心、计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。可以这样认为,嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。表1.1对比了通用计算机系统与嵌入式系统。......
2023-11-19
相关推荐