• rk3328编译Linux固件


    一、编译 Linux 固件

    这一章将介绍编译 ROC-RK3328-CC Linux 固件的整个流程。

    1.1 准备工作

    Linux 固件在如下的环境中编译:

    • Ubuntu 16.04 amd64

    安装以下包:

    sudo apt-get install bc bison build-essential curl 
         device-tree-compiler dosfstools flex gcc-aarch64-linux-gnu 
         gcc-arm-linux-gnueabihf gdisk git gnupg gperf libc6-dev 
         libncurses5-dev libpython-dev libssl-dev libssl1.0.0 
         lzop mtools parted repo swig tar zip

    1.2 下载 Linux SDK

    创建工程目录:

    # create project dir
    mkdir ~/proj/roc-rk3328-cc
    cd ~/proj/roc-rk3328-cc

    下载 Linux SDK:

    # U-Boot
    git clone -b roc-rk3328-cc https://github.com/FireflyTeam/u-boot
    # Kernel
    git clone -b roc-rk3328-cc https://github.com/FireflyTeam/kernel --depth=1
    # Build
    git clone -b debian https://github.com/FireflyTeam/build
    # Rkbin
    git clone -b master https://github.com/FireflyTeam/rkbin

    提示:通过以上链接可以在线浏览源码。

    开发板编译配置在:

    build/board_configs.sh

    1.3 编译 U-Boot

    编译 U-Boot:

    ./build/mk-uboot.sh roc-rk3328-cc

    输出:

    out/u-boot/
    ├── idbloader.img
    ├── rk3328_loader_ddr786_v1.06.243.bin
    ├── trust.img
    └── uboot.img
    • rk3328_loader_ddr786_v1.06.243.bin: DDR 初始化文件。
    • idbloader.img: DDR 初始化与 miniloader 结合的文件。
    • trust.img: ARM trusted 固件。
    • uboot.img: U-Boot映像文件。

    相关文件:

    • configs/roc-rk3328-cc_defconfig: 默认 U-Boot 配置

    1.4 编译 Kernel

    编译 kernel:

    ./build/mk-kernel.sh roc-rk3328-cc

    输出:

    out/
    ├── boot.img
    └── kernel
        ├── Image
        └── rk3328-roc-cc.dtb
    • boot.img: 包含 Image and rk3328-roc-cc.dtb 的映像文件, 为 fat32 文件系统格式。
    • Image: 内核映像。
    • rk3328-roc-cc.dtb: 设备树 blob。

    相关文件:

    • arch/arm64/configs/fireflyrk3328_linux_defconfig: 默认内核配置。
    • arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts: 开发板设备树描述。
    • arch/arm64/boot/dts/rockchip/rk3328.dtsi: CPU 设备树描述。

    自定义内核配置和更新默认配置:

    # 这非常重要!
    export ARCH=arm64
    
    cd kernel
    
    # 首先使用默认配置
    make fireflyrk3328_linux_defconfig
    
    # 自定义你的 kernel 配置
    make menuconfig
    
    # 保存为默认配置
    make savedefconfig
    cp defconfig arch/arm64/configs/fireflyrk3328_linux_defconfig

    注意: 构建脚本不会将内核模块复制到根文件系统。

    1.5 编译根文件系统

    可以下载预编译的根文件系统,或参考《编译 Linux 根文件系统》自己编译一个。

    环境:

    • Ubuntu 16.04 amd64

    安装依赖包:

    sudo apt-get install qemu qemu-user-static binfmt-support debootstrap

    下载 Ubuntu core:

    wget -c http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.1-base-arm64.tar.gz

    创建一个大小为 1000M 的根文件系统映像文件,并使用 Ubuntu 的基础包去初始化:

    fallocate -l 1000M rootfs.img
    sudo mkfs.ext4 -F -L ROOTFS rootfs.img
    mkdir mnt
    sudo mount rootfs.img mnt
    sudo tar -xzvf ubuntu-base-16.04.1-base-arm64.tar.gz -C mnt/
    sudo cp -a /usr/bin/qemu-aarch64-static mnt/usr/bin/

    qemu-aarch64-static是其中的关键,能在 x86_64 主机系统下 chroot 到 arm64 文件系统:

    Chroot 到新的文件系统中去并初始化:

    sudo chroot mnt/
    
    # 这里可以修改设置
    USER=firefly
    HOST=firefly
    
    # 创建用户
    useradd -G sudo -m -s /bin/bash $USER
    passwd $USER
    # 输入密码
    
    # 设置主机名和以太网
    echo $HOST > /etc/hostname
    echo "127.0.0.1    localhost.localdomain localhost" > /etc/hosts
    echo "127.0.0.1    $HOST" >> /etc/hosts
    echo "auto eth0" > /etc/network/interfaces.d/eth0
    echo "iface eth0 inet dhcp" >> /etc/network/interfaces.d/eth0
    echo "nameserver 127.0.1.1" > /etc/resolv.conf
    
    # 使能串口
    ln -s /lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service
    
    # 安装包
    apt-get update
    apt-get upgrade
    apt-get install ifupdown net-tools network-manager
    apt-get install udev sudo ssh
    apt-get install vim-tiny

    卸载文件系统:

    sudo umount rootfs/

    1.6 打包原始固件

    把你的 Linux 根文件系统映像文件放在 out/rootfs.img

    out 目录将包含以下文件:

    $ tree out
    out
    ├── boot.img
    ├── kernel
    │   ├── Image
    │   └── rk3328-roc-cc.dtb
    ├── rootfs.img
    └── u-boot
        ├── idbloader.img
        ├── rk3328_loader_ddr786_v1.06.243.bin
        ├── trust.img
        └── uboot.img
    
    2 directories, 8 files

    打包原始固件:

    ./build/mk-image.sh -c rk3328 -t system -r out/rootfs.img

    这条命令根据《存储映射》所描述的布局,将分区映像文件写到指定位置,最终打包成 out/system.img

    烧写原始固件的步骤,请参考 《上手指南》 一章。

    二、遇到的问题

    2.1 uboot编译问题

    • rkbin路径没有加上bin
    • 文件丢失
      • rk3328_ddr_786MHZ_v1.06.bin
      • rk3328_miniloader_v2.43.bin
      • rk3328_bl31_v1.34.bin
      • rk3328_loader_ddr786_v1.06.243.bin

    firefly丢失的文件可以在下面资源找到

    https://github.com/gkkpch/rock64-bin    

    改完路径,拷贝以上文件,u-boot编译成功

    2.2 编译kernel遇到的问题

    本来内核是在ubuntu16上编译的,但是我在18上编译了。很多都是gcc版本引起的,解决起来也比较简单

    drivers/net/wireless/rockchip_wlan/rtl8821cu/hal/phydm/phydm_adc_sampling.c:46:5: warning: this ‘else’ clause does not guard... [-Wmisleading-indentation]
    error, forbidden warning: phydm_adc_sampling.c:46
    
    没加大括号
    if-else错误

     另一个错误是~号

    drivers/net/wireless/rockchip_wlan/rtl8821cu/hal/btc/halbtc8821c1ant.c:2333:30: warning: ‘~’ on a boolean expression [-Wbool-operation]
    error, forbidden warning: halbtc8821c1ant.c:2333
    ~号错误提示

    修改办法:

    把~号改成!,虽然可能会有问题。但是解决了编译的问题

    drivers/net/wireless/rockchip_wlan/rtl8812au/hal/rtl8812a/rtl8812a_mp.c:640:7: warning: statement will never be executed [-Wswitch-unreachable]

    解决办法:

    把语句放在switch外面

    drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c:2488:3: warning: this ‘for’ clause does not guard... [-Wmisleading-indentation]
    error, forbidden warning: dm.c:2488

    解决办法:后面加括号

    2.3 编译根文件的问题

    编译根文件的时候可能无法apt-get update,网络错误。使用指令:

    cp /etc/resolv.conf mnt/etc/resolv.conf 解决

    使用中没有lsusb命令:

    apt-get install usbutils

    没有lspci:

    apt-get install pciutils  

    没有insmod:

    apt-get install kmod

    启动A start job is running for Raise network interfaces:

    命令:sudo vim /etc/systemd/system/network-online.target.wants/networking.service
    将里面的TimeoutStartSec=5min  修改为TimeoutStartSec=2sec

    烧录镜像后没有扩容剩余空间

    首先需要安装apt-get install parted,然后#vi /etc/rc.local
    在exit 0前添加/usr/local/bin/first-boot-recovery.sh启动脚本,给予可执行权限,用来扩容根目录,记得在根目录下新建一个firstboot文件

    #!/bin/bash
    
    clean_first_boot () {
        rm -f /firstboot 2>/dev/null
        sync
    }
    
    
    if [ -e /firstboot ]; then
        echo "======Expanding the rootfs..."
        parted /dev/mmcblk0 -- unit s resizepart 5 -34s
        e2fsck -f /dev/mmcblk0p5
        resize2fs /dev/mmcblk0p5
        clean_first_boot
    fi
    脚本内容如上,红色部分看实际情况更改
  • 相关阅读:
    压缩信息立方体和集合技术内幕
    C++Dll Injection Tutorial
    BW BW项目的对象传输
    SDSD知识点列表
    MM提取MM模块配置的抛帐科目列表
    MMCollect some Transaction Key Problem
    BW数据装在的处理链的设计顺序
    asp.net 页面回车触发button按钮事件
    (转载)Linux多线程信号量的概念和使用
    (转载)如何查看安装的glibc版本
  • 原文地址:https://www.cnblogs.com/ch122633/p/10755711.html
Copyright © 2020-2023  润新知