《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动

简介:

本节书摘来自异步社区《Android深度探索(卷1):HAL与驱动开发》一书中的第1章,第1.6节 Linux设备驱动,作者李宁,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.6 Linux设备驱动
Android深度探索(卷1):HAL与驱动开发
随着计算机技术的不断发展,与计算机(也包括手机等计算设备)相关的硬件设备的种类也不断丰富起来。这就需要大量的Linux设备驱动来与这些硬件设备进行交互。为了使读者在学习如何编写Linux驱动之前对Linux驱动有一个初步的认识,本节介绍了设备驱动在整个操作系统中的作用以及设备驱动的分类。

1.6.1 设备驱动的发展和作用
任何一台计算机系统的运行都是由软硬件共同作用的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则是一堆废铁。在计算机软件发展的初期,并没有驱动的概念,在这个时期的软件都是直接访问计算机的硬件。一般会通过计算机上的各种元器件和接口(如网卡上的中断、I/O端口、串口、寄存器等)与要控制的硬件通信。例如,本书曾经使用TC2.0(DOS环境)直接和串口通信来获取外部设备中的数据。

应用程序与硬件直接通信从技术上当然没什么问题,但却未对应用软件程序员的职责做更细的划分,所造成的后果就是应用软件程序员也必须要了解外部设备与计算机之间的通信协议以及一些硬件的知识才能使应用程序与这些设备通信,例如,控制打印机。问题还不止这些,大家试想,现在有一个应用程序要将生成的电子表格输出到打印机。应用程序最开始是为A型号打印机做的,而此时A型号打印机恰好坏了,换了B型号的打印机。由于A型号打印机和B型号打印机的打印指令差别很大,这就造成原来的应用程序无法控制B型号的打印机,为了使应用程序可以正常使用B型号打印机,必须重新修改应用程序的源代码以适应B型号打印机的打印指令。通过这个案例很容易知道如果应用程序直接访问硬件,就会造成与硬件耦合度过高的情况。

为了解决上述问题,软件不得不向前发展(几乎所有的新技术和新理论都是为了应对曾经无法解决的问题或使问题解决得更好而出现的,也就是说,由需求决定出现哪些新的技术和理论)。降低软件和硬件之间的耦合度成为当前首要解决的问题。了解面向对象的读者会很容易想到,降低对象与对象之间耦合度最有效的方法是通过接口(Interface)对类进行抽象,也就是说,抽象度越高,耦合度越低。

抽象这个概念同样也可以用在硬件上。只要将同一类型(如打印机)但不同型号的设备抽象成统一的接口就可以很容易解决上述问题。毫无悬念,这个抽象硬件的任务就落在了“驱动”身上。

驱动是直接和硬件交互的一类程序,负责对硬件进行抽象。如前面提到的打印机的例子。如果设计一套抽象的打印机驱动,并提供应用程序可访问的API。那么就算换了其他型号的打印机,只要应用程序通过驱动来访问打印机,就不需要再修改应用程序的源代码。而且开发应用程序的程序员并不需要了解打印机的打印指令。在解决上述接口问题的同时,又产生了一个新的技术领域:驱动程序开发。当然,开发驱动程序的技术人员通常被称为驱动工程师。

1.6.2 设备的分类及特点
计算机系统的硬件主要由CPU、存储器和外设组成。随着技术的不断提高,芯片的集成度也越来越高,往往在CPU内部就集成了存储器和外设适配器。ARM、PowerPC、MIPS等处理器都集成了UART、USB控制器、SDRAM控制器等,有的处理器还集成了片内RAM和Flash。

驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核。Linux将存储器和外设分为3大类:

字符设备(Character devices);
块设备(Block devices);
网络设备(Network devices)。
字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标、键盘等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备与块设备并没有明显的界限,如Flash设备符合块设备的特点,但是也可以把它作为一个字符设备来访问。

字符设备和块设备的驱动设计有很大的差异,但对用户而言,它们都使用文件系统(Linux通过文件系统访问驱动)的操作接口open、close、read、write等函数进行访问。

在Linux系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。Linux内核与网络设备的通信和Linux核与字符设备、块设备的通信方式完全不同。

另外,USB驱动、PCI驱动、LCD驱动等大体可归入上述3类设备,但对于这些复杂的设备,Linux系统还定义了独特的体系结构。

相关文章
|
2月前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
3月前
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
195 2
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
|
3月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
119 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
5月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(五):基于GPIO、LED子系统的LED驱动
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,使用GPIO和LED子系统来实现LED驱动的教程,包括了DTS设备树配置、驱动源码编写以及如何在用户空间控制LED的亮度和开关。
149 0
基于Amlogic 安卓9.0, 驱动简说(五):基于GPIO、LED子系统的LED驱动
|
5月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
90 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
5月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
如何使用Amlogic T972安卓9.0系统上的misc框架来简化驱动程序开发,通过misc框架自动分配设备号并创建设备文件,从而减少代码量并避免设备号冲突。
60 0
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
|
5月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
86 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
5月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
122 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
5月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
62 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
|
5月前
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
67 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动