驅動運行條件:html
驅動簡要編譯步驟:linux
在編譯源碼前須要準備好交叉編譯環境,安裝必要的依賴和工具,如:git
參考命令:github
sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop
編譯好內核,有如下兩個用途:vim
若內核已經燒寫至開發板上,則能夠經過命令 uname -a
查看內核版本。
*
知道內核版本後可在其官網上下載其內核源碼,如並章節以版本爲 Linux npi 4.1.9.71-imx-r1 爲例,可在gitee或github上下載(野火官方提供)網絡
git clone https://gitee.com/Embedfire/ebf-buster-linux.git
編譯內核的步驟過程根據不一樣官方提供的腳步和Makefile不同而不一樣。如下爲野火的i.M 6U編譯linux內核例程。
單獨新建一個工做目錄,將其內核源碼放在該目錄下,切換到內核源碼目錄,找到 make_deb.sh 腳本,修改裏面的配置參數,如內核編譯位置等等。修改好配置參數後,只須要執行腳本便可編譯內核。(其它內核能夠參考該腳本,也能夠本身手寫一個編譯腳本)ionic
deb_distro=bionic DISTRO=stable build_opts="-j 6" build_opts="${build_opts} O=build_image/build" build_opts="${build_opts} ARCH=arm" build_opts="${build_opts} KBUILD_DEBARCH=${DEBARCH}" build_opts="${build_opts} LOCALVERSION=-imx-r1" build_opts="${build_opts} KDEB_CHANGELOG_DIST=${deb_distro}" build_opts="${build_opts} KDEB_PKGVERSION=1${DISTRO}" build_opts="${build_opts} CROSS_COMPILE=arm-linux-gnueabihf-" build_opts="${build_opts} KDEB_SOURCENAME=linux-upstream" make ${build_opts} npi_v7_defconfig make ${build_opts} make ${build_opts} bindeb-pkg
O=build_image/build
:指定編譯好的內核放置的位置。ARCH=arm
:目標是 ARM 體系結構內核。KBUILD_DEBARCH=${DEBARCH}
:對於deb-pkg目標,容許覆蓋deb-pkg部署的常規啓發式。LOCALVERSION=-imx-r1
:使用內核配置選項 "LOCALVERSION" 爲常規內核版本附加一個惟一的後綴。KDEB_CHANGELOG_DIST=${deb_distro}
:KDEB_PKGVERSION=1${DISTRO}
:版本信息。CROSS_COMPILE=arm-linux-gnueabihf-
:指定交叉編譯器。KDEB_SOURCENAME=linux-upstream
:KDEB_SOURCENAME make變量僅控制已打包的源tarball的名稱,並不影響bind -pkg和deb-pkg輸出的.deb包名稱。make ${build_opts} npi_v7_defconfig
:生成配置文件。make ${build_opts} bindeb-pkg
:編譯文件進行打包。hello 例程能夠去 李柱明的gitee clone: demo_code_for_mystudy/linux/driverTest/helloModule函數
這只是一個模塊例程,不含驅動部分
必須內容可分爲如下幾點:工具
hello_module.cflex
/** @file hello_module.c * @brief 簡要說明 * @details 詳細說明 * @author lzm * @date 2021-02-21 18:08:07 * @version v1.0 * @copyright Copyright By lizhuming, All Rights Reserved * ********************************************************** * @LOG 修改日誌: ********************************************************** */ #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> // 入口函數:安裝驅動時調用的函數 static int __init hello_init(void) { printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Init\n"); printk( "[ default ] Hello Module Init\n"); return 0; } // 出口函數:卸載驅動時調用的函數 static void __exit hello_exit(void) { printk("[ default ] Hello Module Exit\n"); } module_init(hello_init); module_exit(hello_exit); //MODULE_LICENSE("GPL2"); MODULE_AUTHOR("embedfire "); MODULE_DESCRIPTION("hello world module"); MODULE_ALIAS("test_module");
編譯好獲得的內核驅動模塊 xx.ko 能夠經過多種方式拷貝到 ARM 板上,如NFS網絡文件系統、SCP命令獲得。
掛載方法能夠參考李柱明博客園NFS篇章。
設備樹是在 Linux3.x 才引入的,用於描述一個硬件平臺的板級細節。
本系列筆記的驅動例程如無特殊說明,都是依賴於設備樹的。
下面簡略演示設備樹的編譯和加載,具體原理由具體篇章說明。
編譯後的內核會自動生成 dtc 工具。其路徑是:內核/scripts/dtc/dtc。
編譯命令:內核構建目錄/scripts/dtc/dtc -I dts -O dtb -o xxx.dtbo xxx.dts
編譯內核時都會自動編譯設備樹,此時,只須要把設備樹源文件放到規定位置便可,設備樹源文件、編譯生成的設備樹文件及咱們所用到的設備樹文件都會存放在 內核源碼/arch/arm/boot/dts 裏面。可是,編譯內核耗時長,因此,推薦只編譯設備樹,方法以下:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs
替換設備樹的方法:
查看是否加載成功:
Linux4.4 之後引入了動態設備樹,設備樹插件被動態的加載到系統中,供內核識別。
設備樹插件通常用於只修改添加部分硬件信息。如只添加 RGB 燈的硬件信息,就只須要編譯 RGB 燈的 .dts 文件爲 .dtbo 便可。
編譯設備樹插件的時候,無需從新編譯整個設備樹插件,只須要編譯修改的部分便可。
設備樹和設備樹插件都是使用 DTC 編譯工具編譯。
設備樹編譯後獲得的是 .dtb 文件;
而設備樹插件編譯後獲得的是 .dtbo 文件。
使用野火提供的一鍵式編譯工具:
編譯設備樹插件和編譯設備樹相似,這裏使用內核中的dtc工具編譯編譯設備樹插件。
編譯命令:內核構建目錄/scripts/dtc/dtc -I dts -O dtb -o xxx.dtbo xxx.dts
先拷貝設備樹插件文件到開發板上。
先在 /sys/kernel/config/device-tree/overlays/下建立一個新目錄,名字自定義。
而後將 dtbo 固件 echo 到 path 屬性文件中或將 dtbo 的內容 cat 到 dtbo 屬性文件中。
echo xxx.dtbo >/sys/kernel/config/device-tree/overlays/xxx/path # 或 cat xxx.dtbo >/sys/kernel/config/device-tree/overlays/xxx/dtbo
刪除設備插件:rmdir /sys/kernel/config/device-tree/overlays/xxx
。
不一樣的板子可能不支持。
修改環境變量文件便可,進入/boot目錄下 修改 vim uEnv.txt