Linux 的 Kernel 編譯,並在其中添加驅動


  源碼來源:各個arm官網下載,不同的CPU去對應的官網下載

  我們在做系統移植的過程中,從各個arm官網上下載的kernel源碼一般都是只有一些常規的驅動的,很多時候需要我們添加一些新的其他IC的驅動,這里就簡單說明一下。

0. 准備工作

  下載kernel源碼,解壓在自己的文件夾。

                                                             /*Linux內核源碼目錄分析*/ 路徑 存放內容 /arch              不同CPU架構下的核心代碼。其中的每一個子目錄都代表Linux支持的CPU架構 ,比如arm,x86,MIPS,PPC等
/block             block目錄下放的是一些linux存儲體系中關於塊設備管理的代碼;譬如說SD卡、iNand、Nand、硬盤等都是塊設備。你幾乎可以認為塊設備就是存儲設備
/crypto            常見的加密算法的C語言實現代碼,譬如crc32、md5、sha1等
/Documentation     說明文檔,對每個目錄的具體作用進行說明
/drivers           內核中所有設備的驅動程序,其中的每一個子目錄對應一種設備驅動
/firmware          固件代碼,固件其實是軟件,不過這個軟件是固話到IC里面運行的,所以叫固件
/fs                Linux支持的文件系統代碼,及各種類型的文件的操作代碼。每個子目錄都代表Linux支持的一種文件系統類型
/include           頭文件目錄,公共的(各種CPU架構共用的)頭文件都在這里。每種CPU架構特有的一些頭文件在arch/arm/include目錄及其子目錄下
/init              init是初始化的意思,這個目錄下的代碼就是linux內核啟動時初始化內核的代碼
/ipc               內核中進程間的通信代碼
/kernel            Linux核心功能源碼,主要包括程序調度,控制進程,模塊化等等
/lib               lib是庫的意思,這里面都是一些公用的有用的庫函數,注意這里的庫函數和C語言的庫函數不一樣的。在內核編程中是不能用C語言標准庫函數,
這里的lib目錄下的庫函數就是用來替代那些標准庫函數的。
比如在內核中要把字符串轉成數字用atoi,但是內核編程中只能用lib目錄下的atoi函數,不能用標准C語言庫中的atoi。
再比如在內核中要打印信息時不能用printf,而要用printk,這個printk就是我們這個lib目錄下的 /mm 內存管理代碼,譬如頁式存儲管理內存的分配和釋放等 /net 網絡通信相關代碼 ,譬如TCP/IP協議棧等都在這里 /samples 內核編程的示例代碼 /scripts 腳本,這個目錄下全部是腳本文件,這些腳本文件不是linux內核工作時使用的,而是用來輔助對linux內核進行配置編譯生成的,比如裁剪內核等等 /security 安全性相關的代碼 /sound 音頻設備的驅動程序 /tools Linux中的常用工具 /usr 內核啟動相關的代碼 /virt 內核虛擬機相關的代碼 /Kbuild Kbuild是kernel build的意思,就是內核編譯的意思。這個文件就是linux內核特有的內核編譯體系需要用到的文件 /Makefile 這個是linux內核的總makefile,整個內核工程是用這個Makefile來管理的
/*注意,最后兩個Kbuild和Makefile和上面提到的不一樣,它們兩個是文件,不是文件夾*/

  最后,還要補充兩個重要的目錄,這里以arm架構為例(注意,前提是內核源碼經過了編譯,才會在這些目錄下生成這些文件):

    arch/arm/boot/ :Linux內核編譯完成以后,在此目錄下生成image,zImage鏡像文件
    arch/arm/boot/dts:存放Linux內核所有設備樹文件,包括dts編譯后對應的.dtb文件

1. 配置Kernel編譯環境

  主要就是配置交叉編譯器。

  如果是 arm 的產品,就是  export ARCH=arm

  如果是 ARM64 的產品,就是 export ARCH=arm64

  其他的配置按常規交叉編譯環境配置即可

2. 找到對應CPU的Kernel配置的配置

  這個文件夾里有一堆板載的配置文件,我們一般在這里選擇跟我們CPU相近的來配置;如果在kernel官網下載的源碼,里面可能不會有你這個CPU對應的配置文件,為此我們一般去各個廠家官網下載他們提供的源碼,他們的源碼里會有對應的配置文件。

  找到編譯 Kernel需要的配置。如果是 ARM 架構的 CPU ,一般位置在 Kernel 目錄下的:arch/arm/configs/

   

  如果是 ARM64, 一般配置的位置在kernel目錄下的:arch/arm64/configs/

  

 

