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
<think>好的,用户想了解如何在Linux内核中配置EMMC驱动和设备树,将8GB的EMMC分成两个各4GB的分区。我需要结合提供的引用内容来组织回答。首先,根据引用[2],emmc驱动修改涉及分区表,可能需要调整设备树中的分区定义。引用[3]提到uboot中的命令,可能涉及分区操作。然后,用户需要创建两个4G分区,这涉及到设备树中的分区节点设置,如修改分区大小参数。可能还需要调整内核配置,确保EMMC驱动支持。最后,要验证分区是否正确挂载。需要分步骤说明,包括设备树修改、驱动确认、分区格式化和验证。同时生成相关问题,比如如何调整分区大小、设备树和驱动的交互等。</think>在Linux内核中配置EMMC驱动和设备树实现双分区需要以下步骤: ### 一、设备树(DTS)配置 1. **定位EMMC设备节点** 在设备树文件中(如`arch/arm/boot/dts/your_board.dts`),找到EMMC控制器节点,通常标记为`mmc@xxxxx`。例如: ```dts &mmc0 { status = "okay"; bus-width = <8>; max-frequency = <200000000>; // 分区定义 partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; partition@0 { label = "partition1"; reg = <0x00000000 0x10000000>; // 起始地址0,大小4GB(0x10000000字节) }; partition@1 { label = "partition2"; reg = <0x10000000 0x10000000>; // 起始地址4GB,大小4GB }; }; }; ``` 2. **关键参数说明** - `reg`属性定义了分区的起始地址和大小,使用十六进制表示。例如,`0x10000000`对应十进制$4 \times 1024^3 = 4294967296$字节。 - 需确保总分区大小不超过EMMC容量(通过引用[2]可知需先确认EMMC设备号为`mmcblk0`或`mmcblk1`)。 ### 二、内核驱动适配 1. **确认EMMC驱动支持** 检查内核配置选项`CONFIG_MMC`和`CONFIG_MMC_SDHCI`是否启用,确保EMMC控制器驱动已编译(参考引用[2]中驱动移植方法)。 2. **更新分区表解析** Linux内核通过设备树中的`fixed-partitions`兼容性标识解析静态分区表,驱动会自动注册分区为`/dev/mmcblk0p1`和`/dev/mmcblk0p2`[^2]。 ### 三、操作验证 1. **烧写与挂载** 使用`fdisk -l /dev/mmcblk0`查看分区,应显示两个4GB分区。通过以下命令格式化并挂载: ```bash mkfs.ext4 /dev/mmcblk0p1 mkfs.ext4 /dev/mmcblk0p2 mount /dev/mmcblk0p1 /mnt/part1 ``` 2. **启动脚本配置** 在`/etc/fstab`中添加自动挂载项,确保系统启动时加载分区(引用[3]中uboot命令需与内核启动参数一致)。 ### 四、注意事项 -EMMC已包含引导程序(如uboot),需保留引导分区空间(通常在起始地址预留4MB)。 - 动态调整分区需结合工具如`parted`,但设备树定义的静态分区更适用于嵌入式固定场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叶玄青

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

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

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

打赏作者

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

抵扣说明:

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

余额充值