【linux-uboot移植-mmc及tftp启动-IMX6ULL】

个人uboot移植配置记录

1. uboot简介

  uboot对于Linux而言就是一个引导内核启动的大型的裸机程序,本质生成的是个.bin的二进制文件,不过要烧录到单片机中的话要加上对应的DDR的头部校准代码,这些可以根据NXP的DDR校准工具进行生成;因此下面根据自己学习以及对应的教程手册制作一份属于自己的内核移植流程

2. 移植前的基本介绍:

  首先移植uboot需要一份能编译通过的原厂文件,也就我使用的是NXP的I.MX6ULL芯片,那么就要去NXP的官网下载一份I.MX6ULL的uboot代码,并进行编译;至于为什么要使用原厂的uboot代码,这是因为我们制作IMX6ULL的最小系统时肯定要对照NXP原厂的开发板进行设计,例如DDR,UART,MMC基本是差不多的,因此我们使用和原厂一样的uboot,我们只需添加自己的板子信息就可以,当然也可以不添加直接进行修改就行,但是从头开始编写uboot明显是不现实的;例如下面的IMX6ULL的原厂的开发板和正点原子的开发板的DDR接线对比,可以看到基本一样一样的:[链接]

  其官方开发版的核心板的DDR原理图如下


  正点原子的IMX6ULL的核心板的DDR设计连接图如下所示:



  可以对比一下,其对于DDR的引脚连接是一样的,同时也可以对照一下EMMC的链接,其引脚链接也是一一样的,因此,对于使用NXP原厂的uboot是最好的选择,我们只需对原厂的uboot进行改造就行;关于NXP的烧录工具,uboot,系统镜像和设备树,根文件系统均可从官网下载;

2.1 环境系统信息:

  • 系统:Ubuntu版本是:16.04版本,linux环境
  • 交叉编译器版本:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
  • 使用的开发板:正点原子的阿尔法I.MX6ULL开发板

3. 初次编译

  • 运行解压命令:tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
  • 在解压文件中创建shell脚本文件my.sh,权限给满:内容如下:
  •  c#!/bin/bash
     make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
     make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
     make V=1 ARCH=arm CrROSS_COMPILE=arm-linux-gnueabihf- -j8 
    
  • 在终端运行命令:./my.sh
  • 运行结果如下:可以看到u-boot.bin和u-boot.imx的文件都成功的编译出来了;我们最终需要的文件也是u-boot.bin和u-boot.imx
  • 在Makefile文件中加上这两句话,方便一键make编译:
  •  ARCH	?=	arm
     CROSS_COMPILE	?=	arm-linux-gnueabihf-
    

4. 烧录编译的u-boot

  这里使用原厂的u-boot.bin进行烧录,并使用SD卡启动,烧录方式这里不过多赘述;烧录结果如下:

在这里插入图片描述
  其实只要能进入uboot,并正确驱动MMC和DDR就已经成功了一大半,可剩下的就是对网络驱动进行修改正确,而对于屏幕驱动不修改也行,因为启动linux内核后这一切还要重新配置,也就是说在uboot里面你把屏幕驱动修改正确了,但是当你成功启动linux内核后,发现屏幕还要重新配置一遍,也就是uboot的作用就是启动内核,当内核成功启动,uboot差不多也就寿终正寝了;
  而修改网络驱动原因是我们要进行网络挂载和调试linux内核和根文件系统,而对Linux内核和根文件系统的挂载要通过uboot来实现,所以uboot的网络功能修改正常是非常重要的;

  成功启动uboot的话,我们就可以利用命令把相关的内核启动或挂载起来,重要的命令如下:

  • setenv:设置环境变量;可以建立自己的环境变量,也可以改变原来的环境变量;
  • saveenv:保存设置的环境变量;
  • printenv:打印出当前的环境变量;
  • fatls:对文件系统的部分分区的内容进行显示;
  • fatload:把内容装载到指定的内存中;
  • bootz:通过uboot启动linux内核;
  • tftpboot:通过网络进行内核和根文件系统的挂载

4.1 修改网络驱动

  这里修改网络驱动要结合正点原子的硬件接口的信息,主要修改的是改LAN的硬件地址和IO引脚,不同的板子情况不一样不具备通用性;但是可以抽象的总结一下,正点原子的PHY芯片的地址和与SOC的引脚接口发生了改变,那么我们至少要修改的内容有:板级文件夹中的.c文件,以及通用的.h头文件;其次我们要修改通用驱动中的内容,基本就这三块内容;如果是正点原子的开发板,详细修改过程可以看看正点原子的linux开发驱动指南;
  mx6ullelk.c文件在board目录下的对应的板级文件内,我这里就是board/freescale/mx6ullelk/ 文件下:这里主要是修改底层的内容,比如IO的拉高拉低,等等
  另外一个就是头文件,在include/comfigs/中:这里修改的主要是eth0和eth1的地址,以及一些环境变量的设置等;
  我们还要去对应的通用驱动中进行修改一下;每个人的情况不一样,这里不赘述,修改后的结果如下:

