This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM623:关于从 eMMC 引导

Guru**** 2372970 points
Other Parts Discussed in Thread: AM623
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1498711/am623-about-boot-from-emmc

器件型号:AM623

工具/软件:

你(们)好

使用我们自己的 AM623板、SD 卡可以正常启动、但在使用 EMMC 时无法启动。 从 SD 卡启动后、通过脚本烧录对 EMMC 中的程序进行编程。 附件包含用于刻录和运行屏幕截图的脚本

这是 sh

#!/bin/bash


设置-e

#主要版本
Major_version="4"
#次要版本
minor_version="1"

# eMMC 器件
eMMC_device=/dev/mmcblk0

# SD 设备
sd_device=/dev/mmcblk1

# SD 装载点
sd_mount_point=/run/media/mmcblk1

# eMMC 默认单位大小(1024 * 1024 = 1048576Byte = 1MB)
size_mb=$((1024 * 1024))

# eMMC 引导分区大小(128MB)
eMMC_BOOT_PART_SIZE=$((128 * 1024 * 1024))

# rootfs 分区的保留容量是800MB
#由于 inode 也占用空间,实际可用空间不足以容纳800MB。
ROOTFS_RESERT_SIZE=$((800 * 1024 * 1024))

#打印错误日志
函数 err(){
回波"[$(日期+'%Y-%m-%dT %H:%M:%S%z')]:$@">&2
}

#检查 SD 卡是否已安装
函数 check_sdboot_mount(){
如果[[! -e ${sd_device}]];然后
错误"错误! 找不到 SD。"
错误"中止、工作未完成!"
退出1
和数据

sdboot_mount_status=$(df ${sd_device}p1 | grep ${sd_device}p1 | awk '{print 6美元}')
如果[[-z ${sdboot_mount_status}]];则
错误"错误! ${sd_device}P1未安装。"
错误"中止、工作未完成!"
退出1
和数据

sdboot_mount_status=$(df ${sd_device}p3 | grep ${sd_device}p3 | awk '{print 6美元}')
如果[[-z ${sdboot_mount_status}]];则
错误"错误! ${sd_device}P3未安装。"
错误"中止、工作未完成!"
退出1
和数据

ECHO "SD 卡已安装"。
}

#检查 eMMC 器件是否存在。
函数 check_eMMC_device (){
#检查 eMMC 设备是否存在
如果[[! -b ${EMMC_device}||-z ${EMMC_device}]];然后
错误"错误:${EMMC_device}不存在。"
错误"中止、工作未完成!"
退出1
和数据

回显"eMMC 器件存在。"

#检查 EMMC 容量是否足够
#计算 eMMC 和文件系统大小
eMMC_size=$($(fdisk -s ${EMMC_device})* 1024))
FS_SIZE=$(($(DU -s ${SD_mount_point}P3 | awk '{PRINT 1美元}')* 1024))

# eMMC 容量必须大于文件系统的大小
如果[[$($eMMC_size -$EMMC_BOOT_PART_SIZE))-lt ${FS_SIZE}]];则
err"错误:创建 eMMC 分区失败、eMMC 容量不足!"
退出1
和数据

回波"eMMC 容量已满足。"
}

#创建 eMMC 分区
函数 create_eMMC_partition(){
回显"Partitioning ${EMMC_DEVICE}..."

# umount 他们,如果已经挂载.
对于$(cat /proc/mounts | grep ${emmc_device}p | awk '{print 1美元}')中的 I、请执行
umount $i 2>/dev/null
已完成

#清除 eMMC 的头。
DD IF=$/dev/zero{EMMC_DEVICE}BS=1024 count=1024

#分割引导分区
Partition_start=1
Partition_end=$(${EMMC_BOOT_PART_SIZE}/${SIZE_MB}+${PARTIT_START}))

parted -s ${EMMC_device}mklabel msdos
parted -s ${EMMC_device}unit MIB mkpart primary FAT32 -${partition_start}${partition_end}
parted -s ${EMMC_device}设置1引导开启

#分割 rootfs 分区
# rootfs 分区是文件系统大小的两倍
Partition_start=${partition_end}
Partition_end=$(($(${FS_SIZE}+${ROOTFS_RESERT_SIZE}))/${SIZE_MB}+${PARDIT_START})

