RK3568学习笔记9:嵌入式Linux驱动开发之UBoot

Dr.Guo
发布于 2024-01-19 / 164 阅读
0
0

RK3568学习笔记9:嵌入式Linux驱动开发之UBoot

1. SDK包介绍

RK3568 SDK包中各文件夹的作用:

  • app:存放上层应用 app,包括 Qt应用程序,以及其它的 C/C++应用程序。
  • buildroot:基于 buildroot开发的根文件系统。
  • debian:基于 Debian开发的根文件系统。
  • device/rockchip: 存放各芯片板级配置 文件 和 Parameter文件,以及一些编译与打包固件的脚本和预备文件 。
  • docs:存放芯片模块开发指导文档、平台支持列表、芯片平台相关文档、 Linux开发指南等。
  • external:存放所需的第三方库,包括音频、视频、网络、 recovery等。
  • kernel: Linux 4.19版本内核源码。
  • prebuilts:存放交叉编译工具链。
  • rkbin:存放 Rockchip相关的 Binary和工具。
  • rockdev:存放编译输出固件,编译 SDK后才会生成该文件夹。
  • tools:存放 Linux和 Windows操作系统环境下常用的工具,包括镜像烧录工具、 SD卡升级启动制作工具、批量烧录工具等,譬如前面给大家介绍的 RKDevTool工具以及Linux_Upgrade_Tool工具在该目录下均可找到。
  • u-boot:基于 v2017.09版本进行开发的 uboot源码。
  • yocto:基于 Yocto开发的根文件系统。

2. U-Boot

2.1 U-Boot 介绍

Linux 系统要启动需要通过 bootloader 程序引导,也就说芯片上电以后先运行一段 bootloader程序。这段 bootloader程序会先初始化 DDR等外设,然后将 Linux内核从 flash (NAND NOR FLASH SD EMMC 等 )拷贝到 DDR 中,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核, bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样, bootloader 就相当于 BIOS。所以我们要先搞定 bootloader,很庆幸,有很多现成的 bootloader 软件可以使用,比如 U-Boot、 vivi、 RedBoot 等等,其中以 U-Boot 使用最为广泛,为了方便书写,本教程会将 U-Boot 写为 uboot。

uboot 的全称是 Universal Boot Loader, uboot 是一个遵循 GPL 协议的开源软件, uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、 USB等高级功能。

一般来说,我们不直接用uboot官方源码,官方的源码是给芯片厂商使用的,我们用厂商优化修改后的uboot包

RK3568的uboot包在SDK的u-boot文件夹下。

2.2 U-Boot编译

可以在SDK文件夹下使用 ./build.sh uboot 编译,然后使用 rkflash脚本烧写。

2.3 U-Boot启动过程

U-Boot的启动过程需要在串口中查看,所以要连接MobaXterm工具,然后复位开发板,然后按住“CTRL-C”键,然后进入uboot命令行模式。

uboot打印信息如下:

  1. uboot版本号,比如图 3.2.2.1中当前 uboot版本号是 2017.09,编译时间为 2023年 5月11号 11:59:33。
  2. 板子信息,当前板子是瑞芯微的 RK3568 Evaluation开发板,这个信息是可以改的,因为正点原子 ATK-DLRK3568开发板是直接参考瑞芯微官方的 RK3568开发板移植的 uboot,所以这部分信息也就没改。
  3. DDR大小为 4GB(请参考根据个人开发板的配置,有可能为 2G/4G等)
  4. EMMC启动设备信息。
  5. PMIC芯片 (RK809)信息。
  6. DRM信息,也就是屏幕信息。
  7. RK3568芯片时钟信息。

