3、SDK源码获取与结构:全志Tina SDK介绍、SDK源码下载、SDK目录结构解析、SDK编译环境初始化
好,咱们进入第三章。这一章,说白了就是带你拿到武器,并且搞清楚这把武器怎么用。很多新手拿到SDK,第一反应就是「哇,好大一个包」,然后直接开始编译,结果各种报错。我当年也干过这种傻事,浪费了整整两天时间。所以,咱们先别急,一步步来。
3.1 全志Tina SDK介绍
Tina SDK,是全志官方为T113系列芯片量身定做的嵌入式Linux开发套件。它不是一个简单的内核源码包,而是一整套「全家桶」。里面包含了U-Boot、Linux内核、文件系统、各种驱动、以及大量的应用层工具。
我个人习惯把Tina SDK理解成一个「乐高积木箱」。你想想看,做嵌入式开发,最烦的就是东拼西凑,今天找个驱动,明天找个库,版本还不一定兼容。Tina SDK把这些都给你打包好了,你只需要根据你的产品需求,选择对应的积木块,然后「拼」起来就行。
核心特点:
- 高度集成: 从bootloader到应用层,一条龙服务。
- 基于OpenWrt: 它的构建系统借鉴了OpenWrt的思路,用
make menuconfig来配置,非常灵活。 - 模块化设计: 内核、驱动、应用都是独立的包,方便裁剪和定制。
- 官方维护: 有持续更新和补丁,比你自己从零开始搞要靠谱得多。
嗯,这里要注意一点。Tina SDK虽然好用,但它不是万能的。它主要针对的是全志自家的硬件平台。如果你想移植到其他厂家的芯片上,那基本得重写底层。不过,对于咱们T113这个项目,它就是最趁手的工具。
3.2 SDK源码下载
下载SDK,其实就两步:拿到链接,然后拉代码。但这里有个坑,我必须要提醒你。
避坑指南: 我曾经遇到过,直接从网盘下载的所谓「官方SDK」,结果编译到一半发现缺文件,或者版本对不上。所以,我建议你从全志官方的Git仓库或者授权的代理商那里获取。别图省事去一些论坛乱下,浪费时间不说,还可能带后门。
假设你已经拿到了官方提供的SDK压缩包,比如 tina-t113-xxx.tar.gz。解压的命令很简单:
tar -zxvf tina-t113-xxx.tar.gz
解压完成后,你会得到一个名为 tina-t113 的目录。这个目录,就是我们接下来所有工作的根目录。我习惯把它放在 /home/yourname/work/ 下面,方便管理。
如果你拿到的是Git仓库地址,那就用 git clone:
git clone https://github.com/xxx/tina-t113.git
下载过程可能会比较慢,毕竟SDK动辄几个G。你可以趁这个时间去泡杯咖啡,或者看看文档。我个人习惯在下载的同时,先看看官方的 README 文件,了解一下基本要求。
3.3 SDK目录结构解析
好,代码拉下来了。咱们来看看这个「乐高积木箱」里到底装了些什么。打开 tina-t113 目录,你会看到一堆文件夹。别慌,我带你捋一遍。
| 目录名 | 作用 | 我的经验 |
|---|---|---|
build/ |
编译脚本和配置文件的核心目录 | 这里面东西很杂,新手别乱改。我一般只动 build/target 下的板级配置。 |
device/ |
存放不同开发板的设备树、分区表等 | 这是移植的关键!你换一块板子,主要就是改这里面的东西。 |
kernel/ |
Linux内核源码 | 嗯,这个不用多说,咱们后面会重点讲。 |
uboot/ |
U-Boot启动引导源码 | 启动流程的第一关,如果板子起不来,先查这里。 |
package/ |
各种应用软件包和库的源码 | 比如你需要的Wi-Fi驱动、蓝牙协议栈,都在这里。 |
target/ |
生成最终固件的配置和脚本 | 决定了你最终烧录的镜像里包含什么。 |
tools/ |
编译工具链和一些辅助工具 | 这里面有交叉编译器,非常重要。 |
out/ |
编译输出目录 | 编译完成后,生成的镜像、内核、模块都在这里。 |
你看,结构是不是很清晰?每个目录各司其职。你想想看,如果没有这种模块化的设计,你要找一个驱动,得翻遍整个源码包,那得多痛苦。
小技巧: 我建议你花点时间,把 device/ 和 target/ 这两个目录下的文件浏览一遍。不需要看懂每一行,但要知道它们大概在什么位置。这样以后出问题了,你才能快速定位。
3.4 SDK编译环境初始化
这是动手前的最后一步,也是很多人容易忽略的一步。SDK的编译,需要特定的环境变量和依赖库。你不能直接双击一个 make 命令就开始干。
全志官方提供了一个初始化脚本,就在SDK的根目录下。运行它:
source build/envsetup.sh
注意,这里用的是 source 命令,而不是直接 ./ 执行。为什么?因为 source 会在当前shell环境中执行脚本,这样设置的环境变量才能生效。如果你用 ./,它会开一个子shell,变量设完了,子shell一退出,什么都没了。
运行完这个脚本后,你会看到一些提示信息,然后命令行前面可能会多出一些前缀。接着,你需要选择你对应的开发板配置:
lunch
输入 lunch 后,会弹出一个菜单,让你选择不同的板级配置。比如:
You're building on Linux
Lunch menu... pick a combo:
1. t113_evb1-xxx
2. t113_evb2-xxx
3. t113_evb3-xxx
选择你手头板子对应的序号,比如 1。这一步,说白了就是告诉SDK:「我要给这块板子编译固件,请加载对应的设备树和配置。」
初始化完成后,你可以检查一下环境变量是否设置成功:
echo $TARGET_PRODUCT
如果输出了你刚才选择的板子名称,比如 t113_evb1,那就说明环境初始化成功了。
注意事项: 每次打开一个新的终端窗口,都需要重新执行 source build/envsetup.sh 和 lunch。环境变量不会自动保存。我刚开始就经常忘记,然后编译报错,还一脸懵逼地查了半天。
另外,你的Ubuntu系统需要安装一些必要的依赖库,比如 build-essential、libncurses5-dev、zlib1g-dev 等等。如果编译过程中提示缺少某个库,用 apt-get install 装上就行。这个没什么捷径,缺啥补啥。
好,到这里,SDK的获取、结构解析和环境初始化就讲完了。下一章,咱们就要开始真正的编译工作了。到时候,我会带你一步步把第一版固件跑起来。