5. 通过命令启动linux内核

  到目前为止,我们工作基本完成,剩下的我们可以通过手动进行linux内核的启动,并把相关的操作保存,例如假设现在mmc中有linux的内核和设备树,我们如何通过上面的基本的uboot手动把这个linux内核给启动起来呢?步骤如下:

5.1 通过命令手动启动mmc中的linux内核

  核心命令就是如下:就是自动启动bootcmd->loadiamge->loadfadt->bootz,这样就实现了手动写死的方法进行linux内核的启动

   - bootcmd=run loadimage;run loadfdt;bootz 0x80800000 - 0x83000000;
   - loadiamge=fatload mmc 1:1 0x80800000 zImage;
   - loadfdt=fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb
   - bootz 0x80800000 - 0x83000000;

  对上述命令的详细解释如下:

5.1.1 fatls mmc 1:1

  这个命令就是把mmc的分区1中的内容给显示出来,注意mmc有分区0,分区1,分区2三个分区,显示的结果如下:



5.1.2 fatload mmc 1:1 0x80800000 zImage

  以下是对这个命令的揭示:主要就是把mmc中第二个分区中(1分区)的镜像文件zImage搬运到内存地址为0x80800000的地方;

  • fatload:这是一个用于从 FAT 文件系统读取数据的命令。
  • mmc 1:1:表示从 MMC(多媒体卡)设备 1(可能是指特定的存储设备)的第一个分区读取,注意有0分区,1分区,2分区,1分区实际上是第二个分区;
  • 0x80800000:这是指定的目标内存地址,即将读取到的数据加载到这个内存位置。
  • zImage:这是要读取的具体文件,通常是 Linux 内核的映像文件。


5.1.3 fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb

  这条命令和上条的基本一样,就是这次搬运的是设备树,搬运到了内存的0x83000000地方;



5.1.4 bootz 0x80800000 - 0x83000000

  这条命令启动位于内存地址0x80800000的内核映像,并使用设备树文件位于内存地址0x83000000;



5.2 通过命令手动进行tftp的网络挂载启动

  我们上面是进行了手动的mmc内核的启动,接下来我们也可以通过网络进行内核的启动,本质思想是一样的,不过我们这次是通过tfptboot的命令把主机上的zImage和dtb设备树给下载到指定的内存中,相当于我搬运的方式从mmc中切换到了远程网络上;
  tftpboot命令解释:“tftpboot”命令用于通过 TFTP(简单文件传输协议)从 TFTP 服务器下载文件到目标系统。假设我们有一个 TFTP 服务器,其 IP 地址为 192.168.1.100,要下载一个名为“ zImage”的文件到内存地址 0x80000000。

  • tftpboot 0x80800000 zImage : 这个命令指示从 TFTP 服务器(192.168.1.100)上获取名为“zImage”的文件,并将其加载到内存地址 0x80000000 处。

  因此我们要做的就是保证我们的板子能通过网络进行主机进行访问,这也是为什么我们上面要对网络驱动进修改,保证uboot的网络驱动是正常工作的;

5.2.1 配置电脑端的tftp

  这里我设置的ubuntu系统,其中我的ubuntu的系统的IP地址为ipaddr=192.168.10.100,而如何配置ubuntu中的tftp这里就不在赘述,网上的教程较多;这里推荐一篇博客,介绍如何配置tftp环境:链接

5.2.2 开发板的操作

  我的ubuntu的系统的IP地址为ipaddr=192.168.10.100,而我们在开发板上的操作如下:

  • setenv serverip 192.168.10.100;设置板子的服务器地址,也就是从哪个主机进行下载
  • saveenv;保存上面的设置,这样就算复位也不会丢失地址
  • tftpboot 0x80800000 zImage;这个命令指示从 TFTP 服务器(192.168.10.100)上获取名为“zImage”的文件,并将其加载到内存地址 0x80000000 处。
  • tftpboot 0x8300000 imx6ull-14x14-evk.dtb;这个命令指示从 TFTP 服务器(192.168.10.100)上获取名为“imx6ull-14x14-evk.dtb”的文件,并将其加载到内存地址 0x80000000 处。
  • bootz 0x80800000 - 0x83000000;启动内核的命令;

  因此,如果我们要想实现复位自启动,我们只需在设置bootcmd就行,设置命令如下:

  • setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-evk.dtb; bootz 80800000 - 83000000'
  • saveenv

  这样我们就能实现复位自动从主机进行获取镜像文件和设备树,并把镜像和设备树下载到对应的内存地址上,最后通过bootz进行设备的启动;

7. 修改uboot的DCD的数据

  对于DCD的数据也就是DDR的校准数据,DCD的数据存方在,这个数据可以通过NXP的DDR测试工具得到,不过这个工具的使用网上也有一大堆教程,这里推荐一篇博客写的不错:链接

在这里插入图片描述

8. 总结

  对于uboot启动内核可以通过手动方式进行启动,我们可以把这些命令写死,具体就是利用setenv的命令就行操作;当然我们用的最多的 是进行网络tftp网络挂载的形式进行内核的启动,但是核心思想是一致的,就是手动把命令写死;下面补一下操作图。



在这里插入图片描述


  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值