本节书摘来自异步社区《Linux 设备驱动开发详解(第2版)》一书中的第1章,第1.5节,作者:宋宝华著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.5 Linux设备驱动开发环境构建
Linux 设备驱动开发详解(第2版)
1.5.1 PC上的Linux环境
本书配套光盘提供了一个Ubuntu的VirtualBox虚拟机映像,该虚拟机上安装了所有本书涉及的源代码、工具链和各种开发工具,读者无需再安装和配置任何环境。该虚拟机可运行于Windows等操作系统中,运行方法如下。
(1)解压缩安装盘内的虚拟机磁盘映像virtual-disk.rar到本地硬盘得到virtual-disk.vdi(至少需要16GB的空闲磁盘空间)。
(2)安装安装盘内的VirtualBox虚拟机软件。
(3)建立一个虚拟机。
① 单击“新建”按钮,指定虚拟机使用Linux Ubuntu系统,如图1.6所示。

② 单击“下一步”按钮,如图1.7所示,使用推荐的内存384MB。

③ 指定虚拟机磁盘映像为第一步解压缩得到的virtual-disk.vdi,如图1.8所示。

④ 完成设置,如图1.9所示。
之后就可以启动虚拟机,账号和密码都是“lihacker”。本书配套源代码都位于lihacker主目录的develop目录下,几个主要项目针对/home/lihacker/develop/的子目录如下。
LDD6410开发板内核源代码:svn/ldd6410-2-6-28-read-only/linux-2.6.28-samsung。
LDD6410开发板U-BOOT源代码:svn/ldd6410-read-only/s3c-u-boot-1.1.6。

LDD6410开发板文件系统用的busybox、jpegview、mplayer、appweb等:svn/ldd6410-read- only/utils。
LDD6410开发板及常用Linux用户空间驱动测试程序:svn/ldd6410-read-only/tests。
书中globalmem、globalfifo等驱动实例:svn/ldd6410-read-only/training/kernel。
Android的源代码:git/myandroid。
NDK:android-ndk-r3。
eclipse:单击桌面上的“android-eclipse”图标,即可运行附带ADT的eclipse开发工具。
1.5.2 LDD6410开发板
LDD6410是本书专配的一款高端ARM11处理器开发板(其结构如图1.10所示,实物如图1.11所示),采用三星公司最新推出S3C6410处理器,芯片拥有强大的内部资源和视频处理能力,板上集成了丰富的外围接口,其主要特点如下。
(1)运行于533MHz的ARM11处理器(最高主频可达到667MHz)。
(2)运行于266MHz的DDR内存,128MB。
(3)1MB NOR Flash。
(4)256MB NAND Flash。
(5)WM9714 AC97声卡。
(6)VGA输出接口(可达1024×768@60Hz)。
(7)TV输出接口。
(8)USB 2.0 OTG接口及USB 1.1 host接口。

