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.shlunch。环境变量不会自动保存。我刚开始就经常忘记,然后编译报错,还一脸懵逼地查了半天。

另外,你的Ubuntu系统需要安装一些必要的依赖库,比如 build-essentiallibncurses5-devzlib1g-dev 等等。如果编译过程中提示缺少某个库,用 apt-get install 装上就行。这个没什么捷径,缺啥补啥。

好,到这里,SDK的获取、结构解析和环境初始化就讲完了。下一章,咱们就要开始真正的编译工作了。到时候,我会带你一步步把第一版固件跑起来。