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 只拉取最新版本,能省不少时间。
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时,心里还挺忐忑的,生怕出什么幺蛾子。其实流程很简单,就几步:
- 安装依赖: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。嗯,这一长串命令,建议你直接复制粘贴,别手打。 - 配置环境:进入
tina/目录,执行source build/envsetup.sh。这个脚本会设置好交叉编译工具链的路径。 - 选择目标:运行
lunch命令,会弹出一个菜单,让你选择开发板型号。D1的话,一般选d1-h_nezha_min或者d1-h_nezha。 - 开始编译:执行
make -j$(nproc)。这里的-j$(nproc)是让编译利用你CPU的所有核心,能快不少。
重点来了:第一次编译大概需要30分钟到1小时,取决于你的机器性能。我建议你泡杯咖啡,或者去干点别的。编译过程中终端会刷很多信息,别慌,只要最后没报错就行。
编译完成后,你会在 out/ 目录下找到生成的镜像文件,比如 tina_d1-h_nezha_uart0.img。这个就是你要烧录到开发板上的东西。
3.4 常见编译错误处理
说实话,编译不出错才奇怪。我做了这么多年嵌入式,还没见过谁一次编译就过的。下面是我遇到过的几个典型问题:
错误信息类似 /bin/bash: line 1: xsltproc: command not found。解决办法很简单,缺什么装什么。比如 sudo apt-get install xsltproc。我曾经因为少装了一个 libncurses5-dev,卡了半小时没找到原因。
D1的SDK对Python版本有要求,最好是Python 2.7和Python 3.x共存。如果你系统默认Python是3.x,可能会报 No module named 'ConfigParser'。解决办法是安装 python2.7 并设置软链接。
编译过程中会生成大量临时文件,尤其是 out/ 目录。我建议你至少预留20GB的空闲空间。如果报 No space left on device,可以清理一下 out/ 目录重新编译。
undefined reference to xxx。查了半天,发现是代码里一个头文件路径写错了。所以,遇到编译错误时,先看错误信息的前几行,别被后面一大串刷屏吓到。错误原因往往就在最上面。
嗯,还有一个常见问题——编译卡在某个地方不动了。这通常是因为网络问题,SDK在编译过程中会下载一些外部依赖包。如果你网络不稳定,可以提前把依赖包下载好放到 dl/ 目录下。我一般会在第一次编译前,先跑一遍 make download 把东西都拉下来。
最后说一句:编译SDK这件事,说白了就是个体力活。只要环境配对了,流程走对了,剩下的就是等。别怕出错,出错了就看日志,日志看不懂就搜一下。你想想看,全志D1的社区现在挺活跃的,你遇到的问题,大概率别人也遇到过。
好,这一章就到这儿。下一章咱们聊聊怎么把编译好的镜像烧录到开发板上,以及第一次上电时要注意什么。