当前位置: 首页 > article >正文

Firefly-RK3399从Ubuntu 16.04到自定义Rootfs:手把手教你编译内核与打包固件

Firefly-RK3399从Ubuntu 16.04到自定义Rootfs手把手教你编译内核与打包固件在嵌入式开发领域能够自主定制系统镜像是一项极具价值的能力。Firefly-RK3399作为一款性能强大的开发板其开放的架构为开发者提供了深度定制的可能性。本文将带你从基础的Ubuntu 16.04系统出发逐步深入到内核编译、驱动开发、根文件系统定制最终生成完全属于自己的固件镜像。1. 开发环境搭建与准备在开始定制系统之前我们需要准备一个稳定可靠的开发环境。推荐使用Ubuntu 18.04作为宿主机系统因为它提供了良好的兼容性和完善的工具链支持。首先安装必要的编译工具和依赖sudo apt-get update sudo apt-get install -y build-essential lzop libncurses5-dev libssl-dev git对于64位系统还需要安装32位兼容库sudo apt-get install -y libc6:i386接下来获取Rockchip专用的mkbootimg工具git clone https://github.com/neo-technologies/rockchip-mkbootimg.git cd rockchip-mkbootimg make sudo make install关键工具版本检查表工具名称最低版本要求检查命令gcc7.4.0gcc --versionmake4.1make --versiongit2.17git --versionlibncurses5-dev6.1dpkg -l libncurses5-dev提示如果在后续步骤中遇到奇怪的编译错误首先检查工具链版本是否符合要求。2. 获取与配置内核源码Firefly-RK3399的内核源码可以从官方仓库获取git clone https://gitlab.com/TeeFirefly/linux-kernel.git cd linux-kernel获取交叉编译工具链git clone https://gitlab.com/TeeFirefly/prebuilts.git export PATH$PATH:$(pwd)/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin配置内核使用Firefly的默认配置make ARCHarm64 firefly_linux_defconfig对于自定义内核配置可以使用menuconfig界面make ARCHarm64 menuconfig在menuconfig界面中你可以启用或禁用特定内核模块调整系统参数添加实验性功能支持常见配置选项参考配置项推荐设置说明CONFIG_LOCALVERSION自定义设置内核版本标识CONFIG_MODULESY启用模块支持CONFIG_CMDLINE保留默认除非有特殊启动参数需求CONFIG_DEBUG_KERNELN生产环境建议关闭CONFIG_DRM_ROCKCHIPY必须启用以支持显示输出3. 开发与集成自定义驱动让我们以一个简单的Hello World驱动为例演示如何将自定义代码集成到内核中。在drivers目录下创建新目录并添加驱动文件mkdir -p drivers/hello cd drivers/hello创建hello.c驱动文件#include linux/init.h #include linux/module.h static int __init hello_init(void) { printk(KERN_INFO Hello World from Firefly-RK3399!\n); return 0; } static void __exit hello_exit(void) { printk(KERN_INFO Goodbye from Firefly-RK3399!\n); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE(GPL); MODULE_AUTHOR(Your Name); MODULE_DESCRIPTION(A simple Hello World driver);创建对应的Makefileobj-$(CONFIG_HELLO) hello.o创建Kconfig配置文件config HELLO tristate Hello World driver help This is a simple Hello World driver example.然后需要修改上一级目录的Makefile和Kconfig将新驱动包含进构建系统cd .. echo obj-y hello/ Makefile在Kconfig中添加source drivers/hello/Kconfig重新配置内核确保新驱动被启用make ARCHarm64 menuconfig在Device Drivers菜单中找到并启用Hello World driver选项。4. 编译内核与生成镜像完成所有配置后可以开始编译内核make ARCHarm64 rk3399-firefly-linux.img -j$(nproc)编译过程可能会持续10-30分钟取决于你的主机性能。编译完成后会在内核根目录生成以下关键文件kernel.img内核镜像resource.img资源镜像包含设备树等常见问题排查编译失败提示缺少头文件检查是否安装了所有依赖库确认交叉编译工具链路径设置正确生成的镜像无法启动检查是否使用了正确的defconfig确认设备树文件(rk3399-firefly-linux.dts)是否正确模块加载失败检查内核版本是否匹配确认模块签名设置5. 构建自定义根文件系统我们将使用Ubuntu Base 16.04作为基础创建自定义的根文件系统。首先获取基础文件系统wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/ubuntu-base-16.04.2-base-arm64.tar.gz mkdir rootfs sudo tar -xpf ubuntu-base-16.04.2-base-arm64.tar.gz -C rootfs准备chroot环境sudo cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/ sudo cp -b /etc/resolv.conf rootfs/etc/resolv.conf配置软件源sudo sh -c echo deb http://ports.ubuntu.com/ubuntu-ports xenial main universe rootfs/etc/apt/sources.list进入chroot环境进行定制sudo chroot rootfs /bin/bash在chroot环境中进行基本配置apt update apt upgrade -y apt install -y sudo ssh net-tools vim添加用户并设置密码useradd -m -s /bin/bash firefly passwd firefly usermod -aG sudo firefly passwd root退出chroot环境后创建镜像文件dd if/dev/zero offirefly-rootfs.img bs1M count2048 mkfs.ext4 firefly-rootfs.img mkdir tmp-mount sudo mount firefly-rootfs.img tmp-mount sudo cp -a rootfs/* tmp-mount/ sudo umount tmp-mount优化镜像大小e2fsck -p -f firefly-rootfs.img resize2fs -M firefly-rootfs.img6. 打包完整固件现在我们已经有了所有必要的组件可以打包成完整的update.img固件了。首先准备打包目录结构rockdev/ ├── Image/ │ ├── kernel.img │ ├── resource.img │ ├── MiniLoaderAll.bin │ ├── uboot.img │ ├── trust.img │ └── firefly-rootfs.img └── package-filepackage-file内容示例# NAME Relative path # #HWDEF HWDEF package-file package-file bootloader Image/MiniLoaderAll.bin parameter Image/parameter.txt trust Image/trust.img uboot Image/uboot.img boot Image/kernel.img rootfs Image/firefly-rootfs.img使用RK工具链打包./rkImageMaker -RK3399 Image/MiniLoaderAll.bin Image/trust.img Image/uboot.img Image/kernel.img Image/resource.img firefly-update.img最终生成的firefly-update.img可以通过Rockchip的工具刷写到开发板中。7. 高级定制技巧7.1 优化启动速度通过分析启动过程可以识别并优化耗时环节# 在内核命令行添加initcall_debug和printk.time1 consolettyFIQ0 rootPARTUUID614e0000-0000 rootfstypeext4 initcall_debug printk.time1启动时间优化策略并行初始化确保内核配置启用了CONFIG_HAVE_KERNEL_XZ和CONFIG_HAVE_KERNEL_LZ4等压缩选项减少不必要的服务在根文件系统中禁用不需要的systemd服务预链接库文件减少动态链接时间7.2 安全加固生产环境部署前应考虑以下安全措施禁用root直接登录配置防火墙规则启用SELinux或AppArmor定期更新安全补丁安全加固示例# 在chroot环境中执行 apt install -y fail2ban sed -i s/PermitRootLogin yes/PermitRootLogin no/ /etc/ssh/sshd_config7.3 空间优化对于存储空间有限的场景可以考虑使用更小的基础系统如Debian或Buildroot移除不必要的文档和语言包使用squashfs等压缩文件系统清理无用文件的命令apt-get clean rm -rf /usr/share/doc/* rm -rf /usr/share/man/*8. 调试与问题解决开发过程中难免会遇到各种问题以下是一些实用的调试技巧内核日志查看dmesg | less # 查看内核环形缓冲区 journalctl -k # 使用systemd的系统查看内核日志常见问题及解决方案问题现象可能原因解决方法系统无法启动内核与rootfs不匹配检查内核配置中的rootfs参数驱动加载失败内核版本不一致重新编译驱动或内核网络不可用设备树配置错误检查dts文件中的网络部分显示异常DRM驱动问题更新或重新配置显示驱动系统随机崩溃内存或电源问题检查硬件连接和电源供应性能分析工具perf系统级性能分析perf top -a # 实时监控系统性能strace系统调用跟踪strace -f -o log.txt ./your_programvalgrind内存调试工具valgrind --leak-checkfull ./your_program在实际项目中我们曾遇到一个棘手的问题自定义驱动导致系统随机死锁。通过使用kgdb进行内核调试最终发现是自旋锁使用不当导致的。这个经验告诉我们即使是最简单的驱动也需要严格的测试和验证。

