u-boot详解

这篇具有很好参考价值的文章主要介绍了u-boot详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

1、uboot是一个裸机程序,比较复杂。我们需要先将其编译生成bin文件,然后添加头文件,然后将其烧写进去,最后通过他来启动Linux。
2、uboot就是一个bootloader(启动加载器),作用就是用于启动Linux或其他系统和初始化DDR。

  • uboot首先初始化ddr,然后将Linux镜像zImage(uImage)+设备树(.dtb)搬运到DDR中,然后启动起来。启动起来以后他就寿终正寝了,把CPU的使用权交给Linux系统。
  • 因为Linux是运行在DDR里面的。一般Linux镜像zImage(uImage)+设备树(.dtb)存放在SD、EMMC、NAND、SPI FLASH等等外置存储区域。

3、注意:

  • Uboot不仅仅能启动Linux,也可以启动其他系统,比如vxworks。他不是为某一个芯片而准备的,他是一个通用的BootLoader,他支持多种架构。使用前要给他配置好,然后编译,一般一个板子一个。
  • Linux不仅仅能通过uboot启动。不过基本上全部都是用uboot。
  • Uboot的主要目的就是为系统的启动做准备。

Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核,bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样,bootloader 就相当于 BIOS。所以我们要先搞定bootloader,很庆幸,有很多现成的 bootloader 软件可以使用,比如 U-Boot、vivi、RedBoot 等等,其中以 U-Boot 使用最为广泛,为了方便书写,本书会将 U-Boot 写为 uboot。

获取

Uboot获取:

  • 首先就是uboot官网。缺点就是支持少,比如某一款具体芯片驱动等不完善。uboot官网下载地址
  • SOC厂商会从uboot官网下载某一个版本的uboot,然后在这个版本的uboot上加入相应的SOC以及驱动。这就是SOC厂商定制版的uboot。NXP官方的I.MX6ULL EVK板子,
  • 做开发板的厂商,开发板会参考SOC厂商的板子。开发板必然会和官方的板子不一样。因此开发板厂商又会去修改SOC厂商做好的uboot,以适应自己的板子。

配置uboot (nxp的)

首先解压nxp的压缩包 ,然后配置,好了再编译。uboot 可以通过 mx6ull_alientek_emmc_defconfig 来配置,或者通过文件 mx6ull_alientek_emmc.h 来配置 uboot(其中有几节视频,专门用来讲解这个,配置也是在这个文件中进行配置的还有一个mx6ull_alientek_emmc.c,驱动啥的 我们需要修改的 都是在这两个文件中的)。还有另外一种配置 uboot 的方法,就是图形化配置。

常规配置

就是改mx6ull_alientek_emmc.h 和mx6ull_alientek_emmc.c这两个文件,用到的时候再好好研究下把。
应该需要改的就是emmc也就是需要从其中读取镜像,还有网络,因为需要从网络中驱动。还有一个LCD驱动更改,因为需要用到屏幕。

1、起因:直接使用NXP 官方 I.MX6ULL EVK 开发板的 uboot 在正点原子 EMMC 版本 I.MX6ULL 开发板上的运行,会出现如下问题

  • uboot 启动正常,DRAM 识别正确,SD 卡和 EMMC 驱动正常。
  • uboot 里面的 LCD 驱动默认是给 4.3 寸 480x272 分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。网络不能工作,识别不出来网络信息,需要修改驱动。
  • 因此需要解决 LCD 驱动和网络驱动的问题。

2、具体工作

  • 直接看手册,写的很详细

  • 第一步修改,下面这个,应该就是让他编译我们的开发板的头文件和.c文件,我觉得如果直接在nxp提供的官方板上进行驱动的修改,那么就不用改下面这个文件。

      mx6ull_14x14_evk_emmc_defconfig
    
  • 添加开发板对应的头文件

      复制include/configs/mx6ullevk.h,并重命名为 mx6ull_alientek_emmc.h
    
  • 添加开发板对应的板级文件夹, 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c。还要修改很多配置,让编译这个板级文件夹。

3、LCD驱动

  • 硬件连接都是一样的,也就是io不需要更改
  • 更改一些配置参数就好了。

4、网络

  • 太多了直接看文档或者视频

  • 好了以后在uboot使用网络之前,先设置几个环境变量,设置好环境变量以后就可以在 uboot 中使用网络了

      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 //保存环境变量
    

bootcmd 和 bootargs 环境变量