2.4 U-Boot 命令

  1. 查询命令
    常用的和信息查询有关的命令有3 个: bdinfo、 printenv 和 version
  2. 环境变量操作
    环境变量的操作涉及到两个命令: setenv 和 saveenv
  3. 内存操作指令
  • md:显示指定地址内存值
  • nm: 修改指定地址的内存值
  • mm: 修改指定地址的内存值。命令也是修改指定地址内存值的,使用 mm修改内存值的时候地址会自增,而使用 nm命令的话地址不会自增。
    mw: 使用一个指定的数据填充一段内存
    cp :数据拷贝。是数据拷贝命令,用于将 DRAM中的数据从一段内存拷贝到另一段内存中,或者把NorFlash中的数据拷贝到 DRAM
    cmp: 比较命令,是比较命令,用于比较两段内存的数据是否相等
  1. 网络操作命令
    设置uboot的网络参数:
setenv ipaddr 192.168.6.38 
setenv ethaddr b8:ae:1d:01:01:00 //有的 uboot会默认设置 ethaddr,然后禁止修改 RK3568是禁止修的,所以这个我们可以不用设置
setenv gatewayip 192.168.6.1 
setenv netmask 255.255.255.0 
setenv serverip 192.168.6.227 
saveenv

网络操作命令如下:

ping: 注意!只能在 uboot中 ping其他的机器,其他机器不能 ping uboot,因为 uboot没有对 ping命令 做 处理,如果用其他的机器 ping uboot的话会失败!
dhcp: dhcp用于从路由器获取 IP地址,前提是开发板得连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp命令就会失效。直接输入 dhcp命令即可通过路由器获取到 IP地址,
nfs: nfs(Network File System)网络文件系统,通过 nfs可以在计算机之间通过网络来分享资源
tftp: tftp命令的作用和 nfs命令一样,都是用于通过网络下载东西到 DRAM中,只是 tftp命令使用的是 TFTP协议, Ubuntu主机作为 TFTP服务器。因此需要在 Ubuntu上搭建 TFTP服务器,需要安装 tftp-hpa和 tftpd-hpa

  1. EMMC和 SD卡操作命令

uboot支持 EMMC和 SD卡,因此也要提供 EMMC和 SD卡的操作命令。一般认为 EMMC和 SD卡是同一个东西,所以没有特殊说明,本教程统一使用

指令详情

指令描述
mmc info输出MMC设备信息
mmc read读取MMC中的数据
mmc write向MMC设备写入数据。
mmc rescan扫描MMC设备。
mmc part列出MMC设备的分区。
mmc dev切换MMC设备
mmc list列出当前有效MMC设备
mmc hwpartition设置MMC设备分区

2.5 EXT格式文件系统操作命令

uboot有 ext2和 ext4这两种格式的文件系统的操作命令, RK3568的系统镜像都是 ext4格式的

指令详情

指令描述
ext4ls命令用于查询 EXT4格式设备的目录和文件信息
ext4load命令用于将指定的文件读取到 DRAM

2.6 BOOT操作命令

uboot的本质工作是引导 Linux,所以 uboot肯定有相关的 boot(引导 )命令来启动 Linux。常用的跟 boot有关的命令有: boot_fit和 boot。

指令详情

指令描述
boot_fit大家如果学过 I.MX6U或者 STM32MP1的话,应该知道 uboot使用 bootm或者 bootz这两个命令启动内核,需要提供 Linux编译出来的 zImage或 uImage以及设备树文件,然后使用bootm或 bootz启动。但是 RK3568最终的系统烧写文件只有一个 boot.img Image和设备树文件全部打包进 boot.img这一个文件里面,所以就不能用 bootm或 bootz,要用到 boot_fit
boot/bootd命令,此命令也是用来启动 Linux系统的,只是 boot会读取环境变量 bootcmd来启动 Linux系统, bootcmd是一个很重要的环境变量!其名字分为“

2.7 其他命令

指令详情

指令描述
reset复位重启
go跳转到指定地址执行应用
run运行环境变量中定义的命令

2.8 MII命令

MII命令是网络相关命令,主要用于读取网络 PHY芯片寄存器,在 uboot中调试网络 PHY芯片的时候非常有用

指令详情

指令描述
mii device列出可用设备
mii device 设置当前设备
mii info 显示设备信息
mii read 读取指定地址的数据
mii write 在指定位置写数据
mii dump 直接打印出 PHY的 0~5寄存器值,输入如下命令:

评论