相关文章:

Firefly-RK3399从Ubuntu 16.04到自定义Rootfs:手把手教你编译内核与打包固件

Firefly-RK3399从Ubuntu 16.04到自定义Rootfs:手把手教你编译内核与打包固件 在嵌入式开发领域,能够自主定制系统镜像是一项极具价值的能力。Firefly-RK3399作为一款性能强大的开发板,其开放的架构为开发者提供了深度定制的可能性。本文将带你…...

Hermes Agent框架对接Taotoken自定义供应商的配置指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Hermes Agent框架对接Taotoken自定义供应商的配置指南 对于使用Hermes Agent框架的开发者而言,能够灵活接入不同的模型…...

get_kline_serial 用法:K 线序列长度、末尾行与新 bar 判定

前言 分钟线、小时线策略里,指标几乎都挂在 get_kline_serial 返回的序列上。我常见三类报错:长度不够就访问 iloc[-20]、把未收盘的 close 当成定稿信号、以及同一根 K 线里重复下单。下面按天勤量化里的订阅方式、长度防护和与 is_changing 的配合写一…...

不止是‘小电脑’:用树莓派4B+Python+传感器,手把手打造你的第一个智能家居原型

从零构建智能家居中枢:树莓派4B实战指南 当一块信用卡大小的电路板能够控制你家的灯光、监测室内环境并自动调节空调时,传统家电的边界就被彻底打破了。树莓派4B以其不到400元的售价和完整的计算机架构,正在重新定义智能家居的入门门槛。本文…...

