美文网首页
RK3328 LINUX开发者指南

RK3328 LINUX开发者指南

作者: shaniadolphin | 来源:发表于2018-10-11 13:23 被阅读0次

    Author shaniadolphin
    E-mail 349948204@qq.com

    目录

    编译LINUX固件

    1. 在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
    

    2. 创建工作目录

    mkdir ~/proj/roc-rk3328-cc
    cd ~/proj/roc-rk3328-cc
    

    3. 下载 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
    cd ~/proj/roc-rk3328-cc
    

    4. 编译UBOOT

      通过运行 build 目录下的 mk-uboot.sh 脚本,设定选项为 roc-rk3328-cc

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

      编译完后输出:

    out/u-boot/
    ├── idbloader.img
    ├── rk3328_loader_ddr786_v1.06.243.bin
    ├── trust.img
    └── uboot.img
    

      各个镜像文件的说明如下:

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

      也可以通过以下文件配置 UBOOT :

    • configs/roc-rk3328-cc_defconfig

    5. 编译编译kernel

      kernel中需要配置,并定义设备树,会涉及到以下文件:

    • 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
    

      需要注意,在 make menuconfig 时应进行如下配置:

    Device Drivers > Network device support > Wireless LAN > Rockchip Wireless LAN support 
    > Rockchip Wireless LAN support 下的除“*”之外的"M"选项都去掉
    Device Drivers > Network device support > Wireless LAN > Realtek rtlwifi family of devices 
    > Realtek rtlwifi family of devices 下的选项都去掉
    

      配置好后即可编译整个 kernel (脚本文件内部设置了使用 -j4 来编译):

    ./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: 设备树。

    制作根文件系统

    1. 安装依赖包

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

    2. 下载ubuntu core

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

    3. 创建根文件映像

      创建一个大小为 20G 的根文件系统映像文件,将 ubuntu core 解压到该映像中,如果不需要安装过多的软件,可以先设置成 2G ,后期再调整。

    cd /mnt/h/proj
    dd if=/dev/zero of=rootfs.img bs=1M count=0 seek=10000
    sudo mkfs.ext4 -F -L ROOTFS rootfs.img
    sudo mkdir mnt
    sudo mount rootfs.img mnt/
    sudo tar -xzvf ubuntu-base-18.04-base-arm64.tar.gz -C mnt/
    

    4. 复制qemu

      将 qemu-aarch64-static 放到挂载的 rootfs/usr/bin 中,能在 x86_64 主机系统下 chroot 到该 arm64 文件系统中运行:

    sudo cp -a /usr/bin/qemu-aarch64-static mnt/usr/bin/
    

    5. 增加有效的更新源

      用 vim 编辑器打开 sources.list

    vim mnt/etc/apt/sources.list
    

    6. chroot 到新的文件系统中

      chroot 命令用来在指定的根目录下运行指令,在使用 chroot 之后,系统的目录结构将以指定的位置作为 “/” 位置。

    sudo chroot mnt/
    

      在 rootfsroot 用户下设置:

    # 这里可以修改设置
    USER=dolphin
    HOST=dolphin-ubuntu
    # 创建用户
    useradd -G sudo -m -s /bin/bash $USER
    passwd $USER
    # 输入密码
    # 设置主机名和以太网
    echo $HOST /etc/hostname
    echo "127.0.0.1 $HOST" >> /etc/hosts
    echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
    mkdir /etc/network
    mkdir /etc/network/interfaces.d
    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
    echo "nameserver 8.8.8.8 " >> /etc/resolv.conf
    
    # 安装包
    apt-get update
    apt-get upgrade
    apt-get install -y udev sudo ssh
    apt-get install -y ifupdown net-tools network-manager
    # 必须安装以安装对应的依赖systemd,否则系统无法挂载
    apt-get install -y vim
    # 增加 armhf支持
    dpkg --add-architecture armhf
    apt-get update
    apt-get install -y libc6:armhf
    
    # 使能串口
    # ROC-RK3328-CC的UART默认使用1 500 000波特率和TTL电平。
    ln -s /lib/systemd/system/serial-getty\@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service
    

      退出,并卸载文件系统:

    exit
    sudo sync
    # <enter user password>
    sudo umount mnt/
    

      如果想要在创建的根文件系统中安装软件,也可以继续chroot到该文件系统中,安装一些常用的软件,比如 "pip" , "numpy" 等,避免复杂的交叉编译环境设置和加快文件系统的成型。
      这样rootfs.img里就已经有刚才制作的根目录内容了,但这个img文件大小却是定义的镜像的大小,不是文件系统的实际大小,所以还要经过一些处理才能发布。
      检查并查看rootfs.img镜像的大小:

    dolphin@dolphin-ubuntu:~/proj/rootfs$ e2fsck -p -f rootfs.img
    ROOTFS:17032/640848 文件(0.2% 为非连续的), 234632/2560000 块
    dolphin@dolphin-ubuntu:~/proj/rootfs$ ls -l rootfs.img
    -rw-rw-r-- 1 dolphin dolphin 10485760000 10月 24 22:18 rootfs.img
    

      减小ubuntu.img镜像文件的大小:

    dolphin@dolphin-ubuntu:~/proj/rootfs$ resize2fs -M rootfs.img
    resize2fs 1.44.1 (24-Mar-2018)
    &emsp;&emsp;将 rootfs.img 上的文件系统调整为 305886 个块(每块 4k)。
    rootfs.img 上的文件系统现在为 305886 个块(每块 4k)。
    
    dolphin@dolphin-ubuntu:~/proj/rootfs$ ls -l rootfs.img
    -rw-rw-r-- 1 dolphin dolphin 1252909056 10月 24 22:19 rootfs.img
    

    打包固件

    1. 准备并检查映像

      把 Linux根文件系统映像文件 rootfs 放在 out/ 下,这时 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
    

    2. 打包固件

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

      该脚本将根据《存储映射》所描述的布局,将分区映像文件写到指定位置,并最终打包成 out/system.img
      如下所示的"parameter.txt"就是按照存储映射布局制作的,只添加了几个必不可少的分区。

    FIRMWARE_VER:8.1
    MACHINE_MODEL:RK3308
    MACHINE_ID:007
    MANUFACTURER: RK3308
    MAGIC: 0x5041524B
    ATAG: 0x00200800
    MACHINE: 3308
    CHECK_MASK: 0x80
    PWR_HLD: 0,0,A,0,1
    TYPE: GPT
    CMDLINE:mtdparts=rk29xxnand:0x1000@0x2000(uboot),0x1000@0x6000(trust),0x6000@0x8000(boot),-@0x40000(rootfs:grow)
    uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
    

    烧录固件

      插入 SD 卡,如果 SD 被自动挂载,则先将其卸载。
      安装pv

    sudo apt-get install pv
    

      通过检查内核的日志查找 SD 卡的设备文件:

    dmesg | tail
    

      如果设备文件为 /dev/sdb ,使用 dd 命令进行烧录:

    pv -tpreb /path/to/your/raw/firmware | sudo dd of=/dev/sdb conv=notrunc
    

      如果需要将分区镜像写入到 SD 卡,可以运行以下命令:

    sudo dd if=./out/u-boot/idbloader.img of=/dev/sdb seek=64 conv=sync,fsync 
    sudo dd if=./out/u-boot/uboot.img of=/dev/sdb seek=16384 conv=sync,fsync 
    sudo dd if=./out/u-boot/trust.img of=/dev/sdb seek=24576 conv=sync,fsync 
    sudo dd if=./out/boot.img of=/dev/sdb seek=32768 conv=sync,fsync 
    sudo dd if=./out/rootfs.img of=/dev/sdb seek=262144 conv=sync,fsync
    

      也可以运行下面指令,将生成的统一固件 system.img 写入到 SD 卡中:

    build/flash_tool.sh -c rk3328 -d /dev/sdb -p system -i out/system.img
    

    参考文档

    # 链接地址 文档名称
    1 dev.t-firefly.com/forum.php?mod=viewthread&tid=52810&highlight=3288 构建ROC-RK3328-CC 固件
    2 wiki.t-firefly.com/zh_CN/ROC-RK3328-CC/linux_compile_firmware.html ROC-RK3328-CC 开发者指南
    3 wiki.t-firefly.com/zh_CN/ROC-RK3328-CC/flash_sd.html ROC-RK3328-CC烧写SD 卡
    4 opensource.rock-chips.com/wiki_Distribution [制作根文件系统](http://opensource.rock-chips.com/wiki_Distribution

    相关文章

      网友评论

          本文标题:RK3328 LINUX开发者指南

          本文链接:https://www.haomeiwen.com/subject/rdbpaftx.html