u-boot详解_uboot-程序员宅基地

技术标签: 网络  linux  单片机  

简介

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,再打开一看还是原来的样子,改的没有起效果。有两种情况,见下图

在这里插入图片描述
在这里插入图片描述
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
    在这里插入图片描述

烧写

使用OTG烧写

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

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初始化失败。
    请添加图片描述
    在这里插入图片描述
    sd卡正常
    在这里插入图片描述
    emmc正常
    在这里插入图片描述

uboot命令

视频详解
在这里插入图片描述
1、help:查看帮助信息

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

2、printenv:信息查询

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

3、setenv:设置环境变量,也可以自定义环境变量,也可以删除环境变量(设置为空值,也就是没有值,就是删除)
4、saveenv命令:保存环境变量。
在这里插入图片描述
在这里插入图片描述

启动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里面的文件
    

在这里插入图片描述
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

在这里插入图片描述
请添加图片描述

通过网络

和上面的基本相同,只是镜像和设备树是通过网络传过来的
1、通过Windows10中直接拷贝过来的首先需要给他权限
在这里插入图片描述
在这里插入图片描述
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

在这里插入图片描述

注意点

开发板ping不同主机
在这里插入图片描述
虚拟机这块的设置到第三步就ok了 第四步不用搞

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

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chengcao123/article/details/124933607

智能推荐

Centos 7 简单部署 jar 并访问成功_centos7一般安装文件 都把jar包放哪里-程序员宅基地

文章浏览阅读1.8k次。  在部署项目之前,必须确保 Centos 7 中已经配置好了 jdk、mysql、maven 等配置。基本步骤和 window 系统基本一致。整体步骤可分为:打包 > 上传 > 启动项目 > 对外开放相应端口 > 访问。1、打包  在本地打包相应的 jar 包。mvn package2、上传  将 jar 包上传到服务器的某个位置。我放在 /usr/project/auto_parts 中。3、启动项目  启动项目有很多种方法。java -jar xxx.jar_centos7一般安装文件 都把jar包放哪里

plsql安装教程_安装plsql步骤-程序员宅基地

