• 正点原子MP157系统移植和根文件系统构建视频教程之uboot命令学习笔记


    本篇内容主要来自正点原子手册《【正点原子】STM32MP1嵌入式Linux驱动开发指南V2.0.pdf》10.3 U-Boot 命令使用,视频是第6.1讲到第6.6讲。

    目录

    1、下载第三方库

    2、基础命令

    2.1 修改环境命令

    2.2 md 命令

    2.3 nm命令

    2.4 MM 命令

    2.5 mw 命令

    2.6 CP 命令

    2.7 CMP 命令

    2.8 mmc

    3、网络类命令

    4、nfs命令

    5、从网络获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):

    6、从mmc的文件系统中获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):

    7、boot和bootm命令

    8、uboot镜像中静态配置ip serverip等地址:

    9、bootcmd和bootargs命令

    从文件系统格式的mmc中加载内核镜像和设备树文件,并启动(用bootcmd实现):

     网络下载,从虚拟机中获取内核镜像和设备树文件,并加载启动(用bootcmd实现):

    10、MII命令:

    11、其他命令

    11.1 ums

    11.2 reset:

    11.3 go:

    11.4 run:

    11.5 mtest


    1、下载第三方库

    首先需要在 Ubuntu 中安装一些库,否则编译 uboot 会报错,安装命令如下:
    sudo apt-get install libncurses5-dev bison flex

    2、基础命令

    2.1 修改环境命令

    1. setenv bootdelay 5   #uboot等待键盘响应的时间设置为5秒
    2. saveenv #保存环境变量

    2.2 md 命令

    用于显示内存值
    1. md.b C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个字节,100x10
    2. md.w C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个字(一个字是两个字节)
    3. md.l C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个双字

    2.3 nm命令

    nm 命令用于修改指定地址的内存值

    C0100000 表示现在要修改的内存地址, ea0000b8 表示地址 0xc0100000 现在的数据,‘?’后面就可以输入要修改后的数据 0x12345678 ,输入完成以后按下回车,然 后再输入‘q’即可退出。

    2.4 MM 命令

    mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用 nm
    命令的话地址不会自增。
    .l 格式修改从地址 0XC0100000 开始的连续 3 个内存块 (3*4=12 个字节) 的数据为 0X05050505

    2.5 mw 命令

    命令 mw 用于使用一个指定的数据填充一段内存。

    比如使用 .l 格式将以 0XC0100000 为起始地址的 0x10 个 内存块(0x10 * 4=64 字节 ) 填充为 0X0A0A0A0A ,命令如下:
    mw.l C0100000 0A0A0A0A 10

    2.6 CP 命令

    cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 NorFlash 中的数据拷贝到 DRAM 中。
    使用 .l 格式将 0xC0100000 处的地址拷贝到 0xC0100100 处,长度为 0x10 个 内存块(0x10 * 4=64 个字节 ) ,命令如下所示:
    cp.l c0100000 c0100100 10

    2.7 CMP 命令

    cmp 是比较命令,用于比较两段内存的数据是否相等。
    我们使用 .l 格式来比较 0xC0100000 0xC0100100 这两 个地址数据是否相等,比较长度为 0x10 个内存块 (16 * 4=64 个字节 ) ,命令如下所示:
    cmp.l c0100000 c0100100 10

    2.8 mmc

    uboot 支持 EMMC SD 卡,因此也要提供 EMMC SD 卡的操作命令。一般认为 EMMC 和 SD 卡是同一个东西.
    mmc 是一系列的命令,其后可以跟不同的参数,输入“? mmc ”即可查看 mmc 有关的命 令.

    3、网络类命令

    uboot网络配置:

    1. setenv ipaddr 192.168.2.20
    2. setenv ethaddr b8:ae:1d:01:01:00 #设置mac地址
    3. setenv gateway 192.168.2.1
    4. setenv netmask 255.255.255.0
    5. setenv serverip 192.168.2.129      #这是pc ubuntu虚拟机的ip地址
    6. saveenv
    7. dhcp
    dhcp 用于从路由器获取 IP 地址,前提是开发板得连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。
    执行完dhcp后,再ping serverip:ping 192.168.2.129

    说明:与开发板相连的pc端网卡口和vm虚拟出来的网卡同网段,并将他们桥接起来,这样在开发板uboot中才能ping同vm虚拟机。

    我的连接图大概是这样的:

    我的虚拟机仅仅增加了NAT网络适配器,没有添加桥接模式。此时虚拟机便能ping通百度了,如果不通,请执行udhcpc -i ens33,重新学习一个ip(其实ip地址不会变化),或者重启网络(/etc/init.d/network-manager restart),再ping。

    网卡VMware Network Adapter VMnet8和网卡“以太网”选择桥接之后,两个各自的IP地址便消失了,新生成的网卡“网桥”自动生成一个地址,该地址如果和虚拟机不是同网段,我们可以静态指定为同网段。

    pc端使用桥接方式可能导致win10系统经常蓝屏,报错bridge.sys,不建议使用该方式。有另一个方案可行且没风险,见链接:

    stm32mp157开发板平通pc虚拟机ubuntu系统,方便nfs挂载根文件系统_汉尼拔勇闯天涯的博客-CSDN博客

    4、nfs命令

    nfs C2000000 192.168.2.129:/home/wang/linux/nfs/uImage


    从192.168.2.129的ubuntu虚拟机中下载文件/home/wang/linux/nfs/uImage到开发板起始地址处:C2000000

    5、从网络获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现)

    1. mmc dev 1
    2. tftp C2000000 uImage #从虚拟机下载内核镜像文件uImage到开发板DDR中,ddr首地址是C2000000
    3. tftp C4000000 stm32mp157d-atk.dtb #从虚拟机下载设备树二进制文件stm32mp157d-atk.dtb到开发板DDR中,ddr首地址是C4000000
    4. bootm C2000000 - C4000000 #启动内核,内核首地址是C2000000,initrd地址没有设置,设备树地址为C4000000

    6、从mmc的文件系统中获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):

    1. mmc dev 1
    2. ext4ls mmc 1:2 #查看文件在dev 12分区中是否有文件uImage和stm32mp157d-atk.dtb
    3. ext4load mmc 1:2 C2000000 uImage
    4. ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb
    5. bootm C2000000 - C4000000

    7、boot和bootm命令

    ST 官方 uboot 并没有使能 boot 和 bootd 这两个命令,需要自行配置 uboot 来启动这两个命令,正点原子出厂系统已经使能了这两个命令。

    boot和bootd是同一个命令。

    bootm和bootz也是同一个命令,bootm针对uImage镜像内核,bootz针对zImage镜像内核。

    uboot文件include\configs\stm32mp1.h中定义该宏,即是打开了bootm和boot命令:
    #define CONFIG_CMD_BOOTD     /*boot和bootd命令使能*/ 

    #define CONFIG_CMD_BOOTD     /*boot和bootd命令使能*/

    8、uboot镜像中静态配置ip serverip等地址:

     在文件include\configs\stm32mp1.h中增加如下宏就行,虽然搜不到这些宏被调用的地方,但是不耽误他们编入镜像中。

    1. #define CONFIG_IPADDR    192.168.2.20
    2. #define CONFIG_GATEWAYIP 192.168.2.1
    3. #define CONFIG_NETMASK   255.255.255.0
    4. #define CONFIG_SERVERIP  192.168.2.129
    5. #define CONFIG_NET_RANDOM_ETHADDR  /*随机生成mac地址*/

     uboot启动时自动生成mac地址,但是该地址不会写入uboot参数中,即敲print命令看不到mac地址。

    9、bootcmd和bootargs命令

    bootcmd 保存着 uboot 默认命令,uboot 倒计时结束以后就会执行 bootcmd 中的命令。
    bootargs 保存着 uboot 传递给 Linux 内核的参数,比如指定 Linux 内核所使用的 console、指定根文件系统所在的分区等。

    从文件系统格式的mmc中加载内核镜像和设备树文件,并启动(用bootcmd实现):

    1. setenv bootcmd 'ext4load mmc 1:2 C2000000 uImage;ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
    2. saveenv
    3. boot

     网络下载,从虚拟机中获取内核镜像和设备树文件,并加载启动(用bootcmd实现):

    1. setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
    2. saveenv
    3. boot

    10、MII命令:


    在 STM32MP157 上是不能读取的,原因是 ST 官方提供的 uboot 中,每次网络通信完成以后会关闭 ETHMAC 时钟,所以 MII 命令就会无法工作。

    解决这个方法很简单,每次使用 MII 或者 MDIO 命令来操作 PHY 芯片的时候,先使能 ETHMAC 时钟。

    这样操作之后才能适用mii命令:

    1. STM32MP> mm 0x50000218
    2. 50000218: 00030000 ? 0x00030700
    3. 5000021c: 00030700 ? q
    4. STM32MP> mii info 0x4
    5. PHY 0x04: OUI = 0x0000, Model = 0x10, Rev = 0x0A, 100baseT, FDX

    11、其他命令

    11.1 ums

    在 uboot 下我们可以将开发板虚拟成一个 U 盘:
    ums 0 mmc 1


    11.2 reset:


    重启uboot

    11.3 go:


    跳转到制定地址处运行命令


    11.4 run:


    运行命令,例:

    1. setenv mycmd 'ext4load mmc 1:2 C2000000 uImage;ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'  #创建了名为mycmd的命令
    2. run mycmd

    11.5 mtest

    mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR.例:

    mtest c1000000 c2000000  #反复测试ddr地址范围c1000000-c2000000内的读写

  • 相关阅读:
    SwiftUI的认识与使用
    Scala基础【模板方法设计模式、基础面向对象编程】
    【JAVA基础】【查漏补缺】07 - 集合Collection和单列集合List
    洗地机哪个好?2023最好用的洗地机
    【中间件篇-Redis缓存数据库02】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)
    Promise, async, await实现异步编程,代码详解
    【教学类-20-01】20221203《世界杯16强国旗》(大班)
    qt基础之全局静态变量
    用户体验设计师是什么,一篇文章读懂!
    工程师如何对待开源 --- 一个老工程师的肺腑之言
  • 原文地址:https://blog.csdn.net/hannibaychty/article/details/126532758