【教程】迅为iTOP

您所在的位置:网站首页 迅为4412恢复出厂设置 【教程】迅为iTOP

【教程】迅为iTOP

2024-06-06 17:30| 来源: 网络整理| 查看: 265

概述

迅为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,源码7QT镜像4,源码6镜像4,源码6镜像4,源码8Qtopia镜像3或4,源码6镜像4,源码6源码8Ubuntu镜像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系统利用板上的有线网口连上网络。

项目版本文件名目标扇区烧写命令编译命令uboot2017.11u-boot-iTOP-4412.bin1sudo 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.binlinux内核4.14.2uImage4096(可自定义)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=0x40007000linux设备树4.14.2myexynos4412-itop-elite.dtb2048(可自定义)sudo dd iflag=dsync oflag=dsync if=arch/arm/boot/dts/myexynos4412-itop-elite.dtb of=/dev/sdb seek=2048make dtbsbusybox根文件系统1.26.2busybox编译完成后 将_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.sh HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf # # configuration written to .config # scripts/kconfig/conf --silentoldconfig Kconfig CHK include/config.h UPD include/config.h CFG u-boot.cfg GEN include/autoconf.mk.dep CFG spl/u-boot.cfg GEN include/autoconf.mk GEN spl/include/autoconf.mk CHK include/config/uboot.release CHK include/generated/timestamp_autogenerated.h HOSTCC scripts/dtc/dtc.o UPD include/generated/timestamp_autogenerated.h HOSTCC scripts/dtc/flattree.o UPD include/config/uboot.release HOSTCC scripts/dtc/fstree.o HOSTCC scripts/dtc/data.o HOSTCC scripts/dtc/livetree.o CHK include/config.h CFG u-boot.cfg HOSTCC scripts/dtc/treesource.o CHK include/generated/version_autogenerated.h UPD include/generated/version_autogenerated.h CC lib/asm-offsets.s HOSTCC scripts/dtc/srcpos.o CC arch/arm/lib/asm-offsets.s HOSTCC scripts/dtc/checks.o HOSTCC scripts/dtc/util.o CHK include/generated/generic-asm-offsets.h UPD include/generated/generic-asm-offsets.h CHK include/generated/asm-offsets.h UPD include/generated/asm-offsets.h SHIPPED scripts/dtc/dtc-lexer.lex.c SHIPPED scripts/dtc/dtc-parser.tab.h SHIPPED scripts/dtc/dtc-parser.tab.c HOSTCC scripts/dtc/dtc-lexer.lex.o HOSTCC scripts/dtc/dtc-parser.tab.o LDS u-boot.lds HOSTLD 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。

名称地址范围大小说明iROM0x00000000~0x0000ffff64KB只读,存放的是BL0程序iRAM0x02020000~0x0205ffff256KB可读写DRAM00x40000000~0x9fffffff1.5GBDRAM10xa0000000~0xffffffff1.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/bash cd ../u-boot-2017.11/ if [ ! -f .config ] then make itop4412_defconfig fi make -j4 cp u-boot.bin ../u-boot/ echo "copy u-boot.bin done." cd spl/ if [ ! -f itop4412-spl.bin ] ; then echo "notice: not found itop4412-spl.bin !" exit 0 else echo "copying itop4412-spl.bin..." fi cp itop4412-spl.bin ../../u-boot/ echo "copy u-boot-spl.bin done." echo "build success !!!"

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

mkuboot.sh脚本的内容如下:

#!/bin/bash if [ ! -f E4412_N.bl1.bin ] ; then echo "not find files: E4412_N.bl1.bin !!!" exit 0 fi if [ ! -f env.bin ] ; then echo "not find files: env.bin !!!" exit 0 fi cat E4412_N.bl1.bin itop4412-spl.bin env.bin u-boot.bin > u-boot-iTOP-4412.bin if [ -f u-boot-iTOP-4412.bin ] ; then echo "created u-boot-iTOP-4412.bin success!!!" else echo "created u-boot-iTOP-4412.bin failed!!!" exit 0 fi echo "writting ..." if [ -z $1 ] ; then dd iflag=dsync oflag=dsync if=u-boot-iTOP-4412.bin of=/dev/sdb seek=1 else dd iflag=dsync oflag=dsync if=u-boot-iTOP-4412.bin of=$1 seek=1 fi echo "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-4412 arm-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=samsung Environment 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 汇总



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3