日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

宏怎么在boot设置u盘启动不-(宏怎么在boot设置u盘启动不起来)

發布時間:2023/11/15 windows 47 电脑专家
生活随笔 收集整理的這篇文章主要介紹了 宏怎么在boot设置u盘启动不-(宏怎么在boot设置u盘启动不起来) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
宏怎么在boot設置u盤啟動不 (宏怎么在boot設置u盤啟動不起來)

1)實驗平臺:正點原子Linux開發板

2)摘自《正點原子I.MX6U嵌入式Linux驅動開發指南關注官方微信號公眾號,獲取更多資料:正點原子

第三十三章U-Boot移植


上一章節我們詳細的分析了uboot的啟動流程,對uboot有了一個初步的了解。前兩章我們都是使用的正點原子提供的uboot,本章我們就來學習如何將NXP官方的uboot移植到正點原子的I.MX6ULL開發板上,學習如何在uboot中添加我們自己的板子。


33.1 NXP官方開發板uboot編譯測試33.1.1 查找NXP官方的開發板默認配置文件

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盘启动不起来)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。