宏怎么在boot设置u盘启动不-(宏怎么在boot设置u盘启动不起来)
1)實驗平臺:正點原子Linux開發板
2)摘自《正點原子I.MX6U嵌入式Linux驅動開發指南》關注官方微信號公眾號,獲取更多資料:正點原子
第三十三章U-Boot移植上一章節我們詳細的分析了uboot的啟動流程,對uboot有了一個初步的了解。前兩章我們都是使用的正點原子提供的uboot,本章我們就來學習如何將NXP官方的uboot移植到正點原子的I.MX6ULL開發板上,學習如何在uboot中添加我們自己的板子。
uboot的移植并不是說我們完完全全的從零開始將uboot移植到我們現在所使用的開發板或者開發平臺上。這個對于我們來說基本是不可能的,這個工作一般是半導體廠商做的,半導體廠商負責將uboot移植到他們的芯片上,因此半導體廠商都會自己做一個開發板,這個開發板就叫做原廠開發板,比如大家學習STM32的時候聽說過的discover開發板就是ST自己做的。半導體廠商會將uboot移植到他們自己的原廠開發板上,測試好以后就會將這個uboot發布出去,這就是大家常說的原廠BSP包。我們一般做產品的時候就會參考原廠的開發板做硬件,然后在原廠提供的BSP包上做修改,將uboot或者linuxkernel移植到我們的硬件上。這個就是uboot移植的一般流程:
①、在uboot中找到參考的開發平臺,一般是原廠的開發板。
②、參考原廠開發板移植uboot到我們所使用的開發板上。
正點原子的I.MX6ULL開發板參考的是NXP官方的I.MX6ULL EVK開發板做的硬件,因此我們在移植uboot的時候就可以以NXP官方的I.MX6ULL EVK開發板為藍本。
本章我們是將NXP官方的uboot移植到正點原子的I.MX6ULL開發板上,NXP官方的uboot放到了開發板光盤中,路徑為:1、例程源碼->4、NXP官方原版Uboot和Linux->uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。將uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2發送到Ubuntu中并解壓,然后創建VSCode工程。
在移植之前,我們先編譯一下NXP官方I.MX6ULL EVK開發板對應的uboot,首先是配置uboot,configs目錄下有很多跟I.MX6UL/6ULL有關的配置如圖33.1.1.1所示,

圖33.1.1.1 NXP官方I.MX6UL/6ULL默認配置文件
從圖33.1.1.1可以看出有很多的默認配置文件,其中以mx6ul開頭的是I.MX6UL芯片的,mx6ull開頭的是I.MX6ULL開發板的。I.MX6UL/6ULL有9x9mm和14x14mm兩種尺寸的,所以我們可以看到會有mx6ull_9x9和mx6ull_14x14開頭的默認配置文件。我們使用的是14x14mm的芯片,所以關注mx6ull_14x14開頭的默認配置文件。正點原子的I.MX6ULL有EMMC和NAND兩個版本的,因此我們最終只需要關注mx6ull_14x14_evk_emmc_defconfig和mx6ull_14x14_evk_nand_defconfig這兩個配置文件就行了。本章我們講解EMMC版本的移植(NAND版本移植很多類似),所以使用mx6ull_14x14_evk_emmc_defconfig作為默認配置文件。
33.1.2 編譯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
編譯完成以后結果如圖33.1.2.1所示:

圖33.1.2.1 編譯結果
從圖33.1.2.1可以看出,編譯成功。我們在編譯的時候需要輸入ARCH和CORSS_COMPILE這兩個變量的值,這樣太麻煩了。我們可以直接在頂層Makefile中直接給ARCH和CORSS_COMPILE賦值,修改如圖33.1.2.2所示:

