【嵌入式Linux學習】Linux系統移植筆記之U-boot學習

燒寫系統

  • 在window下燒寫,通過mfgtool這個工具,先將Linux系統燒寫到DDR中,再燒寫到EMMC或NAND中
    • mfgtool這個工具會將uboot、zImage、rootfs全部燒寫,所以後期當我們只更新一個uboot,可能全部都再重新燒錄,這個可能就是mfgtool一個最大的缺點了。
    • 解決方案1:mfgtool單獨創建一個.vbs文件只燒寫uboot
    • 解決方案2:uboot.bin使用imxdownload腳本燒寫到SD卡中(帶有調試性質的開發,這樣比較方便。)./imxdownload u-boot.bin /dev/sdf
  • 在Ubuntu下少些,通過腳本,先將Linux系統燒寫到SD卡中,再燒寫到EMMC或NAND中

燒寫系統時SD卡注意事項

  • SD卡一定要是FAT32格式!
  • 如何確定SD卡?
    • ls /dev/sd* 比如出現sdf、sdf1,那就是sdf了
    • sudo fdisl -l 也可以查看到對應分區
  • 將文件拷貝到SD卡中需要等待系統進行緩存同步,這段時間不確定,所以最好直接在命令行輸入sync進行手動同步

uboot介紹

  • uboot就是一個bootloader,作用就是用於啓動Linux或其他系統。
  • Uboot最主要的工作就是初始化DDR,因爲Linux是運行在DDR裏面的。
  • 一般Linux鏡像zImage(uImage)+設備樹(.dtb)存放在SD、EMMC、NAND、SPI FLASH等等外置存儲區域。這就需要將Linux鏡像從外置flash拷貝到DDR中,再去啓動。
    • Uboot不僅僅能啓動Linux,也可以啓動其他系統;Linux不僅僅能通過uboot啓動。

uboot獲取

  • 首先就是uboot官網,缺點就是支持少,比如某一款具體芯片驅動等不完善。
  • SOC廠商會從uboot官網下載某一個版本的uboot,然後在這個版本的uboot上加入相應的SOC以及驅動,這就是SOC廠商定製版的uboot。
    • 做開發板的廠商會參考SOC廠商的板子,開發板必然會和官方的板子不一樣。因此開發板廠商又會去修改SOC廠商做好的uboot,以適應自己的板子。

uboot編譯

  • 爲了方便開發,建議直接在uboot頂層Makefile裏面設置好ARCH和CORSS_COMPILE這兩個變量的值。
  • 編譯UBOOT的時候需要先配置。
    • 圖形界面配置
    • 源碼配置
  • 編譯完成以後就會生成一個u-boot.bin。必須向u-boot.bin添加頭部信息。Uboot編譯最後會通過/tools/mkimage軟件添加頭部信息,生成u-boot.imx。
  • 如果配置過uboot,make clean會清除整個工程,那麼配置的文件也會被刪除,配置項也會被刪除掉。
    • 注意這裏說的是通過圖形界面配置uboot需要注意make clean會清除配置項,但是你如果是通過修改uboot源碼來配置的話,就不需要擔心!
  • uboot編譯命令三部曲
make distclean //清理配置
make xxx_defconfig //配置到.config文件
make -j4 //4覈編譯

可以通過時間戳,查看uboot是不是最新編譯的!

uboot命令

uboot命令中的數字都是十六進制的!不是十進制!

  • mmc list
    • 查看當前板子的mmc設備。
    • 將EMMC和SD卡統稱爲MMC
  • help或者?
    • 打印uboot支持的所有的命名
    • 查看某一個命令的幫助 ? xxx
  • bdinfo
    • 打印板子信息
  • version
    • 查看uboot版本相關信息
  • reset
    • uboot的重啓命令
環境變量相關
  • printenv(重要)
    • 查看當前板子的環境變量
    • 當然直接輸入print要是可以的
  • saveenv(重要)
    • 保存環境變量
  • setenv(重要)
    • 修改現有環境變量
      • eg:setenv bootdelay 5然後saveenv這樣就把uboot的倒計時改成了5s
      • eg:set bootcmd 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'然後saveenv注意環境變量是字符串的一定要用單引號引起來!
    • 新建環境變量
      • eg:setenv author 'xxx'然後saveenv
    • 刪除環境變量
      • eg:setenv author然後saveenv,不設置值即可實現刪除操作!
