Android 驅動筆記 1

1. 編譯下載AOSP

目標板是Nexus 5
步驟如下:

1.1. 安裝虛擬機

想必不用多說

1.2. 搭建環境

按照>>搭建編譯環境<<上的提示搭建環境。

1.3. 下載源代碼

1.3.1. 安裝 Repo

按照網址下載源代碼的提示,第一步是不成問題的,但是第二部會提示連不接不到google服務器,下面使用curl的代理功能

原命令行是這樣的。

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

給它添加代理參數

$ curl --proxy 192.168.85.1:1080 https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

這樣就可以下載 repo 工具了。

1.3.2. 初始化 Repo 客戶端

這裏繼續設置代理,終端運行:

$ export HTTP_PROXY=http://192.168.85.1:1080
$ export HTTPS_PROXY=https://192.168.85.1:1080

然後, repo 就可以走代理了。實測走代理的速度還是很不錯的。
還有一些別的什麼專有二進制文件一起下載就可以了。

1.3.3. 下載 Android 源代碼樹

之前設置過代理的話,這裏就可以下載的動。

1.4. 設置環境

$ source build/envsetup.sh

這個操作只能在當前終端中生效,換一個終端就無效了。

1.5. 選擇目標

使用 lunch 選擇編譯目標。
我這裏是:

$ lunch 19

這個操作同上一個一樣只能在當前終端中生效,換一個終端就無效了。要重新來一遍。

1.6. 編譯代碼

宿主機是8750H,我給虛擬機設置的是12核,所以直接運行

$ make -j 12

跑滿整個CPU就可以了。

1.7. 使用 fastboot 刷機

這個很容易,我這裏是:

$ cd out/target/product/hammerhead
$ fastboot flashall -w

開機後正常運行。


下一步就是寫驅動了。先從內核模塊開始。寫內核模塊就可以不用下載編譯內核了。方便很多。但是也又不方便的的就是需要手動 insmod ,當然也可以使用腳本啥的自動掛載。


2. 編寫內核模塊

目標是寫一個虛擬的存儲器,用來存放或者取出數據。不需要很大,普通的 unsigned char 就可以了。
但是不管怎麼樣,還是把內核下載下來把。參照內核文件的寫法來寫模塊。參考AOSP文檔>>編譯內核<<

2.1 選擇內核

設備 二進制文件所在的位置 源代碼所在的位置 編譯配置
volantis device/htc/flounder-kernel kernel/tegra flounder_defconfig
hammerhead device/lge/hammerhead-kernel kernel/msm hammerhead_defconfig
flo device/asus/flo-kernel/kernel kernel/msm flo_defconfig

Nexus 5 需要選擇的高亮顯示出來了。

2.2 確定內核版本

那麼手動選擇內核版本
官方提示可以使用命令行:

dd if=zImage-dtb bs=1 skip=$(LC_ALL=C od -Ad -x -w2 zImage-dtb | grep 8b1f | cut -d ' ' -f1 | head -1) | zgrep -a 'Linux version'

來查看現有內核的版本號。
現有內核的位置是在:/home/godenfreemans/Android/device/lge/hammerhead-kernel/zImage-dtb,那麼 cd 到這個目錄下運行上面的命令。
可以得到:

Linux version 3.4.0-gcf10b7e ([email protected]) (gcc version 4.8 (GCC) ) #1 SMP PREEMPT Mon Sep 19 22:14:08 UTC 2016