3. 加載配置

  像 Amlogic的 A311D 芯片,通過上步的路徑找到他的配置 arch/arm64/configs/aplex_cmi_aa158_defconfig 注意:路徑是:arch/arm64/configs/ ,管網下載的源碼里該芯片的配置文件文件名並不是這個aplex_cmi_aa158_defconfig,這個文件名是我修改過的,初始文件名是 一般是板子CUP的命名加defconfig 

   

  接着加載配置的方法就是:make aplex_cmi_aa158_defconfig ARCH=arm64(ARCH=arm64是指定編譯64位的,一般這個 ARCH=arm64 會放在 ~/.bashrc 里面,放在編譯這里也行)。

  

  make aplex_cmi_aa158_defconfig ARCH=arm64,這個步驟就是把 arch/arm64/configs/aplex_cmi_aa158_defconfig 里面的配置寫到了,Linux 代碼目錄下的   .config 文件里面;要執行這一步后,后面執行make編譯kernel才會編譯生成對應的dtb文件。

 

4. 打開 menuconfig

   執行 make menuconfig ARCH=arm64 (或者是32位平台的話,執行 make menuconfig ARCH=arm 根據你的平台來決定) ,把 menuconfig 操作就是把  .config 文件里面的配置讀取出來,然后顯示在一個可視化的界面里:

  

  如果沒有執行  make aplex_cmi_aa158_defconfig ARCH=arm64 的話,那么執行  make  menuconfig  可能加載的就是 X86 架構的配置。在  make  menuconfig 里面,可以配置自己想要添加的驅動,Exit的時候要選擇保存。

  如果你只是編譯kernel還是要執行一次這個操作,不過只需要打開menuconfig再保存退出即可,不然后面編譯容易報一些錯誤。

5. 保存配置

   如果是 ARM32 的CPU ,就在 Kernel 目錄執行 make  savedefconfig  ARCH=arm

   如果是 ARM64 的CPU ,就在 Kernel目錄執行 make  savedefconfig  ARCH=arm64

  

  執行完畢之后,會生成一個保存的配置文件為: defconfig

  

   再把 defconfig 文件配置覆蓋先前的配置(步驟3加載的配置)。執行指令 cp  defconfig  arch/arm64/configs/aplex_cmi_aa158_defconfig -rf 這樣,配置就保存下來了。

  

6. menuconfig 添加 HYM8653 RTC 驅動舉例  

  如果你只是編譯kernel的話,這步可以跳過。

  先加載原始的配置:make aplex_cmi_aa158_defconfig 在打開 make menuconfig 找到 RTC 的驅動。

  

  

   

  按 Enter是選擇目錄。按空格鍵 是切換是否選擇, * 代表驅動加載到 Kernel里面去,M 代表編譯成模塊。空白表示不操作。退出之后保存。執行 make  savedefconfig 指令保存配置,再將保存好的 defconfig文件保存在arch/arm64/configs/  目錄下的對應文件:執行指令 cp  defconfig  arch/arm64/configs/aplex_cmi_aa158_defconfig  -rf 進行保存,這樣 make 編譯的時候就會將 RTC HYM8563 的驅動編譯進去。

7. 配置 HYM8653 RTC 驅動的設備樹 dts

  如果你只是編譯kernel的話,這步可以跳過。

  這一步步驟放在4、5、6步驟前后操作都可以,設備樹文件一般的位置:

    像 ARM 的CPU ,一般的位置在  Kernel 的 arch/arm/boot/dts/ 目錄下。

    像 ARM64 的CPU,一般的位置在 Kernel 的 arch/arm64/boot/dts/ 目錄下。

  不同設備的設備樹配置不同,需要看該設備掛載在哪個節點上,再在相對應的節點添加改驅動的設備節點信息,一些設備信息配置官網會給出相應的文檔,一些沒有的就需要自己去查,還有一些設備信息可以在Linux 源碼目錄 /Documentation/devicetree/bindings里查看。

  例如, 這里舉例的例子的設備樹就在 :arch/arm64/boot/dts/aplex/aplex文件夾是我自己添加的,一般官網下載的源碼,設備樹文件都保存到dts文件夾)目錄下:

   

  關於設備樹的說明可以參考我另一個文檔:https://www.cnblogs.com/xingboy/p/14898899.html  

  例如 添加 RTC 的設備節點就在: arch/arm64/boot/dts/aplex/cmi_aa158.dts 如下位置:

  

8. 編譯Kernel

  一般官網下載的Kernel的編譯都有其寫好對應的腳本,每個Kernel編譯的方法都有一點點不同,如果系統全部是你自己制作的,編譯一般是直接make,如果需要開多線程編譯,可以執行 make -j** 指令(**是指你需要開啟的線程數)。

  編譯后會在arch/arm/boot文件夾生成一個zImage文件,還會在arch/arm/boot/dts文件夾生成一個 ***.dtb 文件(***是你編譯的內核名,跟前面編譯配置文件時配置文件前的***一致,修改該文件夾里的Makefile文件可以添加編譯的dtb文件) ,這兩個文件后續做系統鏡像需要用到。

  編譯后的燒錄鏡像制作可以參考我另一個博客文章:https://www.cnblogs.com/xingboy/p/14858853.html

 


免責聲明!

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



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