当前位置: 首页 > news >正文

IMX6ULL-ALPHA开发板适配uboot2023.04:从官方EVK到自定义板卡的移植实战

1. 移植前的准备工作

在开始移植uboot之前,我们需要做好充分的准备工作。首先需要明确的是,移植uboot并不是一件简单的事情,特别是当我们选择较新的uboot版本时,可能会遇到各种兼容性问题。我最初尝试移植uboot官网的最新版本时,就遇到了LCD驱动无法正常工作的问题,最终不得不转向NXP官方提供的uboot版本。

开发环境配置如下:

  • 开发软件:VSCode配合SSH远程连接
  • 操作系统:Ubuntu 22.04 LTS
  • 交叉编译工具链:arm-none-linux-gnueabihf-gcc (版本10.3-2021.07)
  • uboot版本:NXP官方的uboot-imx-lf_v2023.04
  • 开发板硬件配置:
    • 核心板:EMMC 512MB版本
    • 底板:ALPHA V2.0

建议在开始前准备好以下材料:

  1. 正点原子ALPHA开发板的原理图
  2. NXP官方EVK开发板的原理图
  3. 开发板配套的Linux内核源码
  4. 串口调试工具
  5. SD卡和读卡器

2. 获取并准备uboot源码

移植的第一步是获取正确的uboot源码。我推荐使用NXP官方维护的uboot版本,而不是uboot官方的主线版本,因为NXP版本已经针对i.MX6ULL处理器做了专门的优化和适配。

获取源码的命令如下:

git clone https://github.com/nxp-imx/uboot-imx.git -b lf_v2023.04

下载完成后,解压源码并进入目录。我习惯使用VSCode进行代码编辑,因为它提供了很好的代码导航和搜索功能,对于uboot这样的大型项目非常有用。

在开始修改前,建议先编译一次原始代码,确保基础环境没有问题:

make mx6ull_14x14_evk_defconfig make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j20

如果编译成功,说明你的交叉编译工具链和环境配置是正确的,可以开始移植工作了。

3. 创建板级配置文件

移植的核心工作就是创建适合ALPHA开发板的配置文件。我们从最简单的配置文件开始:

  1. 复制EVK的默认配置文件:
cp configs/mx6ull_14x14_evk_emmc_defconfig configs/mx6ull_alpha_defconfig
  1. 修改关键配置项:
  • CONFIG_TARGET_MX6ULL_14X14_EVK=y改为CONFIG_TARGET_MX6ULL_ALPHA=y
  • CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk"改为CONFIG_DEFAULT_DEVICE_TREE="imx6ull-alpha"

这里需要注意,设备树名称的修改非常重要,它决定了uboot启动时加载哪个设备树文件。ALPHA开发板与EVK开发板在外设上有不少差异,我们需要通过设备树来正确描述这些差异。

4. 添加板级支持文件

接下来需要创建ALPHA开发板的板级支持文件。这个过程相对繁琐,但方法很直接:

  1. 复制EVK的板级目录:
cp -r board/freescale/mx6ullevk board/freescale/mx6ullalpha
  1. 重命名关键文件:
cd board/freescale/mx6ullalpha mv mx6ullevk.c mx6ullalpha.c
  1. 修改Kconfig文件: 需要将文件中所有的MX6ULLEVK替换为MX6ULLALPHA,确保编译系统能够识别我们的新板型。

  2. 修改MAINTAINERS文件: 更新维护者信息,虽然我们可以保留原来的维护者邮箱,但需要将文件名和路径都改为ALPHA相关的。

  3. 修改Makefile: 将obj-y := mx6ullevk.o改为obj-y := mx6ullalpha.o

这些修改看似简单,但需要非常仔细,任何一个小错误都可能导致编译失败或者运行时出现问题。建议每修改一个文件后都保存并检查是否有遗漏。

5. 修改板级初始化代码

mx6ullalpha.c文件是板级初始化的核心,需要仔细修改。主要修改点包括:

  1. 修改checkboard函数:
