2021-06-24

一、目的:嵌入式开发板,通过emmc上的内核文件加载启动linux操作系统,以及存放其他程序文件。需要将所需文件先写入emmc中。
二、总体步骤是:uboot启动后,进入linux下,将emmc分区并格式化,uboot下支持fat和ext2的格式,这里用fat格式,并挂载,然后放入所需要的文件。这样重启后,进入uboot下,将emmc中的文件load到内存中运行。
三、uboot下emmc内容烧写(拷贝)步骤:
1、uboot启动后,输入mmc info有mmc的相关信息
2、通过tftp或其他方式启动linux
3、linux启动后,输入fdisk -l能看到/dev/mmcblk0的信息
4、linux下用fdisk命令对mmc分区,格式化

一、查看mmc命令用法
在设备进入u-boot 模式下,输入mmc,可以看到帮助信息:

hisilicon # mmc
mmc - MMC sub system
Usage:
mmc info - display info of the current MMC device
mmc reg [dev] - display register of the current MMC device
mmc read dev addr blk# cnt
mmc write dev addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc hwpartition [args...] - does hardware partitioning

一:mmc的命令如下:
1:对mmc读操作
mmc read addr blk# cnt

2:对mmc写操作
mmc write addr blk# cnt

3:对mmc擦除操作
mmc erase blk# cnt

4:重新搜索mmc设备
mmc rescan

5:列出mmc的分区
mmc part - lists available partition oncurrent mmc device

6:查看当前的设备号,或者设置设备号及分区
mmc dev [dev] [part] - show or set currentmmc device [partition]

hisilicon # mmc dev 0
** First descriptor is NOT a primary desc on 0:1 **
switch to partitions #0, OK
mmc0(part 0) is current device

7:显示boot分区号
mmc bootpart [dev] [part] - show or setboot partition

mmc bootpart

显示如下:

Device 3: boot partition 1 is for boot

分析:uboot处于第一个分区

8:列出当前的mmc设备
mmc list - lists available devices

hisilicon # mmc list
hisi-sdhci: 0 (eMMC)
hisilicon # 

9: 打印一些当前mmc设备的信息
mmcinfo

输入:mmcinfo
显示结果:
hisilicon # mmcinfo
Device: hisi-sdhci
Manufacturer ID: 45
OEM: 100
Name: SDW32 
Tran Speed: 200000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 31268536320
Bus Width: 8-bit DDR
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 29.1 GiB WRREL
Boot Capacity: 4 MiB ENH
RPMB Capacity: 4 MiB ENH

2、输入:mmc list
显示如下:
FSL_USDHC: 0
FSL_USDHC: 1
FSL_USDHC: 2
FSL_USDHC: 3
分析:boot中配置了四个mmc资源,SD卡是2,EMMC是3

3:输入:mmc dev 3
显示如下:
mmc3(part 0) is current device
分析:表示当前处于EMMC设备的第0个分区。
注意:当你想从eMMC读取内容的时候,你需要先确定目标内容在哪一个分区。否则读出的内容是错误的。

输入:mmc dev 3 1
显示如下:
mmc3(part 1) is current device
分析:设置当前处于EMMC设备的第1个分区

mmc dev 0 0

switch to partitions #0, OK
mmc0(part 0) is current device
分析:切换到mmc0设备的第0个分区

4:输入:mmc bootpart
显示如下:
Device 3: boot partition 1 is for boot
分析:uboot处于第一个分区

5:输入mmc part
显示如下:
Partition Map for UNKNOWN device 3 – Partition Type: DOS
Partition Start Sector Num Sectors Type
1 16384 16384 83
2 32768 16384 83
3 49152 6397952 5 Extd
4 6447104 9150464 83
5 49153 3145727 83
6 3194881 3145727 83
7 6340609 16383 83
8 6356993 8191 83
分析:显示当前EMMC的所有分区

6:mmc read addr blk# cnt
这个命令的作用是读取mmc上的数据到内存上
参数:
addr: 读取到内存的地址值
blk: 读取block位置,这个位置是mmc相对于0地址的偏移量,是16进制,block单位是512字节
cnt: 读取的block个数,要读取到内存的数据大小,是16进制

例:
mmc dev 3 0
mmc read 0x10800000 600 10
命令分析:表示从mmc上1536×512个字节开始处(1536是600的十进制),读取16×512个字节(16的16进制 表示为10)到内存0x10800000 处

显示结果:
MMC read: dev #3, block # 1536, count 16 … 16 blocks read: OK
结果分析:
我们只能从结果看出来读取成功,但不能确定读取的内容是否正确,所以打印下内存的数据,看是否与mmc中的内容一致

输入:
md.b 0x10800000 100
命令分析:打印内存位置0x10800000的100个字节
显示结果:
10800000: b15ecb3c 6f62 746f 6564 616c 3d79 0033 ^.<.bootdelay=3.
10800010: 61626475 6172 6574 313d 3531 3032 0030 baudrate=115200.
1000020: 70696461 7264 313d 3239 312e 3836 312e ipaddr=192.168.1
10800030: 312e3330 7300 7265 6576 6972 3d70 3931 .103.serverip=19
10800040: 2e323631 2e38 2e31 3031 0031 656e 6d74 2.168.1.101.netm
10800050: 73613d6b 3532 2e35 3532 2e35 3532 2e35 ask=255.255.255.

结果分析:
我在mmc位置1536×512的位置储存的是环境变量,与内存打印的一致,读取正确