深入理解STM32的PWM:从CubeMX配置到用HAL库精准控制舵机角度(以F103为例)

深入理解STM32的PWM:从CubeMX配置到用HAL库精准控制舵机角度(以F103为例) 在机器人控制、自动化设备等需要精确位置反馈的应用场景中,舵机的精准控制往往是项目成败的关键。许多开发者虽然能够通过PWM实现基本的0、90、180三档控制…...

避开RS485通信的‘坑’:基于STM32和MODBUS协议,详解半双工收发时序与数据紊乱处理

避开RS485通信的‘坑’:基于STM32和MODBUS协议,详解半双工收发时序与数据紊乱处理 在工业自动化、智能家居等场景中,RS485总线因其抗干扰能力强、传输距离远等优势成为多设备通信的首选方案。但许多开发者在实际项目中常遇到数据收发冲突、响…...

观察使用Token Plan套餐前后月度AI调用成本的变化趋势

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察使用Token Plan套餐前后月度AI调用成本的变化趋势 对于频繁调用大模型API的开发者或团队而言,成本的可预测性与可控…...

初创团队如何利用 Taotoken 的 Token Plan 有效控制 AI 开发成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何利用 Taotoken 的 Token Plan 有效控制 AI 开发成本 对于资源有限的初创团队而言,在产品原型开发或内部工…...

AI数字人驱动的矩阵内容生产:2026年技术架构与人效革命

