1. 程式人生 > >Android驅動程式開發和除錯環境配置

Android驅動程式開發和除錯環境配置

    本文用《Android深度探索(卷1):HAL與驅動開發》的隨書原始碼為例詳細說明如何配置Android驅動開發和測試環境,並且如何使用原始碼中的build.sh指令碼檔案在各種平臺(Ubuntu Linux、Android模擬器和S3C6410開發板)上編譯、安裝和測試Linux驅動。建議讀者使用Ubuntu Linux12.04或更高版本實驗本文的方法。最好用root賬號登入Linux。

一、安裝交叉編譯器

    如果只是在Ubuntu Linux上測試Linux驅動就不需要安裝交叉編譯器了,但要在Android模擬器或S3C6410開發板上進行測試,就必須安裝交叉編譯器。

首先下載交叉編譯器(分卷壓縮)

分卷1

分卷2

分卷3

下載後解壓,會發現有兩個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核心原始碼(分卷壓縮)

用於S3C6410開發板的Linux核心原始碼(分卷壓縮)

分卷1

分卷2

     由於隨書程式碼中的word_count驅動已經在goldfish和linux2.6.36中分別建立了符號連結,以便在編譯linux核心時同時也會編譯word_count驅動,所以linux核心與原始碼目錄應與作者機器上的目錄相同。也就是兩個linux核心目錄與原始碼目錄如下:

linux核心目錄

/root/kernel/goldfish

/root/kernel/linux_kernel_2.6.36

原始碼目錄

/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,然後將<AndroidSDK根目錄> /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原始碼,如果商家沒給光碟,別忘了要哦!