第二章 开发环境搭建:交叉编译工具链安装、SDK获取与解压、源码目录结构解析

好,咱们正式开始动手了。这一章我带你搭好开发环境。说实话,很多初学者卡就卡在这一步——工具链没配好,SDK解压报错,目录结构看得一头雾水。别急,我一步步来,保证你走通。

2.1 交叉编译工具链安装

为什么要用交叉编译?说白了,你的电脑是x86架构,T113-S3是ARM架构。在x86上编译出ARM能跑的程序,就叫交叉编译。我刚开始做嵌入式时,总觉得直接在板子上编译多省事,结果编译一个内核等了两个小时...嗯,从那以后我再也不这么干了。

2.1.1 获取工具链

全志官方推荐的是 gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi 这个版本。我个人习惯用Linaro的,稳定,社区支持好。你可以在Linaro官网下载,或者直接用全志SDK里自带的。

核心要点:工具链版本必须匹配。我用过8.3版本的,编译出来的程序在T113上跑着跑着就段错误,排查了两天才发现是工具链版本问题。

2.1.2 安装步骤

假设你把工具链下载到了 /opt/ 目录下:

# 解压
tar -xvf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz -C /opt/

# 配置环境变量(建议写到 ~/.bashrc 里)
export PATH=$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin
export CROSS_COMPILE=arm-linux-gnueabi-
export ARCH=arm

# 验证安装
arm-linux-gnueabi-gcc --version

看到版本号输出,就说明装好了。这里有个坑——PATH变量一定要放在最前面,否则系统可能会调用到其他版本的gcc。我曾经就因为这个,编译出来的内核死活起不来。

小技巧:建议在 /opt/ 下建一个 toolchains/ 目录,把所有工具链都放一起。以后换平台也方便管理。

2.2 SDK获取与解压

全志T113-S3的SDK,官方叫 tina-sdk。你想想看,这个SDK包含了uboot、内核、文件系统、还有各种驱动源码,一套搞定。

2.2.1 获取SDK

有两种方式:

  • 官方渠道:全志开发者社区下载,需要注册账号。我记得第一次下载时,那个压缩包有8个G,下了整整一个下午。
  • 板厂提供:如果你买了开发板,厂家一般会提供定制好的SDK。我建议用这个,因为板厂已经帮你适配好了硬件。

2.2.2 解压SDK

SDK通常是 .tar.gz.tar.xz 格式。解压命令很简单:

# 如果是 tar.gz
tar -zxvf tina-t113-sdk.tar.gz

# 如果是 tar.xz(压缩率更高,但解压慢)
tar -xvf tina-t113-sdk.tar.xz

解压时间取决于你的电脑性能。我建议用 tar -xvf-C 指定目录,别解压到桌面,路径太长了后面编译容易出问题。

注意:SDK路径不要包含中文和空格!我见过有人把SDK放在 "我的文档" 下,结果编译时各种奇葩错误。Linux下编译,路径越简单越好。

2.3 源码目录结构解析

解压完,咱们来看看SDK里都有什么。你进入SDK根目录,执行 ls -l,会看到类似这样的结构:

tina-t113/
├── build/          # 编译脚本和配置文件
├── device/         # 板级配置(dts、分区表等)
├── kernel/         # Linux内核源码(4.9或5.4版本)
├── uboot/          # U-Boot启动引导源码
├── package/        # 应用层软件包
├── target/         # 文件系统生成脚本
├── tools/          # 辅助工具(打包、烧录等)
├── out/            # 编译输出目录
└── Makefile        # 顶层Makefile

我来逐个说说每个目录是干什么的:

目录 作用 我常用的操作
build/ 编译配置,比如选择哪个工具链、哪个板型 修改 build/envsetup.sh 里的默认配置
device/ 板级设备树(dts)、分区表、内核配置 双屏异显的dts修改就在这里
kernel/ Linux内核源码,驱动开发的主战场 添加LCD、触摸、显示驱动
uboot/ 启动引导,负责初始化DDR、加载内核 修改启动参数、logo显示
package/ 应用层软件,比如Qt、LVGL、测试程序 添加自己的应用程序包
out/ 编译产物:uboot.bin、zImage、rootfs 烧录时从这里拿镜像文件

2.3.1 重点目录详解

device/ 目录:这里面放着每个板型的配置文件。你执行 ls device/config/chips/t113/,会看到:

device/config/chips/t113/
├── configs/        # 板级配置(默认配置、分区表)
│   └── t113_evb1/  # 开发板配置
│       ├── linux/  # 内核配置
│       ├── uboot/  # uboot配置
│       └── sys_config.fex  # 硬件引脚配置
└── dts/            # 设备树文件
    └── sun8iw20p1.dtsi  # T113-S3的dtsi

双屏异显的硬件配置,主要改 sys_config.fexdts 文件。我刚开始搞双屏时,就是在这里配错了LCD的引脚,导致一个屏幕死活不亮。

kernel/ 目录:这是驱动开发的核心。你想想看,所有外设驱动都在这里:

kernel/linux-4.9/
├── drivers/
│   ├── video/      # 显示驱动(fbdev、drm)
│   ├── input/      # 输入设备(触摸、按键)
│   └── spi/        # SPI总线驱动
└── arch/arm/boot/dts/  # 板级设备树

我们的双屏异显驱动,主要工作在 drivers/video/ 下。全志用的是自家的显示框架,叫 disp 驱动,后面章节我会详细讲。

2.3.2 编译输出目录

执行 make 之后,所有编译产物都在 out/ 下:

out/t113/
├── u-boot.fex      # uboot镜像
├── boot.fex        # 内核+dtb镜像
├── rootfs.fex      # 根文件系统
└── tina_t113_uart0.img  # 完整烧录镜像

个人经验:每次编译前,建议先执行 make clean 清理一下。特别是修改了dts或内核配置后,不清除容易产生奇怪的问题。我吃过这个亏,改了dts但没生效,排查了半天才发现是缓存问题。

2.4 验证环境

装好工具链、解压完SDK,咱们来验证一下环境是否正常:

# 进入SDK目录
cd tina-t113

# 加载编译环境
source build/envsetup.sh

# 选择板型(输入对应数字)
lunch

# 编译uboot(快速验证)
make uboot -j4

如果编译成功,你会看到 out/ 下生成了 u-boot.fex。这说明你的开发环境已经搭好了。

总结一下:这一章我们做了三件事——装了交叉编译工具链、解压了SDK、理清了目录结构。下一章,我会带你点亮第一个屏幕,真正开始双屏异显的实战。

嗯,环境搭建这块就到这里。有什么问题,欢迎在课程群里交流。我记得第一次搭T113环境时,光工具链就折腾了两天,现在想想都是经验啊。