但是沒又說通過這個怎麼找內核版本。選那個最新的。

  • android-msm-glowlight-3.18-nougat-dr-wear-release
  • android-msm-glowlight-3.18-oreo-wear-dr
  • android-msm-glowlight-3.18-pie-wear-dr
  • android-msm-hammerhead-3.4-kitkat-mr1
  • android-msm-hammerhead-3.4-kitkat-mr2
  • android-msm-hammerhead-3.4-kk-fr1
  • android-msm-hammerhead-3.4-kk-fr2
  • android-msm-hammerhead-3.4-kk-r1
  • android-msm-hammerhead-3.4-l-preview
  • android-msm-hammerhead-3.4-lollipop-mr1
  • android-msm-hammerhead-3.4-lollipop-mr1.1
  • android-msm-hammerhead-3.4-lollipop-release
  • android-msm-hammerhead-3.4-m-preview
  • android-msm-hammerhead-3.4-marshmallow
  • android-msm-hammerhead-3.4-marshmallow-mr1
  • android-msm-hammerhead-3.4-marshmallow-mr2
  • android-msm-hammerhead-3.4-marshmallow-mr3
  • android-msm-huawei-3.10-lollipop-mr1-wear-release
  • android-msm-huawei-3.10-lollipop-mr1-wear-release-1
點開可以看到這樣的東西:

目測這個cf10b7e6209c43acf70f82b8d01997ffece88835的縮寫就會附着在Linux version 3.4.0 後面吧。就選這個了,最後一個版本的系統肯定用的是最後一個版本的內核。不然。。。。那不是很奇怪?

2.3 下載源代碼

我這裏就直接下在AOSP裏了。

$ mkdir kernel
$ cd kernel
$ git clone https://android.googlesource.com/kernel/msm

這個代碼是包括所有高通平臺的,通過不同的分支可以將對應目標籤出。

2.4 簽出對應內核代碼

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/android-4.4
  remotes/origin/android-msm-2.6.35
  ..
  remotes/origin/android-msm-glowlight-3.18-oreo-wear-dr
  remotes/origin/android-msm-glowlight-3.18-pie-wear-dr
  remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
  remotes/origin/android-msm-hammerhead-3.4-kitkat-mr2
  remotes/origin/android-msm-hammerhead-3.4-kk-fr1
  remotes/origin/android-msm-hammerhead-3.4-kk-fr2
  remotes/origin/android-msm-hammerhead-3.4-kk-r1
  remotes/origin/android-msm-hammerhead-3.4-l-preview
  remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1
  remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1.1
  remotes/origin/android-msm-hammerhead-3.4-lollipop-release
  remotes/origin/android-msm-hammerhead-3.4-m-preview
  remotes/origin/android-msm-hammerhead-3.4-marshmallow
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr1
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr2
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr3
  remotes/origin/android-msm-huawei-3.10-lollipop-mr1-wear-release
  remotes/origin/android-msm-huawei-3.10-lollipop-mr1-wear-release-1
  ..
$ git checkout -b android-msm-hammerhead-3.4-marshmallow-mr3 origin/android-msm-hammerhead-3.4-marshmallow-mr3

現在裏面就有代碼了。

2.5 手動編譯內核(可選)

$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-android-
$ cd hikey-linaro
$ git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
$ make hikey_defconfig
$ make

就參考這個來編譯:

$ export ARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ make hammerhead_defconfig
$ make -j 12

很短時間後。。。一個報錯:

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/home/godenfreemans/Android/kernel/msm/kernel/Makefile:129: recipe for target 'kernel/timeconst.h' failed

這好像是再說,我應該omit(忽略)defined,那就試着改一下

        if (!defined(@val)) {

改成

        if (!@val) {

可以編譯出來了。
這個內核是不能加載模塊的。需要將這個功能打開。

2.6 編譯下載可加載模塊功能的內核

讀過《Android內核模塊編譯執行》後,瞭解到這裏需要編譯一個能加載模塊的內核。

就像NuttX一樣。

$ make menuconfig

打開

[*] Enable loadable module support  --->

再編譯。

$ make -j 12

下面需要將內核添加到 boot.img 中去。
設定內核位置,在AOSP下:

export TARGET_PREBUILT_KERNEL=~/Android/kernel/mem/arch/arm/boot/zImage-dtb
make bootimage
adb reboot bootloader
fastboot flash boot ./out/target/product/hammerhead/boot.img

現在應該就可以加載模塊了。

2.7 編寫驅動

Google對此沒有什麼說明,看起來只能去其他地方查看了。
參考老羅的文章:《在Ubuntu上爲Android系統編寫Linux內核驅動程序》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章