一、背景:为什么2026年矩阵团队开始淘汰真人出镜?2024年之前,短视频矩阵的内容生产模式是这样的:环节传统方式瓶颈写脚本编剧手写1人1天最多写5条拍视频真人出镜拍摄1人1天最多拍3条剪辑剪辑师手动剪1人1天最多剪8条配音真人录音/…...

[Android] 文案设计助手_24.06.25

[Android] 文案设计助手_24.06.25 链接:https://pan.xunlei.com/s/VOszMVvm4BmG5za6Ib11nfGrA1?pwdsg9f# 文案设计助手,助您文案生成、自动写作,模拟手写生成器。免登陆,下载即用,无需会员。...

OpenCV报错解决:cornerSubPix断言失败 src.channels() == 1 的终极

一、 问题现象:令人头秃的 -215 断言错误 在进行相机标定、棋盘格角点提取或 Harris 角点优化时,很多开发者在调用 cv2.cornerSubPix 函数进行亚像素级精确定位时,经常会遇到如下崩溃报错: D:\a\opencv-python\opencv-python\open…...

AArch64虚拟内存系统架构与硬件自动更新机制详解

1. AArch64虚拟内存系统架构概述AArch64是ARMv8及ARMv9架构的64位执行状态,其虚拟内存系统架构(Virtual Memory System Architecture)是现代ARM处理器的核心组成部分。这套系统通过多级页表机制实现虚拟地址到物理地址的转换,为操…...

SuperRDP完整指南:一键解锁Windows远程桌面多用户并发连接限制

SuperRDP完整指南:一键解锁Windows远程桌面多用户并发连接限制 【免费下载链接】SuperRDP Super RDPWrap 项目地址: https://gitcode.com/gh_mirrors/su/SuperRDP SuperRDP是基于RDPWrap技术的智能工具,专为突破Windows系统远程桌面功能限制而设计…...

基于姿态识别的互动健身系统:用烟花激励锻炼

1. 项目概述:当健身遇上烟花秀这个项目最让我兴奋的点在于:它把枯燥的健身动作变成了创造烟花的魔法。想象一下,当你做一个标准的深蹲,屏幕上会绽放出金色烟花;手臂举到完美角度时,紫色烟火会螺旋上升——这…...

别再只调参了!深入pix2pixHD的多尺度鉴别器与实例地图,解决你的图像合成‘塑料感’难题

突破图像合成瓶颈:pix2pixHD多尺度鉴别器与实例地图的实战精要 当你在深夜调试生成对抗网络,屏幕上的合成图像却始终带着难以消除的"塑料感"——表面过于光滑、边缘模糊、纹理缺乏层次。这种挫败感或许正是促使你点开本文的原因。作为GAN领域的…...

独立开发者如何利用Taotoken以更低成本体验全球主流大模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken以更低成本体验全球主流大模型 对于预算有限的独立开发者或个人研究者而言,探索不同的大模…...

go 链表 (标准库实现)

