Linux内核移植 part1:eMMC启动

本文详细介绍了如何使用U-Boot实现eMMC启动的过程,包括eMMC硬件分区的配置方法、uboot命令的具体用法及烧录启动镜像到eMMC的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

时间,就象海棉里的水,只要愿挤,总还是有的。 —— 鲁迅

从建立博客到现在陆陆续续有好几个童鞋来找我要代码,其中有个问题经常提到:支不支持从emmc启动。但是我移植uboot和kernel只是为了探究我自己感兴趣的东东,所以没有去关注emmc启动的问题。最近工作正好告一段落,就来看看eMMC boot的问题吧。

uboot eMMC驱动框架简介

检查了uboot的代码,发现在2015.04版本中是通过一个统一的mmc驱动框架来管理mmc设备的,也就是说sd mmc和emmc的操作方式是一样的。比如有以下这些命令可供使用:

host > mmc info
host > mmc dev [dev] [part]
host > mmc list
host > mmc partconf

设备树中默认是配置了8比特模式,但是由于pinmux和gpio的驱动还没有兼容,8比特模式还不能工作,暂时先改成4比特就可以正常读写了。

看看设备信息:

host > mmc list
SAMSUNG SDHCI: 0 (SD)
EXYNOS DWMMC: 1 (eMMC)
host > 
host > mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
host > 
host > mmcinfo
Device: EXYNOS DWMMC
Manufacturer ID: 15
OEM: 100
Name: 4YMD3 
Tran Speed: 52000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 3.6 GiB
Bus Width: 4-bit
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 3.6 GiB WRREL
Boot Capacity: 4 MiB ENH
RPMB Capacity: 512 KiB ENH
host >

eMMC硬件分区介绍

eMMC的每一个硬件分区都是独立编址的,所以在访问前要先指定访问哪一个分区,具体访问哪一个分区由Extended CSD寄存器决定的。

partition_access.png

每个字段的说明如下:

partition_bits.png

通过uboot命令把启动镜像烧写到eMMC中

1. 利用sd boot进到uboot界面,查看mmc设备信息。
host > mmc list
SAMSUNG SDHCI: 0 (SD)
EXYNOS DWMMC: 1
2. 通过partconf命令配置分区。

命令介绍如下:

host > mmc partconf
mmc partconf dev boot_ack boot_partition partition_access
 - Change the bits of the PARTITION_CONFIG field of the specified device
host >
host > mmc partconf 1 1 1 1

上面的partconf命令意思是:指定启动分区boot1为启动分区,当前访问的分区也是boot1分区(参考Extended CSD寄存器说明)。

3. 烧写镜像到eMMC
host > fatls mmc 0
   283396   image.bin 
  5935832   uimage 
    37540   exynos4412-landrover.dtb

镜像说明:image.bin是uboot镜像,uimage是内核镜像,exynos4412-landrover.dtb是设备树。

host > fatload mmc 0 40000000 image.bin
host > mmc write 40000000 0 400

然后OM选择eMMC启动,重启就可以看到uboot界面了,如下:

landrover > OKhello.
copy BL2 ends.


U-Boot 2015.04-g02bb89f-dirty (Mar 02 2017 - 16:56:26) for LANDROVER

CPU:    Exynos4412@1000MHz
Model: landrover based on Exynos4412
DRAM:  1 GiB
WARNING: Caches not enabled
Pre-reloc malloc() used 0xdc bytes (0 KB)
Now running in RAM - U-Boot at: 7fe80000
MMC:   found 1 nodes with compatibility...
Found 1 mmc nodes
mmc4 clk source = 0x66666
mmc4 mask = 0x1011111
emmc dev index = 4, sclk = -1, freq = 400000000, div = 0
found 4 nodes with compatibility...
sd mmc count = 1.
probing host[0].
_gpio_request_by_name_nodev: fdtdec_parse_phandle_with_args failed
_gpio_request_by_name_nodev: Node 'sdhci@12530000', property 'pwr-gpios', failed to request GPIO index 0: -2
EXYNOS DWMMC: 0, SAMSUNG SDHCI: 1
*** Warning - bad CRC, using default environment

initr_env:450  load_addr = 0x40007000.
### main_loop entered: bootdelay=5

### main_loop: bootcmd="if mmc rescan; then echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment fro"
Hit any key to stop autoboot:  0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶玄青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值