1.1.2.2 編譯內(nèi)核
編譯內(nèi)核的步驟過程根據(jù)不同官方提供的腳步和Makefile不一樣而不同甲葬。以下為野火的i.M 6U編譯linux內(nèi)核例程牡直。
單獨(dú)新建一個(gè)工作目錄霉晕,將其內(nèi)核源碼放在該目錄下纵朋,切換到內(nèi)核源碼目錄惫皱,找到 make_deb.sh 腳本,修改里面的配置參數(shù)眷唉,如內(nèi)核編譯位置等等予颤。修改好配置參數(shù)后,只需要執(zhí)行腳本即可編譯內(nèi)核冬阳。(其它內(nèi)核可以參考該腳本蛤虐,也可以自己手寫一個(gè)編譯腳本)
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:指定編譯好的內(nèi)核放置的位置。
ARCH=arm:目標(biāo)是 ARM 體系結(jié)構(gòu)內(nèi)核肝陪。
KBUILD_DEBARCH=${DEBARCH}:對(duì)于deb-pkg目標(biāo)驳庭,允許覆蓋deb-pkg部署的常規(guī)啟發(fā)式。
LOCALVERSION=-imx-r1:使用內(nèi)核配置選項(xiàng) "LOCALVERSION" 為常規(guī)內(nèi)核版本附加一個(gè)唯一的后綴氯窍。
KDEB_CHANGELOG_DIST=${deb_distro}:
KDEB_PKGVERSION=1${DISTRO}:版本信息饲常。
CROSS_COMPILE=arm-linux-gnueabihf-:指定交叉編譯器。
KDEB_SOURCENAME=linux-upstream:KDEB_SOURCENAME make變量?jī)H控制已打包的源tarball的名稱狼讨,并不影響bind -pkg和deb-pkg輸出的.deb包名稱贝淤。
make ${build_opts} npi_v7_defconfig:生成配置文件。
make ${build_opts} bindeb-pkg:編譯文件進(jìn)行打包政供。
1.2 內(nèi)核驅(qū)動(dòng)模塊編譯和加載
hello 例程可以去 李柱明的gitee clone: demo_code_for_mystudy/linux/driverTest/helloModule
1.2.1 hello 例程分析
這只是一個(gè)模塊例程播聪,不含驅(qū)動(dòng)部分
必須內(nèi)容可分為以下幾點(diǎn):
入口函數(shù)
出口函數(shù)
協(xié)議
hello_module.c
/** @file hello_module.c
* @brief 簡(jiǎn)要說明
* @details 詳細(xì)說明
* @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>
// 入口函數(shù):安裝驅(qū)動(dòng)時(shí)調(diào)用的函數(shù)
static int __init hello_init(void)
{
printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Init\n");
printk( "[ default ] Hello Module Init\n");
return 0;
}
// 出口函數(shù):卸載驅(qū)動(dòng)時(shí)調(diào)用的函數(shù)
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");
1.2.2 和內(nèi)核源碼一起編譯
1.2.3 加載內(nèi)核驅(qū)動(dòng)模塊
編譯好得到的內(nèi)核驅(qū)動(dòng)模塊 xx.ko 可以通過多種方式拷貝到 ARM 板上,如NFS網(wǎng)絡(luò)文件系統(tǒng)布隔、SCP命令得到离陶。
掛載方法可以參考李柱明博客園NFS篇章。
1.3 設(shè)備樹編譯和加載
設(shè)備樹是在 Linux3.x 才引入的衅檀,用于描述一個(gè)硬件平臺(tái)的板級(jí)細(xì)節(jié)招刨。
本系列筆記的驅(qū)動(dòng)例程如無特殊說明,都是依賴于設(shè)備樹的哀军。
下面簡(jiǎn)略演示設(shè)備樹的編譯和加載沉眶,具體原理由具體篇章說明打却。
1.3.1 設(shè)備樹編譯
1.3.1.1 使用內(nèi)核中的dtc根據(jù)編譯
編譯后的內(nèi)核會(huì)自動(dòng)生成 dtc 工具。其路徑是:內(nèi)核/scripts/dtc/dtc沦寂。
編譯命令:內(nèi)核構(gòu)建目錄/scripts/dtc/dtc -I dts -O dtb -o xxx.dtbo xxx.dts
意為編譯 dts 為 dtb
1.3.1.2 在內(nèi)核源碼中編譯(推薦)
編譯內(nèi)核時(shí)都會(huì)自動(dòng)編譯設(shè)備樹学密,此時(shí),只需要把設(shè)備樹源文件放到規(guī)定位置即可传藏,設(shè)備樹源文件腻暮、編譯生成的設(shè)備樹文件及我們所用到的設(shè)備樹文件都會(huì)存放在 內(nèi)核源碼/arch/arm/boot/dts 里面。但是毯侦,編譯內(nèi)核耗時(shí)長(zhǎng)哭靖,所以,推薦只編譯設(shè)備樹侈离,方法如下:
兩條命令都在內(nèi)核源碼頂層路徑下執(zhí)行(其實(shí)就是利用頂層Makefile):
如果在內(nèi)核源碼中執(zhí)行了 make distclean 试幽,則必須執(zhí)行第一條命令來生成默認(rèn)的配置文件。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig
make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs
1.3.1.3 加載設(shè)備樹
替換設(shè)備樹的方法:
第一種:設(shè)備樹是編譯到內(nèi)核中的卦碾,所以铺坞,重新編譯內(nèi)核,重新制作鏡像即可洲胖。(麻煩济榨,不推薦)
第二種:將編譯好的設(shè)備樹或設(shè)備樹插件替換到開發(fā)板里面的。(推薦)
第三種:將編譯好的設(shè)備樹放到開發(fā)板中绿映,**/boot/dtbs/xxx/擒滑,修改boot啟動(dòng)參數(shù)。(推薦)
查看是否加載成功:
進(jìn)入 /proc/device-tree 目錄下查看已加載的設(shè)備節(jié)點(diǎn)叉弦,看看有沒有改動(dòng)丐一。
1.4 設(shè)備樹插件的編譯和加載
Linux4.4 以后引入了動(dòng)態(tài)設(shè)備樹,設(shè)備樹插件被動(dòng)態(tài)的加載到系統(tǒng)中淹冰,供內(nèi)核識(shí)別库车。
設(shè)備樹插件一般用于只修改添加部分硬件信息。如只添加 RGB 燈的硬件信息樱拴,就只需要編譯 RGB 燈的 .dts 文件為 .dtbo 即可凝颇。
編譯設(shè)備樹插件的時(shí)候,無需重新編譯整個(gè)設(shè)備樹插件疹鳄,只需要編譯修改的部分即可。
1.4.1 單獨(dú)使用dtc工具編譯
設(shè)備樹和設(shè)備樹插件都是使用 DTC 編譯工具編譯芦岂。
設(shè)備樹編譯后得到的是 .dtb 文件瘪弓;
而設(shè)備樹插件編譯后得到的是 .dtbo 文件。
使用野火提供的一鍵式編譯工具:
地址:git clone https://gitee.com/Embedfire/ebf-linux-dtoverlays.git
要編譯的設(shè)備樹插件源文件放在 ebf-linux-dtoverlays/overlays/ebf 目錄下禽最, 然后回到編譯工具的根目錄 ebf-linux-dtoverlays/ 執(zhí)行“make”即可腺怯。
生成的.dtbo位于 ~/ebf-linux-dtoverlays/output 目錄下袱饭。
需要注意的是,如果你在執(zhí)行“make”后出現(xiàn)報(bào)錯(cuò)呛占,可以嘗試先卸載device-tree-compiler(卸載命令為:“sudo apt-get autoremove device-tree-compiler”), 重新安裝虑乖,然后在“ebf-linux-dtoverlays/basic/fixdep文件的權(quán)限, 修改權(quán)限命令為:“chmod 777 scripts/basic/fixdep”晾虑。
USB Microphone https://www.soft-voice.com/
Wooden Speakers? https://www.zeshuiplatform.com/
亞馬遜測(cè)評(píng) www.yisuping.cn
深圳網(wǎng)站建設(shè)www.sz886.com