uboot移植裁剪原理和流程

news2024/10/7 2:25:17

一、Uboot的裁剪是裁剪什么?

Uboot的裁剪分为两个方面:Uboot本身命令的裁剪具体SoC硬件配置的裁剪
1、Uboot本身命令的裁剪
  Uboot提供了很多的操作命令,我们使用Uboot的时候通常只使用最常用的一些命令,其他很多的命令有时候用不上,这个时候我们可以在SoC的头文件中进行Uboot命令的使能或者禁止,这个文件的路径为:uboot/include/configs/xxx_.h
  Uboot命令本身的宏定义其中都包含了CMD字段,如果需要该命令就宏定义出来,如果不需要,希望禁用该命令,直接注释掉即可。
通常如果希望编译出来的Uboot的大小尽量小的话,可以只使能必要的命令,不需要的命令全部注释掉,这样在编译的时候这些不需要的命令的代码文件不会被编译进最后的Uboot文件中,可以减小最后的Uboot.bin的大小。

2、Uboot中关于SoC硬件信息的裁剪
  SoC厂商发布的Uboot是完美适配官方的评估板的,我们自己的板子上的硬件配置和官方的评估板是不同的,因此需要根据自己板子上的硬件信息来裁剪官方提供的Uboot。对SoC硬件信息进行配置同样是在uboot/include/configs/xxx.h文件中进行的。
  硬件的使能和禁用也是在该文件中通过宏进行配置的,我们在Boot阶段往往只需要使能必要的硬件(比如串口,网口,FLASH,LCD屏幕等),其余的硬件可以等待启动内核以后再启动。
一般 uboot 中需要解决串口、NAND、EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核

宏定义是如何控制硬件的使能和禁用?
以串口的宏:#define CONFIG_MXC_UART为例
(1)在.h文件中定义了这个宏以后,我们使用命令make xxx_defconfig 对 uboot进行配置以后,在Uboot的顶层目录下生成的.config文件中会出现这样一句:CONFIG_MXC_UART=y
(2)使用make命令,顶层的make命令会调用各个子目录下的Makefile文件,在串口的目录下的Makefile文件(路径uboot/driver/serial/Makefile)中有这么一句:obj-$(CONFIG_MXC_UART)+=serial_mxc.o
  由于在第一句中.config中这个宏=y,所以Makefile的目标obj-y会追加这个串口驱动的目标文件,这个目标文件就是由串口的去文件serial_mxc.c文件编译链接生成的。
(3)经过上述的过程,串口的驱动程序就被添加到了最后的uboot.bin文件中,也就是使能了该硬件。

二、uboot裁剪前准备

源码/工具:
(1)对应板卡的uboot源码
(2)uboot交叉编译工具
(3)uboot编译说明文档
(4)uboot镜像烧录文档

三、uboot裁剪

1、添加自己开发板默认配置文件
  在使用Uboot之前首先要配置Uboot先配置,再make,那么这里就需要一个配置文件。
官方提供的uboot的配置文件是基于其评估板的,所以我们要根据自己的开发板创建我们自己的配置文件
  这个配置文件的目录是uboot/configs,文件夹中有非常多的配置文件,我们在其中创建自己的配置文件xxx_defconfig。这个配置文件不需要我们从头开始写,通常都是直接复制官方评估板的配置文件,然后根据我们自己的需求进行配置。
(1)在 configs 目录下创建默认配置文件my_board_defconfig,并修改里的内容

cd configs
cp mx6ull_14x14_evk_emmc_defconfig my_board_defconfig

修改my_board_defconfig后如下:

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/my_board_test/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MY_BOARD_TEST=y
CONFIG_CMD_GPIO=y

