工具/软件:
你(们)好
使用我们自己的 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
同步
}
主要