第二章 开发环境搭建:交叉编译工具链安装、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.fex 和 dts 文件。我刚开始搞双屏时,就是在这里配错了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环境时,光工具链就折腾了两天,现在想想都是经验啊。