Add the ability to create additional ubifs volumes inside ubi volume.

For example this code create empty 2MiB volume named "config".
===
MKUBIFS_ARGS = "-m 1 -e 65408 -c 958 -F"
UBINIZE_ARGS = "-m 1 -p 64KiB"

MKUBIFS_VOLUMES="config rootfs"
MKUBIFS_VOLUME_SIZE[config] = "2MiB"
MKUBIFS_VOLUME_ARGS[config] = "-m 1 -e 65408 -c 22 -F"
===
As result system will be have /dev/ubi0_0 as "config" and
/dev/ubi0_1 as "rootfs".

Can be used with FSTYPE ubi and multiubi

Signed-off-by: Maksym Komar <[email protected]>
---
 meta/classes/image_types.bbclass | 67 +++++++++++++++++++++++++-------
 1 file changed, 53 insertions(+), 14 deletions(-)

diff --git a/meta/classes/image_types.bbclass b/meta/classes/image_types.bbclass
index e881d0cc2d..726760d99b 100644
--- a/meta/classes/image_types.bbclass
+++ b/meta/classes/image_types.bbclass
@@ -174,28 +174,67 @@ multiubi_mkfs() {
                local vname="_$3"
        fi
 
-       echo \[ubifs\] > ubinize${vname}-${IMAGE_NAME}.cfg
-       echo mode=ubi >> ubinize${vname}-${IMAGE_NAME}.cfg
-       echo 
image=${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubifs >> 
ubinize${vname}-${IMAGE_NAME}.cfg
-       echo vol_id=0 >> ubinize${vname}-${IMAGE_NAME}.cfg
-       echo vol_type=dynamic >> ubinize${vname}-${IMAGE_NAME}.cfg
-       echo vol_name=${UBI_VOLNAME} >> ubinize${vname}-${IMAGE_NAME}.cfg
-       echo vol_flags=autoresize >> ubinize${vname}-${IMAGE_NAME}.cfg
-       mkfs.ubifs -r ${IMAGE_ROOTFS} -o 
${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubifs ${mkubifs_args}
-       ubinize -o 
${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubi ${ubinize_args} 
ubinize${vname}-${IMAGE_NAME}.cfg
+       if [ -z "$4" ]; then
+               MKUBIFS_VOLUMES="rootfs"
+       fi
+
+       local vol_id=0
+       echo -n > ubinize${vname}-${IMAGE_NAME}.cfg
+       for volume in ${MKUBIFS_VOLUMES}; do
+               echo \[${volume}\] >> ubinize${vname}-${IMAGE_NAME}.cfg
+               echo mode=ubi >> ubinize${vname}-${IMAGE_NAME}.cfg
+               echo vol_id=$vol_id >> ubinize${vname}-${IMAGE_NAME}.cfg
+               echo vol_type=dynamic >> ubinize${vname}-${IMAGE_NAME}.cfg
+
+               # workaround to get Variable Flag 
MKUBIFS_VOLUME_SIZE[volume_name]
+               eval ${@' '.join(['size_' + k + '=\\"' + v + '\\"' for k,v in 
d.getVarFlags('MKUBIFS_VOLUME_SIZE').items()])}
+               eval size=\"\$size_$volume\"
+
+               if [ -z "$size" ]; then
+                       echo vol_flags=autoresize >> 
ubinize${vname}-${IMAGE_NAME}.cfg
+               else
+                       echo vol_size=$size >> ubinize${vname}-${IMAGE_NAME}.cfg
+               fi
+
+               if [ "${volume}" = "rootfs" ]; then
+                       echo 
image=${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubifs >> 
ubinize${vname}-${IMAGE_NAME}.cfg
+                       echo vol_name=${UBI_VOLNAME} >> 
ubinize${vname}-${IMAGE_NAME}.cfg
+                       mkfs.ubifs -r ${IMAGE_ROOTFS} -o 
${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubifs ${mkubifs_args}
+               else
+                       echo 
image=${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}.${volume}.ubifs >> 
ubinize${vname}-${IMAGE_NAME}.cfg
+                       echo vol_name=${volume} >> 
ubinize${vname}-${IMAGE_NAME}.cfg
+
+                       # workaround to get Variable Flag 
MKUBIFS_VOLUME_ARGS[volume_name]
+                       eval ${@' '.join(['args_' + k + '=\\"' + v + '\\"' for 
k,v in d.getVarFlags('MKUBIFS_VOLUME_ARGS').items()])}
+                       eval args=\"\$args_$volume\"
+
+               # create empty volume
+                       mkdir -p empty
+                       mkfs.ubifs -r empty -o 
${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}.${volume}.ubifs $args
+                       rmdir empty
+               fi
+               vol_id=$(expr $vol_id + 1)
+       done
+
+       # if variable IMAGE_NAME_SUFFIX is weak, set suffix with names of all 
volumes
+       image_name_suffix=$IMAGE_NAME_SUFFIX
+       if [ -n "${MKUBIFS_VOLUMES}" -a -z "${@d.getVar('IMAGE_NAME_SUFFIX', 
noweakdefault=True) or ''}" ]; then
+               image_name_suffix=${@'.' + 
'-'.join(d.getVar('MKUBIFS_VOLUMES').split())}
+       fi
+       ubinize -o 
${IMGDEPLOYDIR}/${IMAGE_NAME}${vname}${image_name_suffix}.ubi ${ubinize_args} 
ubinize${vname}-${IMAGE_NAME}.cfg
 
        # Cleanup cfg file
        mv ubinize${vname}-${IMAGE_NAME}.cfg ${IMGDEPLOYDIR}/
 
        # Create own symlinks for 'named' volumes
-       if [ -n "$vname" ]; then
+       if [ -n "$vname" -o "${IMAGE_NAME_SUFFIX}" != "${image_name_suffix}" ]; 
then
                cd ${IMGDEPLOYDIR}
                if [ -e ${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubifs ]; then
                        ln -sf ${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubifs \
                        ${IMAGE_LINK_NAME}${vname}.ubifs
                fi
-               if [ -e ${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubi ]; then
-                       ln -sf ${IMAGE_NAME}${vname}${IMAGE_NAME_SUFFIX}.ubi \
+               if [ -e ${IMAGE_NAME}${vname}${image_name_suffix}.ubi ]; then
+                       ln -sf ${IMAGE_NAME}${vname}${image_name_suffix}.ubi \
                        ${IMAGE_LINK_NAME}${vname}.ubi
                fi
                cd -
@@ -208,12 +247,12 @@ IMAGE_CMD_multiubi () {
                eval local mkubifs_args=\"\$MKUBIFS_ARGS_${name}\"
                eval local ubinize_args=\"\$UBINIZE_ARGS_${name}\"
 
-               multiubi_mkfs "${mkubifs_args}" "${ubinize_args}" "${name}"
+               multiubi_mkfs "${mkubifs_args}" "${ubinize_args}" "${name}" 
"${MKUBIFS_VOLUMES}"
        done
 }
 
 IMAGE_CMD_ubi () {
-       multiubi_mkfs "${MKUBIFS_ARGS}" "${UBINIZE_ARGS}"
+       multiubi_mkfs "${MKUBIFS_ARGS}" "${UBINIZE_ARGS}" "" 
"${MKUBIFS_VOLUMES}"
 }
 
 IMAGE_CMD_ubifs = "mkfs.ubifs -r ${IMAGE_ROOTFS} -o 
${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.ubifs ${MKUBIFS_ARGS}"
-- 
2.19.1

-- 
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to