mx6ull_alientek_emmc.h 中的宏CONFIG_EXTRA_ENV_SETTINGS 保存着这些环境变量的默认值

1、环境变量 bootcmd

  • bootcmd 保存着 uboot 默认命令,uboot 倒计时结束以后就会执行 bootcmd 中的命令。这些命令一般都是用来启动 Linux 内核的,比如读取 EMMC 或 者 NAND Flash 中的 Linux 内核镜像文件和设备树文件到 DRAM 中,然后启动 Linux 内核。

  • 里面的内容浓缩出来就是以下四句

      mmc dev 1 //切换到 EMMC
      fatload mmc 1:1 0x80800000 zImage //读取 zImage 到 0x80800000 处
      fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //读取设备树到 0x83000000 处
      bootz 0x80800000 - 0x83000000 //启动 Linux
    
  • 要修改的话,可以在文件中,修改CONFIG_BOOTCOMMAND

      #define CONFIG_BOOTCOMMAND \
      "mmc dev 1;" \
      "fatload mmc 1:1 0x80800000 zImage;" \
      "fatload mmc 1:1 0x83000000 imx6ull-alientek-emmc.dtb;" \
      "bootz 0x80800000 - 0x83000000;"
    
  • 或者直接在 uboot 中设置 bootcmd 的值,这个值就是保存到 EMMC 中的

setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ullalientek-emmc.dtb; bootz 80800000 - 83000000;'

2、环境变量 bootargs

  • bootargs 保存着 uboot 传递给 Linux 内核的参数,bootargs 环境变量是由 mmcargs 设置的
  • 比如设置波特率啊,linux终端是什么设备,是串口还是LCD屏,根文件系统位置类型啥的。
  • 可以直接看文档或者视频,具体用到再说。

图形化界面配置

视频讲解
uboot中用的不多,但Linux内核配置 用的比较多(linux自己的图形化配置,不是这个),他们的原理都是一样的,uboot比较简单,因为需要配置的东西比较少。
1、简介

  • menuconfig 重点会用到两个文件:.config 和 Kconfig,.config 文件前面已经说了,这个文
    件保存着 uboot 的配置项,使用 menuconfig 配置完 uboot 以后肯定要更新.config 文件。Kconfig文件是图形界面的描述文件,也就是描述界面应该有什么内容,很多目录下都会有 Kconfig 文件。
  • 使用make menuconfig进入图形化配置,配置好了,会将配置好的东西存放在.config文件(是编译mx6ull_ni_emmc_defconfig生成的)中。但是如果这个时候你运行了.sh那么这个.config就会被清除。那么我们配置好的就不复存在了(所以一定要注意保存下,不然一不小心被clean了)
  • 我直接在.config里面改 然后make,再打开一看还是原来的样子,改的没有起效果。有两种情况,见下图

u-boot,linux,linux,网络,单片机
u-boot,linux,linux,网络,单片机
2、使用方式(注意,新电脑需要安装ncurses库,具体详细安装过程可以看手册)

  • 进入到uboot的源码根目录下。

  • 首先默认配置一遍,执行一次就好了 除非清空了一遍

      make mx6ull_alientek_emmc_defconfig		//默认配置 
      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_defconfig//也就是这个
    
  • 输入make menuconfig。打开图形化配置界面。

  • 可以开启DNS啥的

  • 当我们配置好了,保存一下,相当于把.config文件给你重新copy了一份。下次用的时候通过图形化配置界面重新加载,然后生成

编译

参考,讲的很详细
1、编译
找到解压路径输入指令编译

(1)通过shell脚本编译(也可以一句一句的输 一共三句)

vi mx6ull_alientek_emmc.sh//创建shell脚本
  • 第一句: 第一个是 ARCH ,也就是指定目标板的架构(arm、x86啥的都支持) ,这里肯定是 arm ;第二个参数 CROSS_COMPILE(也是顶层makefile里的一个变量) 用于指定编译器 ,只需要指明编译器前缀就行了,比如 arm-linuxgnueabihf-gcc 编译器的前缀就是**“arm-linux-gnueabihf-”** ;最后一个参数 distclean 就是清理工程 。注意 如果前面通过图形化界面配置了uboot的话,就会清除配置项,但如果是通过修改源码来配置的话就不用担心,是没关系的。
  • 第二句: mx6ull_14x14_evk_emmc_defconfig : 是一个配置文件,由恩智浦官方提供(在路径uboot/configs)(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 这两个配置文件就行了。)执行完成就会生成一个.config文件(默认的配置项都会写入到这个.config文件中,一会编译就要用到这个配置文件)
  • 第三句: 这句就是编译,其实就是一句make就行了。其中 V=1 用于设置编译过程的信息输出 级别;-j 用于设置主机使用多少线程编译uboot ,最好设置成我们虚拟机所设置的核心数,如果在 VMware 里面给虚拟就分配了 4 个核,那么使用-j4 是最合适的,这样 4 个核都会一起编译。编译完成会生成一个u-boot.bin文件
  • 这里的乘号就是字母x
 #!/bin/bash
  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_defconfig
  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- V=1 -j4

