1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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}; " 112 113 #if defined(CONFIG_SYS_BOOT_NAND) 114 #define CONFIG_EXTRA_ENV_SETTINGS 115 CONFIG_MFG_ENV_SETTINGS 116"panel=TFT43AB " ...... 126"bootz ${loadaddr} - ${fdt_addr} " 127 128 #else 129 #define CONFIG_EXTRA_ENV_SETTINGS 130 CONFIG_MFG_ENV_SETTINGS 131"script=boot.scr " ...... 202"fi; " 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还是没有正常工作的,那就要检查自己哪里有没有改错,或者还有哪里没有修改。 |
|
相关推荐
|
|
655 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2448 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1292 浏览 0 评论
1895 浏览 0 评论
1486 浏览 0 评论
74867 浏览 21 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 17:48 , Processed in 0.952102 second(s), Total 61, Slave 44 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号