如果[[$($eMMC_SIZE -$EMMC_BOOT_PART_SIZE))-lt $((${FS_SIZE}+${ROOTFS_RESERVED_SIZE}))]];则
#如果 rootfs 分区不能保留800MB 的可用空间,
#会打印警告提示符,但它可以正常闪烁。
err"警告:由于 eMMC 空间不足、rootfs 分区无法保留800MB 的空间。"

#由于 rootfs 分区不能分成两倍的可用空间,
# eMMC 中的所有剩余空间都被划分为 rootfs 分区。
Partition_end=-2
和数据

parted -s ${EMMC_device}unit mib mkpart primary ext4 --${partition_start}${partition_end}
睡眠15 #FIXME 确保分区 eMMC 已完成

#格式化分区
Partition_list=(${EMMC_DEVICE}P1 ${EMMC_DEVICE}P2)

对于${partition_list[*]}中的分区;执行
mount_state=$(cat /proc/mounts | grep ${partition}| awk '{print 1美元}')

# umount 在情况下安装 alraady
如果[[! -z "${mount_state}"]];然后
umount ${partition}
和数据
已完成

mkfs.vfat -F 32 -n boot ${partition_list[0]}
睡眠1

mkfs.ext4 -F -L rootfs ${partition_list[1]}
睡眠1

回显"分区完成!"
}

#检查环境是否满意
函数 check_environment(){
回显"正在检查闪存环境..."

#检查 SD 卡是否已安装
check_sdboot_mount

#检查 eMMC 器件是否存在
CHECK_eMMC_DEVICE

ECHO "Check flash environment done"。
}

#获取 MTD 分区
函数 get_MTD_partition(){
mtd_partition=$(cat /proc/mtd | grep 1美元 | awk -F ':'{print 1美元}'| awk -F 'mtd'{print 2美元}')
如果[[-z "${MTD_partition}"]];则
错误"错误! 获取1美元的 MTD 分区号失败!"
错误"中止、工作未完成!"
退出1
和数据
回显${MTD_PARTITION}
}