2、添加自己开发板的头文件——xxx.h文件
  Uboot的裁剪移植基本都是在这个头文件中进行的,开发板头文件的目录是uboot/include/configs下。同样,这个头文件也不需要我们从头写,也是复制官方评估板的配置文件,然后根据我们自己的开发板进行修改,具体修改什么,就是Uboot本身的命令使能和禁止以及硬件的使能与禁止。如果我们自己要想使能或者禁止 uboot 的某些功能,那就在my_board_test.h 里面做修改即可
(1)在目录 include/configs 下,复制官方头文件并重命名为自己的板卡。

#ifndef __MY_BOARD_TEST_CONFIG_H
#define __MY_BOARD_TEST_CONFIG_H

3、添加自己开发板的板级文件夹
  在uboot/board目录下有非常多的SoC厂商的文件夹,每个文件夹下又包含了该厂商发布的各种SoC的文件夹,也就是说每种SoC都配有自己的一个文件夹。 我们使用IMX6ULL这款SoC,我们就在uboot/board/freescale目录下创建我们自己板子的文件夹。同样,这个文件夹也是复制官方开发板的文件夹,这个文件夹中有一些文件,其中最重要的两个文件就是Makefile文件和板子的.c文件,Makefile文件控制着.c文件的编译
以imx6ull移植为例,具体步骤:
(1)进入官方板级文件夹目录,复制对应芯片的板级文件夹,并重命名自己板子。

cd board/freescale/
cp mx6ullevk/ -r my_board_test
cd my_board_test
mv mx6ullevk.c my_board_test.c

(2)修改自己板子目录下的下 Makefile 文件
(3)修改自己板子目录下的 imximage.cfg 文件
将 imximage.cfg 中的下面一句:

PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000

改为自己板子目录:

PLUGIN board/freescale/my_board_test/plugin.bin 0x00907000

(4)修改自己板子目录下的 Kconfig 文件(图形化配置)

if TARGET_MY_BOARD_TEST
config SYS_BOARD
    default "my_board_test"
config SYS_VENDOR
    default "freescale"
config SYS_SOC
    default "mx6"
config SYS_CONFIG_NAME
    default "my_board_test"
endif

(5)修改自己板子目录下的 MAINTAINERS 维护文件

(6)修改驱动程序
  一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的
  这时候Linux内核还没有加载,此时运行的就是裸机程序,所以硬件的引脚相关信息都是写在c文件中的,所以我们按照自己的硬件信息来修改(重点就是在.c文件中修改相关外设的引脚信息,引脚的复用属性和电气属性)。一般需要修改的就是LCD的参数信息,网卡的引脚配置等。因为LCD的引脚和官方评估板的LCD引脚一般都设计为相同的,所以LCD通常只需要修改LCD的参数信息。而网卡我们自己设计的板子和官方的评估板的引脚可能不同,所以需要修改引脚的信息,然后是引脚的复用状态和电气状态,一般网卡厂商都提供了网卡的驱动程序,只需要在板子的.h文件中使能该厂商的网卡驱动即可,有时候也需要修改厂商的驱动程序,修改驱动程序就是像操作单片机的寄存器这样配置该外设。
(7)make xxx_defconfig ——>make ,得到最终的uboot.bin文件。
  使用shell脚本编译:

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- my_board_test_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

其他知识补充

1、源代码和函数申明处添加上宏定义:

#ifdef CONFIG_XXX
添加代码
#endif

注意:当使用到CONFIG_XXX的代码,需要包含头文件#include common.h>,这个头文件最后会包含CONFIG_XXX的文件。
例如:
在这里插入图片描述
在这里插入图片描述

2、配置宏定义
  代码中加入了条件编译后,就可以使用CONFIG_XXX来控制目标代码是否编译。
实现这个功能,需要做两件事情。
第一:添加编译条件,在配置文件中,添加/删除你的条件编译的条件
(1)直接在xxx_defconfig手动添加
(2)通过make menuconfig添加
直接在xxx_defconfig手动添加:
在configs/xxx_defconfig目录下添加:

CONFIG_MY_TEST = y

