概述

迅为iTOP-4412开发板采用的CPU芯片为三星的exynos4412,开发板分为三种:(1)POP封装+1GB内存(2)SCP封装+1GB内存(3)SCP封装+2GB内存。笔者用的是SCP 1GB精英版(elite)。

迅为开发板自带的光盘里面,有Android系统、QT系统、Qtopia系统和Ubuntu系统的源代码和镜像,但是却唯独没有Linux最小系统的源码和镜像

操作系统 uboot所在文件夹 linux内核所在文件夹 根文件系统所在文件夹
Android 镜像3,源码6 镜像3,源码6 镜像3,源码7
QT 镜像4,源码6 镜像4,源码6 镜像4,源码8
Qtopia 镜像3或4,源码6 镜像4,源码6 源码8
Ubuntu 镜像5,源码6 镜像5,源码6 镜像5
iTOP-4412开发板配套光盘资料01_PCB_SCH_DATASHEET--配套原理图、PCB、Datasheet
02_编译器以及烧写工具--uboot、kernel以及QtE文件系统交叉编译工具--烧写工具fastboot--USB转串口驱动、ADB驱动
03_镜像_Android4.0.3文件系统--二进制文件:Android4.0.3文件系统--二进制文件:文件系统对应的uboot和kernel
04_镜像_QT文件系统--二进制文件:QtE4.7文件系统--二进制文件:文件系统对应的uboot和kernel
05_镜像_Ubuntu文件系统--二进制文件:Ubuntu文件系统(arm)--二进制文件:文件系统对应的uboot和kernel
06_源码_uboot和kernel--源码:uboot以及kerne源码
07_源码_Android文件系统--源码:Android4.0.3文件系统
08_源码_QtE文件系统--源码:QtE4.7文件系统--补丁包:QtE4.7对应的tslib触摸库
iTOP-4412开发板之xxx使用手册_Vx.x.pdf--开发板配套使用手册,xxx代表精英版或者全能版;Vx.x表示版本,以用户拿到的版本为准
光盘目录说明.txt

迅为的百度网盘资料里面倒是有一个文件夹叫做搭建最小linux系统,他搭建的是根文件系统,但是他说uboot和linux内核使用和QT系统一样的uboot和内核即可。而QT系统用的uboot是Android4.0.3的uboot。所以这个搭建出来的所谓的linux最小系统就是个“四不像”。uboot是for android的,linux内核是QT系统的(而且是老版本,不支持设备树),只有根文件系统是用busybox原生编译出来的,只能暂且称他为最小QT系统!
另外,迅为uboot里面启动linux内核时,读存储器用的不是mmc read命令,而是movi read命令。movi read命令后面接的参数是数据名称和目标内存地址,如movi read kernel 30008000,参数中写的不是存储器的扇区号和数据大小,而是数据的名称!那这个movi命令到底是从哪个扇区读取多大的数据呢?
笔者打开uboot官网下载的2010.3版本发现,里面并没有movi命令。后面又下载了几个其他的uboot版本,也没有发现movi命令。倒是在迅为提供的uboot源码包iTop4412_uboot_20180320.tar里面发现了iTop4412_uboot/common/cmd_movi.c,里面都是跟4212 4412相关的代码,用了一个image数组表示了数据名称和起始扇区号、数据大小的对应关系。
根据代码风格,笔者现在严重怀疑movi命令是迅为自创的命令,而非uboot官方的命令!

因此,笔者特意写了本教程,教大家如何在迅为exynos4412开发板上搭建原生uboot+linux内核+busybox根文件系统。如何在开发板上的eMMC Flash为空的情况下,用linux系统的dd命令将uboot、linux内核和根文件系统烧写到开发板中,烧写的文件名和目标扇区是什么。最小linux系统运行起来后,笔者还会教大家如何运行hello world C程序,如何操作GPIO点亮开发板上的两个LED灯,读取按键的状态,以及读取ADC转换结果,如何移植电脑linux系统里面的软件包到开发板上运行,如何让我们的最小linux系统利用板上的有线网口连上网络。

