1. 课程导学与环境搭建:Tina Linux 简介、开发环境搭建与源码编译

各位同学,欢迎来到《Tina Linux 内核裁剪与外设适配实战》的第一章。

在正式开始动手之前,我想先聊聊这门课到底要解决什么问题。说白了,Tina Linux 是全志(Allwinner)针对 IoT 和智能硬件场景定制的一个嵌入式 Linux 系统。它跟桌面 Linux 最大的区别是什么?——资源极度受限。你可能只有 64MB 的 RAM,16MB 的 Flash,却要跑一个完整的 Linux 内核、文件系统,还要驱动摄像头、屏幕、Wi-Fi 模块。

我最早接触 Tina 是在一个智能门锁项目上。客户要求成本压到 30 块以内,主控只能用 V3s,Flash 只有 16MB。当时我天真地把完整内核编译进去,结果镜像 40MB,根本塞不下。后来花了整整两周做裁剪,才把内核压到 3.2MB。嗯,从那时起我就明白——裁剪不是选修课,是必修课。

本章核心目标: 搭建一套可复用的 Tina Linux 开发环境,完成从源码获取、编译到烧录的全流程。这是后续所有裁剪和适配工作的基础。

1.1 Tina Linux 是什么?

Tina Linux 基于 OpenWrt 框架,但做了大量面向全志芯片的适配。它不是一个“全新”的系统,而是一个高度定制化的发行版。你可以把它理解为:OpenWrt 的骨架 + 全志 BSP 的血肉 + 一套包管理工具。

它的典型应用场景包括:

  • 智能家居:智能音箱、智能灯、网关
  • 工业控制:HMI 人机界面、数据采集终端
  • 车载电子:行车记录仪、倒车影像
  • 消费电子:故事机、学习平板、扫码设备

为什么选它?我个人的经验是:Tina 的 SDK 结构非常清晰,内核、驱动、应用层分离得很好。你不需要像 Yocto 那样写一堆复杂的 recipe,也不需要像 Buildroot 那样手动配置每个包。Tina 的 make menuconfig 和 make kernel_menuconfig 两条命令,就能搞定大部分工作。

1.2 开发环境搭建

环境搭建是新手最容易踩坑的地方。我见过太多同学卡在第一步——编译报错,然后怀疑人生。其实 90% 的问题出在依赖包没装全,或者 Ubuntu 版本不对。

1.2.1 虚拟机与 Ubuntu 版本选择

我个人习惯用 VMware Workstation Pro 17,Ubuntu 选 18.04 或 20.04 LTS。为什么不用最新的 22.04?因为 Tina 的 SDK 发布时主要基于 18.04 测试,虽然 20.04 也能用,但 22.04 的 GCC 版本太高,编译旧版内核会报错。你想想看,为了省一个系统版本的时间,花两天去修编译错误,值不值?

组件 推荐版本 备注
VMware Workstation Pro 17 Player 版也够用
Ubuntu 18.04.6 LTS / 20.04.6 LTS 64-bit,分配至少 4GB RAM
硬盘空间 至少 80GB 建议 120GB,SDK 解压后约 15GB,编译产物另占 20-30GB
CPU 核心 至少 4 核 编译时 -jN 参数会用到
注意: 不要在 Windows 的 WSL 或 WSL2 中直接编译 Tina SDK。文件系统大小写敏感问题、符号链接兼容性问题会让你痛不欲生。我曾经试过,折腾了两天,最后还是老老实实回到 VMware。

1.2.2 安装依赖包

Ubuntu 装好后,第一件事是更新软件源并安装编译工具链。别偷懒,一条一条跑:

sudo apt update
sudo apt install -y build-essential git wget curl
sudo apt install -y libncurses5-dev libncursesw5-dev
sudo apt install -y zlib1g-dev libssl-dev liblzma-dev
sudo apt install -y python3 python3-pip python3-dev
sudo apt install -y u-boot-tools device-tree-compiler
sudo apt install -y swig libpython3-dev
sudo apt install -y rsync unzip file

这里有个坑:libncurses5-dev 和 libncursesw5-dev 必须都装,否则 make menuconfig 会报错。我当年第一次编译时,只装了 libncurses5-dev,结果界面花屏,查了半天才发现是宽字符支持缺失。

1.3 源码获取与目录结构

Tina SDK 的源码通常由芯片原厂或方案商提供。如果你有全志的官方账号,可以从 sdk.allwinnertech.com 下载。但更常见的情况是,你的老板给你一个百度网盘链接,或者一个 Git 仓库地址。

假设你拿到了一个压缩包 tina-v3s-202310.tar.gz,解压:

