当前位置: 首页 > news >正文

【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/bashmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfigmake 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	?=	armCROSS_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网络挂载的形式进行内核的启动,但是核心思想是一致的,就是手动把命令写死;下面补一下操作图。



在这里插入图片描述


相关文章:

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

目录 1. uboot简介2. 移植前的基本介绍:2.1 环境系统信息: 3. 初次编译4. 烧录编译的u-boot4.1 修改网络驱动 5. 通过命令启动linux内核5.1 通过命令手动启动mmc中的linux内核5.1.1 fatls mmc 1:15.1.2 fatload mmc 1:1 0x80800000 zImage5.1.3 fatload mmc 1:1 0x8…...

Python-温故知新

1快速打开.ipynb文件 安装好anaconda后,在需要打开notebook的文件夹中, shift键右键——打开powershell窗口——输入jupyter notebook 即可在该文件夹中打开notebook的页面: 2 快速查看函数用法 光标放在函数上——shift键tab 3......

绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析

5月23日,绿联科技举行了“新一代存储方式未来已来”发布会,发布了绿联NAS私有云DXP系列(包括两盘位到八盘位的九款新品)以及由绿联科技自研的全新NAS系统UGOS Pro。此次绿联发布的DXP系列九款产品,共有两盘位、四盘位、…...

力扣:242. 有效的字母异位词

242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram"…...