项目 版本 文件名 目标扇区 烧写命令 编译命令
uboot 2017.11 u-boot-iTOP-4412.bin 1 sudo dd iflag=dsync oflag=dsync if=u-boot-iTOP-4412.bin of=/dev/sdb seek=1 (1) make menuconfig
(2) make
(3) dd if=/dev/zero of=env.bin count=16
(4) cat E4412_N.bl1.bin itop4412-spl.bin env.bin u-boot.bin > u-boot-iTOP-4412.bin
linux内核 4.14.2 uImage 4096(可自定义) sudo dd iflag=dsync oflag=dsync if=arch/arm/boot/uImage of=/dev/sdb seek=4096 (1) make exynos_defconfig
(2) make menuconfig
(3) make uImage LOADADDR=0x40007000
linux设备树 4.14.2 myexynos4412-itop-elite.dtb 2048(可自定义) sudo dd iflag=dsync oflag=dsync if=arch/arm/boot/dts/myexynos4412-itop-elite.dtb of=/dev/sdb seek=2048 make dtbs
busybox根文件系统 1.26.2 busybox编译完成后
将_install文件夹里面的所有文件复制到SD卡的一个ext4分区里
内核启动时直接挂载这个分区
(1) make defconfig
(2) make menuconfig ARCH=arm
(3) make
(4) make install

注:
(1)SD卡每个扇区的大小为512字节,起始扇区为0。
(2)迅为提供的linux内核为3.0版本,是不支持设备树的版本,所以只需要烧写uboot+linux内核+文件系统即可。
         我们这里用的linux内核为4.14版本,是支持设备树的,所以需要烧写uboot+linux内核+linux设备树+文件系统这四样东西。
(3)内核镜像既可以选择烧写uImage,也可以选择烧写zImage。若选择了uImage,那么uboot的内核启动命令是bootm;若选择了zImage,那么uboot的内核启动命令是bootz。

给SD卡分区

迅为教程里面是用fastboot工具,插micro USB线,在线烧写uboot、linux内核和根文件系统。由于fastboot是安卓里面的工具,一旦我们擦除了安卓系统内核,安装了linux最小系统,fastboot工具就没了。并且本文讨论的是如何搭建最小linux系统,不能跟安卓扯上关系,所以本文不使用fastboot作为烧写工具。迅为给SD卡分区,是要板子成功启动linux内核后,在命令行里面执行fdisk命令。

一开始,我们板子上的eMMC是空白的,没有任何内容,板子是无法启动的。eMMC为空,就没有fastboot,现在micro USB线插上去也用不了。我们可以准备一张SD卡,事先在电脑上分好区,烧写好uboot、linux内核、linux设备树和busybox文件系统,然后插到板子上,让板子从SD卡启动。

笔者电脑虚拟机里面装的是Fedora 34系统,用的是GNOME桌面环境。现在最新版本的Ubuntu也是用的GNOME桌面环境。Ubuntu和Fedora用的软件包管理工具是不一样的。Ubuntu用的是apt-get,而Fedora用的是dnf。除了这一点,其他方面都差不多,笔者比较习惯用Fedora系统。
笔者用的SD卡的容量为32GB。用一个USB读卡器,将SD卡插在电脑上,然后插入虚拟机。在GNOME桌面环境里面有一个名叫Disks的分区软件,如下图所示。

打开软件后,找到我们的32GB的内存卡,如下图所示,是31 GB Drive,Generic STORAGE DEVICE。这张内存卡整个被一个31GB的FAT32分区占据。确保这里面没有重要的资料,点击减号按钮,将这个分区删除。
为什么要删除这个分区呢?这是因为,exynos4412选择SD卡启动后,一开机,他读的就是SD卡的1号扇区,这是我们无法改变的。因此我们必须把uboot烧写到1号扇区这里。为了使用1号扇区,以及后面的空间,我们只好把这个最大的分区删除掉。

确认删除最大的那个分区:

现在整张内存卡没有分区了,变成了Free Space。我们点击加号按钮,新建分区:

建立一个1.5GB的分区(大小可以根据自己的需要调整)。这个分区要用来保存uboot(1号扇区处)、linux设备树(2048号扇区处)和linux内核(4096号扇区处),所以我们不要格式化这个分区,文件系统要选择No Filesystem:

然后,在后面建立一个ext4分区,用于挂载根文件系统,最后再添加一个FAT32分区。这两个分区的容量可以根据自己的需要随意调整。FAT32分区是供Windows系统使用的,可要可不要。