使用shell脚本第一行必须这样写: #!/bin/bash

chmod 777 mx6ull_alientek_emmc.sh//给脚本可以执行的权限,此时这个文件就会变绿色 也就是可以执行的样子
./mx6ull_alientek_emmc.sh//执行shell脚本

(2)为了方便开发,可以直接在uboot的顶层makefile中将变量定死,这样就可以直接输命令

vi makefile//然后找到图片所在位置进行代码的添加
  • make distclean
  • make mx6ull_14x14_evk_defconfig
  • make V=1 -j4
    u-boot,linux,linux,网络,单片机

烧写

使用OTG烧写

编译完成以后,生成u-boot.bin文件,还需要向其添加头部信息然后再烧录进去。uboot会自动使用其自带的/tools/mkimage软件添加头部信息,生成u-boot.imx。
视频教程
u-boot,linux,linux,网络,单片机
第三期最后一部分就是专门讲解这一块烧写的。

SD烧写

将uboot烧写到SD卡里面,然后通过sd卡启动。以后带有调试性质的开发,uboot都是烧写到sd卡里面,因为方便烧写。
因为正点原子关键部件和nxp的板子一样的,所以直接用也没问题,就有些地方有些改变,所以需要后面的配置(一个开发板也好运行uboot,DDR或者叫DRAM,串口,SD、EMMC、NAND。板子能工作。)

烧写,然后通过sd卡启动就可以运行uboot了

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

3、测试结果

  • uboot能正常启动
  • LCD驱动要根据所使用的屏幕修改。
  • NET初始化失败。
    u-boot,linux,linux,网络,单片机
    u-boot,linux,linux,网络,单片机
    sd卡正常
    u-boot,linux,linux,网络,单片机
    emmc正常
    u-boot,linux,linux,网络,单片机

uboot命令

视频详解
u-boot,linux,linux,网络,单片机
1、help:查看帮助信息

  • 查看某一个命令帮助信息,?命令名

2、printenv:信息查询

  • 查看当前板子的环境变量。

3、setenv:设置环境变量,也可以自定义环境变量,也可以删除环境变量(设置为空值,也就是没有值,就是删除)
4、saveenv命令:保存环境变量。
u-boot,linux,linux,网络,单片机
u-boot,linux,linux,网络,单片机

启动Linux

512MB字节DDR版本的核心板,DDR范围就是0X80000000- 0X9FFFFFFF(这里的1就是1byte,0x9FFFFFFF+1-0X8000000的值转为十进制/1024/1024=512MB)。对于256MB的DDR来说,那就0X80000000~0X8FFFFFFF。
视频教程:EMMC是第六分钟开始

从EMMC中启动

1、首先查看EMMC里面是否有系统,linux镜像zImage和.dtb文件。

  • 先将当前设备切换到EMMC:

      mmc dev 1	//切换到EMMC
      fatls mmc 1:1  //查看EMMC1的分区1里面的文件
    

u-boot,linux,linux,网络,单片机
2、将zIimage和.dtb读取到DRAM中

fatload mmc 1:1 80800000 zImage //将zimage下载到DDR的0x80800000处
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb //将dtb读取到0X83000000
bootz 80800000 – 83000000 //启动内核
如果内核启动成功,说明uboot支持emmc启动,验证成功。

fatload :将指定文件读取到DRAM中
将EMMC分区1中的zIimage文件读取到DRAM中的0x80800000地址处。

fatload mmc 1:1 80800000 zImage 

同理,读取设备树

fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb

bootz 有三个参数,addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在
DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可,fdt 就是设备树文件在 DRAM 中
的地址。

bootz 80800000 - 83000000

u-boot,linux,linux,网络,单片机
u-boot,linux,linux,网络,单片机

