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

目录

  • 1. uboot简介
  • 2. 移植前的基本介绍:
    • 2.1 环境系统信息:
  • 3. 初次编译
  • 4. 烧录编译的u-boot
    • 4.1 修改网络驱动
  • 5. 通过命令启动linux内核
    • 5.1 通过命令手动启动mmc中的linux内核
      • 5.1.1 fatls mmc 1:1
      • 5.1.2 fatload mmc 1:1 0x80800000 zImage
      • 5.1.3 fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb
      • 5.1.4 bootz 0x80800000 - 0x83000000
    • 5.2 通过命令手动进行tftp的网络挂载启动
      • 5.2.1 配置电脑端的tftp
      • 5.2.2 开发板的操作
  • 7. 修改uboot的DCD的数据
  • 8. 总结

个人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网络挂载的形式进行内核的启动,但是核心思想是一致的,就是手动把命令写死;下面补一下操作图。



在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware 安装Windows 7 SP1

1.下载镜像 迅雷:ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 2.安装过程 自定义名字,点击【浏览】自定义安装路径 点击【浏览】,选择下载镜像的路径 结束啦~ Win…

Pytorch深度学习实践笔记4

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

力扣Hot100-73矩阵置零(标记数组)

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…

2024年二建准考证打印入口已开通!

24年二建将于6月1日、2日举行,目前西藏、陕西准考证打印入口已开通,各省也将陆续开始准考证打印工作。 2024二建考试时间安排 2024二建准考证打印时间 二建准考证打印须知 01 准考证打印信息显示空白怎么办? 1)使用电脑自带的浏览器重新试一下。 2)…

【话题】你眼中的IT行业现状与未来趋势

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 引言一、IT行业的现状1.1 云计算与大数据1.2 人工智能与机器学习1.3 物联网与5G通信1.4 区块链技术 二、IT行业未来发展趋势2.1 边缘计算与智能设备2.2 深度学习与自然语…

话题:如何让大模型变得更聪明?

随着人工智能(AI)技术的迅速发展,大模型(如GPT-4、BERT、Transformer等)在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而,如何让大模型变得更聪明,进一步提升其性能和应用效果&a…

做好商业分析,帮你用有限的资源选择高效益项目实现战略目标

对于组织来说,资源条件总是有限的,为了实现战略目标,则需要从众多项目中筛选出最合适的项目来实现收益。但项目的筛选往往会遇到很多难点,如信息收集不全影响筛选的准确性、评估标准不明确或难以量化、决策过程复杂等等。 那么如何…

守护者:ThingsBoard物联网网关在温室环境监测中的应用

系统设计 智慧农业温室大棚系统由传感器及执行设备、数据传输网关、智慧农业温室大棚管理平台组成。 系统支持实时采集温室大棚内的空气温湿度、土壤温湿度、光照和二氧化碳等环境参数,根据农作物的生长需求自动控制温室中电器设备的启停,从而达到植物生…

caffe在ARM鲲鹏920-openEuler2309上的环境搭建

caffe 配置环境 caffe cpu-only openblas protobuf 编译caffe需要3.6~3.10版本,否则会报错 dnf install只能安装3.19版本 需要从源码编译,这里选择了3.9版本 protobuf的github仓 从源码编译安装 caffe-gpu mode caffe的gpu模式需要用到cuda make…

jmeter线程组(下篇)

线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池,其中每个线程可被理解为一个虚拟用户&#x…

【Django】从零开始学Django(持续更新中)

pip install Djangopython manage.py startapp index运行: 成功!!! 在templates中新建index.html文件:

在做题中学习(61):连续数组

525. 连续数组 - 力扣(LeetCode) 思路:前缀和 哈希表 转化:将 0 ——> -1 转变为:找到和为0的最长子数组 细节: 1.哈希表存什么 前缀和 , 长度 2.什么时候存入哈希表 先处理前一个&…

【Crypto】password

文章目录 password解题感悟 password 试试flag{zs19900315} 提交成功 解题感悟 这题有点大病

工具分享:VsCode注释神器,koro1FileHeader

他是有官方Wiki的。 https://github.com/OBKoro1/koro1FileHeader/wiki/ 项目在GitHub上开源。以下摘录部分wiki,用作介绍分享在这里插入代码片 如何找到setting.json设置模板 简单的输入命令 打开VSCode命令面板: mac: command p window: ctrl p输入> Ope…

day15|各种遍历的应用

相关题目&#xff1a; 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路&#xff1a;层次遍历二叉树&#xff0c;将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…

ubuntu22部署Docker私有仓库Harbor (http https方式)

harbor日志&#xff1a;/var/log/harbor 前置安装配置 需先安装docker和docker-compose&#xff1a; 0.配置清华大学apt源并安装docker #信任 Docker 的 GPG 公钥: sudo apt-get install ca-certificates curl gnupg curl -fsSL https://download.docker.com/linux/ubunt…

Talkingdata 数据统计

TalkingData 是一家提供移动大数据服务的平台&#xff0c;专注于为客户提供全面的产品统计分析服务和权威的移动行业数据解析。通过集成 TalkingData 的 SDK&#xff0c;开发者可以收集、处理和分析其应用的一方数据&#xff0c;从而深入了解用户的使用行为、应用表现及市场动态…

Java面试八股之什么是死锁

什么是死锁 死锁&#xff08;Deadlock&#xff09;是多线程编程中的一种常见问题&#xff0c;特别是在涉及到资源共享和同步的时候。具体来说&#xff0c;死锁是指两个或两个以上的线程在执行过程中&#xff0c;由于互相持有并等待对方释放的资源&#xff0c;而导致所有线程都…

IP地址显示“不安全”怎么办|已解决

解决IP地址显示“不安全”的问题&#xff0c;通常需要确保网站或服务使用HTTPS协议进行加密通信&#xff0c;可以通过部署SSL证书来解决&#xff0c;以下是具体的解决步骤&#xff1a; 1 申请IP地址SSL证书&#xff1a;网站管理员应向证书颁发机构&#xff08;CA&#xff09;申…

http项目改为/支持https的方案、无需修改后台代码

背景描述&#xff1a;原来的项目前后台都是http&#xff0c;现在某个服务要求前台必须使用https&#xff1b; 方案1&#xff1a;前台部署在https里&#xff0c;后面代码修改&#xff1b;但是微服务架构&#xff0c;后台工作量太大&#xff1b; 方案2&#xff1a;前台部署在ht…