blob: 535441d3b813d4e0638da4abb38b726e200535a3 [file] [log] [blame]
#
# Mediatek MT7622 image generation: eMMC, SD and NAND
#
DEPENDS += "parted-native u-boot"
# change suffix to 'bin', default is 'rootfs' which may be a bit misleading Since
# our rootfs also contains the linux kernel and, in case of the SD image, bootloader
# and preloader
IMAGE_NAME_SUFFIX = ".bin"
inherit image_types
EMMC_TMP_FILE = "${IMGDEPLOYDIR}/ptbl-gpt.tmp"
EMMC_PART_TBL_FILE = "${IMGDEPLOYDIR}/ptbl-gpt-${MACHINE}.bin"
SCATTER_TPL = "${IMGDEPLOYDIR}/scatter.template"
SD_TMP_FILE = "${IMGDEPLOYDIR}/ptbl-msdos.tmp"
SD_PART_TBL_FILE = "${IMGDEPLOYDIR}/ptbl-msdos-${MACHINE}.bin"
SD_FILE = "${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.mtk.sd"
# Create the partition table for eMMC. Since we only have 3 partitions we
# could get away with an MSDOS style MBR, but we still use GPT for no
# particular reason.
generate_part_tbl_emmc () {
# Initialize a sparse file
dd if=/dev/zero of=${EMMC_TMP_FILE} bs=1 count=0 seek=$(expr 1024 \* ${EMMC_SIZE})
# Create partition table
parted -s ${EMMC_TMP_FILE} mklabel gpt
parted -a minimal -s ${EMMC_TMP_FILE} unit B mkpart primary \
`printf "%d" ${MTK_ROOTFS1_OFFSET}` \
$(expr `printf "%d" ${MTK_ROOTFS1_OFFSET}` + `printf "%d" ${MTK_ROOTFS_SIZE}` - 1)
parted -a minimal -s ${EMMC_TMP_FILE} unit B mkpart primary \
`printf "%d" ${MTK_ROOTFS2_OFFSET}` \
$(expr `printf "%d" ${MTK_ROOTFS2_OFFSET}` + `printf "%d" ${MTK_ROOTFS_SIZE}` - 1)
parted -a minimal -s ${EMMC_TMP_FILE} unit B mkpart primary \
`printf "%d" ${EMMC_DATA_OFFSET}` \
$(expr `printf "%d" ${EMMC_DATA_OFFSET}` + `printf "%d" ${EMMC_DATA_SIZE}` - 1)
parted -s ${EMMC_TMP_FILE} name 1 "ROOTFS1"
parted -s ${EMMC_TMP_FILE} name 2 "ROOTFS2"
parted -s ${EMMC_TMP_FILE} name 3 "DATA"
# show what we have done...
parted ${EMMC_TMP_FILE} unit MiB print
# extract partition table and delete original file
dd if=${EMMC_TMP_FILE} of=${EMMC_PART_TBL_FILE} conv=fsync bs=512 count=34
rm -f ${EMMC_TMP_FILE}
}
# Create the partition table for SD cards. We need to use legacy MSDOS format
# since the preloader is expected at offset 0x800.
generate_part_tbl_sd () {
# Initialize a sparse file
dd if=/dev/zero of=${SD_TMP_FILE} bs=1 count=0 seek=$(expr 1024 \* ${SD_SIZE})
# Create partition table
parted -s ${SD_TMP_FILE} mklabel msdos
parted -a minimal -s ${SD_TMP_FILE} unit B mkpart primary \
`printf "%d" ${MTK_ROOTFS1_OFFSET}` \
$(expr `printf "%d" ${MTK_ROOTFS1_OFFSET}` + `printf "%d" ${MTK_ROOTFS_SIZE}` - 1)
parted -a minimal -s ${SD_TMP_FILE} unit B mkpart primary \
`printf "%d" ${MTK_ROOTFS2_OFFSET}` \
$(expr `printf "%d" ${MTK_ROOTFS2_OFFSET}` + `printf "%d" ${MTK_ROOTFS_SIZE}` - 1)
parted -a minimal -s ${SD_TMP_FILE} unit B mkpart primary \
`printf "%d" ${SD_DATA_OFFSET}` \
$(expr `printf "%d" ${SD_DATA_OFFSET}` + `printf "%d" ${SD_DATA_SIZE}` - 1)
# show what we have done...
parted ${SD_TMP_FILE} unit MiB print
# extract partition table and delete original file
dd if=${SD_TMP_FILE} of=${SD_PART_TBL_FILE} conv=fsync bs=512 count=1
rm -f ${SD_TMP_FILE}
}
generate_scatter_file () {
cp ${MTK_IMAGE_FILEDIR}/scatter.template ${IMGDEPLOYDIR}
sed -i "s/__PRELOADER_FILE__/preloader-${MACHINE}.bin/g" ${SCATTER_TPL}
sed -i "s/__PART_FILE__/ptbl-gpt-${MACHINE}.bin/g" ${SCATTER_TPL}
sed -i "s/__UBOOT_ENV_FILE__/u-boot-env-${MACHINE}-emmc.bin/g" ${SCATTER_TPL}
sed -i "s/__UBOOT_FILE__/u-boot-${MACHINE}.bin-emmc/g" ${SCATTER_TPL}
sed -i "s/__ROOTFS1_FILE__/${PN}-${MACHINE}.ext4/g" ${SCATTER_TPL}
sed -i "s/__UBOOT_ENV_OFFSET__/${EMMC_UBOOT_ENV_OFFSET}/g" ${SCATTER_TPL}
sed -i "s/__UBOOT_ENV_SIZE__/${EMMC_UBOOT_ENV_SIZE}/g" ${SCATTER_TPL}
sed -i "s/__UBOOT_OFFSET__/${EMMC_UBOOT_OFFSET}/g" ${SCATTER_TPL}
sed -i "s/__UBOOT_SIZE__/${EMMC_UBOOT_SIZE}/g" ${SCATTER_TPL}
sed -i "s/__ROOTFS1_OFFSET__/${MTK_ROOTFS1_OFFSET}/g" ${SCATTER_TPL}
sed -i "s/__ROOTFS2_OFFSET__/${MTK_ROOTFS2_OFFSET}/g" ${SCATTER_TPL}
sed -i "s/__ROOTFS_SIZE__/${MTK_ROOTFS_SIZE}/g" ${SCATTER_TPL}
sed -i "s/__DATA_OFFSET__/${EMMC_DATA_OFFSET}/g" ${SCATTER_TPL}
sed -i "s/__DATA_SIZE__/${EMMC_DATA_SIZE}/g" ${SCATTER_TPL}
mv ${SCATTER_TPL} ${IMGDEPLOYDIR}/scatter-${MACHINE}.txt
}
copy_emmc_preloader () {
cp ${MTK_IMAGE_FILEDIR}/preloader-${MACHINE}.bin ${IMGDEPLOYDIR}
}
assemble_sd_image () {
# Initialize a sparse SD image file that's just big enough to cover the
# space before the first rootfs
dd if=/dev/zero of=${SD_FILE} bs=1 count=0 seek=`printf "%d" ${MTK_ROOTFS1_OFFSET}`
# now fill that space, start with proprietary 2k header provided by MTK
dd if=${MTK_IMAGE_FILEDIR}/sd-card-header.bin of=${SD_FILE} bs=512 count=4 conv=notrunc
# replace primary partions with our own (but leave rest of MBR as-is)
dd if=${SD_PART_TBL_FILE} of=${SD_FILE} seek=446 skip=446 bs=1 conv=notrunc
# add preloader at address 0x800
dd if=${MTK_IMAGE_FILEDIR}/preloader-${MACHINE}.bin of=${SD_FILE} bs=512 seek=4 conv=notrunc
# add u-boot and u-boot environment
dd if=${DEPLOY_DIR_IMAGE}/u-boot-env-${MACHINE}-sd.bin of=${SD_FILE} bs=1 seek=`printf "%d" ${EMMC_UBOOT_ENV_OFFSET}` conv=notrunc
dd if=${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.bin-sd of=${SD_FILE} bs=1 seek=`printf "%d" ${EMMC_UBOOT_OFFSET}` conv=notrunc
# append the rootfs
dd if=${IMGDEPLOYDIR}/${PN}-${MACHINE}.ext4 of=${SD_FILE} bs=64k oflag=append conv=notrunc
}
IMAGE_CMD_mtk.emmc () {
generate_part_tbl_emmc
generate_scatter_file
copy_emmc_preloader
}
IMAGE_CMD_mtk.sd () {
generate_part_tbl_sd
assemble_sd_image
}
#NAND_ROOTFS_TYPE ?= "squashfs-xz"
NAND_ROOTFS_TYPE ?= "ubi"
NAND_FILE ?= "${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.mtk.nand"
IMAGE_CMD_mtk.nand () {
# create factory image align to openwrt (kernel in ubi)
echo \[kernel\] > ubinize.cfg
echo mode=ubi >> ubinize.cfg
echo image=${DEPLOY_DIR_IMAGE}/fitImage >> ubinize.cfg
echo vol_id=0 >> ubinize.cfg
echo vol_type=dynamic >> ubinize.cfg
echo vol_name=kernel >> ubinize.cfg
echo \[rootfs\] >> ubinize.cfg
echo mode=ubi >> ubinize.cfg
echo image=${IMGDEPLOYDIR}/${PN}-${MACHINE}.squashfs-xz >> ubinize.cfg
echo vol_id=1 >> ubinize.cfg
echo vol_type=dynamic >> ubinize.cfg
echo vol_name=rootfs >> ubinize.cfg
echo \[rootfs_data\] >> ubinize.cfg
echo mode=ubi >> ubinize.cfg
echo vol_id=2 >> ubinize.cfg
echo vol_type=dynamic >> ubinize.cfg
echo vol_name=rootfs_data >> ubinize.cfg
echo vol_size=1MiB >> ubinize.cfg
echo vol_flags=autoresize >> ubinize.cfg
ubinize -o ${DEPLOY_DIR_IMAGE}/${PN}-${MACHINE}-factory.bin ${UBINIZE_ARGS} ubinize.cfg
mv ubinize.cfg ${DEPLOY_DIR_IMAGE}/
# create sysupgrade image align to openwrt
rm -rf ${IMGDEPLOYDIR}/sysupgrade-${PN}-${MACHINE}
rm -rf ${IMGDEPLOYDIR}/${PN}-${MACHINE}-sysupgrade.bin
mkdir ${IMGDEPLOYDIR}/sysupgrade-${PN}-${MACHINE}
cp ${DEPLOY_DIR_IMAGE}/fitImage ${IMGDEPLOYDIR}/sysupgrade-${PN}-${MACHINE}/kernel
cp ${IMGDEPLOYDIR}/${PN}-${MACHINE}.squashfs-xz ${IMGDEPLOYDIR}/sysupgrade-${PN}-${MACHINE}/root
cd ${IMGDEPLOYDIR}
tar cvf ${PN}-${MACHINE}-sysupgrade.bin sysupgrade-${PN}-${MACHINE}
}
# Both eMMC and SD requires the ext4 rootfs filesystem to be built before using
# it so we must make this dependency explicit.
IMAGE_TYPEDEP_mtk.emmc += "ext4"
IMAGE_TYPEDEP_mtk.sd += "ext4"
IMAGE_TYPEDEP_mtk.nand += "${NAND_ROOTFS_TYPE}"