一、编译 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.-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 directories, 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::: warning: this ‘else’ clause does not guard... [-Wmisleading-indentation]
error, forbidden warning: phydm_adc_sampling.c: 没加大括号

if-else错误

另一个错误是~号

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

~号错误提示

修改办法:

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

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

解决办法:

把语句放在switch外面

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

解决办法:后面加括号

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 >/dev/null
sync
} if [ -e /firstboot ]; then
echo "======Expanding the rootfs..."
parted /dev/mmcblk0 -- unit s resizepart -34s
e2fsck -f /dev/mmcblk0p5
resize2fs /dev/mmcblk0p5
clean_first_boot
fi
脚本内容如上,红色部分看实际情况更改

rk3328编译Linux固件的更多相关文章

  1. 转:小白编译openwrt固件教程

    原文地址 编译openwrt固件并没有想象的那么复杂,我也是个小白,以下内容是我将网络上的编译教程稍微进行了一下整合.因为我发现很多编译教程没有说明如何更改flash相关配置.   安装ubuntu, ...

  2. ESP8266 LUA脚本语言开发: 准备工作-动手编译LUA固件

    前言 这节咱自己编译LUA固件 准备一台linux的机子 我把固件放到了git上,方便电脑用http下载 我先用这个连接linux 大家随意哈,只要是一台linux的机子就可以,不管是图形页面还是命令 ...

  3. 编译lua固件NodeMcu 8266

    https://www.cnblogs.com/yangfengwu/p/10547024.html 因为我现在的Wifi的教程是lua语言编写的,但是有些功能需要自己编译lua固件才可以,这篇文章就 ...

  4. 关于VS2015支持编译Linux程序的问题

    现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...

  5. 编译linux内核以及depmod的使用

    转载:http://blog.lmtw.com/b/18215/archives/2010/71074.html depmod(depend module) 功能说明:分析可载入模块的相依性. 语 法 ...

  6. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

    最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载 ...

  7. Centos下编译Linux内核

    Linux内核编译是一件简单却费事的事.但是独立的编译linux内核会帮助你很好的理解Linux内核的工作机理. 首先编译linux内核我们需要在当前linux操作系统下安装gcc编译器,因为我是Ce ...

  8. 编译linux内核时出错

    在编译linux内核的时候使用make menuconfig 可能出现下面的错误 *** Unable to find the ncurses libraries or the*** required ...

  9. Mac下重新编译Linux内核

    Mac下重新编译Linux内核 操作系统实验,要求添加系统调用并重新编译内核,这里记录一下编译内核的过程 0.下载VirtualBox 博主一直用parallel desk,但因为驱动等问题,在PD上 ...

随机推荐

  1. CGI FastCGI WSGI 解析

    我们将服务端程序分为了web服务器和应用程序服务器. web服务器是用于处理HTML文件,让客户可以通过浏览器进行访问.主流的有apache,IIS,nginx,lghttpd等. 应用服务器处理业务 ...

  2. Delphi XE2 之 FireMonkey 入门(11) - 控件居中、旋转、透明

    RotationAngle.RotationCenter.Opacity 属性继承自 TControl(FMX.Types), 这些新属性成了控件的基本功能. 先在 HD 窗体上添加 TRectang ...

  3. GMSSL学习总结1

    接触GMSSL一段时间了,总结一点点想法 证书:DER格式.PEM格式 .DER = DER扩展用于二进制DER编码证书. .PEM = PEM扩展用于不同类型的X.509v3文件,是以“ - BEG ...

  4. Mac018--VisualBox & ubuntu 安装

    一.安装虚拟机VMware 参考博客:https://blog.csdn.net/u013142781/article/details/50529030 Step1:下载ubuntu镜像 注:选择Ub ...

  5. Android之异步调用

    概述 AsyncTask可以很好的,准确的使用UI线程,他可以将一个比较耗时(几秒钟)的动作运行在后台,并且能将结果返回至UI线程中,不需要通过(Thread操作和Handler操作). 使用时必须通 ...

  6. mysql数据库监控工具-MONyog的配置和基本使用项

    测试数据传输前,研发要求需要监控10万,50万,100万数量级的数据在传输过程数据库服务器的资源消耗情况,因为数据传输服务是定时任务执行,配置10秒中一次,一次处理500条,处理完10万数据可能要半个 ...

  7. vscode怎么修改颜色主题里的某种颜色

    我习惯用深色主题, 齿轮--->颜色主题 ---->monokai是我的菜. 比较精神,又不刺眼. 但是这个主题的注释的颜色太浅了. 几乎和背景重合. 注释很重要, 能体现和记录自己的代码 ...

  8. 使用userAgent区分浏览器版本

    使用userAgent区分浏览器版本:https://blog.csdn.net/n447194252/article/details/76255489 JS根据userAgent值来判断浏览器的类型 ...

  9. Can you answer these queries? HDU 4027 线段树

    Can you answer these queries? HDU 4027 线段树 题意 是说有从1到编号的船,每个船都有自己战斗值,然后我方有一个秘密武器,可以使得从一段编号内的船的战斗值变为原来 ...

  10. ARM汇编3

    一. 什么是协处理器? 1.1. SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务. 1.2. ARM设计上支持多达16个协处理器,但是一般SoC只实现其中的CP15.(c ...