int checkboard(void) { puts("Board: MX6ULL ALPHA\n"); return 0; }
  1. 修改运行时配置:
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG env_set("board_name", "ALPHA"); env_set("board_rev", "14X14"); #endif
  1. 根据ALPHA开发板的实际硬件调整外设初始化代码,特别是GPIO、网络PHY和LCD相关的配置。

这部分修改需要参考ALPHA开发板的原理图,确保每个外设的引脚配置与硬件一致。例如,网络PHY的复位引脚、LCD的背光控制引脚等都可能与EVK开发板不同。

6. 添加板级头文件

头文件包含了很多重要的配置参数,我们需要为ALPHA开发板创建专用的头文件:

  1. 复制并重命名头文件:
cp include/configs/mx6ullevk.h include/configs/mx6ullalpha.h
  1. 修改关键定义:
  • __MX6ULLEVK_CONFIG_H改为__MX6ULLALPHA_CONFIG_H
  • 修改findfdtfindtee函数的实现,使其指向ALPHA开发板对应的设备树文件
  1. 根据ALPHA开发板的硬件特性调整以下参数:
  • 内存布局参数
  • 环境变量存储位置
  • 启动参数
  • 网络配置

特别要注意的是环境变量的存储位置,ALPHA开发板使用的EMMC可能与EVK开发板的分区布局不同,需要确保uboot能够正确读写环境变量。

7. 配置Kconfig系统

为了让我们的新板型能够出现在配置菜单中,需要修改Kconfig文件:

  1. arch/arm/mach-imx/mx6/Kconfig中添加:
config TARGET_MX6ULL_ALPHA bool "Support mx6ull_alpha" depends on MX6ULL select BOARD_LATE_INIT select DM select DM_THERMAL select IOMUX_LPSR select IMX_MODULE_FUSE select OF_SYSTEM_SETUP imply CMD_DM
  1. 添加板级Kconfig的引用:
source "board/freescale/mx6ullalpha/Kconfig"

这些修改确保了在运行make menuconfig时能够选择我们的ALPHA开发板配置,并且包含必要的驱动和功能支持。

8. 添加设备树文件

设备树是现代Linux系统硬件描述的核心,uboot也依赖设备树来描述硬件。我们需要为ALPHA开发板创建专用的设备树文件:

  1. 复制EVK的设备树文件:
cp arch/arm/dts/imx6ull-14x14-evk.dts arch/arm/dts/imx6ull-alpha.dts cp arch/arm/dts/imx6ul-14x14-evk.dtsi arch/arm/dts/imx6ull-alpha.dtsi cp arch/arm/dts/imx6ull-14x14-evk-u-boot.dtsi arch/arm/dts/imx6ull-alpha-u-boot.dtsi
  1. 修改主设备树文件:
  • 更新model和compatible属性
  • 根据ALPHA开发板的硬件调整外设配置
  • 添加或删除不用的外设节点
  1. 特别注意EMMC配置: ALPHA开发板使用的是8位总线宽度的EMMC,需要确保usdhc2节点配置正确:
&usdhc2 { pinctrl-names = "default", "state_100mhz", "state_200mhz"; pinctrl-0 = <&pinctrl_usdhc2_8bit>; pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>; pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>; bus-width = <8>; non-removable; status = "okay"; };

设备树的修改需要非常小心,特别是引脚复用配置,一个错误的配置可能导致外设无法工作甚至系统无法启动。建议每次修改后都对照原理图检查。

9. 网络驱动移植

ALPHA开发板使用的网络PHY与EVK开发板不同,需要进行相应的修改:

  1. 修改配置文件: 在mx6ull_alpha_defconfig中,将PHY驱动从Micrel改为SMSC:
# CONFIG_PHY_MICREL is not set # CONFIG_PHY_MICREL_KSZ8XXX is not set CONFIG_PHY_SMSC=y
  1. 修改设备树: 更新网络相关的节点,添加复位引脚配置:
&fec2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enet2 &pinctrl_enet2_reset>; phy-mode = "rmii"; phy-handle = <&ethphy1>; phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; phy-reset-duration = <200>; status = "okay"; };
  1. 添加复位引脚配置:
