3. 获取与编译SDK:全志D1 SDK获取方式、SDK目录结构解析、首次编译流程、常见编译错误处理

好,咱们进入正题。这一章聊的是SDK的获取和编译。说实话,我第一次拿到D1的SDK时,也被它的目录结构吓了一跳——东西真不少。但别慌,我带你捋一遍,你会发现其实挺清晰的。

3.1 SDK获取方式

全志D1的SDK,目前主要有两个渠道可以拿到:

  • 全志官方GitHub仓库:这是最直接的来源。地址是 https://github.com/Tina-Linux/tina-d1-h。我个人习惯用这个,因为更新比较及时。
  • 百度网盘/官方论坛:有时候官方会打包成压缩包发布。如果你网络不太好,可以试试这个方式。

嗯,这里要注意一点:SDK体积不小,大概有2-3GB。我第一次下载时没注意,用了个慢速网络,结果等了一下午。建议你找个带宽好的环境,或者用 git clone --depth=1 只拉取最新版本,能省不少时间。

小提示:如果你用GitHub下载,记得先注册一个账号,有时候需要申请权限才能访问。我曾经遇到过权限不足的问题,折腾了半天才发现是账号没配置SSH Key。

3.2 SDK目录结构解析

下载完成后,咱们来看看这个SDK到底长什么样。你打开根目录,会看到这些主要文件夹:

目录名 作用
tina/ 核心构建系统,基于OpenWrt的Tina系统
lichee/ Linux内核、U-Boot、设备树等底层代码
brandy/ 第二级引导程序(SPL)和ATF固件
out/ 编译输出目录,生成的镜像文件都在这里
docs/ 官方文档,不过内容比较简略

说白了,整个SDK就是三个层次:引导层(brandy)→ 内核层(lichee)→ 系统层(tina)。你想想看,一个嵌入式设备启动时,就是按这个顺序一步步起来的。

我个人觉得,最需要关注的是 lichee/tina/ 这两个目录。前者决定了你的硬件能不能正常工作,后者决定了你的系统好不好用。我在项目中遇到过好几次,内核配置没改对,结果外设驱动死活加载不上——最后发现是设备树里一个引脚定义写错了。

3.3 首次编译流程

好,接下来是最激动人心的部分——编译。我第一次编译D1的SDK时,心里还挺忐忑的,生怕出什么幺蛾子。其实流程很简单,就几步:

  1. 安装依赖:Ubuntu系统下,运行 sudo apt-get install -y build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig。嗯,这一长串命令,建议你直接复制粘贴,别手打。
  2. 配置环境:进入 tina/ 目录,执行 source build/envsetup.sh。这个脚本会设置好交叉编译工具链的路径。
  3. 选择目标:运行 lunch 命令,会弹出一个菜单,让你选择开发板型号。D1的话,一般选 d1-h_nezha_min 或者 d1-h_nezha
  4. 开始编译:执行 make -j$(nproc)。这里的 -j$(nproc) 是让编译利用你CPU的所有核心,能快不少。

重点来了:第一次编译大概需要30分钟到1小时,取决于你的机器性能。我建议你泡杯咖啡,或者去干点别的。编译过程中终端会刷很多信息,别慌,只要最后没报错就行。

编译完成后,你会在 out/ 目录下找到生成的镜像文件,比如 tina_d1-h_nezha_uart0.img。这个就是你要烧录到开发板上的东西。

3.4 常见编译错误处理

说实话,编译不出错才奇怪。我做了这么多年嵌入式,还没见过谁一次编译就过的。下面是我遇到过的几个典型问题:

错误1:缺少依赖包

错误信息类似 /bin/bash: line 1: xsltproc: command not found。解决办法很简单,缺什么装什么。比如 sudo apt-get install xsltproc。我曾经因为少装了一个 libncurses5-dev,卡了半小时没找到原因。

错误2:Python版本冲突

D1的SDK对Python版本有要求,最好是Python 2.7和Python 3.x共存。如果你系统默认Python是3.x,可能会报 No module named 'ConfigParser'。解决办法是安装 python2.7 并设置软链接。

错误3:磁盘空间不足

编译过程中会生成大量临时文件,尤其是 out/ 目录。我建议你至少预留20GB的空闲空间。如果报 No space left on device,可以清理一下 out/ 目录重新编译。

避坑指南:我曾经在编译时遇到一个诡异的错误,提示 undefined reference to xxx。查了半天,发现是代码里一个头文件路径写错了。所以,遇到编译错误时,先看错误信息的前几行,别被后面一大串刷屏吓到。错误原因往往就在最上面。

嗯,还有一个常见问题——编译卡在某个地方不动了。这通常是因为网络问题,SDK在编译过程中会下载一些外部依赖包。如果你网络不稳定,可以提前把依赖包下载好放到 dl/ 目录下。我一般会在第一次编译前,先跑一遍 make download 把东西都拉下来。

最后说一句:编译SDK这件事,说白了就是个体力活。只要环境配对了,流程走对了,剩下的就是等。别怕出错,出错了就看日志,日志看不懂就搜一下。你想想看,全志D1的社区现在挺活跃的,你遇到的问题,大概率别人也遇到过。

好,这一章就到这儿。下一章咱们聊聊怎么把编译好的镜像烧录到开发板上,以及第一次上电时要注意什么。