在编译u-boot的时候,会使用make xxx_defconfig,所以可以在这个文件中加入你的条件编译的条件。

通过make menuconfig添加
上述方式较为简单粗暴,在配置项少的情况下可以使用,但是配置项目多的话,层次就比较模糊,显得比较混乱。这里u-boot提供一种图形化配置的方式,make menuconfig,来管理众多的配置选项。

这个操作依赖于相应目录下的Kconfig文件,需要在Kconfig文件里面添加自己的配置项:
修改目标代码所在层级的Kconfig文件,如下图:

config MY_TEST
    bool "my_test"
    default y
    help 
        This is a zhouzhou_test_code help info 

修改Makefile
在目标代码所在层级的Makefile文件中,加入如下代码:

#obj-y += my_test.o
obj -$(CONFIG_MY_TEST) += my_test.o

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/767816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Azido cyclic(RGDyK)整合素靶向环肽c(RGDyK),试剂有哪些特点?

资料编撰来源:陕西新研博美生物科技有限公司小编MISSwu Azido cyclic(RGDyK)环肽 PART1-----Product structure PART2------Product specifications 1.CAS No:N/A 2.Molecular formula:C35H46N12O9.CF3COOH 3.Molecul…

06-C++ 基本算法 - 二分法

📖 前言 在这个笔记中,我们将介绍二分法这种基本的算法思想,以及它在 C 中的应用。我们将从一个小游戏猜数字开始,通过这个案例来引出二分法的概念。然后我们将详细讲解什么是二分法以及它的套路和应用。最后,我们还会…

基于VUE的音乐qq网站设计与实现(Java+spring boot+MySQL+VUE)

获取源码或者论文请私信博主 演示视频: 基于VUE的音乐qq网站设计与实现(Javaspring bootMySQLVUE) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java springboot框架 my…

基于RASC的keil电子时钟制作(瑞萨RA)(2)----配置keil以及使用串口进行打印

基于RASC的keil电子时钟制作_配置keil以及使用串口进行打印 概述参考文档硬件准备视频教程新建工程保存工程路径芯片配置工程模板选择时钟设置管脚配置UART配置UART属性配置DEBUG配置printf()函数设置e2studio堆栈生成工程设置RA Smart Configurator到Keilkeil配置Ddbug设置R_S…

SpringSecurity(6.1.x版本) 认证,授权,自定义登录,内部机制探讨

SpringSecurity 文章目录 SpringSecurityCSRF跨站请求伪造攻击SFA会话固定攻击XSS跨站脚本攻击开发环境搭建认证直接认证使用数据库认证自定义验证 其他配置自定义登录界面记住我功能 授权基于角色授权基于权限授权使用注解权限判断 内部机制探究授权校验流程安全上下文安全上下…

嵌入式必学~黑马新教程发布,你准备好了吗

科技的不断发展,给计算机行业带来了很多机会,嵌入式开发的前景也越来越广阔,过去的嵌入式是:电器、机械、交通设备。现在的嵌入式是:手机、智能家居、物联网、新能源、新基建、芯片...... 随着国家政策的倾斜&#xf…

配置uprof环境

AMD uprof 1/从AMD μProf | AMD处下载两个文档 2/解压 tar jxvf filename 3/将.rpm转换成deb Ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb。 sudo apt-get install alien #alien默认没有安装,所以首先要安…

2023-07-10 linux IIO子系统使用学习,在TI 的ads1015驱动里面看到相关使用,故花点时间进行简单的学习,入门级别,纪录点滴。

一、Linux IIO(Industrial I/O)架构是Linux内核提供的一种用于支持各种类型传感器和数据采集设备的子系统,包括温度、压力、湿度、加速度、光度等多种传感器。 二、这个就是ads1015的驱动,里面用到iio子系统。 ti-ads1015.c adc…

数据脱敏的 3 种常见方案,好用到爆!

