1. 课程导入

做嵌入式BSP开发,第一步不是写代码,而是把环境收拾利索。我见过太多同事,上来就啃驱动源码,结果编译都过不了,串口也打不开,折腾半天发现是工具链版本不对。这一章,咱们就把Jacinto平台的底子摸清楚。

1.1 Jacinto平台硬件架构

TDA4VM和DRA829,这两颗芯片是TI Jacinto家族的明星产品。说白了,它们就是为汽车和工业应用量身定做的异构计算平台。

我刚开始接触TDA4VM时,也被它的框图吓了一跳——CPU、DSP、深度学习加速器、图像信号处理器……一堆东西挤在一个芯片里。但拆开来看,其实就三大块:

  • 主控域(Main Domain):跑Linux或QNX,负责应用调度和网络协议栈。里面是双核或四核的Cortex-A72,主频能到2.0GHz。
  • MCU域(MCU Domain):跑RTOS,负责实时控制。双核Cortex-R5F,主频1.0GHz,专门处理安全相关的任务。
  • 加速器域(Accelerator Domain):C7x DSP、MMA深度学习加速器、VPAC视觉预处理单元。这些是干重活的,比如目标检测、语义分割。

这三个域之间怎么通信?靠的是内部高速互联——Navigator Subsystem和Mailbox。我在项目中遇到过一个问题:A72往C7x发数据,结果DSP一直收不到。查了半天,发现是Mailbox的中断号配错了。嗯,这种跨域通信的细节,后面咱们会专门讲。

关键点:TDA4VM和DRA829的硬件引脚完全兼容。也就是说,你给TDA4VM写的BSP驱动,基本可以直接用在DRA829上。但要注意,DRA829的显示子系统更强,多了个DSS(Display Subsystem)。

下面这张图,是我自己整理的Jacinto平台核心架构关系。你看一眼,心里就有谱了。

Jacinto平台核心架构图 主控域 (Main Domain) Cortex-A72 (双核/四核) 2.0 GHz | Linux / QNX DDR控制器 | 以太网 | PCIe USB 3.0 | CAN-FD | UART MMU | GICv3中断控制器 MCU域 (MCU Domain) Cortex-R5F (双核) 1.0 GHz | RTOS (FreeRTOS/SAFERTOS) 安全岛 (Safety Island) SPI | I2C | GPIO | ADC ECC保护 | 双核锁步模式 加速器域 (Accelerator Domain) C7x DSP (浮点+矢量) | MMA深度学习加速器 VPAC (视觉预处理) | DMPAC (深度与运动) 内部SRAM 2MB | 专用DMA引擎 TI OpenVX / TIDL框架 Navigator + Mailbox 外部DDR4/LPDDR4 (共享内存)

1.2 SDK安装与配置

TI官方提供的SDK叫Processor SDK RTOS / Linux。你想想看,一个SDK里同时包含了RTOS和Linux两套软件栈,这在业界不多见。我个人习惯把SDK安装在/opt/ti/目录下,方便多版本管理。

安装步骤其实很简单:

  1. 从TI官网下载ti-processor-sdk-linux-j7-evm-xx.xx.xx.xx-Linux-x86-Install.bin
  2. 赋予执行权限:chmod +x *.bin
  3. 运行安装:./ti-processor-sdk-linux-j7-evm-xx.xx.xx.xx-Linux-x86-Install.bin
  4. 选择安装路径,比如/opt/ti/processor-sdk-linux-j7-evm-08_06_00_12

我的习惯:安装完成后,我会在~/.bashrc里加一行export TI_SDK_PATH=/opt/ti/processor-sdk-linux-j7-evm-08_06_00_12。这样后面编译、调试时,直接引用这个环境变量,省得每次敲长路径。

SDK安装完后的目录结构,我列个表给你看:

目录/文件 说明
board-support/ 板级支持包,包含U-Boot、Linux内核、设备树
linux-devkit/ 交叉编译工具链和sysroot
filesystem/ 目标板根文件系统(tisdk-rootfs-image)
example-applications/ TI提供的参考例程,比如GPIO、I2C、UART测试
docs/ 用户手册、API文档、勘误表
setup.sh 一键环境配置脚本

1.3 交叉编译工具链验证

交叉编译工具链,说白了就是让你在x86的PC上编译出ARM架构的可执行文件。TI SDK里自带的是gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu。

验证工具链是否正常,我一般做三步检查:

# 第一步:检查编译器版本
$ aarch64-none-linux-gnu-gcc --version
aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12) 9.2.0

# 第二步:编译一个简单的hello.c
$ aarch64-none-linux-gnu-gcc -o hello hello.c

# 第三步:查看生成文件的架构
$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped

看到ARM aarch64这几个字,就说明工具链没问题。我曾经遇到一个坑:同事用错了工具链版本,编译出来的程序在目标板上跑起来就段错误。查了两天才发现是工具链的glibc版本和板子上的不匹配。所以,一定要用SDK自带的工具链,别自己去网上下一个。

避坑指南:如果你在64位Ubuntu上开发,别忘了安装32位兼容库。否则运行linux-devkit/sysroots/x86_64-arago-linux/usr/bin/下的某些工具时,会报No such file or directory。安装命令:sudo apt install lib32z1 lib32ncurses5 lib32bz2-1.0。

1.4 目标板启动与串口连接

环境搭好了,工具链也验证了,接下来就是让板子跑起来。Jacinto平台的启动流程,我画了个简图:

TDA4VM启动流程 ROM Bootloader SPL (MLO) U-Boot Linux Kernel 启动介质:SD卡 / eMMC / OSPI NOR Flash / 以太网

串口连接是调试的基础。TDA4VM EVM板上有两个UART口:

  • UART0:主控域控制台,默认115200 8N1,用于Linux内核启动和shell交互。
  • UART1:MCU域控制台,用于RTOS调试。

我个人习惯用screen命令连接串口:

# 安装screen(如果还没有)
$ sudo apt install screen

# 连接UART0(设备节点可能是ttyUSB0或ttyACM0)
$ screen /dev/ttyUSB0 115200

# 断开连接:Ctrl+A 然后按 K,再按 Y 确认

小技巧:如果你用minicom,记得关掉硬件流控(Hardware Flow Control)。否则板子可能不输出任何信息。我刚开始调试时就被这个坑过——串口线插上了,电源也亮了,就是没输出。折腾了半小时,发现是minicom默认开了RTS/CTS。

板子正常启动后,你会看到U-Boot的启动日志,然后Linux内核开始解压,最后弹出登录提示符。默认用户名是root,没有密码。