(9)SD/SDIO接口,支持SD卡和SDIO设备。
(10)DM9000百兆网卡。
(11)4.3寸LCD(分辨率为480×272)、触摸屏。
(12)S3C6410芯片内嵌图形加速,JPEG、多媒体编解码。
(13)6个GPIO按键。
(14)可扩展Camera、WiFi、3G modem等模块。
(15)可扩展外部矩阵键盘。
配套电路板提供了如下软件。
(1)工具链:提供了arm-linux-gcc、arm-linux-gdb、gdbserver、strace用于Android开发的eclipse(带ADT插件)、JDK和NDK。
(2)U-BOOT:U-BOOT源代码包含独立的LDD6410文件,支持从SD卡、NAND启动,支持DM9000网卡引导。
(3)Linux内核、BSP和驱动:Linux 2.6.28内核、源代码,包含独立的LDD6410 BSP和完整的设备驱动。
(4)文件系统:基于新版Busybox 1.15.1,文件系统集成jpegview、mplayer、appweb等大量应用,集成了按键、鼠标、触摸屏、LCD等测试程序,作为驱动的用户应用案例。
(5)Android:提供Android源代码和文件系统、内核电源管理补丁源代码、内核Android驱动源代码。LDD6410的Android系统支持按键、触摸屏和鼠标操作,支持使用LCD和VGA进行显示。
(6)QT:LDD6410支持Qt/Embedded 4.5.3,移植了Ts_lib和Tslib, ts_calibration,支持使用触摸屏进行操作。
LDD6410支持从SD卡或NAND启动,通过电路板上的SW1可设置LDD6410的启动模式。从SD卡启动设备为全ON;从NAND启动时,将1、2设置为ON,3、4设置为OFF。
LDD6410开发板的详细使用方法,请见配套光盘中的“LDD6410开发板用户手册”。
1.5.3 工具链安装
本书配套光盘的虚拟机映像中已经安装好了LDD6410的工具链,LDD6410开发板工具链为S3C6410X-ToolChain4.2.2-EABI-V0.0-cross-4.2.2-eabi.tar。安装步骤如下。
(1)解压上述工具链获得文件夹:4.2.2-eabi/。
(2)在/usr/local/下面创建目录 arm/(注意,最好是放到这个目录,不然在以后的编译过程中可能出现一些错误)。
(3)将目录 4.2.2-eabi/移动到/usr/local/arm/下面。
(4)设置环境变量。
编辑/etc/profile 文件,在文件末尾添加:
PATH="$PATH:/usr/local/arm/4.2.2-eabi/usr/bin"
export PATH
使环境变量生效,在终端输入命令:
source /etc/profile
另外,也可以通过修改home目录的.bashrc来将/usr/local/arm/4.2.2-eabi/usr/bin添加到PATH:
export PATH=/usr/local/arm/4.2.2-eabi/usr/bin/:$PATH
(5)测试环境变量是否设置成功。
在终端输入:echo $PATH,如果输出的路径中包含了/usr/local/arm/4.2.2-eabi/usr/bin,则说明环境变量设置成功。
(6)测试交叉编译工具链。
在终端输入“arm-linux-gcc –v”,显示如下:
Using built-in specs.
Target: arm-unknown-linux-gnueabi
Configured with:
/home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm
/gcc-4.2.2/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu
--target=arm-unknown-linux-gnueabi --enable-languages=c,c++ --with-sysroot=/usr/local
/arm/4.2.2-eabi/ --with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-
gnueabi/bin --disable-cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared
--with-gmp=/usr/local/arm/4.2.2-eabi/gmp --with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr
--disable-nls --enable-threads --disable-multilib --disable-largefile --with-arch=armv4t
--with-float=soft --enable-cxx-flags=-msoft-float
Thread model: posix gcc version 4.2.2
说明交叉编译工具链已经安装成功。
ldd6410-debug-tools.tar.gz调试工具包包含了strace、gdbserver和arm-linux-gdb,其中 strace、gdbserver用于目标板文件系统,arm-linux-gdb 运行于主机端,对目标板上的内核、内核模块应用程序进行调试。
下载地址为http://ldd6410.googlecode.com/files/ldd6410-debug-tools.tar.gz,光盘目录为toolchains/ ldd6410-debug-tools.tar.gz。
解压ldd6410-debug-tools.tar.gz,将其中的arm-linux-gdb放入主机上arm-linux-gcc所在的目录/usr/local/arm/4.2.2-eabi/usr/bin/。
而 strace、gdbserver则可根据需要放入目标机根文件系统的/usr/sbin目录。
1.5.4 主机端nfs和tftp服务安装
本书配套光盘的虚拟机映像中已经安装好了nfs和tftp,LDD6410可使用tftp或nfs文件系统与主机通过网口交互。如果用户想在其他环境下自行安装,对于Ubuntu或Debian用户而言,在主机端可通过如下方法安装tftp服务:
sudo apt-get install tftpd-hpa
开启tftp服务:
sudo /etc/init.d/tftpdhpa start
Starting HPA's tftpd: in.tftpd.
对于Ubuntu或Debian用户而言,在主机端可通过如下方法安装nfs服务:
apt-get install nfs-kernel-server
sudo mkdir /home/nfs
sudo chmod 777 /home/nfs
运行“sudo vim /etc/exports”或“sudo gedit /etc/exports”,修改该文件内容为:
/home/nfs *(sync,rw)
运行exportfs rv开启NFS服务:
/etc/init.d/nfs-kernel-server restart
1.5.5 源代码阅读和编辑
源代码是学习Linux的最权威资料,在Windows上阅读Linux源代码的最佳工具是Source Insight,在其中建立一个工程,并将Linux的所有源代码加入该工程,同步这个工程之后,我们将可以非常方便地在代码之间进行关联阅读,如图1.12所示。
在Linux主机上阅读和编辑Linux源码的常用方式是vim + cscope或者vim + ctags,vim是一个文本编辑器,而cscope和ctags则可建立代码索引,建议读者尽快使用基于文本界面全键盘操作的vim编辑器,如图1.13所示。