文章浏览阅读4.9k次,点赞3次,收藏18次。先安装Oracle客户端下载地址:再安装plsqldev下载地址:如果需要汉化,可安装汉化补丁包下载地址:配置数据库找到安装路径,如C:\app\xxx\product\11.2.0\client_1\Network\Admin,将此目录下Sample文件夹里的tnsnames.ora文件移到上层Admin目录下。tnsnames.ora里添加数据库配置AUTOSPD1 = (..._安装plsql步骤

权限设计(下) - 细说权限设计-程序员宅基地

文章浏览阅读51次。什么是权限管理一般来说,只要有用户参与的系统,那么都要有权限管理,尤其是一些后台的管理系统,权限管理可以实现对用户访问系统的控制,按照安全规则或者相关策略的控制,可以使用户访问到只属于自己被授权的相关(比如菜单,或者页面资源)权限管理包括用户认证和授权两模块用户认证用户认证,说白了就是登录的时候进行的验证,验证用户身份合法性。最常见的用户身份验证的方式:1、用户名 + ..._在下一篇文章中,将详细介绍以“权限”为单位的权限设计,欢迎阅

【Linux】 通过宝塔面板重置SSH密码,无需原密码_宝塔修改ssh密码-程序员宅基地

文章浏览阅读1.4k次,点赞12次,收藏8次。linux 忘记ssh密码(前提要有宝塔的账号密码)修改重置ssh密码_宝塔修改ssh密码

Android7.0 FileProvider-程序员宅基地

文章浏览阅读308次。一、前言Android 7.0有很多的变化,和我们开发者关联最大的,或者说必须要适配的就是去除项目中传递 file:// 类似格式的 Uri 了。要应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类,FileProvider 实际上是 ContentProvider 的一个子类,它的作用也...

SQL Server安全(9/11):透明数据加密(Transparent Data Encryption)-程序员宅基地

文章浏览阅读253次。在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切。但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念。这篇文章提供了基础,因此你可以对SQL Server里的安全功能充分利用,不用在面对特定威胁,不能保护你数据的功能上浪费时间。从让人眼花缭乱的客户端使用连接,通过到处分布的网络,尤其是互联网,关系数据库在各种应用程序里广泛使用。这使数据..._sql 透明加密enctyption

随便推点

京东php分销系统开源,2017Ecshop鸿宇小京东V7.2.3二次开发版分销多用户商城系统微信支...-程序员宅基地

文章浏览阅读438次。演示地址:如有演示站请以演示为准,无演示站以截图为准,源码太多服务器有限,无法搭建所有源码演示站,请谅解!新手购买指导:1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下载所需源码即可温馨提示:本站所有虚拟资源仅供学习参考技术交流使用,切勿用于商业用途,非法商用或复制传播!2017Ecshop鸿宇小京东V7.2.3二次开发版分销多用户商城系统支付+短信需要安装的请与客服..._ecshop 小京东版本

遗传算法原理与应用_遗传算法可以解决什么问题-程序员宅基地

文章浏览阅读3.6k次。文章目录什么是遗传算法遗传算法用在什么地方遗传算法原理与步骤遗传算法总结什么是遗传算法在问题最优求解中,我们可能会遇到问题不容易求解的情况,或者不存在凹凸性的情况,或者采用暴力求解不可行如NP问题等。这时候一种思路是采用遗传算法。所谓遗传算法(Genetic Algorithm,GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是通过自然进化过程搜索最优解的方法。遗传..._遗传算法可以解决什么问题

activemq 使用nio进行网络传输。配置文件_java activemq配置 nio-程序员宅基地

文章浏览阅读99次。<transportConnector name="nio" uri="nio://localhost:61618?trace=true"/> _java activemq配置 nio

uniapp做h5页面刷新页面404配置nginx后端开启伪静态_uniapp h5 nginx 伪静态-程序员宅基地

文章浏览阅读1.5k次。后端laravel,api和h5分开两个域名来管理。所以去伪静态文件找,不然就是配置文件里面配置即可。如上加上下面代码即可。tip: 如果有使用$Router,需参考另外的配置。location / { try_files $uri $uri/ /index.html;}..._uniapp h5 nginx 伪静态

四象限法推导lm曲线_让你的电脑桌面井井有条,超好用的「四象限壁纸」+ 制作方法分享...-程序员宅基地

文章浏览阅读3.5k次。前言据说大神们的电脑桌面都是空空如也的,我们大多数还是比较习惯把常用的文件直接放在桌面上,日常使用和操作也比较方便。但如果不好好整理的话,时间一久桌面就会变得乱七八糟,既不美观,也不好找文件。比较常见的是使用 Fences、腾讯桌面整理等框格式整理软件分类收纳。今天我们分享一种“神奇”的方法,只需要一张「四象限壁纸」,就可以让我们的电脑桌面变得井井有条!本文说下四象限壁纸的使用和制作方法,还有我自..._任务四象限电脑桌面

web安全php基础_搭建php环境_怎么搭建web,php环境-程序员宅基地

文章浏览阅读2.3w次。首先打开phpstudy的网站栏点击创建网站,新建一个网站(域名随便输反正是局域网)然后点击确认。然后网站好了,就可以新建项目,打开phpstorm,然后点击new project新建项目,然后再在刚刚打开的站点添加/phpinfo.php,看到如下页面,即我们的php环境搭建完成。然后在location栏里选择项目路径,就是刚刚我们创建的那个站点的路径。这个是问你文件夹不是空的是否在这个非空文件夹创建项目,点击创建就好。打开浏览器输入刚刚创建网站时输入的域名,即可看见我们的网站。如下,网站便创建好了。_怎么搭建web,php环境

推荐文章

热门文章

相关标签