7:mmc write addr blk# cnt
这个命令的作用是将内存上的数据写入mmc中
参:
addr: 从内存读取的位置
blk: 写入到mmc中block位置,这个位置是mmc的0地址的偏移量,是16进制,block单位是512字节
cnt: 写入到mmc中block个数,要写入的数据大小,是16进制,
block单位是512字节
例:
mmc dev 3
mmc write 0x108000000 0 100
命令分析:表示从内存0x108000000的位置上读取256*512的数据(256是100的十进制)到mmc上0的位置处,这里就不举例验证了
mmc上0的位置处是分区表,我把内存上的乱数据写进去后,uboot检测不到分区了

8:mmc erase blk# cnt
参数:
blk: 擦除的mmc中block位置,这个位置是mmc的0地址的偏移量,是16进制,block单位是512字节
cnt: 擦除的mmc中block个数,是16进制,block单位是512字节

二、格式化并挂载emmc

#fdisk /dev/mmcblk0
fdisk命令都是非常简单的。
WARNING: DOS-compatible mode is deprecated. It’s strongly recommended to
switch off the mode (command ‘c’) and change display units to
sectors (command ‘u’).

Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
先P,看看sd卡的分区现状。
然后d,删除原分区
n,创建分区

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-62528, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-62528, default 62528): +1500M

t,指定分区类型,
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): L

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx
5 Extended 42 SFS 86 NTFS volume set da Non-FS data
6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility
8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt
9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access
a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT
f W95 Ext’d (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor
14 Hidden FAT16 ❤️ 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary
16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT
1e Hidden W95 FAT1
Hex code (type L to list codes): 6
Changed system type of partition 1 to 6 (FAT16)

这样就分好了第一个分区,并且指定了分区为fat16
好了,看看成果。
Command (m for help): p

Disk /dev/mmcblk0: 2048 MB, 2048917504 bytes
4 heads, 16 sectors/track, 62528 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6f20736b

Device Boot Start End Blocks Id System
/dev/mmcblk0p1 1 48001 1536024 6 FAT16
/
好了,把分区信息写入磁盘。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

下面开始格式化。
首先是fat16分区
#mkdosfs /dev/mmcblk0p1

看一下格式化后的

fdisk -l

Disk /dev/mmcblk0: 1920 MB, 1920991232 bytes
4 heads, 16 sectors/track, 58624 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 1 58624 1875960 6 FAT16

把emmc挂载在一目录下

mount /dev/mmcblk0p1 /vm

1 58624 1875960 6 FAT16
这样就可以将文件拷贝到/vm下,这里新建了一txt文件,并输入内容,重启后在uboot下查看emmc中是否有改文件。
~ # cd vm
/vm # ls
/vm # vi a.txt

11111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000
11111111111111111111111111111111111111111111
00000000000000000000000000000000000000000000

#reboot
重启后进入uboot下,查看mmc设备
Octeon# mmc list
Octeon MMC/SD0: 0
用fatls命令查看mmc下的文件信息,可以看到有linux下建的a.txt文件
Octeon #fatls mmc 0
181 a.txt
1 file(s), 0 dir(s)
将mmc中a.txt拷贝到内存中查看内容
先看一下原来内存的信息
Octeon# md 30000000
30000000: 00000000 00000000 00000000 5f800000 …_…
30000010: 00000000 00000000 00000000 00000000 …
30000020: 00000000 00000000 00000000 00000000 …
30000030: 00000000 00000000 00000000 00000000 …
30000040: 00000000 00000000 00000000 00000000 …
30000050: 00000000 00000000 00000000 00000000 …
30000060: 00000000 00000000 00000000 00000000 …
30000070: 00000000 00000000 00000000 00000000 …
30000080: 00000000 00000000 00000000 00000000 …
30000090: 00000000 00000000 00000000 00000000 …
300000a0: 00000000 00000000 00000000 00000000 …
300000b0: 00000000 00000000 00000000 00000000 …
300000c0: 00000000 00000000 00000000 00000000 …
300000d0: 00000000 00000000 00000000 00000000 …
300000e0: 00000000 00000000 00000000 00000000 …
300000f0: 00000000 00000000 00000000 00000000 …

将mmc中a.txt load到内存中
teon# fatload mmc 0 30000000 a.txt
reading a.txt
181 bytes read
查看内存信息,可以看到就是a.txt的内容,说明emmc内容写入成功 。
Octeon# md 30000000
30000000: 31313131 31313131 31313131 31313131

111111111111111
30000010: 31313131 31313131 31313131 31313131 1111111111111111
30000020: 31313131 31313131 31313131 0a303030 111111111111.000
30000030: 30303030 30303030 30303030 30303030 0000000000000000
30000040: 30303030 30303030 30303030 30303030 0000000000000000
30000050: 30303030 30303030 0a313131 31313131 00000000.1111111
30000060: 31313131 31313131 31313131 31313131 1111111111111111
30000070: 31313131 31313131 31313131 31313131 1111111111111111
30000080: 31313131 310a3030 30303030 30303030 11111.0000000000
30000090: 30303030 30303030 30303030 30303030 0000000000000000
300000a0: 30303030 30303030 30303030 30303030 0000000000000000
300000b0: 30300a0a 0a000000 00000000 00000000 00…
300000c0: 00000000 00000000 00000000 00000000 …
300000d0: 00000000 00000000 00000000 00000000 …
300000e0: 00000000 00000000 00000000 00000000 …
300000f0: 00000000 00000000 00000000 00000000 …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值