通过网络

和上面的基本相同,只是镜像和设备树是通过网络传过来的
1、通过Windows10中直接拷贝过来的首先需要给他权限
u-boot,linux,linux,网络,单片机
u-boot,linux,linux,网络,单片机
2、通过tftp传输到开发板上(直接执行下面的代码就可以了)

  • 首先是通过tftp将镜像和设备树直接拷贝到DRAM中的指定位置
  • 然后直接一个bootz就行了
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

通过go命令运行裸机程序

这样就可以不用每次都通过sd卡了,直接用uboot
1、首先cp到tftpboot文件夹下

cp ./printf.bin /home/ni/linux/tftpboot/ -f

2、下载程序到开发板

tftp 87800000 printf.bin

3、跳转运行

go 87800000

u-boot,linux,linux,网络,单片机

注意点

开发板ping不同主机
u-boot,linux,linux,网络,单片机
虚拟机这块的设置到第三步就ok了 第四步不用搞

u-boot NFS下载文件报错:Loading: *** ERROR: File lookup fail解决方法

u-boot,linux,linux,网络,单片机文章来源地址https://www.toymoban.com/news/detail-627215.html

到了这里,关于u-boot详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MDIO接口协议与其详解——单片机

    MDIO(Management Data Input/Output)接口协议是一种常用于管理和配置网络设备的串行通信协议。在单片机领域,MDIO接口常用于与网络交换机、PHY芯片等外部设备进行通信。本文将详细介绍MDIO接口协议的原理和使用方法,并提供相应的源代码示例。 一、MDIO接口协议原理 MDIO接口协

    2024年02月22日
    浏览(49)
  • 51单片机“密码锁”代码详解

    注:此代码一经过验证,读者不必怀疑其正确性,如果烧录进去没有反应,请自行检查引脚端口配置,以及仔细分析代码实现原理。倘若能静下心来分析代码,一定能受益匪浅。 废话不多说,,直接上代码。如有问题,请下方评论并私信我,收到后一定及时回复!     功能

    2024年02月08日
    浏览(42)
  • 单片机的RTC获取网络时间

    理解网络同步校准RTC的原理需要考虑NTP、SNTP、RTC这三个关键组件的作用和交互。下面详细解释这个过程: 1. NTP(Network Time Protocol): 协议目的:NTP是用于同步计算机和设备时钟的协议。它通过在网络上与时间服务器通信,获取准确的时间信息。 工作原理:NTP使用一种分层的

    2024年02月02日
    浏览(33)
  • MCU-51:单片机LCD1602详解

    LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:16×2个字符,每个字符为5*7点阵 点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应

    2023年04月09日
    浏览(73)
  • 单片机控制直流电机(风扇)电路详解

    单片机引脚为什么无法直接控制电机或风扇?         我们在使用单片机去控制+5V的直流电机或者散热风扇时,可能会有一种疑惑,51单片机的引脚电压为+5V,为什么不直接用单片机引脚去驱动电机或者风扇?         实际上单片机的控制引脚,不管是51单片机或者s

    2024年01月16日
    浏览(77)
  • 51单片机——LED 点阵点亮一个点,小白详解

    LED点阵介绍:        LED点阵是由发光二极管排列组成的显示器件,在我们生活中的电器中随处可见,被广泛用于汽车报站器,广告屏等。         通常用用较多的是8*8点阵,然后使用多个8*8点阵组成不同分辨率的LED点阵显示屏,比如16*16点阵可以使用4个8*8点阵构成。因

    2024年02月09日
    浏览(32)
  • 【32单片机学习】(11)STM32启动过程详解

    目录 前言 一、系统架构 二、启动配置 三、启动流程 1.首先复位MCU,获取栈顶指针MSP和PC指针的内容 2.根据PC的值找到复位中断处理函数Reset_Handler 1.进入中断处理函数Reset_Handler 2.进入SystemInit函数 3._main函数 3.进入main函数 总结          通过查阅官方手册和对实际代码进行

    2024年02月08日
    浏览(33)
  • 单片机和Linux嵌入式区别

    单片机是一种集成电路,它能够在一个芯片上完成各种计算、控制和管理任务。单片机没有明确的分层,这是因为它通常被用来设计嵌入式系统,其程序结构和功能要根据具体的应用需求来设计。 在单片机的程序设计中,可以通过一些方法将程序分为不同的层次,比如可以将

    2024年01月17日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包