前言:
萬事開頭難,如果我們在開發(fā)板上開發(fā)出第一個(gè)應(yīng)用程序,第一個(gè)驅(qū)動(dòng)程序,那么后續(xù)的開發(fā)就會(huì)稍微簡單點(diǎn),下面讓我們來進(jìn)行第一個(gè)應(yīng)用程序和第一驅(qū)動(dòng)程序的開發(fā)吧。
目錄
一、開發(fā)板的第1個(gè)APP實(shí)驗(yàn)
1.通過Git倉庫
2.通過windows上傳?
二、開發(fā)板的第1個(gè)驅(qū)動(dòng)實(shí)驗(yàn)
1.前提條件:
2 編譯內(nèi)核:
(1)編譯內(nèi)核?
(2)編譯設(shè)備樹
3.編譯安裝內(nèi)核模塊
(1) 編譯內(nèi)核模塊
(2) 安裝內(nèi)核模塊到Ubuntu某個(gè)目錄下備用
?4.安裝內(nèi)核和模塊到開發(fā)板上
?(1) 查看當(dāng)前內(nèi)核版本
(2)掛載網(wǎng)絡(luò)文件系統(tǒng)
(3)更新內(nèi)核
(4)更新設(shè)備樹
(5)接下來要把這些文件復(fù)制到開發(fā)板上
(7)同步一下
?(6)最后重啟開發(fā)板,它就使用新的zImage、dtb、模塊了。
5.編譯驅(qū)動(dòng)
(1)上傳內(nèi)核文件
(2)編譯模塊驅(qū)動(dòng)
6.在開發(fā)板安裝驅(qū)動(dòng)模塊???
(1)利用串口掛載網(wǎng)絡(luò)文件系統(tǒng)
(2)裝載驅(qū)動(dòng)程序
7.進(jìn)行編譯測試
一、開發(fā)板的第1個(gè)APP實(shí)驗(yàn)
1.通過Git倉庫
????????Git倉庫里含有本教程的所有源碼,前面已經(jīng)在Windwos下載了Git倉庫, 為例方便編譯,也可以在Ubuntu中再次下載它。 在Ubuntu終端上執(zhí)行如下命令。?
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
2.通過windows上傳?
?hello.c的源碼如下:
/* 執(zhí)行命令: ./hello weidongshan
* argc = 2
* argv[0] = ./hello
* argv[1] = weidongshan
*/
int main(int argc, char **argv)
{
if (argc >= 2)
printf("Hello, %s!\n", argv[1]);
else
printf("Hello, world!\n");
return 0;
}
?編譯程序 在Ubuntu中可以執(zhí)行以下命令編譯、執(zhí)行:
????????上述命令編譯得到的可執(zhí)行程序hello 可以在 Ubuntu 中運(yùn)行,但是如果把它放到 ARM 板子上去,它是無法執(zhí)行的。因?yàn)樗鞘褂胓cc編譯的,是給PC機(jī)編譯的,里面的機(jī)器指令是x86的。 我們要想給ARM板編譯出hello程序,需要使用交叉編譯工具鏈?
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
?
我們要想給ARM板編譯出hello程序,需要使用交叉編譯工具鏈?
執(zhí)行以下命令編譯程序:
arm-buildroot-linux-gnueabihf-gcc -o hello hello.c
?
?這樣編譯出來的hello程序才可以在ARM板子上運(yùn)行。先把編譯生成的 hello 文件拷貝到Ubuntu nfs服務(wù)目錄下,備用:
cp hello /home/book/nfs_rootfs
二、開發(fā)板的第1個(gè)驅(qū)動(dòng)實(shí)驗(yàn)
1.前提條件:
為什么編譯驅(qū)動(dòng)程序之前要先編譯內(nèi)核?(配置編譯:1.內(nèi)核,2.設(shè)備樹,3.驅(qū)動(dòng))
驅(qū)動(dòng)程序要用到內(nèi)核文件:
????????比如驅(qū)動(dòng)程序中這樣包含頭文件:#include ,其中的asm是 一個(gè)鏈接文件,指向asm-arm或asm-mips,這需要先配置、編譯內(nèi)核才會(huì)生成 asm 這個(gè)鏈接文件。
編譯驅(qū)動(dòng)時(shí)用的內(nèi)核、開發(fā)板上運(yùn)行到內(nèi)核,要一致:
???????? 開發(fā)板上運(yùn)行到內(nèi)核是出廠時(shí)燒錄的,你編譯驅(qū)動(dòng)時(shí)用的內(nèi)核是你自己編譯 的,這兩個(gè)內(nèi)核不一致時(shí)會(huì)導(dǎo)致一些問題。所以我們編譯驅(qū)動(dòng)程序前,要把自己編譯出來到內(nèi)核放到板子上去,替代原來的內(nèi)核。
更換板子上的內(nèi)核后,板子上的其他驅(qū)動(dòng)也要更換:
????????板子使用新編譯出來的內(nèi)核時(shí),板子上原來的其他驅(qū)動(dòng)也要更換為新編譯出 來的。所以在編譯我們自己的第1個(gè)驅(qū)動(dòng)程序之前,要先編譯內(nèi)核、模塊,并且 放到板子上去。
2 編譯內(nèi)核:
????????不同的開發(fā)板對應(yīng)不同的配置文件,配置文件位于內(nèi)核源碼 arch/arm/configs/目錄。kernel 的編譯過程如下:
cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88
make 100ask_imx6ull_defconfig
(1)編譯內(nèi)核?
編譯完成zImage后才可編譯設(shè)備樹文件。
make zImage -j4
編譯完成后生成的文件如圖
(2)編譯設(shè)備樹
make dtbs
????????編譯完成后,在 arch/arm/boot 目錄下生成 zImage 內(nèi)核文件, 在 arch/arm/boot/dts 目錄下生成設(shè)備樹的二進(jìn)制文件 100ask_imx6ull 14x14.dtb。把這 2個(gè)文件復(fù)制到/home/book/nfs_rootfs目錄下備用。
cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs
3.編譯安裝內(nèi)核模塊
(1) 編譯內(nèi)核模塊
????????進(jìn)入內(nèi)核源碼目錄后,就可以編譯內(nèi)核模塊了:
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make modules
內(nèi)核模塊編譯完成后如圖?
(2) 安裝內(nèi)核模塊到Ubuntu某個(gè)目錄下備用
????????可以先把內(nèi)核模塊安裝到nfs目錄(/home/book/nfs_rootfs)。
注意:后面會(huì)使用tree命令查看目錄結(jié)構(gòu),如果提示沒有該命令,需要執(zhí)行以 下命令安裝tree命令:
sudo apt install tree
下載完成如圖:
執(zhí)行以下命令安裝模塊:?
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
把模塊安裝在nfs目錄“/home/book/nfs_rootfs/”下:
?4.安裝內(nèi)核和模塊到開發(fā)板上
?(1) 查看當(dāng)前內(nèi)核版本
uname -a
(2)掛載網(wǎng)絡(luò)文件系統(tǒng)
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
(3)更新內(nèi)核
cp /mnt/zImage /boot
(4)更新設(shè)備樹
cp /mnt/100ask_imx6ull-14x14.dtb /boot
(5)接下來要把這些文件復(fù)制到開發(fā)板上
cp /mnt/lib/modules /lib -rfd
(7)同步一下
sync
?(6)最后重啟開發(fā)板,它就使用新的zImage、dtb、模塊了。
reboot
5.編譯驅(qū)動(dòng)
(1)上傳內(nèi)核文件
(2)編譯模塊驅(qū)動(dòng)
首先,進(jìn)入 100ask_imx6ull_src_bin 目錄,修改 Makefile 文件 “KERN_DIR”為自己的內(nèi)核所在路徑,如果你的內(nèi)核源碼不在此目錄則根據(jù)你的實(shí)際情況進(jìn)行修改:
/home/book/100ask_imx6ull-sdk/Linux-4.9.88
?編譯驅(qū)動(dòng)程序和生成測試程序,修改完內(nèi)核所在目錄后,就可以編譯模塊驅(qū)動(dòng)了
6.在開發(fā)板安裝驅(qū)動(dòng)模塊???
(1)利用串口掛載網(wǎng)絡(luò)文件系統(tǒng)
啟動(dòng)開發(fā)板后掛載網(wǎng)絡(luò)文件系統(tǒng)
開發(fā)板啟動(dòng)后通過nfs掛載Ubuntu目錄的方式。使用的是VMware橋接方式,假設(shè)Ubuntu IP為192.168.5.11,在開發(fā)板上執(zhí)行以下命令:
[root@imx6ull:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
(2)裝載驅(qū)動(dòng)程序
[root@imx6ull:~]# cd /mnt/01_hello_drv/
在開發(fā)板串口終端上執(zhí)行如下命令,即可安裝相應(yīng)的驅(qū)動(dòng)模塊。?
[root@imx6ull:/mnt/01_hello_drv]# insmod hello_drv.ko
[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices
[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
29 fb
81 video4linux
89 i2c
90 mtd
108 ppp
116 alsa
128 ptm
136 pts
166 ttyACM
180 usb
188 ttyUSB
189 usb_device
207 ttymxc
216 rfcomm
226 drm
245 hello //hello驅(qū)動(dòng)程序
246 ttyGS
247 ttyLP
248 watchdog
249 tee
250 iio
251 ptp
252 pps
253 rtc
254 gpiochip
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
31 mtdblock
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
安裝完成后可以執(zhí)行l(wèi)smod 命令來查看是否安裝成功?
[root@imx6ull:/mnt/01_hello_drv]# lsmod
Module Size Used by
hello_drv 3746 0
//hello_drv驅(qū)動(dòng)程序
如果你沒有更新板子上的內(nèi)核,會(huì)出現(xiàn)類似如圖所示錯(cuò)誤?
可以強(qiáng)行安裝驅(qū)動(dòng)程序,比如使用“insmod -f hello_drv.ko”這樣的命令,它會(huì)提示說 “內(nèi)核已經(jīng)被污染了”,但是不影響學(xué)習(xí)、不影響使用?
文章來源:http://www.zghlxwxcb.cn/news/detail-717244.html
7.進(jìn)行編譯測試
[root@imx6ull:/mnt/01_hello_drv]# ./hello_drv_test
?以上運(yùn)行結(jié)果表明測試成功文章來源地址http://www.zghlxwxcb.cn/news/detail-717244.html
到了這里,關(guān)于Linux下的IMX6ULL——開發(fā)板的第一個(gè)APP和驅(qū)動(dòng)實(shí)驗(yàn)(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!