设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 组合模式(Composit…...

MyBatis面试题(Mybaits的优点、缺点、适用场合、与Hibernate有哪些不同)

一、Mybaits的优点: 1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML里,解除 sql与程序代码的耦合,便于统一管理;提供 XML 标签,支持…...

python写接口性能测试

import time import requestsdef measure_response_time(api_url):try:start_time time.time()response requests.get(api_url, timeout10) # 设置超时时间为10秒end_time time.time()response_time end_time - start_timeprint(f"接口 {api_url} 的响应时间为&#…...

《暮色将尽》跨越世纪的历程,慢慢走向并完善自我

《暮色将尽》跨越世纪的历程,慢慢走向并完善自我 戴安娜阿西尔(1917-2019),英国知名文学编辑、作家。著有《暮色将尽》《昨日清晨》《未经删节》《长书当诉》等。 曾嵘 译 文章目录 《暮色将尽》跨越世纪的历程,慢慢走…...

python-鸡兔同笼问题:已知鸡和兔的总头数与总脚数。求笼中鸡和兔各几只?

【问题描述】典型的鸡兔同笼问题。 【输入形式】输入总头数和总脚数两个实数:h,f 【输出形式】笼中鸡和兔的个数:x,y 【样例输入】16 40 【样例输出】鸡12只,兔4只 【样例说明】输入输出必须保证格式正确。…...

【NumPy】关于numpy.transpose()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...

什么是住宅IP代理?为什么需要家庭 IP 代理

家庭代理 IP 允许您选择特定位置(国家、城市或移动运营商)并作为代理上网该区域的真实用户。住宅代理 IP 可以定义为保护用户免受一般网络流量影响的中介。它们在隐藏您的 IP 地址的同时充当缓冲区。住宅代理 IP 是服务提供商分配给用户的替代 IP 地址。…...

Java方法的重载

Java方法的重载 前言一、为什么要有重载代码示例问题 代码示例 二、重载的使用代码示例 三、重载的规则针对同一个类代码示例 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分…...

RabbitMQ 消息队列安装及入门

市面常见消息队列中间件对比 技术名称吞吐量 /IO/并发时效性(类似延迟)消息到达时间可用性可靠性优势应用场景activemq万级高高高简单易学中小型企业、项目rabbitmq万级极高(微秒)高极高生态好(基本什么语言都支持&am…...

K8S认证|CKA题库+答案| 14. 排查故障节点

14、排查集群中的故障节点 CKA v1.29.0模拟系统免费下载试用: 百度网盘:https://pan.baidu.com/s/1vVR_AK6MVK2Jrz0n0R2GoQ?pwdwbki 题目: 您必须在以下Cluster/Node上完成此考题: Cluster …...

Linux:网络管理命令之ss

一、ss命令介绍 Linux下的ss命令是Socket Statistics的缩写,也被称为IPC(Inter-Process Communication)套接字统计。这是一个强大的网络管理命令,主要用于获取系统中socket的统计信息,可以帮助系统管理员诊断和排查网络…...

数据结构-队列(带图详解)

目录 队列的概念 画图理解队列 代码图理解 代码展示(注意这个队列是单链表的结构实现) Queue.h(队列结构) Queue.c(函数/API实现) main.c(测试文件) 队列的概念 队列(Queue)是一种基础的数据结构,它遵循先进先出(First In …...

python文件名通常以什么结尾

python文件后缀一般有两个,分别是.py和.pyw。视窗用 python.exe 运行 .py,用 pythonw.exe 运行 .pyw 。 这纯粹是因为安装视窗版Python时,扩展名 .py 自动被登记为用 python.exe 运行的文件,而 .pyw 则被登记为用 pythonw.exe 运…...

前端javascript 中 JSON.parse() 的作用

1.解析 JSON 字符串 JSON.parse({"name": "tom"}) // {"name": "tom"} JSON.parse([1,2,3]) // [1,2,3] 2.转换成数字 JSON.parse(12) // 12 3.转换成布尔值 JSON.parse(false) // false...

【Linux学习】进程基础API

下面是有关进程基础API的相关介绍,希望对你有所帮助! 小海编程心语录-CSDN博客 目录 1. 僵尸进程与孤儿进程 1.1 孤儿进程 1.2 僵尸进程 2. 监视子进程 2.1 wait() 2.2 waitpid() 3. 执行新程序 exec族函数 4. 守护进程 1. 僵尸进程与孤儿进程…...

音视频及H264/H256编码相关原理

一、音视频封装格式原理: 我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…...

查看cpu进程数

import multiprocessing from multiprocessing import Pool# 导入 Pool 允许你创建一个进程池 # 进程池是一组工作进程,它们可以并行地执行多个任务# multiprocessing.cpu_count(): 返回当前机器上的CPU核心数 sum_cpu multiprocessing.cpu_count()use_cpu max(1,…...

MySQL优化篇

文章目录 库表结构优化1.规范和反规范化2.数据类型选择3.主键类型选择 索引优化聚簇索引和辅助索引(一切的起源)复合索引 查询优化 库表结构优化 1.规范和反规范化 表设计之间性能和数据完整性,耦合和解耦合之间的取舍。 进而考虑是要冗余…...

Python3 笔记:部分专有名词解释

1、python 英 /ˈpaɪθən/ 这个词在英文中的意思是蟒蛇。但据说Python的创始人Guido van Rossum(吉多范罗苏姆)选择Python这个名字的原因与蟒蛇毫无关系,只是因为他是“蒙提派森飞行马戏团(Monty Python's Flying Ci…...

javaAPI文档中文版(JDK11在线版)java帮助文档,掌握文档java学习事半功倍。

🌠个人主页 : 赶路人- - 🌌个人格言 : 要努力成为梧桐,让喜鹊在这里栖息。 要努力成为大海,让百川在这里聚积。 11.by,prep.凭,靠,沿 [baɪ] 12.press,v.按,压 [prɛs] 菜鸟教程javaAPI文档中文…...

移动端适配:vw适配方案

vw (Viewport Width) 是一种长度单位,代表视口宽度的百分比。1vw 等于视口宽度的1%。在网页设计和前端开发中,vw 单位常用于实现响应式设计和屏幕适配,尤其是针对不同尺寸和分辨率的移动设备。 为什么使用vw适配? 响应式: 使用v…...

实战Java虚拟机-实战篇

一、内存调优 1.内存溢出和内存泄漏 内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。内存泄漏绝大…...

力扣:349. 两个数组的交集

349. 两个数组的交集 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2]示例 2: …...

深度学习之基于Matlab的BP神经网络交通标志识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着智能交通系统(ITS)的快速发展,交通标志识别&#xff0…...

Linux备份服务及rsync企业备份架构(应用场景)

备份服务概述 备份服务:需要使用到脚本,打包备份,定时任务. 备份服务:rsyncd服务,不同主机之间数据传输. 特点: rsync是个服务也是命令使用方便,具有多种模式传输数据的时候是增量传输 增量与全量: 全量 :无论多少数据全部推…...

用手机打印需要下载什么软件

在快节奏的现代生活中,打印需求无处不在,无论是工作文件、学习资料还是生活小贴士,都可能需要一纸呈现。然而,传统的打印方式往往受限于时间和地点,让人倍感不便。今天,就为大家推荐一款便捷又省钱的手机打…...