创建自己的uboot-基于IMX6
學習目標:
Linux 系統要啟動就必須需要一個 bootloader 程序,上電后首先運行的程序,初始化DDR等外設,然后將Linux內核從flash(NAND,NOR FLASH,SD,MMC 等)拷貝到 DDR 中,最后啟動 Linux 內核,一個啟動流程。因此我們需要一個bootloader,目前有很多現成的 bootloader 軟件可以使用,比如 U-Boot、vivi、RedBoot 等等,其中以 U-Boot 使用最為廣泛,因此我們學習uboot。
根據硬件平臺,搭建適合平臺的uboot
這里用I.MX6ULL,核心板使用正點原子的emmc-btb版本。
擴展板是自己做的,學習uboot里面硬件主要注意boot模式引腳狀態
(1)下面是BOOT模式配置
00:熔絲模式一次性燒錄需要謹慎。
01:外部模式(USB/串口寫入)。
這個模式可以用官方MfgTool2,把uboot,linux,根文件系統,設備樹等燒寫到sd卡,emmc,nand,qspi;其中寫sd卡時需先拔出sd卡(有文件在里面時),otg使用從模式,MfgTool2識別設備后再接入SD卡。
MFGtool燒錄分為兩個階段,第一部分就是將firmware文件夾 下的Uboot、Kernel、device tree、Initramfs加載到內存中,然后在第二階段,將你要燒錄的文件夾下的Uboot、Kernel、device tree、rootfs寫入NAND Flash、SD Card或者emmc,然后完成燒錄。
10:內部模式(SD/EMMC/NAND/QSPI)
?(2)BOOT模式配置為內部模式后,再配置具體的啟動外設
?引腳復用關系如下:
?(3)本次使用普通sd卡方式啟動
硬件配置:BOOT_MODE0=0,BOOT_MODE1=0,
BOOTCFG[6]=1,其余BOOTCFG=0。
紅色圈的電阻拆下?
UBOOT制作過程:
下圖介紹總的框圖
?(1)下載uboot源碼
方法一:uboot 的全稱是 Universal Boot Loader,uboot 是一個遵循 GPL 協議的開源軟件,uboot 是一個裸機代碼,可以看作是一個裸機綜合例程。現在的 uboot 已經支持液晶屏、網絡、USB 等高級功能。uboot 官網為 http://www.denx.de/wiki/U-Boot/;我們可以下載里面源碼。
方法二:平臺用的是I.MX6ULL,可以去NXP官網下載,NXP 就 維 護 的 2016.03 這 個 版 本 的 uboot , 下 載 地 址 為 :
http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/tag/?h=imx_v2016.03_4.1.15_2.0.0_ga&id=
rel_imx_4.1.15_2.1.0_ga
方法三:使用第三方uboot,核心板是購買正點原子的,因此可以使用他們針對核心板做的uboot。
?(2)編譯與修改uboot文件
2.1下載好nxp的uboot后,找到 NXP 官方 I.MX6ULL EVK 開發板配置文件,命令編譯 uboot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
也可以建一個shell腳本,mx6ull_14x14_emmc.sh在里面輸入
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
輸入命令./mx6ull_14x14_evk_emmc.sh就可以完成編譯,編譯完成以后會生成 u-boot.bin、u-boot.imx 等文件
使用下面命令把生成的uboot燒入SD卡內,再放到開發板上可以知道是否啟動正常
chmod 777 imxdownload //給予 imxdownload 可執行權限
./imxdownload u-boot.bin /dev/sdb //燒寫 u-boot.bin 到 SD 卡中
2.2修改文件適配自己的開發板
2.2.1先在 configs 目錄下復制nxp做好的defconfig配置文件,黏貼后修改自己的名字,并修改里面信息
2.2.2再復制/include/configs里面的mx6ullevk.h文件并修改自己的名字,并修改內容
mx6ullevk.h 文件中基本都是“CONFIG_”開頭的宏定義,這也說明 mx6ullevk.h 文件的主要功能就是配置或者裁剪 uboot。如果需要某個功能的話就在里面添加這個功能對應的 CONFIG_XXX 宏即可,如果不需要某個功能的話就刪除掉對應的宏即可。
第 14 行,添加了頭文件 mx6_common.h,如果在 mx6ull_alientek_emmc.h 中沒有發現有配
置某個功能或命令,但是實際卻存在的話,可以到 mx6_common.h 文件里面去找一下。
第 29~39 行,設置 DRAM 的大小,宏 PHYS_SDRAM_SIZE 就是板子上 DRAM 的大小,
如果用的NXP官方的9X9 EVK開發板的話DRAM大小就為256MB。否則的話默認為512MB,
正點原子的 I.MX6U-ALPHA 開發板用的是 512MB DDR3。
第 50 行,定義宏 CONFIG_DISPLAY_CPUINFO,uboot 啟動的時候可以輸出 CPU 信息。
第 51 行,定義宏 CONFIG_DISPLAY_BOARDINFO,uboot 啟動的時候可以輸出板子信息。
第 54 行,CONFIG_SYS_MALLOC_LEN 為 malloc 內存池大小,這里設置為 16MB。
第 56 行,定義宏 CONFIG_BOARD_EARLY_INIT_F,這樣 board_init_f 函數就會調用
board_early_init_f 函數。
第 57 行,定義宏 CONFIG_BOARD_LATE_INIT,這樣 board_init_r 函數就會調用
board_late_init 函數。
第 59、60 行,使能 I.MX6ULL 的串口功能,宏 CONFIG_MXC_UART_BASE 表示串口寄
存器基地址,這里使用的串口 1,基地址為 UART1_BASE,UART1_BASE 定義在文件
arch/arm/include/asm/arch-mx6/imx-regs.h 中,imx-regs.h 是 I.MX6ULL 寄存器描述文件,根據
imx-regs.h 可得到 UART1_BASE 的值如下:
UART1_BASE= (ATZ1_BASE_ADDR + 0x20000)
=AIPS1_ARB_BASE_ADDR + 0x20000
=0x02000000 + 0x20000
第63、64行, EMMC接在I.MX6ULL的USDHC2上,宏CONFIG_SYS_FSL_ESDHC_ADDR
為 EMMC 所使用接口的寄存器基地址,也就是 USDHC2 的基地址。
第 67~72 行,跟 NAND 相關的宏,因為 NAND 和 USDHC2 的引腳沖突,因此如果使用
NAND 的只能使用一個 USDHC 設備(SD 卡)。如果沒有使用 NAND,那么就有兩個 USDHC 設
備(EMMC 和 SD 卡),宏 CONFIG_SYS_FSL_USDHC_NUM 表示 USDHC 數量。EMMC 版本的
核心版沒有用到 NAND,所以 CONFIG_SYS_FSL_USDHC_NUM=2。
第 75~81,和 I2C 有關的宏定義,用于控制使能哪個 I2C,I2C 的速度為多少。
第 92~96 行,NAND 的分區設置,如果使用 NAND 的話,默認的 NAND 分區為:
"mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) "
第 98~111 行,宏 CONFIG_MFG_ENV_SETTINGS 定義了一些環境變量,使用 MfgTool 燒
寫系統時候會用到這里面的環境變量。
第 113~202 行 , 通 過 條 件 編 譯 來 設 置 宏 CONFIG_EXTRA_ENV_SETTINGS , 宏
CONFIG_EXTRA_ENV_SETTINGS 也是設置一些環境變量,此宏會設置 bootargs 這個環境變
量,后面我們會詳細分析這個宏定義。
第 204~217 行,設置宏 CONFIG_BOOTCOMMAND,此宏就是設置環境變量 bootcmd 的
值。后面會詳細的分析這個宏定義。
第 220~222 行,設置命令 memtest 相關宏定義,比如使能命令 memtest,設置 memtest 測試
的內存起始地址和內存大小。
第 224 行,宏 CONFIG_SYS_LOAD_ADDR 表示 linux kernel 在 DRAM 中的加載地址,也
就是 linux kernel 在 DRAM 中的存儲首地址,CONFIG_LOADADDR=0X80800000。
第 225 行,宏 CONFIG_SYS_HZ 為系統時鐘頻率,這里為 1000Hz。
第 227 行,宏 CONFIG_STACKSIZE 為棧大小,這里為 128KB。
第 230 行,宏 CONFIG_NR_DRAM_BANKS 為 DRAM BANK 的數量,I.MX6ULL 只有一
個 DRAM BANK,我們也只用到了一個 BANK,所以為 1。
第 231 行,宏 PHYS_SDRAM 為 I.MX6ULL 的 DRAM 控制器 MMDC0 所管轄的 DRAM 范
圍起始地址,也就是 0X80000000。
第 233 行,宏 CONFIG_SYS_SDRAM_BASE 為 DRAM 的起始地址。
第 234 行,宏 CONFIG_SYS_INIT_RAM_ADDR 為 I.MX6ULL 內部 IRAM 的起始地址(也
就是 OCRAM 的起始地址),為 0X00900000。
第 235 行,宏 CONFIG_SYS_INIT_RAM_SIZE 為 I.MX6ULL 內部 IRAM 的大小(OCRAM
的大小),為 0X00040000=128KB。
第 237~240 行,宏 CONFIG_SYS_INIT_SP_OFFSET 和 CONFIG_SYS_INIT_SP_ADDR 與
初始 SP 有關,第一個為初始 SP 偏移,第二個為初始 SP 地址。
第256行,宏CONFIG_SYS_MMC_ENV_DEV為默認的MMC設備,這里默認為USDHC2,
也就是 EMMC。
第 257 行,宏 CONFIG_SYS_MMC_ENV_PART 為模式分區,默認為第 0 個分區。
第 258 行,宏 CONFIG_MMCROOT 設置進入 linux 系統的根文件系統所在的分區,這里設
置為"/dev/mmcblk1p2",也就是 EMMC 設備的第 2 個分區。第 0 個分區保存 uboot,第 1 個分
區保存 linux 鏡像和設備樹,第 2 個分區為 Linux 系統的根文件系統。
第 277~291 行,與 NAND 有關的宏定義,如果使用 NAND 的話。
第 293 行,宏 CONFIG_ENV_SIZE 為環境變量大小,默認為 8KB。
第 294~308 行,宏 CONFIG_ENV_OFFSET 為環境變量偏移地址,這里的偏移地址是相對
于存儲器的首地址。如果環境變量保存在 EMMC 中的話,環境變量偏移地址為 12*64KB。如
果環境變量保存在 SPI FLASH 中的話,偏移地址為 768*1024。如果環境變量保存在 NAND 中
的話,偏移地址為 60<<20(60MB),并且重新設置環境變量的大小為 128KB。
第 312~323 行,與 USB 相關的宏定義。
第 325~342 行,與網絡相關的宏定義,比如使能 dhcp、ping 等命令。第 331 行的宏
CONFIG_FEC_ENET_DEV 指定 uboot 所使用的網口,I.MX6ULL 有兩個網口,為 0 的時候使
用 ENET1,為 1 的時候使用 ENET2。宏 IMX_FEC_BASE 為 ENET 接口的寄存器首地址,宏
CONFIG_FEC_MXC_PHYADDR 為網口 PHY 芯片的地址。宏 CONFIG_FEC_XCV_TYPE 為
PHY 芯片所使用的接口類型,I.MX6U-ALPHA 開發板的兩個 PHY 都使用的 RMII 接口。
第 344~END,剩下的都是一些配置宏,比如 CONFIG_VIDEO 宏用于開啟 LCD,
CONFIG_VIDEO_LOGO 使能 LOGO 顯示,CONFIG_CMD_BMP 使能 BMP 圖片顯示指令。這
樣就可以在 uboot 中顯示圖片了,一般用于顯示 logo。
2.2.3再復制/board/freescale里面的mx6ullevk文件夾并修改自己的名字,并修改內容
imximage.cfg?
?Kconfig
MAINTAINCERS
?Makefile?
復制mx6ullevk.c文件粘貼改成自己的名字(和makeflie內.o文件名一致),并修改里面內容
此文件內包含許多外設驅動,LCD顯示,網絡
修改網絡:
?
?再?drivers/net/phy/phy.c,添加如下代碼。
編譯和啟動uboot:
重新編譯 uboot,然后將 u-boot.bin 燒寫到 SD 卡中并啟動
建一個shell腳本,mx6ull_paopao_emmc.sh在里面輸入
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
mx6ull_paopao_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
輸入命令./mx6ull_paopao_emmc.sh就可以完成編譯,編譯完成以后會生成 u-boot.bin、u-boot.imx 等文件
先格式化SD卡
./imxdownload u-boot.bin /dev/sdb?
?插入寫好的sd卡,再上電啟動,硬件電阻配置是SD卡啟動。
啟動信息如下:
?再設置ip地址信息網絡就可以連接電腦
本次實驗平臺:
總結
以上是生活随笔為你收集整理的创建自己的uboot-基于IMX6的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于《高性能JavaScript》制表(
- 下一篇: Weather