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

news2024/11/16 22:49:08

目录

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



在这里插入图片描述


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

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

相关文章

力扣HOT100 - 169. 多数元素

解题思路&#xff1a; 有点类似于Boyer-Moore 投票算法&#xff0c;但更加形象。 class Solution {public int majorityElement(int[] nums) {int winner nums[0];int cnt 1;for (int i 1; i < nums.length; i) {if (winner nums[i]){cnt;} else if (cn…

IRFB3207PBF TO-220 N沟道75V/180A 直插MOSFET场效应管

英飞凌&#xff08;Infineon&#xff09;的 IRFB3207PBF 是一款高性能的 N 沟道 MOSFET&#xff0c;适用于多种电子设备和系统中的高侧开关应用。以下是 IRFB3207PBF 的一些典型应用场景&#xff1a; 1. 电源管理&#xff1a;在电源管理系统中&#xff0c;IRFB3207PBF 可以作为…

【LeetCode刷题】三数之和、四数之和

【LeetCode刷题】Day 6 题目1&#xff1a;LCR 7.三数之和思路分析&#xff1a;思路1&#xff1a;排序暴力枚举set去重思路2&#xff1a;单调性双指针细节处理去重 题目2&#xff1a;18.四数之和思路分析&#xff1a;思路1&#xff1a;排序暴力枚举set去重思路2&#xff1a;单调…

力扣HOT100 - 287. 寻找重复数

解题思路&#xff1a; 快慢指针 第一步&#xff0c;慢指针每次移动一步&#xff0c;快指针每次移动两步&#xff0c;直到它们相遇。这一步保证了它们在环中相遇。 接下来&#xff0c;将其中一个指针&#xff08;快指针或慢指针&#xff09;重置到起点&#xff08;即数组的第一…

想要修改Excel表格内容,怎么移除编辑权限?

在使用Excel进行数据处理和管理时&#xff0c;我们经常会遇到需要保护工作表以防止误操作的情况。有时可能碰到“被保护单元格不支持此功能”的提示&#xff0c;本文将详细介绍这个问题的解决方案&#xff0c;帮助你取消单元格保护&#xff0c;使用所需的功能。 一、取消单元格…

LoFTR 笔记和理解

文章目录 解决什么实际问题&#xff1f;算法结构 解决什么实际问题&#xff1f; 主要是解决传统特征匹配和之前的基于深度学习特征匹配不稳定和不准确的问题。传统的特征匹配方法主要依赖于特征点的检测&#xff0c;如果特征点的检测出现问题&#xff0c;比如某一些的关键点没…

BEVFusion中特征融合模块是如何应用通道注意力机制的?

BEVFusion总体结构如下图所示&#xff0c;在相机和lidar的输入都已经被网络提取特证之后&#xff0c;就要对两种特征进行融合&#xff0c; 在BEV Fusion中图像支路得到的是 Camera BEV Features&#xff0c;点云支路得到的是 LiDAR BEV Features&#xff0c;除了2d和3d各自的检…

C语言指针的介绍1

前言 嗨&#xff0c;我是firdawn&#xff0c;本章将简单介绍&#xff0c;指针对应的实际意义&#xff0c;以及指针的简单使用和如何避免野指针&#xff0c;下面的图是本章的思维导图&#xff0c;那么&#xff0c;让我们开始吧&#xff01; 一&#xff0c;内存和地址 1.1 程…

使用 CapSolver API 服务解决 Arkose Labs FunCaptcha 验证码

使用 CapSolver API 服务解决 Arkose Labs FunCaptcha 验证码 FunCaptcha 以其复杂的图像验证而闻名&#xff0c;对自动化系统构成了巨大的挑战。CapSolver 的 API 服务利用先进的 AI 技术轻松应对和解决 FunCaptcha 挑战。本指南探讨了 CapSolver 如何实现无缝自动化&#xff…

基于SpringBoot的社区医院管理系统

基于SpringBootVue的社区医院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 医生预约 管理员界面 医生界面 摘要 基于Spring Boot的社区医院管理系…

如何通过IP地址来防范“杀猪盘”?

