Tegra-TX1-r24.2.1驅動補丁和內核編譯過程

Tegra TX1(r24.2.1)驅動補丁和內核編譯過程

導語

In this article, we’ll cover how to build a custom kernel for the NVIDIA Jetson TX1. For our purposes, having a way to build a custom kernel or add some modules here and there is a good to have in the tool belt.

準備工作

1、在官網下載相應版本的kernel源代碼。
下載圖片:
在這裏插入圖片描述

2、解壓kernel源碼和交叉編譯器在合適的位置:

	tar -xvjf kernel_src.tbz2

內核編譯

內核編譯網上有很多方式,我採用GitHub的jetsonhack的buildJetsonTX1Kernel腳本方式,比較方便,但要下載相應的版本的腳本。寫這篇文章時,已經是L4T 28.1版本。因此在commits中找到了L4T 24.2.1版本的。
下載後的腳本基本按照
getKernelSources.sh
patchAndBuildKernel.sh
copyImage.sh
三個腳本文件順序執行,執行的時候需要注意的是內核源碼的位置,對於本文,由於內核源碼直接在官網下載過了,而且已解壓到/usr/src/sources位置,因此可以不運行getKernelSources.sh腳本中源碼下載部分,只運行apt-get部分。此外後面步驟的腳本需要修改相應的kernel路徑位置。根據build-custom-kernel-nvidia-jetson中所述,第一步需要先生成內核配置文件:

If you are running a differently configured or modified kernel, you may want to generate the .config file in a different manner. One way to do this is to use:

$ make tegra21_defconfig

1. 編輯內核配置–Edit the Kernel Configuration

生成.config文件

	$ make tegra21_defconfig

修改.config文件

	$ make menuconfig

或者

	$ make xconfig

此處我需要的是增加內核中OV5640的支持,因此根據OV5693的設置,設置了OV5640的選項。此外由於我需要修改extlinux.config中的啓動dtb文件,因此根據make文件添加boot options選項。

extlinux.conf is a standard text-format sysboot configuration file that contains all boot information, it is installed in /boot according to the boot method.

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

2. 添加內核源碼–採用patch補丁方式

在源碼的解壓位置的kernel路徑下,執行以下命令行:(我的位置爲/usr/src/sources/kernel/)

	patch -p1 < ov5640_patch

ov5640_patch爲我需要添加的驅動的補丁文件,通過上面的命令行會添加相應的驅動源碼和dts內容在源碼中。

3. 編譯內核

如果是不改變內核配置的情況下重新編譯,先添加命令:

	$ make clean

再編譯內核

	$ ./patchAndBuildKernel.sh

如果出現Reversed (or previously applied) patch detected! Assume -R? [n]

第一個選擇是你是不是想還原,如果選n,那麼代表不還原,接下來就詢問是不是還是要應用該補丁

4. Copy Boot Image
	$ ./copyImage.sh
5. Updating the DTB

replacing the one in the boot folder of the boot directory and you could also just change the FDT entry in /boot/extlinux/extlinux.conf to use a different one. ----Jetpack 3.1版本之前

  1. Replace or Added the dtb in /boot with yours :

     $ cp /usr/src/kernel/arch/arm64/boot/dts/tegra210-****.dtb /boot/tegra210-****.dtb
    
  2. you could also just change the FDT entry in /boot/extlinux/extlinux.conf to use a different one.

6. 重啓Tegra Tx1

以下爲知識點備註:

- 驅動補丁文件的使用說明

patch的作用則是將diff記錄的結果(即補丁)應用到相應文件(夾)上。爲了正確地打上一個補丁,你需要知道這個補丁是從哪個基礎版本產生出來的以及這個補丁將要把目前的源代碼樹變化到什麼新的版本。這些信息或者會出現在補丁文件的原數據中,或者可能從文件名中推斷出來。由於本文是需要在r24.2.1版本上增加一個驅動文件,因此內核源碼需對應下載r24.2.1版本。

patch的作用則是將diff記錄的結果(即補丁)應用到相應文件(夾)上。最常見的用法爲:

	patch -pNUM <patchfile>

-pNum

忽略幾層文件夾,隨後詳解。

-E

選項說明如果發現了空文件,那麼就刪除它

-R

取消打過的補丁。
爲了解釋 -p 參數,需要看看如下patch文件片段:

	--- old/modules/pcitable       Mon Sep 27 11:03:56 1999
	+++ new/modules/pcitable       Tue Dec 19 20:05:41 2000

如果使用參數**-p0**,那就表示從當前目錄找一個叫做old的文件夾,再在它下面尋找 modules/pcitable 文件來執行patch操作。
而如果使用參數**-p1**,那就表示忽略第一層目錄(即不管old),從當前目錄尋找 modules 的文件夾,再在它下面找pcitable。

  • 如何在Github下載某個程序的commit版本

步驟一:打開項目,點擊commits

在這裏插入圖片描述

步驟二:點擊紅框框裏面的東西,英文叫做Browse the repository at this point in history。

在這裏插入圖片描述

步驟三:你就會看到Download了,還是歷史版本的,這個不是最新的。

在這裏插入圖片描述

  • Device Tree編譯

Device Tree文件的格式爲dts,包含的頭文件格式爲dtsi,dts文件是一種人可以看懂的編碼格式。但是uboot和linux不能直接識別,他們只能識別二進制文件,所以需要把dts文件編譯成dtb文件。dtb文件是一種可以被kernel和uboot識別的二進制文件。把dts編譯成dtb文件的工具是dtc。Linux源碼目錄下scripts/dtc目錄包含dtc工具的源碼。在Linux的scripts/dtc目錄下除了提供dtc工具外,也可以自己安裝dtc工具,linux下執行:sudo apt-get install device-tree-compiler安裝dtc工具。dtc工具的使用方法是:dtc –I dts –O dtb –o xxx.dtb xxx.dts,即可生成dts文件對應的dtb文件了。 當然了,dtc –I dtb –O dts –o xxx.dts xxx.dtb反過來即可生成dts文件。其中還提供了一個fdtdump的工具,可以dump dtb文件,方便查看信息。

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