參考資料
1.正點原子《Linux驅動開發指南說明V1.0》 第四章 開發環境搭建
2.正點原子《Linux驅動開發指南說明V1.0》 第三十章 U-Boot使用實驗
3.正點原子《Linux驅動開發指南說明V1.0》 第三十七章 Linux內核移植
4.正點原子《Linux驅動開發指南說明V1.0》 第三十八章 根文件系統移植
交叉編譯環境構建
選擇正點原子A盤>5、開發工具>1、交叉編譯器中已經下載好的編譯工具,並根據Ubuntu系統位數的不同選擇指定的編譯器,如我安裝的系統是64位,選擇gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz文件
1)在linux下使用指令sudo su,輸入密碼后進入root模式
2) 使用指令創建文件夾
mkdir -p /usr/local/arm
3)將gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.通過SSH Secure Shell Client上傳到創建的/usr/local/arm文件夾下,如果上傳失敗,要用
chmod 777 /usr/local/arm
修改路徑的權限, 上傳之后如圖所示
4)使用指令
tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
解壓到當前路徑,如下:
5)將路徑添加到全局變量上,使用vim /etc/profile指令,在末尾添加
export PATH="$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"
同時使用vim /etc/environment,路徑如下:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"
開啟新的窗口,此時通過
echo $PATH
即可查看全局路徑下gcc的路徑是否成功添加。
注意:修改上述路徑需要注意不要有語法錯誤,否則可能導致全局路徑丟失,導致系統問題
6)最后通過指令,即可查看是否安裝成功
arm-linux-gnueabihf-gcc -v
至此,交叉環境的編譯即搭建完成,因為以應用為目的,所以后續都以開發板提供的工具為准,如果想了解編譯器和下面的安裝包,建議詳細去看《Linux驅動開發指南說明V1.0》的指定章節。
uboot編譯和驗證
從學習的角度來說,這三部分在整個嵌入式Linux的要占很大的比重,這部分很重要,而且也必須要掌握去了解,但是從應用的角度,首先最重要的是去實現需求,所以最初這部分不要去深究,因為偏離去學的話,一方面會占用大量的時間,另一方面這部分資料學起來分散,容易因為沒有目標而不知道深入的重點,因此先以熟練使用為目標,后面在工程開發中穿插實現。因此這里就以正點原子提供的uboot和linux系統為准,在掌握這部分知識之前,需要確定Linux的啟動方式,這部分會經常用到。
1).使用光盤資料A盤>1、例程源碼>3、正點原子修改后的Uboot和Linux,將解壓后的文件上傳到Ubuntu到的路徑下。
2).在/usr/code/uboot下使用
tar -xvf uboot-imx-2016.03-2.1.0-g9bd38ef-v1.0.tar.bz2
指令解壓,解決后結果如下:
3).以我的硬件平台(ddr256M, nand512M為例), 使用默認配置文件為mx6ull_14x14_ddr256_nand_defconfig, 使用如下指令進行編譯
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_defconfig
執行結果如下,即用於編譯的.config的文件,最后執行編譯指令:
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
如此就完成了編譯,然后參考《Linux驅動開發指南說明V1.0》中8.4.3章節,使用imxdownload即可完成下載(具體如何下載參考。使用指令
./imxdownload u-boot.bin /dev/sdb
即可實現下載,結果如下:
至於sdb就是我的SD卡掛載的地址,可通過ls /dev/sd*查看,此外這個下載會格式化指定的路徑,需要格外注意,不要出錯。
將SD卡插在嵌入式Linux平台上,修改Boot為Pin1,Pin7高,復位芯片,打印如下:
到這一步初步完成了uboot的體驗,此外uboot也支持很多指令,這些后面會了解到,按照進度會掌握。
Linux的編譯
1).使用光盤資料A盤>1、例程源碼>3、正點原子修改后的Uboot和Linux,將解壓后的文件上傳到Ubuntu到的路徑下,解壓即可。
2).在/usr/code/uboot下使用
tar -xvf linux-imx-4.1.15-2.1.0-g49efdaa-v1.0.tar.bz2
指令解壓,解決后結果如下:
3).使用如下指令
cd arch/arm/boot/dts
vim Makefile
在400多行添加對應的設備樹,如我的開發板對應:
使用:wq保存文件即可。
4).使用如下指令進行編譯
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
執行結果如,即用於編譯的.config的文件,最后執行編譯指令:
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
如此即完成了編譯,編譯結果如下:
編譯之后文件路徑在
arch/arm/boot/zImage arch/arm/boot/dst/imx6ull-14x14-emmc-4.3-800x480-c.dts
將上述文件和uboot文件通過SSH傳輸到Windows系統,為后面使用MfgTool工具下載做准備。
文件系統的編譯
1).使用光盤資料A盤>1、例程源碼>6、BusyBox源碼,將解壓后的文件上傳到Ubuntu到的路徑下,解壓即可。
2).在/usr/code/uboot下使用
tar -xvf busybox-1.29.0.tar.bz2
指令解壓,解壓后結果如下:
3). 修改Makefile文件,最好使用絕對路徑,如果找不編譯器,可通過指令echo $PATH查看當前路徑是否添加,支持中文字符詳細參考文檔38.2.2說明。
164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- 190 ARCH ?= arm
4). 使用指令進行將鏈接編譯到指定的路徑
make install CONFIG_PREFIX=/usr/code/rootfs/nfs/
5). 在編譯后的路徑添加文件夾,並將支持動態庫添加到路徑下,參考文檔38.2.3說明。
6). 參考38.2.4章節,創建/etc/init.d/rcS,內容
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH runlevel mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
創建文件etc/fstab,內容
#<system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0
創建etc/inittab文件,內容
#etc/inittab ::sysinit:/etc/init.d/rcS console::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a
然后使用打包指令
tar -vcjf rootfs.tar.bz2 *
獲取打包文件: rootfs.tar.bz2
MgTool工具下載更新
完成上述所有流程,我們就獲得了最基礎的底層應用結構,包含:
Uboot -- uboot.bin(重命名為imx6ull-14x14-nand-4.3-800x480-c.bin)
Kernel -- zImage, imx6ull-14x14-emmc-4.3-800x480-c.dts
文件系統 -- rootfs.tar.bz2
有了上述軟件,就可以進行后續的代碼下載,參考39.5章節說明:


5.將boot置為Pin1, Pin5, Pin8為高,復位即可發現系統已經替換成我們編譯的最小文件系統。
總結
至此,關於項目方案實現的第一步就已經完成,在本節中,體驗了編譯uboot,內核和文件系統,並進行了燒錄,但如果對比本節的內容和參考文檔的相關說明,就會發現我省略了很多內容,舉幾個例子,官方的Uboot是如何變成原子的修改后的Uboot,如何通過make menuconfig配置符合需求應用,這部分重要嗎,事實上很重要,未來的很多時候都要和這些知識打交道,但當你當剛踏入嵌入式學習的時候,去深入鑽研,一方面沒有概念,難以建立清晰的脈絡認知,另一方面這部分是基石,知識繁雜且耗時,學習就很難快速給予反饋,這是最大的障礙,所以初步以運用為主,體驗下流程即可,重心還是快速進入應用和驅動開發,等真正需要時(如將模塊編入內核),就需要去深入掌握,但那時肯定有了足夠的嵌入式Linux開發經驗,也更容易去理解,事倍功半。