第4章:开发环境搭建与SDK部署

说实话,开发环境搭建这事儿,看着简单,但坑是真不少。我见过太多工程师,芯片还没摸热,先在环境配置上耗了两三天。这一章,我就把QNX和Android Automotive两套环境的搭建流程,还有高通SDK的安装验证,掰开了揉碎了讲清楚。

4.1 QNX开发环境配置

QNX这玩意儿,跟Linux不太一样。它是个硬实时系统,开发环境也相对封闭。我个人习惯用QNX Momentics IDE,虽然界面老点,但胜在稳定。

核心要点:QNX开发环境 = 宿主机(Ubuntu 18.04/20.04)+ 目标机(高通SA8155/SA8295)+ 网络连接

4.1.1 宿主机准备

先装好Ubuntu 20.04 LTS,别用22.04,我踩过坑——某些QNX工具链在22.04上会有奇怪的链接错误。

# 安装必要依赖
sudo apt-get update
sudo apt-get install build-essential git cmake python3 python3-pip
sudo apt-get install libncurses5-dev libssl-dev libelf-dev

4.1.2 QNX Momentics IDE安装

去QNX官网下载Momentics IDE,版本建议用7.1或8.0。安装过程其实很简单:

  1. 解压安装包:tar -xzf qnxmomentics-8.0-linux.tar.gz
  2. 运行安装脚本:./install
  3. 选择安装路径,我一般放/opt/qnx
  4. 配置环境变量
# 在 ~/.bashrc 中添加
export QNX_HOST=/opt/qnx/qnx800/host/linux/x86_64
export QNX_TARGET=/opt/qnx/qnx800/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH

小技巧:我习惯把QNX的环境变量单独写到一个qnx_env.sh文件里,需要时source一下,避免污染全局环境。

4.1.3 目标机连接配置

目标机就是你的开发板,比如高通SA8295。通过以太网连接,配置静态IP:

# 在目标机上执行
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
route add default gw 192.168.1.1

然后在宿主机上测试连通性:

ping 192.168.1.100

通了?好,接下来配置QNX的qconn服务。这玩意儿是QNX的远程调试代理,必须跑起来。

# 目标机上启动qconn
qconn -p 8000

注意:我曾经遇到过qconn启动后连不上,折腾半天发现是防火墙没关。检查一下iptables,或者直接关掉防火墙省心。

4.2 Android Automotive开发环境配置

Android Automotive,说白了就是车机版的Android。开发环境跟普通Android差不多,但多了些车规级的东西。

4.2.1 AOSP源码下载

高通有自己定制的AOSP分支,别去Google官方拉,那里面没有高通BSP。你得从高通开发者网站获取:

# 以SA8295为例
repo init -u https://source.codeaurora.org/quic/la/platform/manifest -b release -m sa8295.xml
repo sync -j8

这个过程比较漫长,我建议用-j4而不是-j8,虽然慢点,但不容易出错。嗯,网络不好的话,搞个代理吧。

4.2.2 编译环境配置

Android Automotive的编译环境,跟普通AOSP一样,但要注意Java版本:

# 安装OpenJDK 11
sudo apt-get install openjdk-11-jdk

# 设置Java环境
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

然后安装编译依赖:

sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev
sudo apt-get install libgl1-mesa-dev libgles2-mesa-dev

关键点:Android Automotive的编译,内存建议32GB以上,磁盘至少200GB。我见过有人用16GB内存编译,直接OOM了。

4.2.3 编译与烧录

# 初始化编译环境
source build/envsetup.sh

# 选择目标
lunch qcom_sa8295-userdebug

# 开始编译
make -j16

编译完成后,生成的文件在out/target/product/sa8295/目录下。烧录的话,高通有专门的烧录工具,叫QFIL(Qualcomm Flash Image Loader)。

4.3 高通SDK安装与验证

高通SDK,全称Qualcomm Automotive Development Platform。这东西包含了芯片的BSP、驱动、示例代码等等。

4.3.1 SDK获取

你得先签NDA,然后从高通开发者门户下载。SDK一般是个压缩包,大概5-10GB:

# 解压SDK
tar -xzf qadp_sdk_SA8295_v2.0.tar.gz -C /opt/qcom/sdk

4.3.2 SDK目录结构

解压后,目录结构大概是这样:

目录 说明
bsp/ 板级支持包,包含设备树、内核配置
drivers/ 驱动源码,比如显示、音频、摄像头
samples/ 示例代码,我经常从这里抄代码
tools/ 调试工具,比如性能分析器
docs/ 文档,建议先看这个

4.3.3 SDK验证

安装完SDK,得验证一下能不能用。我一般先编译一个示例程序:

# 进入示例目录
cd /opt/qcom/sdk/samples/hello_world

# 设置SDK环境
source /opt/qcom/sdk/envsetup.sh

# 编译
make

# 检查生成的可执行文件
file hello_world

如果输出显示ELF 64-bit LSB executable, ARM aarch64,说明SDK工作正常。

个人经验:我第一次验证SDK时,编译出来的是x86_64的可执行文件,吓我一跳。后来发现是环境变量没设对,envsetup.sh没source成功。

4.4 交叉编译工具链配置

交叉编译,说白了就是在PC上编译出能在ARM芯片上跑的程序。高通用的是GCC工具链,但版本有讲究。

4.4.1 工具链获取

高通SDK里自带工具链,在tools/目录下。你也可以从Linaro下载:

# 下载aarch64工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 解压到/opt
sudo tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt

4.4.2 环境变量配置

# 在 ~/.bashrc 中添加
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export LD=${CROSS_COMPILE}ld
export AR=${CROSS_COMPILE}ar
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH

4.4.3 测试交叉编译

写个简单的测试程序:

// test.c
#include <stdio.h>

int main() {
    printf("Hello from SA8295!\n");
    return 0;
}

然后编译:

${CC} -o test test.c
file test

输出应该是:test: ELF 64-bit LSB executable, ARM aarch64

避坑指南:我曾经用错工具链版本,编译出来的程序在目标机上跑不起来。后来发现是glibc版本不匹配。记住,工具链的glibc版本必须跟目标机上的glibc版本一致或更低。

4.5 常见问题与调试

环境搭建过程中,我遇到过不少问题。挑几个典型的说说:

  • QNX连不上目标机:检查网络,检查qconn是否启动,检查防火墙
  • Android编译报错:多半是Java版本不对,或者内存不够
  • SDK验证失败:环境变量没设对,或者SDK版本跟目标芯片不匹配
  • 交叉编译链接错误:库路径不对,或者工具链版本不匹配

嗯,环境搭建这块,说白了就是耐心活。别急,一步一步来,肯定能搞定。下一章我们开始讲高通芯片的启动流程,那才是真正有意思的东西。