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打印信息如下:
- uboot版本号,比如图 3.2.2.1中当前 uboot版本号是 2017.09,编译时间为 2023年 5月11号 11:59:33。
- 板子信息,当前板子是瑞芯微的 RK3568 Evaluation开发板,这个信息是可以改的,因为正点原子 ATK-DLRK3568开发板是直接参考瑞芯微官方的 RK3568开发板移植的 uboot,所以这部分信息也就没改。
- DDR大小为 4GB(请参考根据个人开发板的配置,有可能为 2G/4G等)
- EMMC启动设备信息。
- PMIC芯片 (RK809)信息。
- DRM信息,也就是屏幕信息。
- RK3568芯片时钟信息。
2.4 U-Boot 命令
- 查询命令
常用的和信息查询有关的命令有3 个: bdinfo、 printenv 和 version - 环境变量操作
环境变量的操作涉及到两个命令:setenv
和 saveenv - 内存操作指令
md
:显示指定地址内存值nm
: 修改指定地址的内存值mm
: 修改指定地址的内存值。命令也是修改指定地址内存值的,使用 mm修改内存值的时候地址会自增,而使用 nm命令的话地址不会自增。
mw
: 使用一个指定的数据填充一段内存
cp
:数据拷贝。是数据拷贝命令,用于将 DRAM中的数据从一段内存拷贝到另一段内存中,或者把NorFlash中的数据拷贝到 DRAM
cmp
: 比较命令,是比较命令,用于比较两段内存的数据是否相等
- 网络操作命令
设置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
- 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寄存器值,输入如下命令: |