pinctrl_enet2_reset:enet2resetgrp { fsl,pins = < MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 >; };
  1. 修改PHY驱动: 在drivers/net/phy/phy.cgenphy_config_aneg函数中添加PHY复位代码:
int genphy_config_aneg(struct phy_device *phydev) { int result; phy_reset(phydev); // 添加的复位代码 ... }

完成这些修改后,网络功能应该可以正常工作。可以通过以下命令测试网络:

setenv eth1addr 32:34:46:78:9A:DD setenv serverip 192.168.8.2 setenv ipaddr 192.168.8.3 saveenv ping ${serverip}

10. LCD驱动移植

LCD驱动的移植相对复杂,需要根据具体的LCD屏幕参数进行配置:

  1. 修改设备树中的LCD配置:
&lcdif { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_lcdif_dat &pinctrl_lcdif_ctrl>; display = <&display0>; status = "okay"; display0: display@0 { bits-per-pixel = <24>; bus-width = <24>; display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <9200000>; hactive = <480>; vactive = <272>; hfront-porch = <8>; hback-porch = <4>; hsync-len = <41>; vback-porch = <2>; vfront-porch = <4>; vsync-len = <10>; hsync-active = <0>; vsync-active = <0>; de-active = <1>; pixelclk-active = <0>; }; }; }; };
  1. 根据实际LCD参数调整:
  • clock-frequency:像素时钟频率
  • hactive/vactive:分辨率
  • hfront-porch/hback-porch/hsync-len:水平同步参数
  • vfront-porch/vback-porch/vsync-len:垂直同步参数

这些参数需要严格遵循LCD手册中的时序要求,任何参数错误都可能导致显示异常。正点原子的开发板配套资料中通常会提供这些参数。

11. 解决常见问题

在移植过程中,可能会遇到各种问题,以下是一些常见问题及解决方法:

  1. uboot启动时显示信息不全: 这是uboot的一个已知问题,可以通过reset命令重启uboot来显示完整信息。

  2. 内核启动失败: 可能是设备树配置问题,尝试删除OF_SYSTEM_SETUP选项:

config TARGET_MX6ULL_ALPHA ... # select OF_SYSTEM_SETUP # 注释掉这行 ...
  1. 校验码错误: 修改board/freescale/mx6ullalpha/imximage.cfg文件中的校验参数:
DATA 4 0x021B083C 0x01380138 DATA 4 0x021B0848 0x40402E32 DATA 4 0x021B0850 0x40403432
  1. 编译错误:
  • 确保所有文件重命名和路径修改都正确
  • 检查Kconfig和Makefile中的拼写错误
  • 清理工程后重新编译:make distclean

12. 编译与测试

完成所有修改后,可以创建一个编译脚本简化编译过程:

#!/bin/bash make distclean make mx6ull_alpha_defconfig make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j20

给脚本添加执行权限:

chmod +x mkuboot.sh

运行脚本编译uboot:

./mkuboot.sh

编译成功后,会生成以下重要文件:

  • u-boot.bin:原始的uboot二进制文件
  • u-boot-dtb.bin:包含设备树的uboot二进制文件
  • u-boot.imx:添加了NXP特定头部的uboot镜像

将生成的u-boot.imx烧写到SD卡或EMMC中,上电测试。如果一切正常,你应该能看到uboot启动日志,并且能够通过串口与uboot交互。

13. 优化与调试

uboot移植完成后,还可以进行一些优化工作:

  1. 优化启动速度:
  • 减少不必要的驱动初始化
  • 调整环境变量
  • 优化bootcmd
  1. 添加自定义命令: 可以在uboot中添加一些方便调试的自定义命令,比如读取传感器数据、控制GPIO等。

  2. 调试技巧:

  • 使用bdinfo命令查看板级信息
  • 使用mdmm命令查看和修改内存
  • 使用dm tree命令查看设备模型

移植过程中,串口调试是最重要的手段。建议在关键初始化函数中添加调试打印,帮助定位问题。

14. 总结与经验分享