內存操作相關
  • md - 顯示指定地址內存值

    • md[.b, .w, .l] address [# of objects]
    • b w l 分別對應1 2 4字節,address對應內存起始地址 [# of objects]要查看的數據長度(十六進制格式)
    • eg:想查看以 0X80000000 開始的 20 個字節的內存值,顯示格式爲.b 的話:md.b 80000000 14注意14是0x14!直接寫md.b 80000000 0x14不容易弄混。
  • nm - 修改指定地址內存值(修改完地址不會自增)

    • nm [.b, .w, .l] address
      • eg:以.l 格式修改 0x80000000 地址的數據爲 0x12345678:輸入nm.l 0x80000000按下回車後,輸入0x12345678,按下回車,然後再輸入q即可退出。
  • mm- 修改指定地址內存值(修改完地址會自增)

  • mw - 使用一個指定數據填充一段內存

    • mw [.b, .w, .l] address value [count]
    • eg:使用.l 格式將以 0X80000000 爲起始地址的 0x10 個內存塊(0x10 * 4=64 字節)填充爲 0X0A0A0A0A:mw.l 80000000 0A0A0A0A 10
  • cp - 數據拷貝

    • cp [.b, .w, .l] source target count
    • eg:使用.l 格式將 0x80000000 處的地址拷貝到 0X80000100 處,長度爲 0x10 個內存塊(0x10 * 4=64 個字節):cp.l 80000000 80000100 10
  • cmp - 比較命令

    • cmp [.b, .w, .l] addr1 addr2 count
    • eg:使用.l 格式來比較 0x80000000 和 0X80000100 這兩個地址數據是否相等,比較長度爲 0x10 個內存塊:cmp.l 80000000 80000100 10
網絡相關命令(重點)

  開發板網線需要插到網口2上(左邊那個) ,保證開發板和電腦在同一個網段。只要uboot的網絡配置好了,便可以通過tftp或NFS連接ubuntu,這樣直接從ubuntu下載zImage和rootfs將會方便開發許多!

環境變量 描述
ipaddr 開發板 ip 地址,可以不設置,使用 dhcp 命令來從路由器獲取 IP 地址(dhcp獲取的僅僅本次有效,不會修改環境變量的ipaddr,下次啓動依然是ipaddr的地址)。
ethaddr 開發板的 MAC 地址,一定要設置。
gatewayip 網關地址。
netmask 子網掩碼。
serverip 服務器 IP 地址,也就是 Ubuntu 主機 IP 地址,用於調試代碼。
setenv ipaddr 192.168.1.50
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.250
saveenv
  • 開始之前,最好將ubuntu的ip地址給寫死(手動設置)
  • ipaddr - 設置之前在ubuntu看看能不能ping通,ping不通板子才能用。
  • ethaddr - 也要保證唯一
  • serverip - 這個地址就是ubuntu的地址

在這裏插入圖片描述

  • ping 測試網絡

    • 上述設置完畢之後,通過ping ubuntu地址,查看是否設置成功!
  • nfs命令 - 目的就是爲了調試程序

    • nfs 也就是網絡文件系統,通過 nfs 可以在計算機之間通過網絡來分享資源,比如我們將linux 鏡像和設備樹文件放到 Ubuntu 中,然後在 uboot 中使用 nfs 命令將 Ubuntu 中的 linux 鏡像和設備樹下載到開發板的 DRAM 中。這樣做的目的是爲了方便調試 linux 鏡像和設備樹,也就是網絡調試, 通過網絡調試是 Linux 開發中最常用的調試方法。
    • 當然使用NFS前提需要在ubuntu開啓NFS服務,並且創建設置NFS目錄。
    • nfs [loadAddress] [[hostIPaddr:]bootfilename]
    • eg:將 zImage 下載到開發板 DRAM 的 0X80800000 地址處:nfs 80800000 192.168.1.250:/home/zuozhongkai/linux/nfs/zImage
  • tftp命令 - 目的就是爲了調試程序

    • tftp 命令的作用和 nfs 命令一樣,都是用於通過網絡下載東西到 DRAM 中,只是 tftp 命令使用的 TFTP 協議, Ubuntu 主機作爲 TFTP 服務器。
    • tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
    • 和 nfs 命令的區別在於, tftp 命令不需要輸入文件在 Ubuntu 中的完整路徑,只需要輸入文件名即可。
    • eg:將 tftpboot 文件夾裏面的 zImage 文件下載到開發板 DRAM 的 0X80800000 地址處:tftp 80800000 zImage
    • 注意:從windows下拷貝到ubuntu中的文件,在用tftp下載的時候就會有權限問題。但是直接在ubuntu下編譯生成的文件在用tftp下載的時候就不存在權限問題。
mmc相關命令
命令 描述
mmc info 輸出 MMC 設備信息
mmc read 讀取 MMC 中的數據。
mmc wirte 向 MMC 設備寫入數據(可以通過網絡下載.imx文件升級uboot)。
mmc rescan 掃描 MMC 設備。
mmc part 列出 MMC 設備的分區。
mmc dev 0 切換 MMC 設備0。
mmc list 列出當前有效的所有 MMC 設備。
mmc hwpartition 設置 MMC 設備的分區。
mmc bootbus…… 設置指定 MMC 設備的 BOOT_BUS_WIDTH 域的值。
mmc bootpart…… 設置指定 MMC 設備的 boot 和 RPMB 分區的大小。
mmc partconf…… 設置指定 MMC 設備的 PARTITION_CONFG 域的值。
mmc rst 復位 MMC 設備
mmc setdsr 設置 DSR 寄存器的值
FAT文件系統相關命令

對於I.MX6U來說,SD/EMMC分爲三個分區:

  • 第一個:存放uboot
  • 第二個:存放Linux zImage,.dtb。FAT格式
  • 第三個:系統的根文件系統。EXT4格式
  • fatinfo - 查詢指定 MMC 設置指定分區的文件系統信息

    • fatinfo <interface> [<dev[:part]>]interface 表示接口,比如 mmc, dev 是查詢的設備號, part 是要查詢的分區。
    • eg:要查詢 EMMC 分區 1 的文件系統信息:fatinfo mmc 1:1
  • fatls - 查詢 FAT 格式設備的目錄和文件信息

    • fatls <interface> [<dev[:part]>] [directory]directory是要查詢的目錄
    • eg:查詢 EMMC 分區 1 中的所有的目錄和文件:fatls mmc 1:1
  • fstype - 查看 MMC 設備某個分區的文件系統格式

    • fstype <interface> <dev>:<part>
    • eg:EMMC 核心板上的 EMMC 默認有 3 個分區,我們來查看一下第0個分區的文件
      系統格式:fstype mmc 1:0
  • fatload - 將指定的文件讀取到 DRAM 中

    • eg:將 EMMC 分區 1 中的 zImage 文件讀取到 DRAM 中的0X80800000 地址處:fatload mmc 1:1 80800000 zImage
  • fatwrite - 將 DRAM 中的數據寫入到 MMC 設備中

    • fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
EXT文件系統相關命令

  uboot 有 ext2 和 ext4 這兩種格式的文件系統的操作命令,常用的就四個命令,分別爲:ext2load、 ext2ls、 ext4load、 ext4ls 和 ext4write。這些命令的含義和使用與 fatload、 fatls 和 fatwrit一樣,只是 ext2 和 ext4 都是針對 ext 文件系統的。

  • eg:查詢 EMMC 的分區 2 中的文件和目錄:ext4ls mmc 1:2
BOOT操作命令

  要啓動 Linux,需要先將 Linux 鏡像文件和設備樹拷貝到 DRAM 中,然後使用 bootz 命令來啓動Linux系統。拷貝鏡像和設備樹到DRAM有好2中方式:①、通過tftp從ubuntu下載 ②、通過fatload從EMMC中讀取到DRAM中!

  • bootz - 用於自動 zImage 鏡像文件

    • bootz [addr [initrd[:size]] [fdt]] addr 是 Linux 鏡像文件在 DRAM 中的位置, initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的話使用‘-’代替即可, fdt 就是設備樹文件在 DRAM 中的地址。
    • zImage 一般放到 DRAM 的 0X80800000 地址;設備樹放到 DRAM 中的 0X83000000 地址處
    • 輸入bootz 80800000 - 83000000便可啓動Linux!
  • boot - 啓動Linux系統

    • boot 命令也是用來啓動 Linux 系統的,只是 boot 會讀取環境變量 bootcmd 來啓動 Linux 系統, bootcmd 是一個很重要的環境變量!這個環境變量保存着引導命令,其實就是啓動的命令集合,具體的引導命令內容是可以修改的。
    • eg:我們要想使用 tftp 命令從網絡啓動 Linux 那麼就可以設置 bootcmd 爲“tftp
      80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000”,然後使用 saveenv 將 bootcmd 保存起來。然後直接輸入 boot 命令即可從網絡啓動 Linux 系統,命令如下:
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz
80800000 - 83000000'
saveenv
boot

Uboot源碼目錄分析

  • 因爲uboot會使用到一些經過編譯纔會生成的文件,因此在分析uboot的時候,需要先編譯一下uboot。
  • 整個UBOOT的鏈接腳本在arch\arm\cpu\u-boot.lds,編譯後uboot根目錄下也會有個u-boot.lds,注意後者由前者生成的!

移植uboot的時候重點要關注

  • board\freescale\mx6ullevk目錄,參考此目錄創建自己的板子

  • configs目錄,uboot的默認配置文件目錄,此目錄下都是以_defconfig結尾的,這些配置文件對應不同的板子。

    • 其中mx6ull_alientek_alpha_ddr256_emmc_defconfig是正點原子的配置文件!
  • 執行make xxx_defconfig,會在uboot根目錄下生成.config文件,此文件保存了詳細的uboot配置信息。

  • 頂層README,非常重要,介紹uboot。

  • 根目錄下的u-boot,這個是編譯出來帶ELF信息的uboot可執行文件

  • bootcmd - 命令列表,這些命令一般都是用來啓動 Linux 內核的。(如通過tftp下載zImage和dtb文件,啓動Linux內核)

    • bootcmd=tftp 80800000 zImage;tftp 83000000 imx6ull.dtb;bootz 80800000 - 83000000;
  • Bootargs - 命令行參數,傳遞給Linux內核。(通常用來設置控制檯和指定根文件系統)

    • bootargs=console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
配置uboot有3種方法:
  • 通過 mx6ull_alientek_emmc_defconfig 來配置
  • 通過文件 mx6ull_alientek_emmc.h 來配置
  • 通過圖形化配置
    • 在圖形化界面可以保存配置
    • 圖形界面可以通過?查看使能具體宏的名字。
    • 圖形界面啓動前需要安裝ncurses 庫
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev

配置完成之後會在.config中定義相應的宏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章