1. QNX驱动开发环境搭建:安装QNX SDP、配置交叉编译链、搭建QNX虚拟机目标机环境

好,咱们直接进入正题。做QNX驱动开发,第一步就是把环境搭起来。这一步要是没弄好,后面写再多代码也跑不起来。我见过不少新手,上来就急着写驱动,结果编译都过不了,白白浪费时间。

说白了,QNX驱动开发环境就三块:开发主机上的SDP交叉编译链、以及目标机环境。咱们一个一个来搞定。

1.1 安装QNX SDP(Software Development Platform)

SDP是QNX的软件开发包,里面包含了编译器、头文件、库文件、调试工具等等。没有它,你连个hello world都编译不出来。

获取方式

  • QNX官网下载(需要注册账号,免费版有功能限制)
  • 商业授权用户可以从BlackBerry的客户门户获取
  • 我建议直接申请试用版,功能全,够用一阵子

安装步骤

  1. 下载对应宿主机的安装包(Linux或Windows)
  2. 运行安装程序,选择安装路径
  3. 选择要安装的组件——我个人习惯全选,省得后面缺东西再补
  4. 等待安装完成,大概10-15分钟
小提示:安装路径不要有中文和空格。我吃过这个亏,当年装在一个带空格的目录下,结果编译时各种路径解析错误,排查了半天才发现是这个问题。

安装完成后,你会看到类似这样的目录结构:

/opt/qnx710/
├── host/          # 宿主工具链
├── target/        # 目标平台库和头文件
├── qnxbase/       # 基础系统文件
└── qsdp/          # 示例和文档

嗯,这里要注意:QNX SDP的版本号很重要。目前主流的是QNX 7.0和7.1。不同版本之间API有差异,驱动代码不一定能直接移植。我建议统一用7.1,兼容性更好。

1.2 配置交叉编译链

QNX驱动不是在开发机上直接编译运行的。你的开发机可能是x86架构,但目标机可能是ARM、AArch64或者x86_64。所以需要交叉编译链——在开发机上编译出目标机能运行的二进制文件。

环境变量配置

安装完SDP后,需要设置环境变量。我个人习惯把下面这段加到 ~/.bashrc 里:

export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
export MAKEFLAGS=-j4

然后执行 source ~/.bashrc 让配置生效。

验证交叉编译链

配置好了,怎么知道对不对?跑一下这个命令:

ntox86_64-gcc --version

如果能看到版本信息,说明交叉编译链已经就绪。如果提示命令找不到,那就是环境变量没配好,回去检查一下路径。

注意:不同目标架构的编译器前缀不一样:
  • ntox86_64-gcc — x86_64目标
  • ntoarmv7-gcc — ARMv7目标
  • ntoaarch64-gcc — AArch64目标
我曾经在项目里搞混过,用x86_64的编译器编译了ARM的驱动,结果在目标机上怎么都跑不起来。后来才发现是编译器选错了。

测试编译

写个简单的驱动框架,测试一下编译环境:

#include <sys/types.h>
#include <devctl.h>
#include <stdio.h>

int main(void) {
    printf("QNX Driver Dev Env OK!\n");
    return 0;
}

编译命令:

ntox86_64-gcc -o test_drv test_drv.c

如果能生成 test_drv 可执行文件,恭喜你,交叉编译链配置成功了。

1.3 搭建QNX虚拟机目标机环境

驱动写好了,总得有个地方跑吧?如果你手头没有真实的QNX硬件板子,那就用虚拟机。QNX官方提供了QNX虚拟机镜像,可以直接在VMware或VirtualBox上运行。

获取虚拟机镜像

  • QNX SDP安装目录下有个 images/ 文件夹,里面有预制的虚拟机镜像
  • 也可以自己用 mkqnximage 工具生成

创建虚拟机步骤

  1. 打开VMware Workstation(我用的是17版本)
  2. 选择「创建新虚拟机」
  3. 选择「稍后安装操作系统」
  4. 操作系统选择「Other」,版本选「Other 64-bit」
  5. 分配内存:建议至少2GB,我一般给4GB
  6. 网络类型:选择「桥接模式」或「NAT模式」
  7. 创建完成后,编辑虚拟机设置,把QNX镜像挂载到CD/DVD驱动器
小技巧:网络配置建议用NAT模式。桥接模式需要额外的网络配置,新手容易踩坑。我刚开始学的时候,桥接模式折腾了一下午没通,换成NAT模式五分钟搞定。

启动QNX虚拟机

启动虚拟机后,你会看到QNX的启动日志。启动完成后,登录界面如下:

QNX Neutrino (localhost) (tty1)

login: root
password: (默认密码为空,直接回车)

登录成功后,用 ifconfig 查看IP地址:

# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33184
    inet 127.0.0.1 netmask 0xff000000
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255

记下这个IP地址,后面开发机要通过它来连接目标机。

验证开发机与目标机的连接

在开发机上执行:

ping 192.168.1.100

如果能ping通,说明网络连接正常。接下来就可以用 qconnssh 连接目标机了。

核心要点总结
  • SDP安装路径不要有中文和空格
  • 交叉编译链前缀必须与目标架构匹配
  • 虚拟机网络建议用NAT模式
  • 开发机和目标机必须能互相ping通

好了,环境搭建就到这里。下一步咱们就可以开始写真正的字符设备驱动了。记住,环境搭好了,后面的事情就顺了。我见过太多人因为环境问题卡在第一关,结果连驱动长什么样都没看到就放弃了。别急,慢慢来,每一步都走扎实。