需求:全志A64打印机驱动,更换buildroot2018文件系统
v1.1 | zsh | |
---|---|---|
buildroot2018.11 | 2022-3 |
由于一些兼容性的问题,在实际项目的开发过程中可能会出现文件系统的一些版本的问题,因此官方的2017版本的文件系统可能需要更改。
因此这个任务目的是把开发板的文件系统版本进行更换。
因为全志的官方是提供脚本进行全部的编译,包括文件系统,内核等等,为了任务的顺利完成,首要任务是弄懂脚本的具体实现流程。
下面我们进行一下脚本的分析:
首先先介绍一个概念: Lichee表示全志科技A10芯片的开发代号
说白了Lichee是一个包含文件系统,内核等等需要编译,打包的文件夹。
例如这个Lichee下就有 /brandy /buildroot-2017-02.3 等等
那么我们在编译的时候执行的脚本是 ./build.sh 我们进去看一下:
#!/bin/bash
set -e
buildroot-2017.02.3/scripts/mkcommon.sh $@
这很明显就是指定执行的路径,我们跳转mkcommon.sh看看:
//这里的 xconfig xpack …表示的是传入的命令,我们默认最开始是无参数传入。
BR_SCRIPTS_DIR=`dirname $0`
****
# source shflags
. ${BR_SCRIPTS_DIR}/shflags/shflags
[ -f .buildconfig ] && . .buildconfig
. ${BR_SCRIPTS_DIR}/mkcmd.sh
[ -f .buildconfig ] && . .buildconfig
if [ "x$1" = "xconfig" ] ; then
. ${BR_SCRIPTS_DIR}/mksetup.sh
exit $?
elif [ "x$1" = "xpack" ] ; then
if [ "x$2" = "x-d" ] ; then
init_defconf
mkpack -d card0
exit $?
else
init_defconf
mkpack
exit $?
fi
elif [ "x$1" = "xpack_debug" ] ; then
init_defconf
mkpack -d card0
exit $?
elif [ "x$1" = "xpack_dump" ] ; then
init_defconf
mkpack -m dump
exit $?
elif [ "x$1" = "xpack_secure" ] ; then
init_defconf
mkpack -s secure
exit $?
elif [ "x$1" = "xpack_prvt" ] ; then
init_defconf
mkpack -f prvt
exit $?
elif [ "x$1" = "xpack_nor" ] ;then
init_defconf
if [ "x$2" = "xdebug" ] ; then
mkpack -f spinor -d card0
else
mkpack -f spinor
fi
exit $?
elif [ "x$1" = "xpack_erase" ] ; then
init_defconf
mkpack -f erase
exit $?
elif [ $# -eq 0 ] ; then
init_defconf
mklichee
exit $?
fi
也就是当我们执行./build.sh 时 我们执行的是
elif [ $# -eq 0 ] ; then
init_defconf //初始化一些参数
mklichee //开始编译
exit $?
fi
那这两个的命令是在哪里定义的呢?我们跳转同目录下的mkcmd.sh 这里有编译的所有命令。
function init_defconf()
{
local pattern
local defconf
local out_dir="common"
check_env
pattern="${LICHEE_CHIP}_${LICHEE_PLATFORM}_${LICHEE_BOARD}"
defconf=`awk '$1=="'$pattern'" {print $2,$3}' buildroot-2017.02.3/scripts/mkrule`
if [ -n "${defconf}" ] ; then
export LICHEE_BR_DEFCONF=`echo ${defconf} | awk '{print $1}'`
export LICHEE_KERN_DEFCONF=`echo ${defconf} | awk '{print $2}'`
out_dir="${LICHEE_BOARD}"
else
pattern="${LICHEE_CHIP}_${LICHEE_PLATFORM}"
defconf=`awk '$1=="'$pattern'" {print $2,$3}' buildroot-2017.02.3/scripts/mkrule`
if [ -n "${defconf}" ] ; then
export LICHEE_BR_DEFCONF=`echo ${defconf} | awk '{print $1}'`
export LICHEE_KERN_DEFCONF=`echo ${defconf} | awk '{print $2}'`
out_dir="common"
fi
fi
export LICHEE_PLAT_OUT="${LICHEE_OUT_DIR}/${LICHEE_CHIP}/${LICHEE_PLATFORM}/${out_dir}"
export LICHEE_BR_OUT="${LICHEE_PLAT_OUT}/buildroot-2017.02.3"
mkdir -p ${LICHEE_BR_OUT}
}
function mklichee()
{
mk_info "----------------------------------------"
mk_info "build lichee ..."
mk_info "chip: $LICHEE_CHIP"
mk_info "platform: $LICHEE_PLATFORM"
mk_info "kernel: $LICHEE_KERN_VER"
mk_info "board: $LICHEE_BOARD"
mk_info "output: out/${LICHEE_CHIP}/${LICHEE_PLATFORM}/${LICHEE_BOARD}"
mk_info "----------------------------------------"
check_env
mkbr && mkkernel && mkrootfs
[ $? -ne 0 ] && return 1
mk_info "----------------------------------------"
mk_info "build lichee OK."
mk_info "----------------------------------------"
}
function mkbr()
{
mk_info "build buildroot ..."
local build_script="scripts/build.sh"
(cd ${LICHEE_BR_DIR} && [ -x ${build_script} ] && ./${build_script})
[ $? -ne 0 ] && mk_error "build buildroot Failed" && return 1
mk_info "build buildroot OK."
}
function mkrootfs()
{
mk_info "build rootfs ..."
if [ ${LICHEE_PLATFORM} = "linux" ] ; then
mkdir -p ${LICHEE_BR_DIR}/output/target/lib/modules
rm -rf ${LICHEE_BR_DIR}/output/target/lib/modules/*
cp -rf ${LICHEE_KERN_DIR}/output/lib/modules/* ${LICHEE_BR_DIR}/output/target/lib/modules/
(cd ${LICHEE_BR_DIR}/target/linux; ./build.sh)
mv ${LICHEE_BR_DIR}/target/linux/rootfs.ext4 ${LICHEE_PLAT_OUT}
else
mk_info "skip make rootfs for ${LICHEE_PLATFORM}"
fi
mk_info "build rootfs OK."
}
这里我给大家提炼出了几个关键点的函数,我们可以看到
在mklichee中 调用了3个命令:mkbr mkkernel mkrootfs
内核我们不用管,文件系统,我们有已经编译好的2018的文件系统,所以mkbr不用管,
接着我们需要看rootfs 这个很明显的可以提前知道,肯定是根据已经编译好的文件系统打包成rootfs,这里我们需要把2018打包成rootfs 替换2017.
function mkrootfs()
{
mk_info “build rootfs …”
if [ ${LICHEE_PLATFORM} = "linux" ] ; then
mkdir -p ${LICHEE_BR_DIR}/output/target/lib/modules //创建文件夹,不重要
rm -rf ${LICHEE_BR_DIR}/output/target/lib/modules/* //删除,不重要
cp -rf ${LICHEE_KERN_DIR}/output/lib/modules/* ${LICHEE_BR_DIR}/output/target/lib/modules/
**(cd ${LICHEE_BR_DIR}/target/linux; ./build.sh)** //这里很重要,执行了一个脚本./build.sh
mv ${LICHEE_BR_DIR}/target/linux/rootfs.ext4 ${LICHEE_PLAT_OUT}
else
mk_info "skip make rootfs for ${LICHEE_PLATFORM}"
fi
mk_info "build rootfs OK."
}
我们跳转进去看一下它的脚本:
#!/bin/bash
cd ${LICHEE_TOP_DIR}/lib/
if [ -e "build.sh" ]; then
./build.sh
fi
cd -
echo "generating rootfs..."
BR_ROOT=`(cd ../..; pwd)`
export PATH=$BR_ROOT/target/tools/host/usr/bin
//划重点这里的路径就是我们需要更改的路径
NR_SIZE=`du -sm /home/zsh/buildroot-2018.11/output/target | awk '{print $1}'`
NEW_NR_SIZE=$((((6962)/16)*16))
TARGET_IMAGE=rootfs.ext4
echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
//还有这里
make_ext4fs -s -l $NEW_NR_SIZE"M" $TARGET_IMAGE /home/zsh/buildroot-2018.11/output/target
fsck.ext4 -y $TARGET_IMAGE > /dev/null
if [ -n "$OUT_PATH" ]; then
cp -v rootfs.ext4 $OUT_PATH/
fi
echo "Build at: `date`"
更改完成后,直接./build.sh 有报错的话在我的其他文章已经有讲过,不再讲。
打包完成后直接烧写就可以。
提醒:
1.不要想着一开始更改目录,直接进行2018的编译,因为配置不同,会出现很多错误,并且你不知道错在哪
2.2018的配置要正确 makemenuconfig 可以参照一下官方的设置。