1.SQL数据脱敏实现 MYSQL(电话号码,身份证)数据脱敏的实现 -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用,请看下面具体实现-- CONCAT(str1,str2,…):返回结果为连接参数产生的字符串 -- LEFT(str,len):返回从字符串str 开始的len 最左字…

力扣 -- 123. 买卖股票的最佳时机 III

题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码: class Solution { public:int maxProfit(vect…

OKCC呼叫中心的坐席监控功能有什么

最近很多客户都在跟我谈他们企业的电话客服工作量都非常大,虽然客服人员在服务时应该态度谦和,但是遇到难缠的客户,客服人员总有脾气忍不住的时候,言语上会带有情绪,这些客服人员会因为服务水平欠佳让客户不满意从而产…

【Python】json 格式转换 ( json 模块使用 | 列表转 json | json 转列表 | 字典转 json | json 转字典 )

文章目录 一、json 格式转换1、json 模块使用2、代码示例分析 - 列表转 json3、代码示例分析 - 字典转 json json 格式 字符串 与 Python 中的 字典 dict 和 列表 list 变量 可以无缝转换 ; 调用 json.dumps 函数 可以将 Python 列表 / 字典 转为 json ;调用 json.loads 函数 …

基于Vue + 数据组装 + axios请求接口 实现图书信息提交功能实战

前言 上节回顾 上一节针对图书信息录入前的准备做了讲解,主要是使用ElementUI的el-form做录入界面基本布局,包含了el-input el-select el-date-picker 还有图片上传等组件。同时在布局完成后,配合使用el-form自带的rules进行数据提交前验证…

生鲜小程序怎么做

生鲜超市小程序功能介绍 1、产品展示:果蔬生鲜的图片展示,食欲满满的食材图,丰富的生鲜品类,细致的产品描述,提高用户的购买欲望和复购率。 2、在线支付:用户选择好所需食材在线下单,利用第三…

[Linux] 守护进程介绍、服务器的部署、日志文件...

守护进程 我们使用的系统中, 一般以服务器的方式工作 对外提供服务的服务器, 都是以守护进程的方式在系统中工作的. 比如, 我们使用Linux服务器时, 大多都会使用一些终端软件通过ssh远程连接服务器使用. 这就是因为, Linux服务器中 通常默认运行着 ssh服务器的守护进程: 守护…

利用数据分析告警机制,实现鸿鹄与飞书双向集成

需求描述 实现鸿鹄与飞书的双向集成,依赖鸿鹄的告警机制,可以发送用户关心的信息到飞书。同时依赖飞书强大的卡片消息功能,在飞书消息里面能够通过链接(如下图)返回到鸿鹄以方便用户进一步排查和分析问题。 解决方案 1…

Goby 漏洞发布|致远 M1 移动端 userTokenService 代码执行漏洞

漏洞名称:致远 M1 移动端 userTokenService 代码执行漏洞 English Name:seeyon M1 Server userTokenService Code Execution Vulnerability CVSS core: 10.0 影响资产数:7050 漏洞描述: 致远 M1 Server是一个移动服务。致远 …

7zip修复右击菜单的问题

以管理员权限运行7-Zip File Manager后 ,要在右键菜单显示 图标,不然就有问题

苍穹外卖day03——菜品管理业务代码开发

目录 公共字段自动填充——问题分析和实现思路 公共字段自动填充——代码实现(1) 公共字段自动填充——代码实现完善(2) 新增菜品——需求分析与设计 产品原型 ​编辑 接口设计 ​编辑 数据库设计 新增菜品——代码开发1(文件上传接口) 配置文件 Controller层代码 前后…

项目名称:智能家居边缘网关项目

一,项目介绍 软件环境: C语言 硬件环境: STM32G030C8TX单片机开发板 开发工具: Linux平台GCC交叉编译环境以及ukeil (1)边缘网关概念 边缘网关是部署在网络边缘侧的网关,通过网络联接、协议转换等功能联接物理和数字世界,提供轻量化的联接管…