圖33.1.2.2 添加ARCH和CROSS_COMPILE值
圖33.1.2.2中的250、251行就是直接給ARCH和CROSS_COMPILE賦值,這樣我們就可以使用如下簡短的命令來編譯uboot了:
make mx6ull_14x14_evk_emmc_defconfig
make V=1 -j16
如果既不想修改uboot的頂層Makefile,又想編譯的時候不用輸入那么多,那么就直接創建個shell腳本就行了,shell腳本名為mx6ull_14x14_emmc.sh,然后在shell腳本里面輸入如下內容:
示例代碼33.1.2.1 mx6ull_14x14_emmc.sh文件
1 #!/bin/bash
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
4 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf--j16
記得給mx6ull_14x14_emmc.sh這個文件可執行權限,使用mx6ull_14x14_emmc.sh腳本編譯uboot的時候每次都會清理一下工程,然后全部重新編譯,編譯的時候直接執行這個腳本就行了,命令如下:
./mx6ull_14x14_evk_emmc.sh
編譯完成以后會生成u-boot.bin、u-boot.imx等文件,但是這些文件是NXP官方I.MX6ULL EVK開飯。能不能用到正點原子的I.MX6ULL開發板上呢?試一下不就知道了!
33.1.3 燒寫驗證與驅動測試將imxdownload軟件拷貝到uboot源碼根目錄下,然后使用imxdownload軟件將u-boot.bin燒寫到SD卡中,燒寫命令如下:
chmod 777 imxdownload //給予imxdownload可執行權限
./imxdownload u-boot.bin /dev/sdg //燒寫u-boot.bin到SD卡中
燒寫完成以后將SD卡插入I.MX6U-ALPHA開發板的TF卡槽中,最后設置開發板從SD卡啟動。打開SecureCRT,設置好開發板所使用的串口并打開,復位開發板,SecureCRT接收到如下圖33.1.3.1所示信息:

圖33.1.3.1 uboot啟動信息
從圖33.1.3.1可以看出,uboot啟動正常,雖然我們用的是NXP官方I.MX6ULL開發板的uboot,但是在正點原子的I.MX6ULL開發板上是可以正常啟動的。而且DRAM識別正確,為512MB,如果用的NAND版本的核心版的話uboot啟動會失敗!因為NAND核心版用的256MB的DRAM。
1、SD卡和EMMC驅動檢查
檢查一下SD卡和EMMC驅動是否正常,使用命令mmclist列出當前的MMC設備,結果如圖33.1.3.2所示:

圖33.1.3.2 emmc設備檢查
從圖33.1.3.2可以看出當前有兩個MMC設備,檢查每個MMC設備信息,先檢查MMC設備0,輸入如下命令:
mmcdev 0
mmcinfo
結果如圖33.1.3.3所示:

圖33.1.3.3 mmc設備0信息
從圖33.1.3.3可以看出,mmc設備0是SD卡,SD卡容量為14.8GB,這個和我所使用的SD卡信息相符,說明SD卡驅動正常。再來檢查MMC設備1,輸入如下命令:
mmcdev 1
mmcinfo
結果如圖33.1.3.4所示:

圖33.1.3.4 mmc設備1信息
從圖33.1.3.4可以看出,mmc設備1為EMMC,容量為3.6GB,說明EMMC驅動也成功,SD卡和EMMC的驅動都沒問題。
2、LCD驅動檢查
如果uboot中的LCD驅動正確的話,啟動uboot以后LCD上應該會顯示出NXP的logo,如下圖33.1.3.5所示:

圖33.1.3.5 uboot LCD界面
如果你用的不是正點原子的4.3寸480x272分辨率的屏幕的話,那么LCD就不會顯示33.1.3.5所示logo界面。因為NXP官方I.MX6ULL開發板的屏幕就是4.3寸480x272分辨率的,所以uboot默認LCD驅動是4.3寸480x272分辨率的。如果使用其他分辨率的LCD就需要修改LCD驅動,這里我們先不修改LCD驅動了,稍后我們在講解如何修改uboot中的LCD驅動,我們只需要記得,uboot的LCD需要修改就行了。
3、網絡驅動
uboot啟動的時候提示"Board Net Initialization Failed"和"No ethernet found."這兩行,說明網絡驅動也有問題,正常情況下應該是如圖33.1.3.6所示提示:

