?本文用《Android深度探索(卷1):HAL與驅動開發》的隨書源代碼為例詳細說明如何配置Android驅動開發和測試環境,并且如何使用源代碼中的build.sh腳本文件在各種平臺(Ubuntu Linux、Android模擬器和S3C6410開發板)上編譯、安裝和測試Linux驅動。建議讀者使用Ubuntu Linux12.04或更高版本實驗本文的方法。最好用root賬號登錄Linux。
**一、安裝交叉編譯器**
??? 如果只是在Ubuntu Linux上測試Linux驅動就不需要安裝交叉編譯器了,但要在Android模擬器或S3C6410開發板上進行測試,就必須安裝交叉編譯器。
首先下載交叉編譯器(分卷壓縮)
[分卷1](http://vdisk.weibo.com/s/rH2PH)
[分卷2](http://vdisk.weibo.com/s/rHcNo)
[分卷3](http://vdisk.weibo.com/s/rHfpy)
下載后解壓,會發現有兩個tgz文件,可以將這兩個文件放到/root/compilers目錄中,在Linux終端進入該目錄,執行如下命令安裝交叉編譯器。
~~~
# tar zxvf arm-linux-gcc-4.3.2.tgz -C /
# tar jxvf arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2 -C /
~~~
**二、編譯和測試Linux內核**
???? 這里的Linux內核有兩個,一個是goldfish,也就是Android模擬器使用的Linux內核、另外一個是S3C6410開發板使用的Linux內核(Linux2.6.36)。讀者首先要下載這兩個Linux內核。
Android模擬器用的Linux內核源代碼(分卷壓縮)
[goldfish(卷1)](http://vdisk.weibo.com/s/rGgna)
[goldfish(卷2)](http://vdisk.weibo.com/s/rGtsz)
[goldfish(卷3)](http://vdisk.weibo.com/s/rGEK3)
[goldfish(卷4)](http://vdisk.weibo.com/s/rGFbP)
用于S3C6410開發板的Linux內核源代碼(分卷壓縮)
[分卷1](http://vdisk.weibo.com/s/rGP7W)
[分卷2](http://vdisk.weibo.com/s/rGUCi)
???? 由于隨書代碼中的word_count驅動已經在goldfish和linux2.6.36中分別建立了符號鏈接,以便在編譯linux內核時同時也會編譯word_count驅動,所以linux內核與源代碼目錄應與作者機器上的目錄相同。也就是兩個linux內核目錄與源代碼目錄如下:
linux內核目錄
/root/kernel/goldfish
/root/kernel/linux_kernel_2.6.36
[源代碼](http://vdisk.weibo.com/s/rCmcW/1361708452)目錄
/root/drivers
注意/root/drivers目錄下就直接是每一章的源代碼了,例如/root/drivers/ch06、/root/drivers/ch07
現在需要將/usr/local/arm/arm-none-linux-gnueabi/bin路徑加到Linux的PATH環境變量中(不會加的上網查,這是Linux的基本功)
???? 最后進入/root/compilers/goldfish目錄,執行make命令編譯linux內核,如果完全編譯,大概20分鐘左右。編譯完成后,會在/root/kernel/goldfish/arch/arm/boot目錄中生成一個zImage文件,代碼1.7MB,這就是用于Android模擬器的Linux內核文件。
**三、編譯Linux驅動**
???? 現在來編譯隨書光盤的驅動程序,這里以word_count驅動為例。在Linux終端進入/root/drivers/ch06/word_count目錄。先別忙著編譯。首先要設置打開/root/drivers/common.sh文件,修改第一行UBUNTU_KERNEL_PATH變量值為自己機器上安裝的Ubuntu Linux內核路徑,只要執行“ls /usr/src”命令即可查看當前機器可用的linux內核。如可以設置下面的路徑。
UBUNTU_KERNEL_PATH=/usr/src/linux-headers-3.2.0-23-generic
???? 剩下的兩個(S3C6410_KERNEL_PATH和/root/kernel/goldfish)只要按著前面的路徑解壓Linux內核源代碼,就不用設置了。
在word_count目錄中執行“source build.sh”命令,會允許選擇在哪個平臺上編譯驅動,直接按回車會在Ubuntu Linux上編譯。如果編譯成功,會發現當前目錄多一個word_count.ko文件(驅動文件)。
???? 現在來編譯S3C6410上運行的word_count驅動。先別忙,在編譯之前,需要Android中的adb命令。因為build.sh足夠只能,在編譯完后,如果有多個Android設備連接到PC,會允許用戶選擇上傳到哪個設備裝載,這里需要選擇S3C6410開發板,然后會直接上傳到開發板上,如圖1所示。

圖1
?????? 可以直接使用adb shell命令進入開發板,也可以使用/root/drivers/shell.sh腳本完成同樣的工作,只是后者如果有多個android設備,會允許用選擇,而不是輸入相應的設備ID。使操作更方便。在/root/drivers目錄中提供了很多這樣的腳本(shell.sh、push.sh、pull.sh等),這些腳本都會允許用戶選擇操作的Android設備。
我們通常使用Android SDK中的adb命令,到官方網站下載裝載linux版本的Android SDK,然后將根目錄> /platform-tools加到PATH環境變量中。
?????? 現在再次執行“source build.sh”命令,選擇第2項(S3C6410開發板),如果系統沒找到開發板,需要將USB線拔下重插一下。然后就可以進入開發板的終端,輸入lsmod命令查看驅動的安裝情況了。
如果在模擬器上測試,選第3項。具體測試的方法請參見書中相應的章節。
**四、測試Linux驅動**
????? 測試word_count驅動的方法很多,通過命令行測試的方法請參見書中相應的章節,在word_count目錄中有一個test_word_count程序,通過執行如下的命令可以測試word_count驅動,編譯test_word_count.c程序的方法書中已詳細描述。
test_word_count “abc? bb? cc”
上面的命令會輸出單詞數為3。
如果要編譯Android HAL,需要Android源代碼。購買S3C6410開發板時商家通常會帶一些光盤,里面有用于開發板的Android源代碼,如果商家沒給光盤,別忘了要哦!