这里的FAT其实指的是FAT32:

最终分好区后是这样的:

三个分区的设备名分别为/dev/sdb1、/dev/sdb2和/dev/sdb3,所以这张SD卡在这个Linux虚拟机里面的名称就叫/dev/sdb。

使FAT32分区能在Windows系统下使用

我们创建FAT分区的目的就是为了给Windows系统使用。
这样分完区后,Win10系统下倒是没问题,插上读卡器后会有U盘盘符出现。但是Win7和WinXP系统下却不行,系统无法识别第一个分区的内容,尽管第三个分区是可识别的,但是“我的电脑”中不会显示出盘符。
为了解决这个问题,FAT分区必须调整到Partition 2的位置,所有分区创建完之后,必须把Partition 1删掉,变成Free Space,如下图所示。这样修改之后,Win7下就能使用FAT32分区了。

选择交叉编译器

下载交叉编译器的网站有两个:
(1)GNU Toolchain | GNU-A Downloads – Arm Developer
(2)Linaro Releases

通常,交叉编译器是在arm的网站里面下载。如果这个网站里面找不到自己CPU的编译器,那么就去第二个网站linaro里面下载。linaro里面的编译器种类比较全,而且近几年所有的版本都在里面,如下图所示。

经过笔者测试,arm网站和linaro网站都有能用于exynos4412的编译器。linaro网站里面的gcc-linaro-7.5.0-2019.12-i686_arm-eabi.tar.gz是可以用于编译exynos4412的uboot和linux内核的。
我们优先选择arm网站里面的编译器,打开arm网站后,出现的画面如下:

请大家一定要看仔细了,上面一定要选择GNU-A,不要选到GNU-RM那里去了。我们的exynos4412芯片是ARM-A系列的芯片,像stm32那种单片机才是ARM-M类型的芯片。
目前最新的编译器版本是10.3-2021.07。对于不同的编译环境,运行环境,网站里面都有相应的编译器可供选择。
Windows (mingw-w64-i686) hosted cross compilers栏目里面的编译器适用于Windows 64位编译环境,也就是电脑是Windows 64位的。
x86_64 Linux hosted cross compilers栏目里面的编译器适用于Linux 64位编译环境。
AArch64 Linux hosted cross compilers栏目里面的编译器适用于直接在ARM芯片上编译的编译环境,也就是直接在板子上编译程序,这就很神奇了。
Sources栏目是编译器的源码。

可以看到,这里面是没有适用于32位编译环境的编译器的。如果电脑是32位的话,那就只有去linaro的网站里面看看了。
对于Windows电脑,其实不用安装虚拟机,就可以使用Windows (mingw-w64-i686) hosted cross compilers栏目里面的编译器,在命令行里面直接编译exynos4412的程序,如下图所示。然后把程序复制到SD卡里面,板子插好SD卡后开机,就能运行程序。
(笔者试过了,32位的Windows 7电脑上,也能使用这个编译器)

不过我们通常的做法是在Windows的电脑里装一个Linux的虚拟机,然后选择Linux的编译器来编译代码。
笔者安装的Linux虚拟机是64位的Fedora 34,于是去x86_64 Linux hosted cross compilers栏目里面寻找,如下图所示。

hosted表示的是在哪个系统下编译程序,x86_64 Linux hosted cross compilers的中文意思是:编译环境为64位Linux系统的交叉编译器。
target表示的是编译出来的程序要在哪个平台下运行。
AArch32 bare-metal target (arm-none-eabi) 是说运行环境是32位的ARM芯片,且编译的是裸机(bare-metal)程序。
AArch32 target with hard float (arm-linux-none-gnueabihf) 同样是运行环境为32位的ARM芯片,但他带了linux字样,说明是用于编译linux下的应用程序的。
AArch64 ELF bare-metal target (aarch64-none-elf) 是编译64位ARM芯片的裸机程序的。
AArch64 GNU/Linux target (aarch64-none-linux-gnu) 是编译64位ARM芯片的Linux应用程序的。
AArch64 GNU/Linux target (aarch64_be-none-linux-gnu) 也是编译64位ARM芯片的Linux应用程序的,但是程序采用的字节序为大端序(be是big endian的缩写)。