mkdir -p ~/workspace/tina
cd ~/workspace/tina
tar -xzf ~/Downloads/tina-v3s-202310.tar.gz
cd tina-v3s

解压后,你会看到这样的目录结构:

tina-v3s/
├── build/          # 编译脚本和配置文件
├── config/         # 全局配置
├── device/         # 设备树、分区表、板级配置
├── kernel/         # Linux 内核源码(4.9 或 5.4)
├── lichee/         # 全志 BSP 包(boot0、uboot、内核补丁)
├── out/            # 编译输出目录
├── package/        # 应用层软件包
├── prebuilt/       # 预编译工具链
├── target/         # 目标板配置
├── toolchain/      # 交叉编译工具链源码
├── build.sh        # 一键编译脚本
└── Makefile        # 顶层 Makefile

我个人习惯把 device/ 和 kernel/ 两个目录重点标记。因为内核裁剪主要改 kernel/,外设适配主要改 device/ 下的设备树文件。后面几章我们会反复进出这两个目录。

1.4 编译 Tina 固件

编译流程其实很简单,但第一次跑的时候,你可能会被漫长的等待吓到。以 V3s 芯片为例:

source build/envsetup.sh
lunch   # 选择目标板,比如 v3s_licheepi_zero
make -j4

source build/envsetup.sh 会加载一系列环境变量和辅助函数。lunch 让你选择具体的硬件平台。选好后,make 开始编译。第一次编译会下载工具链、编译内核、编译 uboot、打包文件系统,整个过程大约 30-60 分钟,取决于你的机器性能。

小技巧: 编译时加上 V=s 参数可以看到详细日志,方便排查错误。比如 make -j4 V=s。如果编译中途报错,别慌,先看最后几行日志,90% 的情况是某个依赖包没装。

编译成功后,固件输出在 out/ 目录下:

out/v3s_licheepi_zero/
├── boot.img        # 内核 + 设备树 + ramdisk
├── rootfs.squashfs # 只读根文件系统
├── tina_v3s_licheepi_zero_uart0.img  # 完整烧录镜像
└── config-*        # 本次编译的内核配置备份

1.5 烧录工具使用

烧录工具推荐 PhoenixCard,这是全志官方提供的 Windows 工具。当然,Linux 下也可以用 dd 命令直接写卡,但 PhoenixCard 更友好,支持分区校验和进度显示。

烧录步骤:

  1. 将 TF 卡插入读卡器,连接到 Windows 机器
  2. 打开 PhoenixCard,选择固件 tina_v3s_licheepi_zero_uart0.img
  3. 选择“启动卡”模式(不是“量产卡”)
  4. 点击“烧录”,等待进度条走完
  5. 烧录完成后,将 TF 卡插入开发板,上电启动
注意: 烧录前务必确认 TF 卡容量大于固件大小。另外,PhoenixCard 会格式化整张卡,记得先备份数据。我曾经有一次不小心把存了三个月项目代码的 TF 卡插进去烧录……嗯,从那以后我养成了贴标签的习惯。

1.6 本章知识体系

下面这张图总结了本章的核心流程和知识点之间的关系:

第一章 知识体系:环境搭建与编译流程 Tina Linux 简介 开发环境搭建 源码获取与编译 烧录工具使用 VMware + Ubuntu 安装依赖包 配置工具链 SDK 目录结构 lunch 选择平台 make -jN 编译 out/ 输出产物 PhoenixCard 选择启动卡模式 烧录与上电验证 💡 学习路径建议 先搭建环境 → 编译一次完整固件 → 烧录验证 → 再开始裁剪 不要跳过任何一步,否则后面出问题你很难定位是环境问题还是代码问题

1.7 常见问题与避坑指南

最后,我整理了几个新手最容易遇到的问题,希望能帮你少走弯路:

  • 编译报错:找不到 ncurses —— 检查 libncurses5-dev 和 libncursesw5-dev 是否都装了。只装一个不行。
  • 烧录后开发板无输出 —— 检查串口线是否接对(GND、TX、RX),波特率是否设为 115200。另外,确认 TF 卡接触良好。
  • 编译卡在 30% 不动 —— 可能是内存不足。VMware 虚拟机至少分配 4GB RAM,如果只有 2GB,编译内核时会因为 OOM 被 kill。
  • lunch 后找不到目标板 —— 检查 device/ 目录下是否有对应的 .mk 文件。如果没有,说明 SDK 不完整,需要找供应商补全。
我的建议: 第一次编译时,旁边放杯咖啡,耐心等。如果一次成功,恭喜你,运气不错。如果报错,别灰心,把错误日志复制到搜索引擎里,大概率能找到解决方案。嵌入式开发就是这样——90% 的时间在搭环境和修 bug,10% 的时间在写代码。