您当前的位置: 首页 >  嵌入式

正点原子

暂无认证

  • 1浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子Linux连载】第三十三章 U-Boot移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

正点原子 发布时间:2021-08-27 17:50:49 ,浏览量:1

1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:935446741 4)关注正点原子公众号,获取最新资料更新 在这里插入图片描述

第三十三章 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或者linux kernel移植到我们的硬件上。这个就是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/sdd //烧写到SD卡中,不能烧写到/dev/sda或sda1里面 烧写完成以后将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驱动是否正常,使用命令mmc list列出当前的MMC设备,结果如图33.1.3.2所示: 在这里插入图片描述

图33.1.3.2 emmc设备检查 从图33.1.3.2可以看出当前有两个MMC设备,检查每个MMC设备信息,先检查MMC设备0,输入如下命令: mmc dev 0 mmc info 结果如图33.1.3.3所示: 在这里插入图片描述

图33.1.3.3 mmc设备0信息 从图33.1.3.3可以看出,mmc设备0是SD卡,SD卡容量为14.8GB,这个和我所使用的SD卡信息相符,说明SD卡驱动正常。再来检查MMC设备1,输入如下命令: mmc dev 1 mmc info 结果如图33.1.3.4所示: 在这里插入图片描述

图33.1.3.4 mmc设备1信息 从图33.1.3.4可以看出,mmc设备1为EMMC,容量为7.3GB,说明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分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。 ③、网络不能工作,识别不出来网络信息,需要修改驱动。 接下来我们要做的工作如下: ①、前面我们一直使用着NXP官方开发板的uboot配置,接下来需要在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 
13  #include 
14  #include "mx6_common.h"
15  #include 
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             
关注
打赏
1665308814
查看更多评论
0.0472s