Android系統篇之—-編寫簡單的驅動程序並且將其編譯到內核源碼中【轉】


本文轉載自:大神

通過之前的一篇文章,我們了解了 Android中的Binder機制和遠程服務調用 在這篇文章中主要介紹了Android中的應用在調用一些系統服務的時候的原理,那么接下來就繼續來介紹一下如何通過編譯Android源碼來手動添加一個系統服務,讓編譯之后的Android系統中存在我們的這個服務,每個應用都可以調用。但是本文得先介紹一下如何編寫一個簡單的驅動程序,先介紹了驅動程序,然后在通過JNI讓framework層訪問這個驅動程序,在通過注冊服務來封裝這個功能,最后在把這個服務添加到系統中,實現上層應用通過訪問這個服務來操作驅動,當然你必須要掌握和了解 Android中如何編譯源碼 如果沒有編譯過Android源碼的話,下面的內容將會看的很吃力的。

聲明:本文內容參考羅升陽的書籍:《Android系統源代碼情景分析》 如果想了解更詳細的內容非常建議購買此書

非常感謝羅神的這本書,給我帶來很多未知的知識,大神的博客地址:http://blog.csdn.net/luoshengyang

一、編寫內核驅動小程序

這里不會介紹內核驅動小程序內容,因為沒什么好說的,就是Linux系統api,然后在了解一下驅動的概念即可。這里主要介紹操作步驟,關於代碼后面我會給出下載地址,感興趣的同學可以自己詳細看一下。

第一步:進入源碼內核目錄創建驅動程序目錄

cd kernel/drivers

在這個目錄中,我們新建一個我們自己的驅動目錄freg:

看到這個目錄中有很多系統的驅動程序。然后就在這個freg目錄中編寫驅動程序:

這里的freg.c就是驅動程序,這里,我們不會為真實的硬件設備編寫內核驅動程序。為了方便描述為Android系統編寫內核驅動程序的過程,我們使用一個虛擬的硬件設備,這個設備只有一個4字節的寄存器,它可讀可寫。

第二步:配置驅動程序編譯信息

在freg目錄中新增Kconfig和Makefile兩個文件,其中Kconfig是在編譯前執行配置命令make menuconfig時用到的:

而Makefile是執行編譯命令make是用到的:

第三步:將驅動程序到系統配置中

上面配置完了驅動程序自身的編譯信息,如果想把這個驅動程序編譯到內核中,還需要配置內核信息,修改arch/arm/Kconfig和drivers/kconfig兩個文件,在menu “Device Drivers”和endmenu之間添加一行:

source “drivers/hello/Kconfig”

  
這樣,執行make menuconfig時,就可以配置hello模塊的編譯選項了。修改drivers/Makefile文件,添加一行:

第四步:編譯內核驅動

在內核目錄下運行命令:make menuconfig

“Device Drivers” => “First Android Drivers”選項,設置為y:

這樣就編譯驅動程序成功了,下面就開始編譯內核源碼

第五步:啟動模擬器檢查驅動程序

到源碼的根目錄中,運行命令:emulator -kernel ./kernel/common/arch/arm/boot/zImage &

有的同學可能會遇到這個錯誤,不過沒關系,咋們在運行一下腳本文件:

如果運行成功的話,就可以看到模擬器了:

這時候,我們使用adb shell命令查看驅動程序的功能:

首先驅動程序肯定是存放在/dev目錄中的,如果要進行操作驅動程序,需要到/proc目錄中找到指定驅動程序,然后可以使用echo命令寫入數據,cat命令讀取數據。

到這里,我們就成功的編寫了虛擬驅動程序,並且編譯到內核中,通過命令訪問也是測試通過了。這里采用的是系統提供的方法和驅動程序進行交互,也就是通過proc文件系統和devfs文件系統的方法。

二、編寫內核驅動訪問程序

有了上面的驅動程序內容,下面為了更好的方便操作這個驅動,我們可以在編寫一個簡單的C語言來直接訪問這個驅動,而操作驅動的方法也很簡單,使用open方法即可。

第一步:建立系統程序目錄

進入/external/目錄,新建一個freg程序目錄:

第二步:編寫操作驅動程序

這里的代碼比較簡單,在main函數中直接使用open打開驅動,然后就可以直接讀寫操作了

第三步:建立編譯腳本,然后編譯程序

在程序的同一目錄下,創建編譯腳本:Android.mk文件

參照如何單獨編譯Android源代碼中的模塊一文,使用mmm命令進行編譯:
mmm ./external/freg
編譯成功后,就可以在out/target/product/gerneric/system/bin目錄下,看到可執行文件hello了。
重新打包Android系統文件system.img:
make snod
這樣,重新打包后的system.img文件就包含剛才編譯好的hello可執行文件了。

 

第四步:運行模擬器

運行模擬器的命令上面已經介紹了,這里就不在演示了,運行成功之后,就可以使用/system/bin/hello可執行程序來訪問Linux內核驅動程序:

系統命令都是存放在/system/bin目錄下的,我們可以看到找到我們編譯的讀取驅動的系統命令程序freg,然后可以運行這個程序進行驅動的讀寫操作了。到此就完成了使用C程序來操作驅動了。

項目案例代碼:http://download.csdn.net/detail/jiangwei0910410003/9642364

三、總結

本文介紹了如何通過編譯Android內核源碼,來手動的編寫一個簡單的虛擬驅動程序,然后在寫一個簡單的C程序訪問這個驅動,后續將會介紹如何在Framework層通過JNI來訪問這個驅動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM