IMX6ULL Uboot 移植

article/2025/10/6 16:24:39

使用的开发板:正点原子ALPHA V2.2

  • Uboot简介
    在学习STM32的过程中使用过IAP在线升级就会知道,有引导程序+APP程序,即bootloader程序+APP。在学习嵌入式Linux的时候也一样,这个引导程序就是Uboot.
    uboot移植主要是根据原厂的uboot移植:芯片厂商通常会做一块自己的评估板并发布BSP,我们使用的就是NXP官方的评估板的Uboot进行裁剪,修改得来我们自己板子的程序。
    本次使用的是NXP
    官方原版的
    uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
    首先把文件原版的Uboot文件拷贝到Ubuntu下并且解压
    在这里插入图片描述
tar xf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 -C ./

在这里插入图片描述
解压了之后我们需要看一下配置文件,需要再配置文件里面配置我们的Uboot,这个配置文件就在configs目录下,我们进入configs目录下。
在这里插入图片描述
在这一个目录下我们可以看到有很多defconfig结尾的文件,这些就是Uboot每对应一个板子的一个配置文件。由于使用的是正点原子的开发板,使用的是mx6ull_14x14_evk_emmc_defconfig这一个配置文件。找到我们这个配置文件后我们就可以对他进行编译了。
首先清理一下工程

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

对目标的配置进行编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 

在这里插入图片描述
然后make进行编译

在这里插入图片描述

在这里我们可以看到生成了u-boot.bin和 u-boot.imx文件。
下面我们烧录进开发板里面看看。
我们使用 imxdownload 软件将 u-boot.bin烧写到 SD 卡中

把SD卡插上电脑
查找自己的设备,我这里是/dev/sdb ,切记烧录的时候不可以用/dev/sda 否则Ubuntu就开不了机了!!!
在这里插入图片描述

chmod 777 imxdownload 
./imxdownload u-boot.bin /dev/sdb   //切记不可以使用/dev/sda 

在这里插入图片描述
然后插SD卡到板子上。
用xshell连接板子。可以看到Uboot已经成功启动了。
在这里插入图片描述

但是启动是启动了,但是这时候屏幕和网络无法使用,因为我使用的这款正点原子的开发板驱动和uboot默认的屏幕不一样,因此我们需要修改驱动。
下面开始移植我们自己板子的uboot
首先就是配置文件,我们打开uboot的配置文件目录
在configs 目录下有很多配置文件,可想而知,每一个配置文件就对应一块开发板。
我们找到 mx6ull_14x14_evk_emmc_defconfig, 这是nxp官方的配置文件,我们就是参考它做修改。

cp mx6ull_14x14_evk_emmc_defconfig  mx6ull_myuboot_emmc_defconfig

在这里插入图片描述
然后复 制
include/configs/mx6ullevk.h,并重命名为 mx6ull_myuboot_emmc.h:

 cp mx6ullevk.h  mx6ull_myuboot_emmc.h

把mx6ull_myuboot_emmc.h文件的相关配置改成我们自己的。
文件中基本都是“CONFIG_”开头的宏定义,这也说明这个文件的主要功能就是配置或者裁剪 uboot。如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。
在这里插入图片描述

添加开发板对应的板级文件夹
进入board/freescale/目录下

cp mx6ullevk/ -r mx6ull_myuboot_emmc

然后进入mx6ull_myuboot_emmc目录修改相应文件的名字

mv mx6ullevk.c mx6ull_myuboot_emmc.c

我们改了c文件后,我们需要更改Mainfile文件
在这里插入图片描述

同时修改 imximage.cfg 中的下面一句改成自己的目录

在这里插入图片描述
修改Kconfig文件

if TARGET_MX6ULL_MYUBOOT_EMMCconfig SYS_BOARDdefault "mx6ull_myuboot_emmc"config SYS_VENDORdefault "freescale"config SYS_SOCdefault "mx6"config SYS_CONFIG_NAMEdefault "mx6ull_myuboot_emmc"endif

在这里插入图片描述

修改 MAINTAINERS 文件

MX6ULLEVK BOARD
M:      Peng Fan <peng.fan@nxp.com>
S:      Maintained
F:      board/freescale/mx6ull_myuboot_emmc/
F:      include/configs/mx6ull_myuboot_emmc.h

在这里插入图片描述

uboot 是支持图形界面配置,修改 U-Boot 图形界面配置文件
在这里插入图片描述
在这里插入图片描述
到此,已经移植好了,下面我们还需要修改LCD驱动和网络驱动。
打开mx6ull_myuboot_emmc.c文件
修改LCD驱动
找到mx6ull_myuboot_emmc.c文件下的
在这里插入图片描述改为如下:

struct display_info_t const displays[] = {{.bus = MX6UL_LCDIF1_BASE_ADDR,.addr = 0,.pixfmt = 24,.detect = NULL,.enable	= do_enable_parallel_lcd,.mode	= {.name			= "ATK4384",.xres           = 800,.yres           = 480,.pixclock       = 32258,.left_margin    = 88,.right_margin   = 40,.upper_margin   = 32,.lower_margin   = 13,.hsync_len      = 48,.vsync_len      = 3,.sync           = 0,.vmode          = FB_VMODE_NONINTERLACED
} } };

在这里插入图片描述

下一步注释掉lcd_pads里面的LCD复位
找到do_enable_parallel_lcd函数注释啊掉复位的相关代码在这里插入图片描述

在这里插入图片描述

然后找到 mx6ull_myuboot_emmc.h里面的
"panel=AFT43AN\0"改为
“panel=ATK4384\0”

修改网络驱动
网络 PHY 地址修改
修改mx6ull_myuboot_emmc.h 的代码

#ifdef CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
#define CONFIG_FEC_MXC
#define CONFIG_MII
#define CONFIG_FEC_ENET_DEV		1#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE			ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR          0x0
#define CONFIG_FEC_XCV_TYPE             RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE			ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR		0x1
#define CONFIG_FEC_XCV_TYPE		RMII
#endif
#define CONFIG_ETHPRIME			"FEC"#define CONFIG_PHYLIB
#define CONFIG_PHY_SMSC
#endif

在这里插入图片描述
更改好网络PHY芯片地址后我们修改复位引脚,因为官方的Uboot使用74LV595进行扩展IO但是我们的开发板并没有这东西。而是直接接到了IO口,因此我们需要修改驱动
找到以下代码注释掉这是芯片 74LV595的芯片引脚IO
在这里插入图片描述
然后加入我们自己的

#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)

在这里插入图片描述
同时删掉 74LV595 的 IO 配置参数结构体,将其删除掉。
在这里插入图片描述
接着删掉74LV595的初始化函数
void iox74lv_init(void)
void iox74lv_set(int index)
找到 board_init 函数,此函数是板子初始化函数,会被
board_init_r 调用,board_init 函数内容如下:
删掉 以下代码

	imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));iox74lv_init();

在这里插入图片描述

接下来就是添加 I.MX6U-ALPHA 开发板两个网络复位引脚了
找到fec1_pads 和 fec2_pads

MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL)
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),

在这里插入图片描述
修改setup_iomux_fec为如下

static void setup_iomux_fec(int fec_id)
{if (fec_id == 0){imx_iomux_v3_setup_multiple_pads(fec1_pads,ARRAY_SIZE(fec1_pads));gpio_direction_output(ENET1_RESET, 1);gpio_set_value(ENET1_RESET, 0);mdelay(20);gpio_set_value(ENET1_RESET, 1);}else{imx_iomux_v3_setup_multiple_pads(fec2_pads,ARRAY_SIZE(fec2_pads));gpio_direction_output(ENET2_RESET, 1);gpio_set_value(ENET2_RESET, 0);mdelay(20);gpio_set_value(ENET2_RESET, 1);}	
}

在这里插入图片描述
修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link

在函数加入以下代码

int bmcr_reg = 0;if (lan8720_flag == 0) {bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000) {udelay(100);}phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);lan8720_flag = 1;}

在这里插入图片描述

在此LCD驱动和网络驱动已经修改完成了
我们来编译验证一下!!

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_myuboot_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

在这里插入图片描述
编译完成。
最后烧录进行SD卡

./imxdownload u-boot.bin /dev/sdb

在这里插入图片描述
在这里插入图片描述
屏幕亮起,说明屏幕驱动OK
然后设置板子的网络参数

setenv ipaddr 192.168.1.55 //开发板 IP 地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.1.250 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量

最后测试网络连接
在这里插入图片描述
网络时通的!!说明网络驱动OK。


http://chatgpt.dhexx.cn/article/tTDMMAt2.shtml

相关文章

二、uboot移植

二、uboot移植 版本作者时间备注V 1.0bug设计工程师2021/11/10创建文件软件网盘链接0交叉编译工具链接:https://pan.baidu.com/s/1yFO2NDMet9_b1E1q1rMwEA提取码:42kluboot源码同上linux源码同上文件系统工具同上tftp工具同上2.1 简单说明 uboot制作结束会生成 u-boot-etc44…

linux-uboot 移植四 uboot的移植

概述 前边的章节中介绍到如果要移植uboot的话&#xff0c;最好的参考就是由官方提供的demo。 1、移植 1.1 添加board对应的板级文件夹 uboot 中每个板子都有一个对应的文件夹来存放板级文件&#xff0c;比如开发板上外设驱动文件等等。 NXP 的 I.MX 系列芯片的所有板级文件…

[uboot 移植]uboot 移植过程

文章目录 uboot 移植1 修改顶层 Makefile2 在 board 文件夹下添加开发板对应的板级文件2.1 imximage_lpddr2.cfg 和 imximage.cfg 文件2.2 plugin.S 文件2.3 Kconfig 文件2.4 igkboard.c 文件2.5 MAINTAINERS 文件2.6 Makefile 文件 3 添加 igkboard_defconfig 配置文件4 添加开…

UBoot 移植

1 NXP官方开发板uboot编译测试 1 查找 NXP 官方的开发板默认配置文件 因为我们的开发板是参考 NXP 官方的 I.MX6ULL EVK 开发板做的硬件&#xff0c;因此我们在移植 uboot 的时候就可以以 NXP 官方的 I.MX6ULL EVK 开发板为蓝本。 在 NXP 官方 I.MX6UL/6ULL 默认配置文件中找…

大话uboot 移植

结合作者多年的移植经验&#xff0c;尽量简单的为大家描述一个uboot 的移植过程。希望通过描述&#xff0c;给初入移植行道的你带来美好的希望。接下来&#xff0c;我们通过以下几个方面来描述。 1. arm soc 的启动方式 在描述soc 前&#xff0c;我们先看下一个简单的arm soc:…

uboot移植步骤

Uboot移植具体步骤(本例子为Samsung origen板) 第一步:准备源码 网上下载现成的uboot开源代码:https://ftp.denx.de/pub/u-boot/ 在该网站中选择与板子兼容的uboot源文件(公司中一般咨询硬件工程师) 在Linux系统下解压 tar xf 压缩包名 第二步:修改源码 1.抄板:将和你板子兼容…

(二)uboot移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

目录 一、前言 二、F1C200s上电启动顺序 三、前期准备 四、新建用户 五、交叉编译环境配置 六、uboot简介 七、uboot移植 &#x1f34f; uboot下载 &#x1f34f; uboot默认配置 &#x1f34f; uboot图形界面配置 &#x1f34f; uboot编译 &#x1f34f; 烧录bin…

U-Boot 移植初探

1. NXP官方开发板uboot编译测试 uboot移植不需要从零开始将uboot移植到使用的开发板上。因为半导体厂商通常都会自己做一个开发板&#xff0c; 将uboot移植到他们自己的原厂开发板上&#xff0c;再将这个uboot&#xff08;原厂BSP 包&#xff09;发布出去。因此使用自已的开发…

U-Boot移植

一、U-Boot Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;芯片上电以后先运行一段bootloader程序。 bootloader程序会先初始化DDR等外设&#xff0c;然后将Linux内核从flash(NAND&#xff0c;NOR FLASH&#xff0c; SD&#xff0c; eMMC 等)拷贝到 DDR 中&…

uboot移植

一、我们知道uboot就是一个Bootloader。但是&#xff0c;arm不像我们的pc机一样&#xff0c;用一个老毛桃随便找一个网站下一个windows镜像就可以直接装了。 我们的uboot对应的就是老毛桃里面刷的引导程序。 虽然uboo支持很多架构很多不同的厂家的板子&#xff0c;但是UBOOT它…

【Linux】系统移植篇四--uboot移植

系统移植篇四--uboot移植 一、uboot源码结构1、uboot源码获取2、uboot特点3、uboot源码结构 二、uboot的配置与编译1、uboot配置2、uboot编译 前言&#xff1a;本篇主要介绍uboot的一些结构与相关配置&#xff0c;uboot是一款免费开源的芯片启动软件&#xff0c;代码完全开源&a…

uboot移植过程

uboot移植过程 IMX6ULL 文章目录 uboot移植过程 IMX6ULL 前言一、从原厂中移植uboot进行测试二、在U-Boot中添加自己的硬件1. 添加默认配置文件2. 添加对应的头文件3. 添加对应的板级文件夹3.1 修改Makefile文件3.2 修改 mx6ull_alientek 目录下的 imximage.cfg 文件3.3 修改 m…

MediaCodec对接到OMX的简单分析

一、引言&#xff1a; nuplayer播放器是使用MediaCodec来进行编解码的&#xff0c;而OMX组件则是MediaCodec的解码核心&#xff0c;但是因为涉及的面太过底层&#xff0c;往往是芯片公司才会涉及到这一块&#xff0c;所以就做一个简单分析&#xff0c;对通路有个大致了解就行。…

MediaCodec(native)状态机分析

一、引入&#xff1a; MediaCodec这条通路的调用逻辑是MediaCode->ACodec->OMX&#xff0c;因为OMX有自己的状态机&#xff0c;所以MediaCodec和ACodec也分别基于OMX组件的调用维护了其状态机&#xff0c;这篇博客就先分析MediaCodec的状态机是如何运转的。 二、MediaCo…

视频-MediaCodec

1.解析视频可以使用android 提供的api MediaPlayer,实现简单的播放暂停&#xff0c;提取视频中的一帧或者编辑视频&#xff0c;需要另一个api MediaCodec&#xff08;硬解&#xff0c;控制DSP芯片&#xff09;或者 ffmpeg(软解&#xff0c;耗时)&#xff0c;选择的优先级一定要…

MediaCodec解析MP4视频

MediaCodec讲解 MediaCodec是Android提供的用于对音视频进行编解码的类&#xff0c;它通过访问底层的codec来实现编解码的功能。是Android media基础框架的一部分&#xff0c;通常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTra…

Android视频编解码之MediaCodec简单入门

本篇只是简单入门&#xff0c;后面会继续写文章详细讲解&#xff1a; 由于MediaCodec涉及内容众多&#xff0c;原本想一篇文章把所有内容概括&#xff0c;但是后来发现不太可能&#xff0c;限于自己能力&#xff0c;想要考虑全面太难&#xff0c;我也是刚开始学习需要借助网上…

Android:MediaCodec基本原理

最近需要使用MediaCodec做一些工作&#xff0c;因此对MediaCodec做了些研究和代码编写&#xff0c;在此先对MediaCodec的一些基础原理、工作流程、常用API等做个初步总结&#xff0c;方便后续开发过程中查阅。 1.MediaCodec简介 1.1 MediaCodec来历 Android从最初的API 1.0版…

MediaCodec原理及使用

使用MediaCodec目的 MediaCodec是Android底层多媒体框架的一部分&#xff0c;通常与MediaExtractor、MediaMuxer、AudioTrack结合使用&#xff0c;可以编码H264、H265、AAC、3gp等常见的音视频格式 MediaCodec工作原理是处理输入数据以产生输出数据 MediaCodec工作流程 Medi…

Android MediaCodec

Android中可以使用MediaCodec来访问底层的媒体编解码器&#xff0c;可以对媒体进行编/解码。 MediaCodec可以处理的数据有以下三种类型&#xff1a;压缩数据、原始音频数据、原始视频数据。这三种类型的数据均可以利用ByteBuffers进行处理&#xff0c;但是对于原始视频数据应提…