基礎小知識
核心板載存儲介質:eMMC NAND FLASH
dtb格式文件:設備樹文件
使用SD卡燒寫系統鏡像時,盡量使用FAT32格式的SD卡,使用NTFS很可能就不支持,無法掛載,因為Windows,微軟有版權
使用SDFormatter 軟件進行SD卡格式化
在Ubuntu下復制文件時最好執行一下 sync 命令,將緩存中的文件同步到移動設備當中
sudo fdisk -l 查看掛在的移動設備
uboot:引導linux啟動,最主要的工作就是初始化DDR,因為Linux是運行在DDR里面的,uboot的主要目的就是為系統啟動做準備
ddr是ram,掉電之后是數據全部丟失。
uboot、linux、設備樹文件等等統稱系統鏡像
uboot命令使用
0x8000 0000是ddr的起始地址
0x8780 0000是uboot的起始地址,需要把編譯好的u-boot.bin文件拷貝到87800000的地址處,也是鏡像的起始地址
go 87800000跳轉到87800000的地方運行
常用命令
查看某一個命令幫助信息:
?命令名 或 help 命令名
信息查詢:
1、bdinfo 查看板子信息
2、printenv(print)查看當前板子的環境變量
3、setenv 可以設置環境變量,也可以自定義環境變量,也可以刪除環境變量
4、saveenv 保存環境變量
內存操作命令
1、md 用于顯示內存值
2、nm 用于修改指定地址的內存值
3、mm 修改指定地址內存值的,使用 mm 修改內存值的時候地址會自增,而使用命令 nm 的話地址不會自增
4、mw 用于使用一個指定的數據填充一段內存
5、cp 數據拷貝命令
6、cmp 比較命令,用于比較兩段內存的數據是否相等
網絡操作命令
1、ping命令重點
2、dhcp命令
3、nfs命令 重點 目的就是為了調試程序。
4、tftp命令 重點 當Windows下的文件拷貝到Ubuntu時,使用tftp命令下載到板子上就會出現權限問題
uboot源碼目錄文件
fs:文件系統
include:頭文件
dts:設備樹
system.map: u-boot.map 內存映射文件
uboot頂層Makefile分析
vscode中:shift+Alt+F,格式化文檔 shift+Alt+左鍵可以豎排選擇 鼠標中鍵也可豎排選擇
? ctrl+p可以搜索文件
在makefile里打印信息:
mytest:
? echo:xxx=$(xxx)
mytest:
? @echo:xxx=$(xxx) 加@可以不打印echo指令
uboot啟動流程
.s .S為匯編程序文件
r0寄存器中保存著:0x9FF47000:gd->relocaddr就是uboot重定位后的起始地址,uboot共0xA8EF4大小
r1保存著原先起始地址:0x87800000
r4=r0-r1,0x18747000即保存偏移量
r2=0x8785dc6c:整個鏡像的最終地址
machineID對于現在的Linux來說沒用了,因為使用的是設備樹
VBAR寄存器為重定位后的中斷向量表起始地址
do_bootz函數
使用bootz命令啟動Linux內核
先將鏡像文件和設備樹文件下載到對應地址:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
使用bootz命令啟動:bootz 80800000 - 83000000
uboot移植實驗
編譯uboot:使用shell腳本的那三條命令進行編譯
在uboot根目錄下:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean 清理下工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
配置后會生成 .config 文件
之后就是編譯:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- V=1 -j12
編譯完成后會生成 u-boot.bin、u-boot.imx 文件
燒寫到SD卡:
將imxdownload軟件拷貝到uboot根目錄下,將u-boot.bin文件燒寫到SD卡:
./imxdownload u-boot.bin /dev/sdf
網絡驅動修改:
網卡1 ENET1 FEC0
網卡2 ENET2 FEC1
啟動Linux內核測試
從emmc啟動
EMMC 是有 3 個分區的:
第 0 個分區存放 uboot(原始的分區);
第 1 個分區會把它格式化成FAT文件系統,存放著Linux 鏡像文件和設備樹;
第 2 個分區存放根文件系統。
1、首先查看EMMC里面是否有系統:linux鏡像zImage和.dtb文件。
先將當前設備切換到EMMC:mmc dev 1 //切換到EMMC
fatls mmc 1:1 //查看EMMC分區1里面的文件
fatload mmc 1:1 80800000 zImage //將zimage下載到DDR的0x80800000處
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb //將dtb讀取到0X83000000
bootz 80800000 – 83000000 //啟動內核,如果內核啟動成功,說明uboot支持emmc啟動,驗證成功。
從網絡啟動
tftp 80800000 zImage //從tftp服務器下載zimage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb //從tftp服 務 器 下載.dtb
bootz 80800000 – 83000000 //啟動系統
bootcmd和bootargs
boorcmd:命令列表,有多條指令,目的就是啟動Linux內核
bootargs:命令行參數,會由uboot傳遞給linux內核
uboot圖形化配置
使用make menuconfig進入圖形化配置頁面
所有的配置信息只是臨時存到了.config文件里面,當清理工程后,.config就會被清掉
配置完成后,save保存配置文件xxx_defconfig,相當于拷貝了一份.config文件,后續可load加載配置文件繼續配置
Linux內核編譯
Uboot編譯步驟:
1、distclean清理工程,
2、make xxx_defconfig使用默認配置文件配置工程
3、make -j12編譯,
4、make menuconfig,打開配置界面,進行配置。
Linux編譯:
Linux內核的默認配置文件保存在arch/arm/configs。編譯的時候提示如下錯誤:
'arch/arm/compressed/piggy.lzo' failed
'arch/arm/compressed/vmlinux' failed
如果遇到上述錯誤,請:Sudo apt-get install lzop
編譯完成后會輸出:arch/arm/boot/zImage is ready
zImage存放在./arch/arm/boot/zImage
.dtb存放在:./arch/arm/boot/dts/xxx.dtb
編譯設備樹文件:在Linux頂層目錄下執行:make imx6ull-14x14-emmc-7-1024x600-c.dtb
Linux內核源碼目錄分析
dts:device tree設備樹
block:存放塊設備,NAND fash emmc就叫塊設備
make xxx.defconfig之后就會生成.config文件
Linux內核移植
準備兩個文件:一個就是imx6_alientek_emmc_defconfig默認配置文件。另一個就是:imx6ull-alientek-emmc.dts編譯出來就是.dtb文件。
1、復制arch/arm/configs/imx_v7_mfg_defconfig文件為imx_alientek_emmc_defconfig
2、復制arch/arm/boot/dts/imx6ull-14x14-evk.dts文件為imx6ull-alientek_emmc.dts
3、修改arch/arm/boot/dts/Makefile,添加imx6ull-alientek_emmc.dtb信息
注:Makefile中的 \ 后不能有空格
編譯完后就會有zImage和.dtb文件,拷貝到板子即可啟動Linux
CPU主頻和網絡驅動修
1、修改驅動之前,要先保證板子能夠正常啟動。2、根文件系統處理好,使用現成根文件系統。保證EMMC燒寫了系統,設置bootcmd和bootargs。
Bootcmd設置
默認從網絡啟動,通過TFTP:
setenv bootcmd ‘tftp 80800000 zImage;tftp 83000000 imx6ull-alientek_emmc.dtb;bootz 80800000 - 83000000;’
saveenv
設置好bootcmd后,復位板子后就會自動執行命令
Bootargs設置
根文件系統存放在EMMC的分區2里面,命令如下:
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
mmcblk1p2:mmcblk1表示emmc,p2代表emmc第二個分區
現 在 的 問 題 就 是EMMC驅 動 有 問 題 ,在imx6ull-alientek-emmc.dts中 找 到usdhc2節點。將usdhc2改為:
&usdhc2 {
? pinctrl-names = "default", "state_100mhz", "state_200mhz";
? pinctrl-0 = <&pinctrl_usdhc2_8bit>;
? pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
? pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
? bus-width = <8>;
? non-removable;
? status = "okay";
};
完了以后編譯設備樹。使用如下命令:make dtbs(代表編譯所有修改過的設備樹文件)
根文件系統構建
nfs相當于共享文件夾
tftp則需要下載文件
uboot階段,虛擬機ping板子是ping不同的
軟件在arm下運行一定是使用交叉編譯器編譯,使用交叉編譯器編譯在Ubuntu下是執行不了的
在Ubuntu下使用gcc編譯器編譯后,才能在Ubuntu運行
編寫hello.c,測試軟件是運行在ARM開發板上,因此編譯的時候要使用交叉編譯器。
編譯完成以后使用file命令查看可執行文件信息。
應用程序后臺運行xxx &。 ./hello & 后臺運行就可以不妨礙終端使用
關閉某個軟件后臺運行,輸入ps命令查看當前所有軟件的PID。查到hello的PID是77。通過 kill -9 77(PID).
kill -9 77 kill -9是固定的
1、mfgtool是NXP官方做的向I.MX系列燒寫系統的軟件,該軟件運行在windows下。
可以燒寫uboot.imx、zImage、dtb,rootfs。通過USB燒寫。
Mfgtool里面默認存放了NXP官方開發板的系統文件,
2、基本原理向開發板燒系統分兩部分:
? 1、先向開發板的DDR下載一個Linux系統,
? 2、通過前面下載到DDR中的Linux系統完成最終的燒寫工作。
L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools\Profiles\Linux\OSFirmware下有:files和firmware兩個文件夾。
files里面保存著最終燒寫到開發板中的uboo.imx、zImage、dtb以及rootfs。Firmware里面保存著第一步的uboot.imx、zImage、dtb。
燒寫自己的系統
1、firmare下的文件名:
u-boot-imx6ull14x14evk_emmc.imx uboot
zImage
zImage-imx6ull-14x14-evk-emmc.dtb //dtb文件
2、files下的文件名:
?u-boot-imx6ull14x14evk_emmc.imx //uboot
?zImage //kernel
?zImage-imx6ull-14x14-evk -emmc.dtb //dtb
?rootfs_nogpu.tar.bz2 //rootfs
? ↑↑↑ 將以上文件替換掉原來官方的文件
再使用mfgtool工具燒寫到開發板:插上usb線,撥碼開關設置到USB啟動,SD卡彈出;后復位,執行.vbs燒寫腳本程序;燒寫完畢后先按stop,再按exit;后撥碼開關設置到emmc啟動