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。嗯,从那时起我就明白——裁剪不是选修课,是必修课。
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 参数会用到 |
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 更友好,支持分区校验和进度显示。
烧录步骤:
- 将 TF 卡插入读卡器,连接到 Windows 机器
- 打开 PhoenixCard,选择固件
tina_v3s_licheepi_zero_uart0.img - 选择“启动卡”模式(不是“量产卡”)
- 点击“烧录”,等待进度条走完
- 烧录完成后,将 TF 卡插入开发板,上电启动
1.6 本章知识体系
下面这张图总结了本章的核心流程和知识点之间的关系:
1.7 常见问题与避坑指南
最后,我整理了几个新手最容易遇到的问题,希望能帮你少走弯路:
- 编译报错:找不到
ncurses—— 检查libncurses5-dev和libncursesw5-dev是否都装了。只装一个不行。 - 烧录后开发板无输出 —— 检查串口线是否接对(GND、TX、RX),波特率是否设为 115200。另外,确认 TF 卡接触良好。
- 编译卡在 30% 不动 —— 可能是内存不足。VMware 虚拟机至少分配 4GB RAM,如果只有 2GB,编译内核时会因为 OOM 被 kill。
lunch后找不到目标板 —— 检查device/目录下是否有对应的.mk文件。如果没有,说明 SDK 不完整,需要找供应商补全。