#擦除 u-boot 环境变量
函数 erase_uboot_env (){
本地 eMMC_BOOT_PATTERN="${EMMC_DEVICE}boot0"
本地配置文件="/sys/block/mmcblk0boot0/force_ro "

回显"Erasing u-boot 环境变量..."

如果[[! -e ${profile}];然后
错误"错误:${profile}不存在。"
退出1
和数据

如果[[! -e ${eMMC_BOOT_PARTITION}]];然后
err"错误:${eMMC_BOOT_PARTITION}不存在。"
退出1
和数据

#启用可以写入引导分区
回波0 >${profile}

#擦除环境变量
# ENV_SIZE:0x20000
# ENV_OFFSET:0x380000
DD if=$/dev/zero{eMMC_BOOT_PARTITION}bs=1k count=128 seek=3584

回显"擦除 u-boot 环境变量完成。"
}

#闪存 u-boot/dtb/kernel/rootfs
function flash_system(){
本地 eMMC_BOOT_PATTERN="${EMMC_DEVICE}boot0"
本地配置文件="/sys/block/mmcblk0boot0/force_ro "

回显"正在闪烁系统..."

#闪存 u-boot
回波"->刷写 tiboot3/tispl/u-boot..."

#启用可以写入引导分区
回波0 >${profile}

#闪存 tiboot3.bin
DD IF=$/media/mmcblk1p1/tiboot3.bin{eMMC_BOOT_PARTITION}BS=1K
#闪存 tispl.bin
DD if=$/media/mmcblk1p1/tispl.bin{eMMC_BOOT_PARTITION}BS=1K seek=512
#闪存 u-boot.img
DD if=$/media/mmcblk1p1/u-boot.img{eMMC_BOOT_PARTITION}bs=1K seek=1536

回波"->闪存 tiboot3/tispl/u-boot 完成。"

回波"->将 dtb/kernel/rootfs 刷写到${EMMC_device}p2..."

# rootfs 分区的挂载点。
本地 rootfs_mount_point="/tmp/$$-rootfs"

如果[[! -d ${rootfs_mount_point}]];然后
mkdir -p ${rootfs_mount_point}
和数据
装载${EMMC_DEVICE}P2 ${rootfs_mount_point}

#从 SD 的备份分区复制文件到 dtb/kernel/rootfs
sd_p3_mount_point=$(df ${sd_device}p3 | grep ${sd_device}p3 | awk '{print 6美元}')
cp -rf ${sd_p3_mount_point}/。 ${rootfs_mount_point}

# umount rootfs 分区
rootfs_partition=$(cat /proc/mounts | grep ${EMMC_device}p2 | awk '{print 1美元}')
如果[[! -z "${rootfs_partition}"]];然后
金额${EMMC_DEVICE}P2
和数据

回波"->闪存 DTB/kernel/rootfs 完成。"

回显"闪存系统完成。"
}

########## 主入口##########
函数 main(){

echo -e "\n 版本:mkemmcboot_${major_version}.${minor_version}"

#检查闪存环境
回波-e "\n1/4:"
CHECK_ENTERGY

#擦除 u-boot 环境变量
回波-e "\n2/4:"
erase_uboot_env

#创建 eMMC 分区
回波-e "\n3/4:"
create_eMMC_partition

#闪存 u-boot/kernel/rootfs 等
回波-e "\n4/4:"
FLASH_SYSTEM

同步

}

主要

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    有关使用 SD 卡将 Linux 刷写到 eMMC 的信息、请参阅以下指南:

    https://dev.ti.com/tirex/explore/node?node=A__AdNWBqCVds4ZSqU9osT1tQ__AM62-ACADEMY__uiYMDcq__LATEST

    对于您自己的脚本、请确保执行以上指南中列出的每个步骤。 更具体地说、请确保从 U-Boot 运行"mmc partconf"和"mmc bootbus"命令。

    此致、

    Prashant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我可以使用 uboot 命令进行写入、但我的 u-boot.img 文件太大、导致下载失败。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    请参阅以下主题:

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1494767/am6442-emmc-boot-spl-failed-to-boot-from-all-boot-devices

    此致、

    Prashant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我修改了 A53的 defconfig、将 u-boot.img 地址从0x1400加载到0xc00、但在将 u-boot.img 刻录到 EMMC 的过程中会出现如图所示的问题。 我的文件只有890KB、不超过4MB。 我的理解是、加载过程中可能会出现加载问题、但执行 MMC 写入${loadaddr}0x1400 0x2000应该会导致正常写入。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否可以在 Linux 用户阶段配置 MMC partconf 0 1 1、MMC bootbus 0 2 0 0、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但执行 MMC write ${loadaddr}0x1400 0x2000应导致正常写入。

    如果 A53 U-Boot 仅为1MB、则可以使用以下命令:

    => mmc write $loadaddr 0x1400 0x800

    是否可以在 Linux 用户阶段配置 MMC partconf 0 1 1、MMC bootbus 0 2 0 0、

    这些命令将从 U-Boot 运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好
    我知道 boot0分区的大小由我的 eMMC 决定、并且 MMC 写入命令的大小设置不正确。 非常感谢您的帮助。
    我能否找到一种在 Linux 应用层配置 partconf 和 bootbus 的方法?因为我要实现在 Linux 层上刻录 SD 卡中的 EMMC、如果我仍需要进入 U-boot 层配置、则需要重新启动器件并修改 U-boot 代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、我将检查 Linux 是否有方法、然后返回给您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我能找到一种在 Linux 应用层配置 partconf 和 bootbus 的方法吗?

    您可以使用"MMC-utils"用户空间应用程序中的以下命令:

    https://git.kernel.org/pub/scm/utils/mmc/mmc-utils.git/tree/man/mmc.1#n56

    https://git.kernel.org/pub/scm/utils/mmc/mmc-utils.git/tree/man/mmc.1#n62

    示例日志:

    root@am62pxx-evm:/run/media/root-mmcblk1p2/usr/bin# ./mmc bootpart enable 1 1 /dev/mmcblk0
    root@am62pxx-evm:/run/media/root-mmcblk1p2/usr/bin# ./mmc bootbus set single_backward x1 x8 /dev/mmcblk0
    Changing ext_csd[BOOT_BUS_CONDITIONS] from 0x02 to 0x02