上面所说的编译器里面,不带linux字样的,只能编译裸机程序。uboot、linux内核、linux模块属于裸机程序。
带linux字样的,既可以编译裸机程序,又可以编译linux应用程序。也就是说uboot、linux内核、linux驱动、busybox文件系统里面的程序,都能编译。

exynos4412是32位小端序(little endian)的CPU,所以我们最终选择了gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz这个编译器。下面那个asc文件大小只有几十字节,只是一个校验和,不用下载。
下载下来后解压,我们后面要用到的就是bin文件夹下的arm-none-linux-gnueabihf-gcc。

编译并运行uboot

uboot的移植过程比较复杂,要修改很多代码,我们直接采用这位CSDN博主的成果:iTop-4412精英版的u-boot-2017.11移植教程(一)_hyyoxhk的博客-CSDN博客

下载下来后的文件名是u-boot-2017.11-itop4412-2.0.0.tar.gz,解压,然后打开u-boot-2017.11/Makefile文件,将我们用的编译器的路径填到CROSS_COMPILE上面去:
CROSS_COMPILE := /home/oct1158/Downloads/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-

然后用u-boot文件夹下的build.sh脚本编译uboot:

[oct1158@fedora u-boot]$ pwd
/home/oct1158/Downloads/u-boot-2017.11-itop4412-2.0.0/u-boot
[oct1158@fedora u-boot]$ ./build.shHOSTCC  scripts/basic/fixdepHOSTCC  scripts/kconfig/conf.oSHIPPED scripts/kconfig/zconf.tab.cSHIPPED scripts/kconfig/zconf.lex.cSHIPPED scripts/kconfig/zconf.hash.cHOSTCC  scripts/kconfig/zconf.tab.oHOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
scripts/kconfig/conf  --silentoldconfig KconfigCHK     include/config.hUPD     include/config.hCFG     u-boot.cfgGEN     include/autoconf.mk.depCFG     spl/u-boot.cfgGEN     include/autoconf.mkGEN     spl/include/autoconf.mkCHK     include/config/uboot.releaseCHK     include/generated/timestamp_autogenerated.hHOSTCC  scripts/dtc/dtc.oUPD     include/generated/timestamp_autogenerated.hHOSTCC  scripts/dtc/flattree.oUPD     include/config/uboot.releaseHOSTCC  scripts/dtc/fstree.oHOSTCC  scripts/dtc/data.oHOSTCC  scripts/dtc/livetree.oCHK     include/config.hCFG     u-boot.cfgHOSTCC  scripts/dtc/treesource.oCHK     include/generated/version_autogenerated.hUPD     include/generated/version_autogenerated.hCC      lib/asm-offsets.sHOSTCC  scripts/dtc/srcpos.oCC      arch/arm/lib/asm-offsets.sHOSTCC  scripts/dtc/checks.oHOSTCC  scripts/dtc/util.oCHK     include/generated/generic-asm-offsets.hUPD     include/generated/generic-asm-offsets.hCHK     include/generated/asm-offsets.hUPD     include/generated/asm-offsets.hSHIPPED scripts/dtc/dtc-lexer.lex.cSHIPPED scripts/dtc/dtc-parser.tab.hSHIPPED scripts/dtc/dtc-parser.tab.cHOSTCC  scripts/dtc/dtc-lexer.lex.oHOSTCC  scripts/dtc/dtc-parser.tab.oLDS     u-boot.ldsHOSTLD  scripts/dtc/dtc
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
make[2]: *** [scripts/Makefile.host:108: scripts/dtc/dtc] Error 1
make[1]: *** [scripts/Makefile.build:425: scripts/dtc] Error 2
make: *** [Makefile:493: scripts] Error 2
cp: cannot stat 'u-boot.bin': No such file or directory
copy u-boot.bin done.
notice: not found itop4412-spl.bin !
[oct1158@fedora u-boot]$

