“黑色经典”系列之《嵌入式Linux 应用程序开发详解》

11 章 嵌入式Linux 设备驱动开发

本章目标

本书从 6 章到 10 章详细讲解了嵌入式Linux 应用程序的开

发 ,这些都是处于用户空间的内容。本章将进入到Linux 的内核空间,

初步介绍嵌入式Linux 设备驱动的开发。驱动的开发流程相对于应用

程序的开发是全新的 ,与读者以前的编程习惯完全不同,希望读者能

尽快地熟悉现在环境。经过本章的学习,读者将会掌握以下内容。

Linux 设备驱动的基本概念

Linux 设备驱动程序的基本功能

Linux 设备驱动的运作过程

常见设备驱动接口函数

掌握LCD 设备驱动程序编写步骤

掌握键盘 备驱动程序编写步骤

能够独立定制Linux 服务

清远见培训教材

清远见——嵌入式培训专家

11.1 设备驱动概述

11.1.1 设备驱动简介及驱动模块

操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱

动硬件是操作系统最基本的功能,并且提供统一的操作方式。设备驱动程序是内核的一部分,

硬件驱动程序是操作系统最基本的组成部分,在Linux 内核源程序中也占有60% 以上。因此,

熟悉驱动的编写是很重要的。

在第2 章中已经提到过,Linux 内核中采用可加载的模块化设计 LKMs ,Loadable Kernel

Modules ),一般情况下编译的Linux 内核是支持可插入式模块的,也就是将最基本的核心代

码编译在内核中,其他的代码可以选择在内核中,或者编译为内核的模块文件。

常见的驱动程序也是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而 Linux

最基础的驱动,如CPU、PCI 总线、TCP/IP 协议、APM (高级电源管理)、VFS 等驱动程序

则直接编译在内核文件中。有时也把内核模块叫做驱动程序,只不过驱动的内容不一定是硬

件罢了,比如ext3 文件系统的驱动。因此,加载驱动时就是加载内核模块。

这里,首先列举一些模块相关命令。

lsmod 列出当前系统中加载的模块,其中左边第一列是模块名,第二列是该模块大小,

第三列则是该模块使用的数量。如下所示:

[root@www root]# lsmod
Module Size Used by
autofs 12068 0 (autoclean) (unused)
eepro100 18128 1
iptable_nat 19252 0 (autoclean) (unused)
ip_conntrack 18540 1 (autoclean) [iptable_nat]
iptable_mangle 2272 0 (autoclean) (unused)
iptable_filter 2272 0 (autoclean) (unus