什么是低代码?低代码开发平台靠谱吗?低代码平台优缺点
1573
2022-05-28
1. 前言
这篇文章是UBOOT命令介绍的下篇,接着上篇文章介绍剩下的几个命令用法。
主要是涉及的命令是:磁盘分区、磁盘文件加载、内核引导、二进制文件加载、跳转命令、磁盘文件系统格式等等。
2. UBOOT命令
2.1 fatls –列出指定目录下的文件
查看帮助:
TINY4412 # ? fatls fatls - list files in a directory (default /) 列出一个目录文件 Usage: fatls
参数说明:
查看SD卡中的文件列表(查看之前SD需要有完好的分区才行,可以通过fdisk进行分区,从U-BOOT和内核地址之后开始分区,防止将U-BOOT和内核清除)
TINY4412 # fatls mmc 0 / Partition1: Start Address(0x71c53a), Size(0x2025c6) system volume information/ 12345/ 0 file(s), 2 dir(s) 共用两个目录,0个文件----进过确认正确的
查看子目录下的文件:
TINY4412 # fatls mmc 0 /12345 Partition1: Start Address(0x71c53a), Size(0x2025c6) ./ ../ 5567/ 0 file(s), 3 dir(s)
2.2 从一个MMC文件系统(fat)中加载一个二进制文件到DDR
查看帮助:
TINY4412 # help fatload fatload - fatload - load binary file from a dos filesystem Usage: fatload
参数说明:
先将SD卡从开发板取出(开发板不要断电),通过读卡器插入 PC,复制一些文件到卡里,然后再重新插入开发板中
(SD卡拔出来时开发板不要断电,目的想测试一下 mmc rescan 命令作用)。SD卡拔掉之后,UBOOT一样可以运行,因为程序已经拷贝到DDR中运行了,只要不断电U-BOOT就可以正常运行。
文件拷贝完将SD卡再放回开发板,先不要重新扫描 mmc 设备,直接输入 fatls 就会出错:
TINY4412 # fatls mmc 0 /* 打印错误信息,因为开发板没有断电,设备0是SD卡*/ count: 1 # Tx: Inverter delay / Rx: Inverter delay count: 2 ## Tx: Basic delay / Rx: Inverter delay count: 3 ## Tx: Inverter delay / Rx: Basic delay count: 4 ### Tx: Basic delay / Rx: Basic delay count: 5 # Tx: Disable / Rx: Basic delay count: 6 ## Tx: Disable / Rx: Inverter delay count: 7 ### Tx: Basic delay / Rx: Disable count: 8 ### Tx: Inverter delay / Rx: Disable mmc read failed ERROR: -19 data.dest: 0xc3cfbbdc data.blocks: 1 data.blocksize: 512 MMC_DATA_READ ** Can't read from device 0 ** ** Unable to use mmc 0:1 for fatls ** TINY4412 #
扫描设备0,再读出信息:
TINY4412 # mmc rescan 0 扫描设备 TINY4412 # fatls mmc 0 列出设备的文件目录 /* 成功列出了SD卡文件目录信息*/ Partition1: Start Address(0xa203d2), Size(0x2037b2) system volume information/ 4783928 zimage 277108 u-boot.bin 127245 纇/u-boot.pdf 5268 2015-12-30txt 731729 shell, - a.pdf 5 file(s), 1 dir(s)
开始测试 fatload 命令:
TINY4412 # fatload mmc 0 48000000 zimage 将 zimage文件加载到DDR的48000000地址处 Partition1: Start Address(0xa203d2), Size(0x2037b2) reading zimage 4783928 bytes read 成功加载文件的大小(字节单位) TINY4412 # md.b 48000000 打印出DDR 48000000地址处的数据 48000000: 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 ................ 48000010: 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 ................ 48000020: 02 00 00 ea 18 28 6f 01 00 00 00 00 38 ff 48 00 .....(o.....8.H. 48000030: 01 70 a0 e1 02 80 a0 e1 00 20 0f e1 03 00 12 e3 .p....... ......
2.3 cmp --比较内存数据是否相同
查看帮助 TINY4412 # ? cmp cmp - memory compare 内存比较 Usage: cmp [.b, .w, .l] addr1 addr2 count 格式 注意:count 是用十六进制表示 cmp .b :以1个字节方式 cmp .w :以2 个字节方式 cmp .l :以4 个字节方式 格式: Cmp.b 地址1 地址2 比较数据的数量 ① 比较DRR两个地址数据是否相等 TINY4412 # cmp.b 48000000 49000000 10 比较两个地址数据---数量是10个 byte at 0x48000000 (0x00) != byte at 0x49000000 (0xff) Total of 0 bytes were the same 共有0字节是相同的 TINY4412 # ② 从MMC读取1个扇区的数据到DDR的两个地址 TINY4412 # mmc read 0 48000000 1 1 MMC read: dev # 0, block # 1, count 1 ... 1 blocks read: OK TINY4412 # mmc read 0 49000000 1 1 MMC read: dev # 0, block # 1, count 1 ... 1 blocks read: OK ③ 再次比较两个地址的数据 TINY4412 # cmp.b 48000000 49000000 10 ( 注意:这里的10是十六进制的10 ,转成十进制就是16) Total of 16 bytes were the same 共有16个字节都是一样的。
2.4 mm --地址以自动增加的方式修改内存数据
查看帮助: TINY4412 # ? mm mm - memory modify (auto-incrementing address) 修改内存(增加的地址) Usage: mm [.b, .w, .l] address 格式: address要修改的地址 ① 先将DDR某处数据打印出来,方便修改完比较 TINY4412 # md.b 48000000 10 48000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y ② 修改数据 TINY4412 # mm.b 48000000 48000000: a3 ? 5 //把a3 修改为5 48000001: 69 ? 6 //把69 修改为6 48000002: d3 ? 7 48000003: 18 ? 8 48000004: e9 ? 不想修改直接按下<回车键>跳过 48000005: 7d ? 9 48000006: b9 ? TINY4412 #
2.5 cp –内存拷贝
查看帮助: TINY4412 # ? cp cp - memory copy 内存复制 Usage: 用法格式 cp [.b, .w, .l] source target count 注意这里的数量是用16进制表示的 格式:cp.b 源地址 目标地址 数量 ① 读出DDR两个地址的数据,方便后面比较 TINY4412 # md.b 45000000 10 显示数据 45000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ TINY4412 # md.b 49000000 10 显示数据 49000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y ② 将DDR的4900000地址前10个字节拷贝到45000000地址处 TINY4412 # cp 49000000 45000000 10 ③ 将两处地址的数据再显示出来 TINY4412 # md.b 45000000 10 45000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y TINY4412 # md.b 49000000 10 49000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y 拷贝之后,将两处地址数据再次比较,两边数据是一样的。
2.6 loady - 使用串口下载二进制数据到内存中
U-BOOT支持的串口传输模式:
loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line loady - load binary file over serial line (ymodem mode)
串口下载文件到DDR,上面是U-BOOT支持串口的3种传输模式。
CRT串口终端支持的协议:
查看帮助: TINY4412 # ? loady Unknown command '' - try 'help' without arguments for list of all known commands loady - load binary file over serial line (ymodem mode) 用在串行线加载二进制文件(ymodem模式) Usage: loady [ off ] [ baud ] - load binary file over serial line with offset 'off' and baudrate 'baud' 参数说明: [ off ]: DDR 内存地址, 可选。 [ baud ]:使用多快的波特率下载, 可选,不填就表示默认的115200波特率。 示例: loady 0x40000000 115200
测试loady命令:
(1)下载文件到内存
TINY4412 # loady 40000000 下载文件到DDR 40000000地址 ## Ready for binary (ymodem) download to 0x40000000 at 0 bps...
(2)对比数据内容
(3)执行代码
上面下载的bin文件是一个按键的裸机程序,可以用go命令跳转到指定地址去执行下载的代码。
TINY4412 # go 40000000 ## Starting application at 0x40000000 ... 跳转过去之后,按下按键测试! 测试结果正常,按键程序可以正常执行。
2.7 go–CPU 跳转到指定的地址执行代码
一旦 go 指令执行后, CPU 就会去执行指定地址处的代码。
查看帮助:
TINY4412 # ? go go - start application at address 'addr' 在addr处启动应用程序 Usage: go addr [arg ...] - start application at address 'addr' passing 'arg' as arguments 作为参数传递的参数
测试go命令
将SD卡第一个扇区数据读到DDR内存中等待执行。读8个扇区 TINY4412 # mmc read 0 45000000 1 8 MMC read: dev # 0, block # 1, count 8 ... 8 blocks read: OK 跳转到45000000地址去执行程序 TINY4412 # go 45000000 ## Starting application at 0x45000000 ... 开始执行地址处的代码,因为扇区1开始存放的是BL1代码,重新执行启动了UBOOT OK U-Boot 2010.12 (Jan 01 2016 - 02:37:55) for TINY4412 CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9] APLL = 1400MHz, MPLL = 800MHz Board: TINY4412 DRAM: 1023 MiB ...........................................................................................................
2.8 打开关闭emmc设备引导分区
查看帮助: TINY4412 # ? emmc emmc - Open/Close eMMC boot Partition 打开/关闭emmc引导分区 Usage: emmc open
2.9 movi 子系统----从MMC向DDR读写数据
该指令在产品发布时需要用到,用来固化内核和UBOOT。
查看帮助:
TINY4412 # ? movi movi - movi - sd/mmc r/w sub system for SMDK board Usage: movi init - Initialize moviNAND and show card info movi read zero {fwbl1 | u-boot} {device_number} {addr} - Read data from sd/mmc 读取数据从sd / mmc movi write zero {fwbl1 | u-boot} {device_number} {addr} - Read data from sd/mmc 读取数据从sd / mmc movi read {u-boot | kernel} {device_number} {addr} - Read data from sd/mmc 读取数据从sd / mmc movi write {fwbl1 | u-boot | kernel} {device_number} {addr} - Write data to sd/mmc 写入数据到sd / mmc movi read rootfs {device_number} {addr} [bytes(hex)] - Read rootfs data from sd/mmc by size 从sd/mmc读取rootfs数据大小 movi write rootfs {device_number} {addr} [bytes(hex)] - Write rootfs data to sd/mmc by size 写rootfs sd/mmc的数据大小 movi read {sector#} {device_number} {bytes(hex)} {addr} - instead of this, you can use "mmc read" movi write {sector#} {device_number} {bytes(hex)} {addr} - instead of this, you can use "mmc write"
(1)把 sd 卡中 u-boot 的第一阶段的 bl1 数据复制到内存,然后再写入 emmc 对应位置
movi read fwbl1 0 40000000; //从SD(设备编号为)拷贝bl1到DDR内存地址 emmc open 1; //打开EMMC设备 movi write zero fwbl1 1 40000000; //将DDR地址处数据写入到EMMC对应位置 emmc close 1; //关闭EMMC设备
用法示例:
TINY4412 # movi read fwbl1 0 40000000; reading FWBL1 ..device 0 Start 1, Count 16 MMC read: dev # 0, block # 1, count 16 ... 16 blocks read: OK 从SD卡第1个扇区开始读,连续读16个扇区 completed TINY4412 # emmc open 1; eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero fwbl1 1 40000000; writing FWBL1 ..device 1 Start 0, Count 16 MMC write: dev # 1, block # 0, count 16 ... 16 blocks written: OK 从EMMC第0个扇区写,连续写16个扇区 completed TINY4412 # emmc close 1; eMMC CLOSE Success.!! 因为SD卡的特性,第0个扇区不能使用,数据只能从第1个扇区开始存放。 EMMC可以直接从第0个扇区存放数据。 所以-----EMMC的第0个扇区相当于SD卡的第1个扇区
(2)把sd卡中u-boot的BL2 数据复制到内存,然后再写入 emmc 对应位置
movi read bl2 0 40000000; //从SD(设备编号为0)拷贝bl2到DDR内存地址 emmc open 1; //打开EMMC设备 movi write zero bl2 1 40000000; //将DDR地址处数据写入到EMMC对应位置 emmc close 1; //关闭EMMC设备
示例:
TINY4412 # movi read bl2 0 40000000 reading BL2 ..device 0 Start 17, Count 32 MMC read: dev # 0, block # 17, count 32 ... 32 blocks read: OK //从SD卡的第17个扇区开始读,连续读32个扇区。 //查看UBOOT烧写脚本可知,BL2是从SD卡第17扇区开始烧写的 completed TINY4412 # emmc open 1 eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero bl2 1 40000000 writing BL2 ..device 1 Start 16, Count 32 MMC write: dev # 1, block # 16, count 32 ... 32 blocks written: OK //向EMMC的第17个扇区开始写,连续写32个扇区。 completed TINY4412 # emmc close 1 eMMC CLOSE Success.!!
(3)把 sd 卡中 u-boot 复制到内存,然后再写入 emmc 对应位置
movi read u-boot 0 40000000; 将SD卡的U-BOOT.Bin读到DDR内存空间 emmc open 1; 打开EMMC设备 movi write zero u-boot 1 40000000; 将DDR的数据写入EMMC设备 emmc close 1; 关闭EMMC
示例:
TINY4412 # movi read u-boot 0 40000000 reading bootloader..device 0 Start 49, Count 656 MMC read: dev # 0, block # 49, count 656 ... 656 blocks read: OK 从SD卡第49个扇区开始,读取656个扇区到DDR内存 completed TINY4412 # emmc open 1 eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero u-boot 1 40000000 writing bootloader..device 1 Start 48, Count 656 MMC write: dev # 1, block # 48, count 656 ... 656 blocks written: OK 向EMMC的第49个扇区,连续写入656个扇区到DDR内存 completed TINY4412 # emmc close 1 eMMC CLOSE Success.!!
(4)把 sd 卡中 u-boot 安全加密数据复制到内存,然后再写入 emmc 对应位置
movi read tzsw 0 40000000; 将安全加密数据拷贝到DDR emmc open 1; 打开EMMC设备 movi write zero tzsw 1 40000000; 将DDR数据写入EMMC emmc close 1; 关闭EMMC设备
示例:
TINY4412 # movi read tzsw 0 40000000 reading 0 TrustZone S/W.. Start 705, Count 320 MMC read: dev # 0, block # 705, count 320 ... 320 blocks read: OK 从SD卡的第705个扇区开始,连续读取320个扇区到DDR Completed 安全加密数据是从SD的705个扇区存放的 TINY4412 # emmc open 1 eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero tzsw 1 40000000; writing 1 TrustZone S/W.. Start 704, Count 320 MMC write: dev # 1, block # 704, count 320 ... 320 blocks written: OK 写入EMMC completed TINY4412 # emmc close 1 eMMC CLOSE Success.!!
(5)把 sd 卡中内核数据复制到内存,然后再写入 emmc 对应位置
movi read kernel 0 40000000; 将SD卡的内核数据读到DDR内存中 movi write kernel 1 40000000; 将DDR的数据写入EMMC中
示例:
TINY4412 # movi read kernel 0 40000000 reading kernel..device 0 Start 1057, Count 12288 MMC read: dev # 0, block # 1057, count 12288 ... 12288 blocks read: OK 从SD卡1057扇区开始,连续读12288个扇区到DDR completed TINY4412 # movi write kernel 1 40000000 writing kernel..device 1 Start 1057, Count 12288 MMC write: dev # 1, block # 1057, count 12288 ... 12288 blocks written: OK将DDR的数据写入EMMC,从1057开始写,连续写12288个扇区 completed
2.10 movi 精简命令-一键拷贝
将UBOOT和内核数据固化到EMMC精简命令:
movi r f 0 40008000;emmc open 1;movi w z f 1 40008000;emmc close 1; movi r b 0 40008000;emmc open 1;movi w z b 1 40008000;emmc close 1; movi r u 0 40008000;emmc open 1;movi w z u 1 40008000;emmc close 1; movi r t 0 40008000;emmc open 1;movi w z t 1 40008000;emmc close 1; movi r k 0 40008000;movi w k 1 40008000;
2.11 bootcmd命令的使用
bootcmd命令是设置U-BOOT启动成功后执行的命令代码。
示例:
set bootcmd 'mmc read 0 40000000 421 1;md.b 40000000' 格式:setenv ‘ 需要执行的命令’ Save //保存设置
2.12 执行二进制文件–>bootm命令
bootm命令是用来引导经过U-Boot的工具mkimage打包后的kernel image的。
查看帮助:
TINY4412 # ? bootm bootm - boot application image from memory //bootm从内存中启动应用程序 Usage: bootm [addr [arg ...]] - boot application image stored in memory passing arguments 'arg ...'; when booting a linux kernel, 'arg' can be the address of an initrd image //传递参数的参数…”;当引导Linux内核,“参数”可以是映像文件的地址 Sub-commands to do part of the bootm sequence. The sub-commands must be issued in the order below (it's ok to not issue all sub-commands): start [addr [arg ...]] loados - load OS image 加载操作系统映像 cmdline - OS specific command line processing/setup 操作系统特定的命令行处理/设置 bdt - OS specific bd_t processing 操作系统特定bd_t处理 prep - OS specific prep before relocation or go go - start OS 启动操作系统
示例:
(1)直接引导内核
TINY4412 # mmc read 0 40007fc0 421 3000 将SD卡内核读到DDR内存空间----内核映像是从SD卡1057扇区开始存放的,连续占用了12288个扇区 (注意: 421是0x421 3000是0x3000) MMC read: dev # 0, block # 1057, count 12288 ... 12288 blocks read: OK TINY4412 # bootm 40007fc0 执行DDR--40007fc0地址处的二进制文件 Boot with zImage Starting kernel ... Uncompressing Linux... done, booting the kernel.
(2)设置UBOOT启动成功自动引导内核
TINY4412 # setenv bootcmd 'mmc read 0 40007fc0 421 3000;bootm 40007fc0' U-BOOT启动成功之后自动执行 TINY4412 # save 保存设置 或者使用bootcmd=movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000
2.13 分区命令-fdisk
查看帮助:
TINY4412 # ? fdisk fdisk - fdisk for sd/mmc. //硬盘分区工具 Usage: fdisk -p
(1)查看分区信息示例
TINY4412 # fdisk -p 0 //查看SD卡分区信息 分区 大小 扇区开始地址 扇区数量(512字节一个扇区) 分区ID名称 partion # size(MB) block start # block count partition_Id 1 1028 7456058 2106822 0x06 4 0 28049408 441 0x00
(2)给SD卡分区示例
(分区时–会自行在SD卡开头大约66M后的空间开始分区,因为开头部分需要用来存放内核与U-BOOT)
TINY4412 # fdisk -c 0 320 2057 520 //给SD卡分区, -c 表示分区 fdisk is completed //提示分区完成 分区 大小 扇区开始地址 扇区数量(512字节一个扇区) 分区ID名称 partion # size(MB) block start # block count partition_Id 1 4416 6090216 9045762 0x0C 2 320 134343 656788 0x83 3 2062 791131 4224341 0x83 4 524 5015472 1074744 0x83
2.14 指定EMMC的分区文件系统格式
U-BOOT支持格式化的文件系统格式:
fatformat- fatformat - disk format by FAT32 ext3format- ext3format - disk format by ext3 ext2format- ext2format - disk format by ext2
查看 fatformat命令使用帮助:
TINY4412 # ? fatformat fatformat - fatformat - disk format by FAT32 指定磁盘的格式位FAT32 Usage: fatformat
(1)指定分区命令-用法示例
fatformat mmc 0:1 //表示将第0个盘的第一个分区初始化为 fat ext3format mmc 0:2 //表示将第0个盘的第二个分区初始化为 ext3 ext2format mmc 0:3 //表示将第0个盘的第三个分区初始化为 ext2 ext3format mmc 0:4 //表示将第0个盘的第四个分区初始化为 ext3
(2)SD卡分区文件系统格式化完毕,将SD卡插入电脑,查看SD卡的分区信息
(3)将SD卡挂载进虚拟机,查看设备节点。
Linux 嵌入式
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。