uboot移植是一个需要耐心和细致的工作。通过这次IMX6ULL-ALPHA开发板的uboot移植,我总结了以下几点经验:

  1. 版本选择很重要: 不要盲目追求最新版本的uboot,稳定性和兼容性更重要。NXP官方维护的uboot版本通常比uboot官方主线版本更适合i.MX系列处理器。

  2. 方法比细节重要: uboot移植有一套固定的模式和方法,掌握这些方法比记住每个配置细节更重要。核心思路就是"替换与适配"——找到参考板的配置,然后逐步修改适配到目标板。

  3. 调试是成功的关键: 遇到问题时,要学会使用uboot提供的调试工具和命令。有时候一个小小的环境变量设置错误就可能导致系统无法启动。

  4. 文档和社区是宝贵资源: uboot的官方文档、NXP的参考手册以及各种技术社区都是解决问题的好去处。很多问题可能已经有现成的解决方案。

  5. 保持代码整洁: 在修改uboot代码时,保持代码的整洁和可读性。添加适当的注释,方便日后维护和升级。

移植完成后,建议保存好所有的修改,最好能够打上标签或者创建分支,方便后续维护和升级。同时,记录下移植过程中遇到的问题和解决方法,形成文档,这对以后的工作会有很大帮助。

http://www.jsqmd.com/news/843194/

相关文章:

  • 微博相册批量下载神器:3分钟学会免费获取高清图片的终极指南
  • AUTOSAR CAN驱动Mailbox配置实战:从Full/Basic CAN到FIFO深度详解
  • 时间序列分类新范式:从ROCKET到MINI ROCKET的演进与实践
  • 蚂蚁百灵 Ring-2.6-1T 开源解析:万亿级思考模型如何实现「按需推理」
  • 【NotebookLM研究问题生成避坑白皮书】:从0到1构建可复现、可评估、可审计的问题生成工作流
  • 泡沫箱码垛(易碎),伯朗特机器人宽幅吸盘+低真空,吸气泡沫箱无压痕
  • 2026年|10款亲测降ai率工具,论文AI率从80%降到10%,内含AIGC免费降重 - 降AI实验室
  • 零代码构建你的AI知识库:让Obsidian笔记开口说话
  • AutoHotKey进阶:文件与路径自动化操作实战
  • Hyper-V装完就完事了?新手必看的Windows 11虚拟机网络与存储配置避坑指南
  • 通过用量看板与账单追溯实现团队 AI 成本精细化管理
  • Cadence变种BOM实战:以IMU模块为例,打造多配置硬件设计流程
  • 【NotebookLM知识图谱构建权威白皮书】:基于127个企业POC验证的4层语义对齐框架
  • TB5128HG步进电机驱动芯片评估板深度拆解与实测指南
  • 从谐波治理到能量回馈:深入聊聊LCL滤波器在光伏逆变器和PWM整流器里的那些关键设计
  • ARMv9内存拷贝指令优化与性能提升解析
  • 别再只会用阿里云加速了!手把手教你配置Docker daemon.json,优化日志与存储路径
  • 四大路径!CS保研生冲刺南京大学如何精准定位?
  • SmartDock:让Android设备拥有桌面级生产力的智能启动器
  • 从零到一:在RK3568开发板上实战NVMe硬盘的完整存储栈配置
  • 别再折腾讯飞百度了!Android自带TTS引擎搞定中文语音合成(附Pico TTS替代方案)
  • NotebookLM来源追溯功能深度拆解:基于LLM-verified citation graph的5层证据锚定架构(含架构图源码)
  • 别光看代码!聊聊51单片机做计算器时,那些新手容易踩的坑(键盘消抖、变量溢出、显示刷新)
  • 避坑指南:海康GB28181接入SRS服务器时,防火墙和云安全组必须放行的这8个端口(含TCP/UDP)
  • 用ESP32做个蓝牙MIDI键盘,手把手教你连接手机库乐队弹奏(附完整代码)
  • C语言宿舍管理系统:数据结构与文件操作实战指南
  • 从零到一:FOFA搜索引擎实战语法精解与场景化应用
  • 实测60W激光雕刻PCB:Altium Designer文件直出,显微镜下看边缘毛刺有多严重?
  • DW PCIe Linux驱动初始化流程与ATU配置详解
  • 【Dify】CentOS 7 and 8 部署Dify