圖33.1.3.6 網絡信息
現在沒有圖33.1.3.6中的信息,那更別說ping一下ubuntu主機了,說明當前uboot的網絡部驅動也是有問題的,這是因為正點原子開發板的網絡芯片復位引腳和NXP官方開發板不一樣,因此需要修改驅動。
總結一下NXP官方I.MX6ULL EVK開發板的uboot在正點原子EMMC版本I.MX6ULL 開發板上的運行情況:
①、uboot啟動正常,DRAM識別正確,SD卡和EMMC驅動正常。
②、uboot里面的LCD驅動默認是給4.3寸480x272分辨率的,如果使用的其他分辨率的屏幕需要修改驅動。
②、網絡不能工作,識別不出來網絡信息,需要修改驅動。
接下來我們要做的工作如下:
①、前面我們一直使用著uboot中NXP官方開發板的配置,接下來需要在uboot中添加我們自己的開發板,也就是正點原子的I.MX6ULL開發板。
②、解決LCD驅動和網絡驅動的問題。
33.2 在U-Boot中添加自己的開發板NXP官方uboot中默認都是NXP自己的開發板,雖說我們可以直接在官方的開發板上直接修改,使uboot可以完整的運行在我們的板子上。但是從學習的角度來講,這樣我們就不能了解到uboot是如何添加新平臺的。接下來我們就參考NXP官方的I.MX6ULL EVK開發板,學習如何在uboot中添加我們的開發板或者開發平臺。
33.2.1 添加開發板默認配置文件先在configs目錄下創建默認配置文件,復制mx6ull_14x14_evk_emmc_defconfig,然后重命名為mx6ull_alientek_emmc_defconfig,命令如下:
cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig
然后將文件mx6ull_alientek_emmc_defconfig中的內容改成下面的:
示例代碼33.2.1.1 mx6ull_alientek_emmc_defconfig文件
1 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_alientek_
emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
2 CONFIG_ARM=y
3 CONFIG_ARCH_MX6=y
4 CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y
5 CONFIG_CMD_GPIO=y
可以看出,mx6ull_alientek_emmc_defconfig基本和mx6ull_14x14_evk_emmc_defconfig中的內容一樣,只是第1行和第4行做了修改。
33.2.2 添加開發板對應的頭文件在目錄include/configs下添加I.MX6ULL-ALPHA開發板對應的頭文件,復制include/configs/mx6ullevk.h,并重命名為mx6ull_alientek_emmc.h,命令如下:
cp include/configs/mx6ullevk.h mx6ull_alientek_emmc.h
拷貝完成以后將:
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
改為:
#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H
mx6ull_alientek_emmc.h里面有很多宏定義,這些宏定義基本用于配置uboot,也有一些I.MX6ULL的配置項目。如果我們自己要想使能或者禁止uboot的某些功能,那就在mx6ull_alientek_emmc.h里面做修改即可。mx6ull_alientek_emmc.h里面的內容比較多,去掉一些用不到的配置,精簡后的內容如下:
示例代碼33.2.2.1 mx6ull_alientek_emmc.h文件
1/*
2 * Copyright (C) 2016 Freescale Semiconductor, Inc.
3 *
4 * Configuration settings for the Freescale i.MX6UL 14x14 EVK board.
5 *
6 * SPDX-License-Identifier: GPL-2.0+
7 */
8 #ifndef __MX6ULL_ALEITENK_EMMC_CONFIG_H
9 #define __MX6ULL_ALEITENK_EMMC_CONFIG_H
10
11
12 #include <asm/arch/imx-regs.h>
13 #include <linux/sizes.h>
14 #include "mx6_common.h"
15 #include <asm/imx-common/gpio.h>
16
......
28
29 #define is_mx6ull_9x9_evk() CONFIG_IS_ENABLED(TARGET_MX6ULL_9X9_EVK)
30
31 #ifdef CONFIG_TARGET_MX6ULL_9X9_EVK
32 #define PHYS_SDRAM_SIZE SZ_256M
33 #define CONFIG_BOOTARGS_CMA_SIZE "cma=96M "
34 #else
35 #define PHYS_SDRAM_SIZE SZ_512M
36 #define CONFIG_BOOTARGS_CMA_SIZE ""
37/* DCDC used on 14x14 EVK, no PMIC */
38 #undef CONFIG_LDO_BYPASS_CHECK
39 #endif
40
41/* SPL options */
42/* We default not support SPL
43 * #define CONFIG_SPL_LIBCOMMON_SUPPORT
44 * #define CONFIG_SPL_MMC_SUPPORT
45 * #include "imx6_spl.h"
46 */
47
48 #define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
49
50 #define CONFIG_DISPLAY_CPUINFO
51 #define CONFIG_DISPLAY_BOARDINFO
52
53/* Size of malloc() pool */
54 #define CONFIG_SYS_MALLOC_LEN (16* SZ_1M)
55
56 #define CONFIG_BOARD_EARLY_INIT_F
57 #define CONFIG_BOARD_LATE_INIT
58
59 #define CONFIG_MXC_UART
60 #define CONFIG_MXC_UART_BASE UART1_BASE
61
62/* MMC Configs */
63 #ifdef CONFIG_FSL_USDHC
64 #define CONFIG_SYS_FSL_ESDHC_ADDR USDHC2_BASE_ADDR
65
66/* NAND pin conflicts with usdhc2 */
67 #ifdef CONFIG_SYS_USE_NAND
68 #define CONFIG_SYS_FSL_USDHC_NUM 1
69 #else
70 #define CONFIG_SYS_FSL_USDHC_NUM 2
71 #endif
72 #endif
73
74/* I2C configs */
75 #define CONFIG_CMD_I2C
76 #ifdef CONFIG_CMD_I2C
77 #define CONFIG_SYS_I2C
78 #define CONFIG_SYS_I2C_MXC
79 #define CONFIG_SYS_I2C_MXC_I2C1 /* enable I2C bus 1 */
80 #define CONFIG_SYS_I2C_MXC_I2C2 /* enable I2C bus 2 */
81 #define CONFIG_SYS_I2C_SPEED 100000
82
......
89
90 #define CONFIG_SYS_MMC_IMG_LOAD_PART 1
91
92 #ifdef CONFIG_SYS_BOOT_NAND
93 #define CONFIG_MFG_NAND_PARTITION "mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) "
94 #else
95 #define CONFIG_MFG_NAND_PARTITION ""
96 #endif
97
98 #define CONFIG_MFG_ENV_SETTINGS \
99"mfgtool_args=setenv bootargs console=${console},${baudrate} " \
......
111"bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};\0" \
112
113 #if defined(CONFIG_SYS_BOOT_NAND)
114 #define CONFIG_EXTRA_ENV_SETTINGS \
115 CONFIG_MFG_ENV_SETTINGS \
116"panel=TFT43AB\0" \
......
126"bootz ${loadaddr} - ${fdt_addr}\0"
127
128 #else
129 #define CONFIG_EXTRA_ENV_SETTINGS \
130 CONFIG_MFG_ENV_SETTINGS \
131"script=boot.scr\0" \
......
202"fi;\0" \
203
204 #define CONFIG_BOOTCOMMAND \
205"run findfdt;" \
......
216"else run netboot; fi"
217 #endif
218
219/* Miscellaneous configurable options */
220 #define CONFIG_CMD_MEMTEST
221 #define CONFIG_SYS_MEMTEST_START 0x80000000
222 #define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_MEMTEST_START +0x8000000)
223
224 #define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR
225 #define CONFIG_SYS_HZ 1000
226
227 #define CONFIG_STACKSIZE SZ_128K
228
229/* Physical Memory Map */
230 #define CONFIG_NR_DRAM_BANKS 1
231 #define PHYS_SDRAM MMDC0_ARB_BASE_ADDR
232
233 #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM
234 #define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR
235 #define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE
236
237 #define CONFIG_SYS_INIT_SP_OFFSET \
238(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
239 #define CONFIG_SYS_INIT_SP_ADDR \
240(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
241
242/* FLASH and environment organization */
243 #define CONFIG_SYS_NO_FLASH
244
......
255
256 #define CONFIG_SYS_MMC_ENV_DEV 1/* USDHC2 */
257 #define CONFIG_SYS_MMC_ENV_PART 0/* user area */
258 #define CONFIG_MMCROOT "/dev/mmcblk1p2"/* USDHC2 */
259
260 #define CONFIG_CMD_BMODE
261
......
275
276/* NAND stuff */
277 #ifdef CONFIG_SYS_USE_NAND
278 #define CONFIG_CMD_NAND
279 #define CONFIG_CMD_NAND_TRIMFFS
280
281 #define CONFIG_NAND_MXS
282 #define CONFIG_SYS_MAX_NAND_DEVICE 1
283 #define CONFIG_SYS_NAND_BASE 0x40000000
284 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
285 #define CONFIG_SYS_NAND_ONFI_DETECTION
286
287/* DMA stuff, needed for GPMI/MXS NAND support */
288 #define CONFIG_APBH_DMA
289 #define CONFIG_APBH_DMA_BURST
290 #define CONFIG_APBH_DMA_BURST8
291 #endif
292
293 #define CONFIG_ENV_SIZE SZ_8K
294 #if defined(CONFIG_ENV_IS_IN_MMC)
295 #define CONFIG_ENV_OFFSET (12* SZ_64K)
296 #elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
297 #define CONFIG_ENV_OFFSET (768*1024)
298 #define CONFIG_ENV_SECT_SIZE (64*1024)
299 #define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS
300 #define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS
301 #define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE
302 #define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED
303 #elif defined(CONFIG_ENV_IS_IN_NAND)
304 #undef CONFIG_ENV_SIZE
305 #define CONFIG_ENV_OFFSET (60<<20)
306 #define CONFIG_ENV_SECT_SIZE (128<<10)
307 #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE
308 #endif
309
310
311/* USB Configs */
312 #define CONFIG_CMD_USB
313 #ifdef CONFIG_CMD_USB
314 #define CONFIG_USB_EHCI
315 #define CONFIG_USB_EHCI_MX6
316 #define CONFIG_USB_STORAGE
317 #define CONFIG_EHCI_HCD_INIT_AFTER_RESET
318 #define CONFIG_USB_HOST_ETHER
319 #define CONFIG_USB_ETHER_ASIX
320 #define CONFIG_MXC_USB_PORTSC (PORT_PTS_UTMI | PORT_PTS_PTW)
321 #define CONFIG_MXC_USB_FLAGS 0
322 #define CONFIG_USB_MAX_CONTROLLER_COUNT 2
323 #endif
324
325 #ifdef CONFIG_CMD_NET
326 #define CONFIG_CMD_PING
327 #define CONFIG_CMD_DHCP
328 #define CONFIG_CMD_MII
329 #define CONFIG_FEC_MXC
330 #define CONFIG_MII
331 #define CONFIG_FEC_ENET_DEV 1
332
333 #if(CONFIG_FEC_ENET_DEV ==0)
334 #define IMX_FEC_BASE ENET_BASE_ADDR
335 #define CONFIG_FEC_MXC_PHYADDR 0x2
336 #define CONFIG_FEC_XCV_TYPE RMII
337 #elif (CONFIG_FEC_ENET_DEV ==1)
338 #define IMX_FEC_BASE ENET2_BASE_ADDR
339 #define CONFIG_FEC_MXC_PHYADDR 0x1
340 #define CONFIG_FEC_XCV_TYPE RMII
341 #endif
342 #define CONFIG_ETHPRIME "FEC"
343
344 #define CONFIG_PHYLIB
345 #define CONFIG_PHY_MICREL
346 #endif
347
348 #define CONFIG_IMX_THERMAL
349
350 #ifndef CONFIG_SPL_BUILD
351 #define CONFIG_VIDEO
352 #ifdef CONFIG_VIDEO
353 #define CONFIG_CFB_CONSOLE
354 #define CONFIG_VIDEO_MXS
355 #define CONFIG_VIDEO_LOGO
356 #define CONFIG_VIDEO_SW_CURSOR
357 #define CONFIG_VGA_AS_SINGLE_DEVICE
358 #define CONFIG_SYS_CONSOLE_IS_IN_ENV
359 #define CONFIG_SPLASH_SCREEN
360 #define CONFIG_SPLASH_SCREEN_ALIGN
361 #define CONFIG_CMD_BMP
362 #define CONFIG_BMP_16BPP
363 #define CONFIG_VIDEO_BMP_RLE8
364 #define CONFIG_VIDEO_BMP_LOGO
365 #define CONFIG_IMX_VIDEO_SKIP
366 #endif
367 #endif
368
369 #define CONFIG_IOMUX_LPSR
370
......
375 #endif
從示例代碼33.2.2.1可以看出,mx6ull_alientek_emmc.h文件中基本都是"CONFIG_"開頭的宏定義,這也說明mx6ull_alientek_emmc.h文件的主要功能就是配置或者裁剪uboot。如果需要某個功能的話就在里面添加這個功能對應的CONFIG_XXX宏即可,如果不需要某個功能的話就刪除掉對應的宏即可。我們以示例代碼33.2.2.1為例,詳細的看一下mx6ull_alientek_emmc.h中這些宏都是什么功能。
第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
=0X02020000
查閱I.MX6ULL參考手冊,UART1的寄存器基地址正是0X02020000,如圖33.2.2.1所示:

圖33.2.2.1 UART1寄存器地址表
第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) ",分區結果如表33.2.2.1所示:
表33.2.2.1 NAND分區設置
NAND的分區是可以調整的,比如boot分區我們用不了64M這么大,因此可以將其改小,其他的分區一樣的。
第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中的加載地址,也就是linuxkernel在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。
關于mx6ull_alientek_emmc.h就講解到這里,其中以CONFIG_CMD開頭的宏都是用于使能相應命令的,其他的以CONFIG開頭的宏都是完成一些配置功能的。以后會頻繁的和mx6ull_alientek_emmc.h這個文件打交道。
33.2.3 添加開發板對應的板級文件夾uboot中每個板子都有一個對應的文件夾來存放板級文件,比如開發板上外設驅動文件等等。NXP的I.MX系列芯片的所有板級文件夾都存放在board/freescale目錄下,在這個目錄下有個名為mx6ullevk的文件夾,這個文件夾就是NXP官方I.MX6ULL EVK開發板的板級文件夾。復制mx6ullevk,將其重命名為mx6ull_alientek_emmc,命令如下:
cd board/freescale/
cp mx6ullevk/ -r mx6ull_alientek_emmc
進入mx6ull_alientek_emmc目錄中,將其中的mx6ullevk.c文件重命名為mx6ull_alientek_emmc.c,命令如下:
cdmx6ull_alientek_emmc
mv mx6ullevk.c mx6ull_alientek_emmc.c
我們還需要對mx6ull_alientek_emmc目錄下的文件做一些修改:
1、修改mx6ull_alientek_emmc目錄下的Makefile文件
將mx6ull_alientek_emmc下的Makefile文件內容改為如下所示:
示例代碼33.2.3.1 Makefile文件
1 # (C) Copyright 2015 Freescale Semiconductor, Inc.
2 #
3 # SPDX-License-Identifier: GPL-2.0+
4 #
5
6 obj-y := mx6ull_alientek_emmc.o
7
8 extra-$(CONFIG_USE_PLUGIN):= plugin.bin
9 $(obj)/plugin.bin: $(obj)/plugin.o
10 $(OBJCOPY)-O binary --gap-fill 0xff $< $@
重點是第6行的obj-y,改為mx6ull_alientek_emmc.o,這樣才會編譯mx6ull_alientek_emmc.c這個文件。
2、修改mx6ull_alientek_emmc目錄下的imximage.cfg文件
將imximage.cfg中的下面一句:
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
改為:
PLUGIN board/freescale/mx6ull_alientek_emmc /plugin.bin 0x00907000
3、修改mx6ull_alientek_emmc目錄下的Kconfig文件
修改Kconfig文件,修改后的內容如下:
示例代碼33.2.3.2 Kconfig文件
1if TARGET_MX6ULL_ALIENTEK_EMMC
2
3 config SYS_BOARD
4default"mx6ull_alientek_emmc"
5
6 config SYS_VENDOR
7default"freescale"
8
9 config SYS_SOC
10default"mx6"
11
12 config SYS_CONFIG_NAME
13default"mx6ull_alientek_emmc"
14
15 endif
4、修改mx6ull_alientek_emmc目錄下的MAINTAINERS文件
修改MAINTAINERS文件,修改后的內容如下:
1 MX6ULL_ALIENTEK_EMMC BOARD
2 M: Peng Fan <peng.fan@nxp.com>
3 S: Maintained
4 F: board/freescale/mx6ull_alientek_emmc/
5 F: include/configs/mx6ull_alientek_emmc.h
33.2.4 修改U-Boot圖形界面配置文件uboot是支持圖形界面配置,關于uboot的圖形界面配置下一章會詳細的講解。修改文件arch/arm/cpu/armv7/mx6/Kconfig(如果用的I.MX6UL的話,應該修改arch/arm/Kconfig這個文件),在207行加入如下內容:
示例代碼33.2.4.1 Kconfig文件
1 config TARGET_MX6ULL_ALIENTEK_EMMC
2 bool"Support mx6ull_alientek_emmc"
3 select MX6ULL
4 select DM
5 select DM_THERMAL
在最后一行的endif的前一行添加如下內容:
示例代碼33.2.4.2 Kconfig文件
1 source "board/freescale/mx6ull_alientek_emmc/Kconfig"
添加完成以后的Kconfig文件如圖33.2.4.1所示:

圖33.2.4.1 修改后的Kconfig文件
到此為止,I.MX6U-ALPHA開發板就已經添加到uboot中了,接下來就是編譯這個新添加的開發板。
33.2.5 使用新添加的板子配置編譯uboot在uboot根目錄下新建一個名為mx6ull_alientek_emmc.sh的shell腳本,在這個shell腳本里面輸入如下內容:
示例代碼33.2.5.1 mx6ull_alientek_emmc.sh腳本文件
1 #!/bin/bash
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek__emmc_defconfig
4 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf--j16
第3行我們使用的默認配置文件就是33.2.1節中新建的mx6ull_alientek_emmc_defconfig這個配置文件。給予mx6ll_alientek_emmc.sh可執行權限,然后運行腳本來完成編譯,命令如下:
chmod 777 mx6ull_alientek_emmc.sh //給予可執行權限,一次即可
./mx6ull_alientek_emmc.sh //運行腳本編譯uboot
等待編譯完成,編譯完成以后輸入如下命令,查看一下33.2.2小節中添加的mx6ull_alientek_emmc.h這個頭文件有沒有被引用。
grep -nR "mx6ull_alientek_emmc.h"
如果有很多文件都引用了mx6ull_alientek_emmc.h這個頭文件,那就說明新板子添加成功,如圖33.2.5.1所示:

圖33.2.5.1 查找結果
編譯完成以后就使用imxdownload將新編譯出來的u-boot.bin燒寫到SD卡中測試,SecureCRT輸出結果如圖33.2.5.2所示:

圖33.2.5.1 uboot啟動過程
從圖33.2.5.1可以看出,此時的Board還是"MX6ULL 14x14 EVK",因為我們參考的NXP官方的I.MX6ULL開發板來添加自己的開發板。如果接了LCD屏幕的話會發現LCD屏幕并沒有顯示NXP的logo,而且從圖33.2.5.1可以看出此時的網絡同樣也沒識別出來。前面已經說了,默認uboot中的LCD驅動和網絡驅動在正點原子的I.MX6U-ALPHA開發板上是有問題的,需要修改。
33.2.6 LCD驅動修改一般uboot中修改驅動基本都是在xxx.h和xxx.c這兩個文件中進行的,xxx為板子名稱,比如mx6ull_alientek_emmc.h和mx6ull_alientek_emmc.c這兩個文件。
一般修改LCD驅動重點注意以下幾點:
①、LCD所使用的GPIO,查看uboot中LCD的IO配置是否正確。
②、LCD背光引腳GPIO的配置。
③、LCD配置參數是否正確。
正點原子的I.MX6U-ALPHA開發板LCD原理圖和NXP官方I.MX6ULL開發板一致,也就是LCD的IO和背光IO都一樣的,所以IO部分就不用修改了。需要修改的之后LCD參數,打開文件mx6ull_alientek_emmc.c,找到如下所示內容:
示例代碼33.2.6.1 LCD驅動參數
1struct display_info_t const displays[]={{
2 .bus = MX6UL_LCDIF1_BASE_ADDR,
3 .addr =0,
4 .pixfmt =24,
5 .detect =NULL,
6 .enable = do_enable_parallel_lcd,
7 .mode ={
8 .name ="TFT43AB",
9 .xres =480,
10 .yres =272,
11 .pixclock =108695,
12 .left_margin =8,
13 .right_margin =4,
14 .upper_margin =2,
15 .lower_margin =4,
16 .hsync_len =41,
17 .vsync_len =10,
18 .sync =0,
19 .vmode = FB_VMODE_NONINTERLACED
20 }}};
示例代碼33.2.6.1中定義了一個變量displays,類型為display_info_t,這個結構體是LCD信息結構體,其中包括了LCD的分辨率,像素格式,LCD的各個參數等。display_info_t定義在文件arch/arm/include/asm/imx-common/video.h中,定義如下:
示例代碼33.2.6.2 display_info結構體
1struct display_info_t {
2 int bus;
3 int addr;
4 int pixfmt;
5 int(*detect)(struct display_info_t const*dev);
6 void(*enable)(struct display_info_t const*dev);
7 struct fb_videomode mode;
8};
pixfmt是像素格式,也就是一個像素點是多少位,如果是RGB565的話就是16位,如果是888的話就是24位,一般使用RGB888。結構體display_info_t還有個mode成員變量,此成員變量也是個結構體,為fb_videomode,定義在文件include/linux/fb.h中,定義如下:
示例代碼33.2.6.3 fb_videomode結構體
1struct fb_videomode {
2 constchar*name; /* optional */
3 u32 refresh; /* optional */
4 u32 xres;
5 u32 yres;
6 u32 pixclock;
7 u32 left_margin;
8 u32 right_margin;
9 u32 upper_margin;
10 u32 lower_margin;
11 u32 hsync_len;
12 u32 vsync_len;
13 u32 sync;
14 u32 vmode;
15 u32 flag;
16};
結構體fb_videomode里面的成員變量為LCD的參數,這些成員變量函數如下:
name:LCD名字,要和環境變量中的panel相等。
xres、yres:LCD X軸和Y軸像素數量。
pixclock:像素時鐘,每個像素時鐘周期的長度,單位為皮秒。
left_margin:HBP,水平同步后肩。
right_margin:HFP,水平同步前肩。
upper_margin:VBP,垂直同步后肩。
lower_margin:VFP,垂直同步前肩。
hsync_len:HSPW,行同步脈寬。
vsync_len:VSPW,垂直同步脈寬。
vmode:大多數使用FB_VMODE_NONINTERLACED,也就是不使用隔行掃描。
可以看出,這些參數和我們第二十四章講解RGB LCD的時候參數基本一樣,唯一不同的像素時鐘pixclock的含義不同,以正點原子的7寸1024*600分辨率的屏幕(ATK7016)為例,屏幕要求的像素時鐘為51.2MHz,因此:
pixclock=(1/51200000)*10^12=19531
在根據其他的屏幕參數,可以得出ATK7016屏幕的配置參數如下:
示例代碼33.2.6.4 ATK7016屏幕配置參數
1struct display_info_t const displays[]={{
2 .bus = MX6UL_LCDIF1_BASE_ADDR,
3 .addr =0,
4 .pixfmt =24,
5 .detect =NULL,
6 .enable = do_enable_parallel_lcd,
7 .mode ={
8 .name ="TFT7016",
9 .xres =1024,
10 .yres =600,
11 .pixclock =19531,
12 .left_margin =140,//HBPD
13 .right_margin =160,//HFPD
14 .upper_margin =20,//VBPD
15 .lower_margin =12,//VFBD
16 .hsync_len =20,//HSPW
17 .vsync_len =3,//VSPW
18 .sync =0,
19 .vmode = FB_VMODE_NONINTERLACED
20}}};
使用示例代碼33.2.6.4中的屏幕參數替換掉mx6ull_alientek_emmc.c中uboot默認的屏幕參數。
打開mx6ull_alientek_emmc.h,找到所有如下語句:
panel=TFT43AB
將其改為:
panel=TFT7016
也就是設置panel為TFT7016,panel的值要與示例代碼33.2.6.4中的.name成員變量的值一致。修改完成以后重新編譯一遍uboot并燒寫到SD中啟動。
重啟以后LCD驅動一般就會工作正常了,LCD上回顯示NXP的logo。但是有可能會遇到LCD并沒有工作,還是黑屏,這是什么原因呢?在uboot命令模式輸入"printf"來查看環境變量panel的值,會發現panel的值要是TFT43AB(或其他的,反正不是TFT7016),如圖33.2.6.1所示:

圖33.2.6.1 panel的值
這是因為之前有將環境變量保存到EMMC中,uboot啟動以后會先從EMMC中讀取環境變量,如果EMMC中沒有環境變量的話才會使用mx6ull_alientek_emmc.h中的默認環境變量。如果EMMC中的環境變量panel不等于TFT7016,那么LCD顯示肯定不正常,我們只需要在uboot中修改panel的值為TFT7016即可,在uboot的命令模式下輸入如下命令:
setenv panel TFT7016
saveenv
上述命令修改環境變量panel為TFT7016,然后保存,重啟uboot,此時LCD驅動就工作正常了。如果LCD還是沒有正常工作的,那就要檢查自己哪里有沒有改錯,或者還有哪里沒有修改。
這是水淼·dedeCMS站群文章更新器的試用版本更新的文章,故有此標記(2023-11-15 08:32:52)
總結
以上是生活随笔為你收集整理的宏怎么在boot设置u盘启动不-(宏怎么在boot设置u盘启动不起来)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老主板系统安装教程-(老主板系统安装教程
- 下一篇: 老机器u盘启动在哪设置-(老机器u盘启动