随着人工智能技术的逐渐成熟&#xff0c;给人们的生活带来了很多方面&#xff0c;但同时犯罪分子也紧跟“潮流”&#xff0c;据报道&#xff0c;以东南亚为主要地区的犯罪集团聚集地已开始使用人工智能聊天机器进行“杀猪盘”行动。这一现象导致国内诈骗案件持续发生&#xff0…

vue2好用的日期选择插件vue2-datepicker

中文文档&#xff1a;vue2-datepicker/README.zh-CN.md at master mengxiong10/vue2-datepicker GitHub npm下载地址&#xff1a; npm install vue2-datepicker --save 示例&#xff08;去除默认样式&#xff09; <style scoped> .datePicker{width: 15vw;backgrou…

用Sora等AI视频大模型赚钱的48种方式

不废话&#xff0c;直接上干货&#xff01; \1. 定制视频创作服务&#xff1a;为寻找在社交媒体平台上脱颖而出的企业和个人提供定制视频制作服务&#xff0c;或用于个人使用。根据特定主题或行业量身定制视频&#xff0c;例如旅行、教育或产品营销。 \2. **教育内容包&#…

python期末作业:批量爬取站长之家的网站排行榜数据并保存,数据分析可视化

爬虫作业,含python爬取数据和保存文件,数据分析使用pyecharts做数据可视化 整体上分析网站的排名,直观看各个网站的热度。 数据分析之后大致的效果: 整个项目分为两个大的部分,第一部分就是抓取网站排名数据,然后保存为Excel、csv等格式,其次就是从文件中…

【linux特殊符号】

文章目录 学习目标一、Linux的特殊符号1.系统变量2.引号 总结 学习目标 1.学会查看系统变量 2.学会各种引号 3.一、Linux的特殊符号 1.系统变量 windows系统变量&#xff1a;echo %path% linux系统变量&#xff1a;echo $PATH2.引号 " " 双引号&#xff0c;换行…

centos ping: www.baidu.com: 未知的名称或服务

可以检查 /etc/sysconfig/network-scripts/ifcfg-ens33和/etc/resolv.conf这两个文件里面的内容&#xff1a; 这个就不多说了&#xff0c;可以看教程合集的000文档 还有一个原因就是路由网关没有配置&#xff1a; netstat -rn 如果GATEWAY这里没有显示你的网关信息&#xff08…

有道:一季度业绩超市场预期,生成式AI商业化落地进程加快

5月23日&#xff0c;教育科技公司网易有道&#xff08;NYSE&#xff1a;DAO&#xff09;公布了2024年第一季度未经审计的财务报告。报告期内&#xff0c;受益于“AI”加“教育”双轮驱动&#xff0c;业绩表现超市场预期&#xff0c;业务健康度大幅改善。 财报显示&#xff0c;…

体量小但增速快,国内OTA平台与国际巨头差在哪?

5月3日&#xff0c;Booking、Expedia等国际OTA平台相继发布2024年第一季度财报。5月21日&#xff0c;携程发布2024年第一季度财报。至此&#xff0c;国内外主要OTA平台一季度成绩单均已披露。 受益于全球旅游市场复苏&#xff0c;三家OTA平台一季度营收同比均正向增长。增长之…

Unity LayerMask避坑笔记

今天使用Physics2D.OverlapAreaNonAlloc进行物理检测时候&#xff0c;通过LayerMask.NameToLayer传入了int值的LayerMask&#xff0c;结果一直识别不到&#xff0c;经过Debug才找到问题&#xff0c;竟是LayerMask的“值”传输有问题&#xff0c;记录一下。 直接贴代码输出结果&…

最大负载1kg!高度模块化设计!大象机器人智能遥控操作机械臂组合myArm MC

引入 近年来&#xff0c;市面上涌现了许多类似于斯坦福大学的 Alopha 机器人项目&#xff0c;这些项目主要通过模仿人类的运动轨迹来进行学习&#xff0c;实现了仿人类的人工智能。Alopha 机器人通过先进的算法和传感技术&#xff0c;能够精确复制人类的动作&#xff0c;并从中…