分享

手把手教你移植U-boot系列(4)-U-boot移植方法

 新用户0118F7lQ 2023-08-11 发布于山东

1.概述

本文主要讲述了U-boot的移植方法。

U-boot版本:2022.10;硬件平台架构:ARMv8;操作系统:Linux。

2.移植思路

本文的目标是将U-boot移植到ARMv8架构硬件平台,支持引导Linux内核启动。

移植的主要工作包括编译配置、添加硬件平台、添加开发板、添加串口驱动等。

3.移植方法

3.1编译配置

在源码的configs目录下有众多defconfig文件,这些文件是板级的默认配置文件。移植的首要工作就是根据开发板硬件配置编写默认配置文件,以开发板esdev1_evb1为例,将其默认配置文件命名为esdev1_evb1_defconfig。

esdev1_evb1_defconfig的设计方法为基于硬件配置相近平台的defconfig文件,然后通过menuconfig界面修改配置。图示的Target选择了ESDev SoCs系列芯片,开发板选择了ESDEV ESDEV1 EVB1,这些就是我们将要移植的内容。

         图片

添加引导Linux内核启动命令booti和bootz,配置界面如下。

图片

3.2添加硬件平台

硬件平台目录在arch/arm下,增加arch/arm/mach-esdev目录,esdev是添加的硬件平台名称。mach-esdev目录下添加具体芯片目录esdev1、Kconfig和Makefile。

芯片目录esdev1用于支持esdev1芯片,包括esdev1芯片使用的公共代码。esdev1目录下包含esdev1.c、Kconfig、Makefile 和u-boot.lds。

esdev1.c一般包括如下内容:

(1)存储器映射结构体指针struct mm_region *mem_map定义,arch/arm/cpu/armv8/cache_v8.c会使用mem_map结构体指针。

(2)reset_cpu函数实现。该函数被arch/arm/lib/reset.c调用。

(3)arch_cpu_init函数实现,用于完成CPU初始化相关工作,比如配置ARMv8 CPU的Generic timer。该函数被common/board_f.c的board_init_f函数调用。

u-boot.lds是链接器脚本文件,基于arch/arm/cpu/armv8/u-boot.lds编写。链接器脚本文件的路径配置界面如下。

图片

3.3添加开发板

开发板是我们进行U-boot移植的具体对象。对于esdev1芯片,可以有多个开发板相对应。如下图所示,有EVB1和EVB2两个开发板。

图片

其中,EVB1开发板对应的板级目录为board/esdev/esdev1_evb1。

添加开发板主要有3方面工作,包括添加板级源文件、添加板级头文件和添加板级设备树。

(1)添加板级源文件

添加板级源文件esdev1_evb1.c到board/esdev/esdev1_evb1目录下,完成板级初始化工作,比如DRAM初始化、芯片管脚复用配置、外设配置等。

(2)添加板级头文件

添加板级头文件esdev1_evb1.h到include/configs目录,用于对芯片及板级进行配置,比如GIC控制器、DRAM、串口、定时器、MMC、BOOTCOMMAND以及环境变量等。

(3)添加板级设备树

添加板级设备树esdev1-evb1.dts到arch/arm/dts目录。

3.4添加串口驱动

串口驱动是串口控制台工作的必备基础。串口驱动的加载由common/board_r.c的board_init_r函数调用serial_initialize函数完成。

根据芯片使用的UART IP对驱动进行配置。配置界面示例如下。

图片

4.功能验证

U-boot的启动log示例如下。

图片

支持的命令示例如下。

图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多