Go 链表简介Go 标准库里没有单链表,只在 container/list 包里提供了双向循环链表。两个核心类型list.List :链表本身,包含哨兵节点和长度 list.Element :链表节点,存数据 前后指针 type Element struct {Value interf…...

Linux 系统编程 文件篇 (二)

[TOC] Linux 系统编程 文件篇 (二) 1 open 函数介绍 1.1 标记位 上一篇的结尾,我们讲到了我们用的打开文件的库函数其实是封装了,这个 open 的系统调用,然后解释了这个 open 函数的 这个标记位,flags 是一个…...

标题:【2026 最全】CTF 零基础入门指南|小白必看,一篇封神!

前言 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式,而DEFCON作为CTF赛制的发源地&#xf…...

【2026 最新】Web 安全完整学习指南 红队全套技能栈

0x00 技能栈 依照红队的流程分工,选择适合自己的技能栈发展。 越接近中心的能力点越贴近web技术栈,反之亦然。可以根据自身情况,选择技术栈的发展方向。 0x01 漏洞理解篇(Vulnerability) 1.1 前端 同源策略 & CSP & JOSNP 跨域…...

LabVIEW项目实战:用‘类+队列’模式管理仪器参数,告别全局变量混乱

LabVIEW工程实践:基于类与队列的仪器参数管理框架设计 在工业自动化测试系统中,仪器参数管理一直是困扰工程师的典型难题。当系统需要同时控制网口、串口、GPIB等多种接口的测试设备时,传统的全局变量方案会导致参数耦合、修改不同步等问题。…...

【MATLAB源码-第439期】基于MATLAB的APSK与QAM高阶调制在Saleh非线性功放下BER和EVM性能对比

操作环境:MATLAB 2024a1、算法描述摘要 高阶数字调制技术是现代无线通信和卫星通信系统提高频谱利用率的重要方法。QAM 调制通过同相分量和正交分量的幅度组合形成二维星座,在较高信噪比条件下能够获得较高的信息承载能力。APSK 调制则采用多环幅相结构&…...

3个真实场景告诉你,Avogadro 2分子建模软件如何改变化学研究方式

3个真实场景告诉你,Avogadro 2分子建模软件如何改变化学研究方式 【免费下载链接】avogadroapp Avogadro is an advanced molecular editor designed for cross-platform use in computational chemistry, molecular modeling, bioinformatics, materials science, …...

JoyCon-Driver:Windows平台上的Switch手柄完美解决方案

JoyCon-Driver:Windows平台上的Switch手柄完美解决方案 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 还在为Nintendo Switch JoyCon控制器…...

西南交通大学【数电实验之Modelsim仿真全流程实战】

1. 从零开始搭建Modelsim仿真环境 第一次接触数字电路仿真的同学可能会觉得Modelsim界面复杂,其实只要跟着步骤一步步操作,半小时就能跑通第一个仿真案例。我当年在西南交大做数电实验时,也经历过从一脸懵到熟练操作的过程,这里把…...

利欧股份持续推进“制造业+科技投资”战略 主业与投资协同效应显现

全球商业航天企业SpaceX(太空探索技术公司)计划于6月12日在纳斯达克上市,股票代码为SPCX。此次IPO预计融资规模约为800亿美元,市场估值在1.75万亿至2万亿美元之间,引发资本市场广泛关注。据悉,利欧股份&…...

OpenClaw用户如何通过CLI子命令快速完成Taotoken接入配置

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 OpenClaw用户如何通过CLI子命令快速完成Taotoken接入配置 对于使用OpenClaw进行AI智能体开发的开发者而言,快速接入稳定…...

HarmonyOS ArkWeb 系列之网页秒变PDF:createPdf 完整指南

文章目录createPdf 是什么配置参数说清楚Callback 方式Promise 方式完整流程图那个最容易忽略的坑权限配置写在最后能把一张网页直接转成 PDF,保存到本地——这个需求在报表、电子凭证、文档生成场景里非常常见。HarmonyOS 的 Web 组件内置了 createPdf 接口&#x…...

别再只盯着原理图了!FPGA/SoC硬件工程师必看的RGMII接口PCB布线实战指南(含时序约束与等长规则)

RGMII接口PCB设计实战:从时序规范到千兆以太网稳定通信 在FPGA和SoC硬件开发中,RGMII接口设计一直是工程师们又爱又恨的挑战。爱它的简洁高效——相比GMII接口减少了近一半的引脚数量;恨它的时序敏感——一个看似微小的PCB布线失误就可能导致…...

HarmonyOS ArkWeb 系列之从框架层锁死复制权限:copyOptions 详解

文章目录copyOptions 是什么完整代码示例HTML 页面(用于测试)三种模式的实际表现和 H5 层 user-select 的区别实际业务场景踩坑记录写在最后上两篇讲的都是 H5 层面的剪贴板操作。但有些场景下,你需要的不是"监听"或"修改&quo…...