zoukankan      html  css  js  c++  java
  • Lichee(两) 在sun4i_crane该平台下编译

    让我们先来回顾一下编译命令
    $ cd workdir/lichee
    $ ./build.sh -p sun4i_crane -k 3.0 

    lichee文件夹下的build.sh

    #!/bin/bash
    set -e
    buildroot/scripts/common.sh $@



    build.sh的内容就是这么简单。有效内容就2行。先看第一行 set -e
    set命令的-e參数。linux自带的说明例如以下:
    "Exit immediately if a simple command exits with a non-zero status."
    也就是说。在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会马上退出。

    1.  运行buildroot文件夹下的build.sh
    在buildroot/scripts/common.sh中,因为我们没有带MODULE參数,就表示并非仅仅编译单个模块。而是buildroot linux3.0 u-boot这3个会被一次性都编译

    buildroot/scripts/common.sh中的编译buildroot的关键内容例如以下:

    BR_DIR = buildroot
    PLATFORM = sun4i_crane
    cd ${BR_DIR} && ./build.sh -p ${PLATFORM}

    buildroot/build.sh的核心内容是

    if [ -x ./scripts/build_${PLATFORM}.sh ]; then
     ./scripts/build_${PLATFORM}.sh $MODULE
    else
        ……
    fi

    实际上就是运行
    ./buildroot/scripts/build_sun4i_crane.sh
    有效代码例如以下

    export PATH=${CUR_DIR}/output/external-toolchain/bin:$PATH
    
    if [ ! -e output/external-toolchain ];then
    cd output
    tar -jxf ../dl/arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 
    mv arm-2010.09 external-toolchain 
    fi


    到这里就非常明显了,buildroot的前期工作就是依据 ${PLATFORM}的值来使用交叉编译工具链 而arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 就是Android的交叉编译工具链
    至此在SUN4I平台下的Android版本号的builtroot的工作就完毕了

    2. 编译内核
    buildroot/scripts/common.sh中的编译linux-3.0的关键内容例如以下:

    export PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATH
     cd ${KERN_DIR} && ./build.sh -p ${PLATFORM} -v ${VENDOR}

    接下来就是将buildroot解压好的Android toolchain设置到PATH中。紧接着就是运行linux3.0中的build.sh脚本了

    ./.linux-3.0/build.sh

    .........
    
    if [ -x ./scripts/build_${PLATFORM}.sh ]; then
     ./scripts/build_${PLATFORM}.sh $MODULE
    else
     printf "
    ERROR: Invalid Platform
    "
     show_help
     exit 1
    fi
    
    .........


    相同地,linux-3.0/build.sh的重点也是运行linux/script/build_sun4i_crane.sh,我们找到了这个脚本文件

    ./linux/script/build_sun4i_crane.sh

    经过简单分析,我们发现,编译内核最重要的2个shell函数就是build_kernel() build_modules(),通过我们对《Lichee(一)­­—— lichee文件夹结构介绍和编译命令》一文的分析,内核编译主要是对标准内核 已经 提供给制造商的module模块来一直编译

    小贴士:
        这里来谈谈modules模块的意义。把SUN4I平台很常见的驱动或者自己比較独特的驱动列入单独的modules以下来。能够大大减少耦合性。甚至不用改动原有内核的配置或代码,就能够完毕一款新产品的移植


    因为比較关键,接下来通篇分析build_kernel()这个函数
    build_kernel()
    {
    #假设没有配置过kernel 就运行cp arch/arm/configs/sun4i_crane_defconfig .config,就使用预设的配置
     if [ ! -e .config ]; then
      echo -e "
    		Using default config... ...!
    "
      cp arch/arm/configs/sun4i_crane_defconfig .config
     fi
    
    #编译standby模块
     build_standby
    #指定buildroot的工具链来make uImage
     make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -j8 uImage modules
    
     update_kern_ver
    
     if [ -d output ]; then
      rm -rf output
     fi
     mkdir -p $LICHEE_MOD_DIR
    
    #通过 buildroot/output/external-toolchain/bin/arm-none-linux-gnueabi-objcopy 命令生成 bImage文件
     ${OBJCOPY} -R .note.gnu.build-id -S -O binary vmlinux output/bImage
     cp -vf arch/arm/boot/[zu]Image output/
     cp .config output/
    
    #拷贝重要文件夹下的模块文件*.ko 到 ${LICHEE_MOD_DIR} lichee/modules文件夹
     for file in $(find drivers sound crypto block fs security net -name "*.ko"); do
      cp $file ${LICHEE_MOD_DIR}
     done
     cp -f Module.symvers ${LICHEE_MOD_DIR}
     #cp -f modules.* ${LICHEE_MOD_DIR}
    
     #copy bcm4330 firmware and nvram.txt
     cp drivers/net/wireless/bcm4330/firmware/bcm4330.bin ${LICHEE_MOD_DIR}
     cp drivers/net/wireless/bcm4330/firmware/bcm4330.hcd ${LICHEE_MOD_DIR}
     cp drivers/net/wireless/bcm4330/firmware/nvram.txt ${LICHEE_MOD_DIR}/bcm4330_nvram.txt
     cp drivers/net/wireless/bcm4330/firmware/mw269v3_fw.bin ${LICHEE_MOD_DIR}
     cp drivers/net/wireless/bcm4330/firmware/mw269v3_nvram.txt ${LICHEE_MOD_DIR}
     cp drivers/net/wireless/rtxx7x/RT2870STA.dat ${LICHEE_MOD_DIR}
     cp drivers/net/wireless/rtxx7x/RT2870STACard.dat ${LICHEE_MOD_DIR}
    }



    而build_modules()函数就是将modules文件夹下的各个模块,假设是源代码就通过make -C的方式编译并拷贝。假设是.ko文件就直接拷贝

    3. 编译uboot
    buildroot/scripts/common.sh中的编译u-boot的关键内容例如以下:

    echo "build uboot for ${PLATFORM}"
    cd ${U_BOOT_DIR} && ./build.sh -p sun4i -v ${VENDOR}


    相对于kernel而言。uboot文件夹下的build.sh就简单多了

    if [ "$PLATFORM" = "sun4i_crane" ]; then
     make distclean && make -j4 sun4i CROSS_COMPILE=arm-none-linux-gnueabi-
    else
     make distclean && make -j4 $PLATFORM CROSS_COMPILE=arm-none-linux-gnueabi-
    fi


    不过简单的clean后,再又一次编译罢了

    至此看起来复杂的lichee,通过一条主脉络走下来。我们就很清晰了,我们也大致了解了lichee这个项目的主要构成,作为一个合格的BSPproject师,实现编译打包的自己主动化是一个起码要求,这也能够给我们今后的编译打包设计提供一个參考。






    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    【LeetCode】205. Isomorphic Strings
    Syscall param open(filename) points to unaddressable byte(s)
    五种主要多核并行编程方法分析与比较
    计算机时间复杂度和空间复杂度
    CUDA学习笔记(二)【转】
    CUDA学习笔记(一)【转】
    CUDA Thread Indexing
    Intel MKL函数,如何得到相同的计算结果?【转】
    CUDA编程
    GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4652528.html
Copyright © 2011-2022 走看看