提示multiple definition of `yylloc'。解决方案是在刚才的Makefile里面添加一句HOSTCFLAGS  += -fcommon,如下图所示。

现在就能编译成功了:

然后,执行sudo ./mkuboot.sh /dev/sdb命令,将uboot烧写到SD卡的一号扇区。/dev/sdb就是我们的SD卡的设备名称。

在Linux系统中安全弹出SD卡,然后拔掉读卡器,将SD卡插到开发板上。

请注意板上的红色拨码开关的设置。1和2设置的是启动方式,3和4选择的是屏幕接口。
当1拨到上面,2拨到下面时是从SD卡启动。当1拨到下面,2拨到上面时是从eMMC启动。我们现在是要从SD卡启动。

打开开发板电源后,我们可以从UART2看到uboot输出的调试信息:

备注:Tera Term的字体设置是SimSun-ExtB Regular 12。

我们来讲一下exynos4412的内存编址。
exynos4412芯片内有一个64KB的iROM(只读)和一个256KB的iRAM,芯片外可以扩展两个DRAM,每个DRAM容量不能超过1.5GB。如下表所示。
SCP 1G板子上,只插了DRAM0,内存类型为DDR3,容量为1GB。

名称 地址范围 大小 说明
iROM 0x00000000~0x0000ffff 64KB 只读,存放的是BL0程序
iRAM 0x02020000~0x0205ffff 256KB 可读写
DRAM0 0x40000000~0x9fffffff 1.5GB
DRAM1 0xa0000000~0xffffffff 1.5GB

exynos4412芯片的启动过程(假设OM引脚选的是SD卡):
(1) 运行iROM中的BL0程序:将SD卡的第1~16扇区(共8KB)存放的BL1程序(E4412_N.bl1.bin)复制到iRAM中(0x02021400~0x020233ff)。BL1是三星公司提供的,无源码。
(2) 运行iRAM中的BL1程序:将SD卡的第17~48扇区(共16KB)存放的BL2_SPL程序(itop4412-spl.bin)复制到iRAM中(0x02023400~0x020273ff)。BL2_SPL是我们自己的uboot程序的SPL部分。然后,检查BL2_SPL程序第14332字节(14KB-4)处的4字节校验和是否正确(见Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.01.pdf的3 INTERNAL MEMORY MAP那一节说明)。也就是说,BL2_SPL程序不能超过14332字节。
(3) 运行iRAM中的BL2_SPL程序(即uboot spl,全称是Secondary Program Loader):
     程序入口为arch/arm/cpu/armv7/vectors.S的_start标号。
     通过“b reset"指令跳转到arch/arm/cpu/armv7/start.S的reset标号。
     再通过“bl _main”指令跳转到arch/arm/lib/crt0.S的_main标号。
     接着通过“mov r0, #0”和“bl board_init_f”调用C语言函数board_init_f(0),board_init_f函数位于arch/arm/mach-exynos/spl_boot.c
     调用copy_uboot_to_ram()函数,将uboot的完整版内容(完整的BL2程序:u-boot.bin)从SD卡复制到DDR3内存的0x43e00000地址处,然后跳转到DDR3内存中执行完整的uboot程序:(*uboot)()
(4) 运行DDR3内存中的BL2程序:
     程序入口为arch/arm/cpu/armv7/vectors.S的_start标号。
     通过“b reset"指令跳转到arch/arm/cpu/armv7/start.S的reset标号。
     再通过“bl _main”指令跳转到arch/arm/lib/crt0.S的_main标号。
     接着通过“mov r0, #0”和“bl board_init_f”指令调用C语言函数board_init_f(0),board_init_f函数位于common/board_f.c。在board_init_f函数中通过initcall_run_list(init_sequence_f)语句调用了init_sequence_f函数指针数组里面的所有函数。(最后board_init_f函数会返回,不会hang(),不要被代码迷惑了)
     接下来,将uboot代码从DDR3内存的低地址拷贝到顶端地址,然后跳转到拷贝后的位置继续运行uboot。这个过程叫做relocation。(也就是换个地方继续运行剩余的代码)
     最后通过“ldr pc, =board_init_r”指令调用C语言函数board_init_r函数,board_init_r函数位于common/board_r.c。在board_init_r函数中通过initcall_run_list(init_sequence_r)语句调用了init_sequence_r函数指针数组里面的所有函数,其中最后一个函数就是run_main_loop(进入uboot命令行)。
(5) uboot的5秒倒计时完毕后,执行uboot bootcmd环境变量中存储的命令:使用mmc read命令将SD卡的第4096扇区存放的Linux内核、以及第2048扇区存放的Linux设备树复制到DDR3内存中,然后用bootm或bootz命令运行内核。

其中,BL0和BL1是三星公司提供的两段不开放源代码的程序,BL2_SPL就是我们的uboot的spl部分。我们编译出来的u-boot-iTOP-4412.bin文件是“BL1+BL2_SPL+uboot环境变量存储区+BL2”的组合,所以,我们必须将这个文件烧写到SD卡的第一个扇区处。Linux内核和设备树的存放位置分别为第4096和第2048扇区,这两个位置是由uboot的bootcmd环境变量决定的,是可以修改的。

build.sh脚本的内容如下:

#!/bin/bashcd ../u-boot-2017.11/if [ ! -f .config ]
thenmake itop4412_defconfig
fimake -j4cp u-boot.bin ../u-boot/
echo "copy u-boot.bin done."cd spl/
if [ ! -f itop4412-spl.bin ] ; thenecho "notice: not found itop4412-spl.bin !"exit 0
elseecho "copying itop4412-spl.bin..."
ficp itop4412-spl.bin ../../u-boot/
echo "copy u-boot-spl.bin done."echo "build success !!!"

其中最重要的两条命令,就是make itop4412_defconfig和make -j4(四线程编译)。

mkuboot.sh脚本的内容如下:

#!/bin/bashif [ ! -f E4412_N.bl1.bin ] ; thenecho "not find files: E4412_N.bl1.bin !!!"exit 0
fiif [ ! -f env.bin ] ; thenecho "not find files: env.bin !!!"exit 0
ficat E4412_N.bl1.bin itop4412-spl.bin env.bin u-boot.bin > u-boot-iTOP-4412.binif [ -f u-boot-iTOP-4412.bin ] ; thenecho "created u-boot-iTOP-4412.bin success!!!"
elseecho "created u-boot-iTOP-4412.bin failed!!!"exit 0
fiecho "writting ..."if [ -z $1 ] ; thendd iflag=dsync oflag=dsync if=u-boot-iTOP-4412.bin of=/dev/sdb seek=1
elsedd iflag=dsync oflag=dsync if=u-boot-iTOP-4412.bin of=$1 seek=1
fiecho "writting success"

脚本中先用cat命令将几个bin文件(BL1和BL2_SPL,以及env.bin和BL2)合并成一个文件,然后用dd命令烧写到SD卡的1号扇区(请注意SD卡的起始扇区是0号扇区,不是1号扇区)。
dd命令的if参数是要烧写的文件名,of参数是目标设备,seek参数表示从哪一个扇区开始烧写。我们的u-boot-iTOP-4412.bin文件大小为400864字节,占了783个扇区,所以dd命令实际烧写是扇区1~783。
env.bin的内容为全0,大小为8192字节(8KB),这个区域是用来存放uboot环境变量的。只要这些数据不能通过CRC校验,uboot就会采用源码头文件include/configs/itop4412.h里面的环境变量值。若能通过CRC校验,就采用env.bin里面的环境变量值。

在uboot中,可以使用help命令查看uboot支持的所有命令:

u-boot # help
?       - alias for 'help'
base    - print or set address offset
bdinfo  - print Board Info structure
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootefi - Boots an EFI payload from memory
bootelf - Boot from an ELF image in memory
bootm   - boot application image from memory
bootvx  - Boot vxWorks from an ELF image
bootz   - boot Linux zImage image from memory
cmp     - memory compare
coninfo - print console devices and information
cp      - memory copy
crc32   - checksum calculation
dcache  - enable or disable data cache
dfu     - Device Firmware Upgrade
dm      - Driver model low level access
echo    - echo args to console
editenv - edit environment variable
env     - environment handling commands
erase   - erase FLASH memory
exit    - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls  - list files in a directory (default /)
ext4load- load binary file from a Ext4 filesystem
ext4ls  - list files in a directory (default /)
ext4size- determine a file's size
ext4write- create a file in the root directory
false   - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls   - list files in a directory (default /)
fatsize - determine a file's size
fatwrite- write file into a dos filesystem
fdt     - flattened device tree utility commands
flinfo  - print FLASH memory information
fstype  - Look up a filesystem type
go      - start application at address 'addr'
gpt     - GUID Partition Table
help    - print command description/usage
icache  - enable or disable instruction cache
iminfo  - print header information for application image
itest   - return true/false on integer compare
load    - load binary file from a filesystem
loadb   - load binary file over serial line (kermit mode)
loads   - load S-Record file over serial line
loadx   - load binary file over serial line (xmodem mode)
loady   - load binary file over serial line (ymodem mode)
loop    - infinite loop on address range
ls      - list files in a directory (default /)
md      - memory display
mii     - MII utility commands
mm      - memory modify (auto-incrementing address)
mmc     - MMC sub system
mmcinfo - display MMC info
mw      - memory write (fill)
nm      - memory modify (constant address)
part    - disk partition related commands
printenv- print environment variables
protect - enable or disable FLASH write protection
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
save    - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv  - set environment variables
setexpr - set environment variable as the result of eval expression
showvar - print local hushshell variables
size    - determine a file's size
source  - run script from memory
test    - minimal test like /bin/sh
thordown- TIZEN "THOR" downloader
true    - do nothing, successfully
ums     - Use the UMS [USB Mass Storage]
version - print monitor, compiler and linker version

这个uboot比迅为提供的那个for android的uboot支持的命令多得多。迅为那个for android的uboot只有零星几个命令,连mmc read这么重要的命令都不支持的。

用version命令可以看到编译uboot的编译器的版本,以及编译时间:

u-boot # version
U-Boot 2017.11 (Aug 26 2021 - 23:02:28 +0800) for itop-4412arm-none-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621
GNU ld (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 2.36.1.20210621

用printenv命令可以打印出所有的环境变量的值,其中bootcmd是最重要的环境变量,他决定了开机5秒倒计时过去后要执行怎样的命令启动Linux内核。

u-boot # printenv
arch=arm
baudrate=115200
board=itop4412
board_name=itop4412
bootargs=console=ttySAC2,115200n8 earlyprintk
bootcmd=if mmc rescan; then echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loadbootscript; then run bootscript; fi; fi;mmc read ${loadaddr} 0x1000 0x4000; mmc read ${dtb_addr} 0x800 0xa0; bootm ${loadaddr} - ${dtb_addr}load mmc ${mmcdev} ${loadaddr} uImage; load mmc ${mmcdev} ${dtb_addr} ${dtb_name}; bootm ${loadaddr} - ${dtb_addr}
bootdelay=5
bootenv=uEnv.txt
bootscript=echo Running bootscript from mmc${mmcdev} ...; source ${loadaddr}
console=ttySAC2,115200n8
cpu=armv7
dtb_addr=0x41000000
dtb_name=exynos4412-itop-4412.dtb
fdtcontroladdr=7feb1640
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
kerneladdr=0x40007000
loadaddr=0x40007000
loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}
loadbootscript=load mmc ${mmcdev} ${loadaddr} boot.scr
mmcdev=0
ramdiskaddr=0x48000000
rdaddr=0x48000000
soc=exynos
vendor=samsungEnvironment size: 1174/8188 bytes

[下一篇]


笔者推荐一下xhr_embedded这位csdn大佬,他移植了2020年新版本的u-boot-2020.07、linux-5.8.5和BusyBox-1.31.1,比笔者用的版本新的多。
他移植的uboot还支持emmc启动。
[2020.09.12 - xhr4412] 移植 u-boot-2020.07 & linux-5.8.5 & BusyBox-1.31.1 到 iTOP-4412 汇总

【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(一)相关推荐

  1. 嵌入式Linux系统环境搭建全流程-4412友善之臂开发板

    4412友善之臂开发板-Linux系统环境搭建全流程 ​ 没错,这篇确实值得一看!可能是由于我稍微会一点点哈,就有好多小伙伴就找我帮他们搭建环境,但Linux中的以及开发版连接,与烧写程序中的整个环境 ...

  2. 【迅为资料上新】iTOP-3568开发板指南手册

    很多零基础的同学在刚开始学习嵌入式的时候,都会不知道应该怎么做,迅为精心编写了适配iTOP-rk3568开发板的嵌入式教程-<[北京迅为]嵌入式linux开发指南_v1.0(itop-rk356 ...

  3. 迅为IMX6ULL开发板搭建Web服务器(二)

    boa 拷贝到开发板的 bin 目录下 接下来在开发板根目录下建立 www 文件夹,如图 80.15. 然后在开发板上面建立的 www 目录下面建立文件夹 cgi-bin 目录,如图 80.16: 然 ...

  4. 【开发教程1】疯壳·ARM功能手机-开发板上电教程

    开发板上电教程 ARM功能手机 --疯壳·开发板系列 图1     硬件连接     做完全部的实验,需要有以下模块∶     WT 手机开发板(手机主控底板+手机电容屏模块+FPC 30P排线+GS ...

  5. 2.23 haas506 2.0开发教程 - KeyPad - 矩阵键盘(仅支持M320开发板)

    haas506 2.0开发教程 - KeyPad - 矩阵键盘 矩阵键盘 320矩阵键盘连线 案例说明 测试代码 功能测试 class - KeyPad keypad.init() - 初始化keyp ...

  6. Exynos4412开发板

    UT-Exynos4412开发板是一款功能极为强大的高端ARM Coretex-A9开发平台,采用Samsung最新的Exynos4412(Exynos4412 Quad),主频达到1.4~1.6GH ...

  7. 迅为LS2k1000龙芯国产双核开发板烧写系统到 U 盘

    龙芯的系统可以存放在 Nand Flash,SD 卡,U 盘,固态或者是网络加载,迅为的龙芯开发板核心板默认没有焊接 Nand Flash,是将文件系统存储在底板的固态硬盘上,这一章节我们将系统烧写到 ...

  8. linux最小系统 安装教程,Linux 学习笔记 1 使用最小的系统,从分区安装系统开始,...

    Linux 学习笔记 1 使用最小的系统,从分区安装系统开始, 我们常用的linux系统在安装过程中大多都省略了对系统进行分区的操作,以至于后期,不了解什么是分区以及分区当中最基本的一些概念, 我们不 ...

  9. Web控制SG90 9g舵机(180度版)-MicroPython-NodeMcu-Esp8266开发板

    最终目的: 使用web界面控制SG90 9g舵机: 开发语言:MicroPython 所需硬件:NodeMcu-Esp8266开发板.SG90 9g舵机(180度版) 新人必看: 如驱动不成功,一般是 ...

最新文章

  1. 温度自动调节 c语言编写,室内温度自动调节控制系统课程设计(26页)-原创力文档...
  2. 我的家乡-客家小山村
  3. MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN
  4. file相对路径java_浅谈java 中文件的读取File、以及相对路径的问题
  5. 超有用的方法-----英语单词记忆篇
  6. Win7电脑,无法把文件保存到桌面上?
  7. 寻仙手游维护公告服务器停服更新,寻仙手游3月1日停服更新公告 更新内容分享...
  8. mysql通过日志恢复数据_mysql通过binlog日志来恢复数据
  9. css3之 谜灯卡片_纯css3灯泡开关特效代码
  10. 论文精读—XGBoost paper
  11. MATLAB处理txt文档数据——以处理pscad输出数据为例
  12. C语言学习笔记——(三)静态开辟内存和动态开辟内存
  13. MIT6.828学习之homework2:shell
  14. 太厉害了!我用 Nginx 提升系统10倍性能
  15. 扫描二维码如何实现从微信内直接跳转外部浏览器打开指定页面
  16. 使用HybridSN进行高光谱图像分类
  17. linux编译符号那些事儿
  18. 标准和非标poe交换机如何选择
  19. Go的研习笔记-day13(以Java的视角学习Go)
  20. java400行能干啥?不如写个飞翔小鸟游戏吧

热门文章

  1. 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别
  2. 微信公众号消息推送,注册成功,支付成功,积分余额变化
  3. html5卤虾,自制五香小龙虾,自己做干净卫生,香辣可口,太过瘾了
  4. se(3)-TrackNet: Data-driven 6D Pose Tracking by Calibrating Image Residuals in Synthetic Domains
  5. 竣达技术丨多台精密空调微信云监控方案
  6. 如何用一句话向你二大爷解释运维是做啥的?
  7. c语言中pair的头文件,C++中使用pair是否一定要包含头文件utility
  8. 南通大学计算机学院顾飘,解密通大软件专业“学霸”们的考研之路_南通大学...
  9. 推荐算法之用户行为分析
  10. cobalt strike各种beacon的详解(http/https/tcp)