Vortex DX-3 PC/104板卡设计实战:从硬件到Linux适配

📅 2026/8/27 10:24:02
Vortex DX-3 PC/104板卡设计实战:从硬件到Linux适配
做嵌入式板卡这么多年PC/104 一直是我又爱又恨的标准。爱的是它稳定、抗造模块化程度高恨的是它总带着一股“老派”气息选型时经常被年轻工程师无视。但上一个项目甲方要求非常明确必须保留 PC/104 接口要能直接叠上仓库里那批跑了十年的 ISA 采集卡还要在宽温环境下无风扇长期运行。这时候我才发现真正合适的选择并不多。最后定下来的方案是以 DMP 的 Vortex DX-3 SoC 作为核心做一块标准的 PC/104 CPU 模块。这篇文章不是 datasheet 的复读我会从“我实际做这块板子”的角度把 Vortex DX-3 的架构特性、PC/104 板级的硬件设计、Linux/嵌入式系统适配过程以及测试阶段的真实故障和排查经验一五一十写出来。如果你是做工业嵌入式、正在考虑 x86 系 SoC 怎么配合传统总线生态或者想给老产线做升级选型这篇大概能帮你少走不少弯路。1. 项目思路为什么到今天还要用 PC/104 和 Vortex DX-31.1 PC/104 在严苛环境中的独特生态位PC/104 是一种非常“固执”的嵌入式标准。板卡尺寸统一为 90.2mm x 95.9mm大约就是 3.6 英寸见方比一张扑克牌大不了多少。和普通 CPCI、PXI 这类带背板的总线不同PC/104 模块之间没有背板板子通过四角的安装孔用铜柱压紧插针直接上下堆叠一层一层像积木一样搭起来。第一层作为系统主控的 PC/104 的 104 个引脚对应传统 ISA 总线而后来扩展出的 PC/104-Plus 又加了一组 120 针用来走 PCI 总线。这种机械结构在普通办公环境下看不出优势一旦放到振动剧烈的机车、装甲车甚至矿山机械里优势就出来了。没有背板意味着没有插卡松动、接触不良的隐患层与层之间通过螺丝和铜柱刚性固定抗冲击和抗振动能力远强于桌面级主板加扩展卡。再加上整个板卡面积小、功耗低非常容易做三防漆、宽温筛选所以军工、电力、轨道交通这些对可靠性要求极高的行业至今仍在大量使用。正是因为有这条存量生态链PC/104 在今天依然有不可替代的价值。很多时候客户并不是想“追新”他们只是需要一块能替换老主板的 CPU 卡要求总线兼容、机械兼容、软件尽量少改。这也是我在这类项目里最常听到的一句话“别的都好说只要它还能插我原来的卡。”1.2 选型对比Vortex DX-3 到底赢在哪里确定 PC/104 这个形态之后核心问题就变成了“上面用什么 CPU”。当时我列了几个方向第一是传统 x86 处理器配独立芯片组比如老式的 Atom、Geode 一类。思路没问题但这类方案已经进入生命周期尾声很多芯片组规格老旧DDR2/DDR3 内存颗粒越来越难买而且整体功耗偏高一块 PC/104 大小的板子上做多路电源和复杂时序对热设计和布局压力都很大。第二是用 ARM 系 SoC比如 i.MX、AM335x 之类。这类芯片在消费电子和工业控制领域用得很多软件生态也成熟但它们天生不带 ISA 总线。想挂载老式 ISA 采集卡必须额外加 CPLD/FPGA 做总线翻译和时序转换工程量不小。而且很多老应用是 x86 编译出来的二进制程序换到 ARM 之后要么重新编译要么做指令集翻译兼容成本非常高。第三类是高端的 FPGA/自适应 SoC。这类芯片确实强比如现在市面上很火的 Versal Adaptive SoC逻辑资源丰富、接口灵活几乎什么总线协议都能“磨”出来。但对这个项目来说属于杀鸡用牛刀开发周期长、需要大量 HDL 设计、BSP 和驱动也全靠自己写而且成本翻了好几倍。最后定下来的 DMP Vortex DX-3 恰好避开了以上所有问题。它本质是一颗具有 x86 指令集兼容内核的 SoC把传统 PC 架构里 CPU、北桥、南桥的功能全部塞进单颗芯片内部直接引出 PCI 总线并且支持标准 ISA 时序。这就意味着板卡上不需要再放一颗“翻译官”芯片PC/104 的 104 针接口可以直接连到 SoC 的总线引脚上。软件方面由于是标准 x86 启动流程传统 BIOS 加操作系统的方式完全适用老程序的兼容问题几乎归零。功耗又低工业级温度范围也能覆盖。2. 把 Vortex DX-3 SoC 拆开看这颗芯片能给我们什么2.1 “无芯片组”架构与内存控制器Vortex DX-3常被工程师叫成 Vortex86DX3属于 DMP 的 Vortex86 系列定位是高度集成的 x86 SoC。它的核心是一颗 32 位 x86 兼容处理器标称主频在 800MHz 到 1.0GHz 这个区间具体取决于型号和温度等级。单从性能看它肯定比不了现在的酷睿、锐龙甚至也比不了一些高性能 ARM 处理器但在 PC/104 这种功耗和散热受限的场景里这个性能级别足够跑 Linux、跑数据采集、跑小型控制逻辑属于典型“够用就好”。真正值钱的地方在于集成度。传统嵌入式 x86 方案里CPU 之外还要配内存控制器、PCI 桥、IDE/串口控制器、中断控制器、DMA 控制器、定时器、RTC 等等一块板上密密麻麻全是芯片。Vortex DX-3 把这些全部收进了一颗芯片里板级设计只需要围绕它做电源、存储和外设接口。特别是它在片内集成了 DDR3 内存控制器板载 DDR3 颗粒可以直接挂在 SoC 的存储总线上不再需要额外的 Northbridge。这种“无芯片组”设计的另一个好处是功耗大幅下降。少了外围芯片的静态功耗和信号翻转功耗整颗 SoC 的发热量大大降低板卡可以做成完全无风扇结构。对工业现场来说没有风扇就等于少了一个最容易坏的活动部件长期运行的可靠性提升非常明显。2.2 IO资源串口、以太网、总线接口一应俱全我在这块板子上最常点名的几组外设Vortex DX-3 基本都内置了。串口是最重要的工业通信口芯片集成了多路 UART我这块 PC/104 板引出 4 路其中两路做 RS-232两路配置成 RS-422/485用来连接现场 PLC、仪表和传感器。UART 的寄存器兼容传统 16550Linux 下直接识别为标准串口驱动不用额外写。以太网方面Vortex DX-3 内置 MAC 控制器板级只需要外接一颗 PHY 芯片和网络变压器就能引出标准 RJ45。我在这块板上选了百兆 PHY对大多数工业数据上传和远程维护场景完全够用。存储接口上芯片支持传统的 IDE 时序以及 SATAPC/104 板空间紧张我最终用 CF 卡接口做主启动盘同时引出一路 SATA 用于外接大容量存储。更关键的是它保留了对 ISA 总线的原生支持。PC/104 的 104 个引脚地址线、数据线、中断线、DMA 线直接由 SoC 的总线控制器驱动不需要额外的桥接芯片。这意味着老式 ISA 卡插上去只要地址和中断不冲突基本就能正常工作。这也是这颗 SoC 在 PC/104 领域难以被替代的根本原因。2.3 功耗与热设计无风扇背后的账我实测过这块板卡整板功耗跑 Linux 系统、双网口空闲、串口全开的情况下整板功耗大约在 5W 到 8W 之间其中 SoC 本身占大头大概 2W 到 4W。这个数字放在今天可能不算惊艳但要知道这是一颗 x86 兼容芯片能跑 Windows CE、Linux、老式 DOS 应用而且能在 -40°C 到 85°C 的工业温度范围内稳定工作。功耗低散热就成了“顺带解决”的问题。普通 3.5 英寸嵌入式主板还需要贴大面积散热片甚至加风扇这块 PC/104 板只需要在 SoC 表面贴一块小尺寸铝制散热片靠自然对流就能满足散热需求。系统集成商把它装进密封机箱、导轨控制柜里不用担心积灰堵住风道。这一点在长期运维里特别省心我后面的项目里甚至会主动把它列为“无维护设计”的一部分。3. PC/104 板级硬件设计要点复盘3.1 机械结构与层叠设计机械上PC/104 的标准非常严格板卡尺寸 90.2mm x 95.9mm四角有 4 个安装孔孔位距离和孔径都有明确规范。我拿到结构工程师给的 3D 图时第一条要求就是“不要超出这个范围尤其是叠层连接器的高度”。PC/104 板卡叠放时层与层之间通过标准的 2.54mm 针式连接器对插中间用铜柱隔开这个高度是固定的板卡上如果有太高的器件就会顶到上层板。实际布局上我把 Vortex DX-3 SoC 放在板卡几何中心偏一侧DDR3 颗粒紧贴 SoC 放置尽量缩短存储总线的走线长度。PC/104 总线的连接器分布在板卡边缘ISA/PCI 信号从 SoC 引出后先经过总线驱动芯片再做等长处理防止高速信号因为长度差产生时序偏移。电源部分放在另一侧通过大面积铺铜和过孔阵列把热量分散到整板。还有一个容易踩的坑PC/104 板卡的四角安装孔周围要预留足够的禁布区否则堆叠铜柱的金属边缘很容易碰到走线造成短路。我在第一版 Layout 里就吃过亏孔周围走了信号线测试时整板复位最后查了两天才发现是安装孔位置的问题。后来养成习惯拿到结构图先标禁布区再开始画原理图。3.2 供电、纹波与复位时序PC/104 总线规范里板卡通常由背板或上一级供电我设计时按单 5V 输入考虑板载 DC/DC 转换成 SoC 需要的各路电压。Vortex DX-3 的内核电压、DDR3 电压、IO 电压各不相同我用了 3 路 DC/DC 和几路 LDO保证上电时序先 3.3V再 DDR3 的 1.5V/1.35V最后内核电压。这个顺序不能乱一旦内核电压先起来、IO 后起来SoC 内部的 ESD 保护二极管可能被正向导通长期看有损伤风险。纹波控制是我特别想强调的一点。工业现场电源环境恶劣24V 转 5V 的电源模块本身就有不小的开关噪声。SoC 内核电压对纹波非常敏感我实测过纹波超过 50mV 时系统会出现随机死机、USB 设备掉线的问题。后来我在内核电压输出端加了 π 型 LC 滤波同时把 DC/DC 的开关频率尽可能调低最终把纹波压在 20mV 以内问题才消失。用示波器测纹波的时候一定要用弹簧接地别用长地线夹子否则探头本身会引入噪声误判方向。复位电路我也做了双重设计芯片自身的 POR 复位加上外部看门狗复位。看门狗选的是外部独立芯片而不是只用 SoC 内部看门狗——SoC 内部看门狗一旦 CPU 跑飞可能连喂狗功能一起失效独立硬件看门狗更可靠。复位输出连到 SoC 的复位引脚同时通过逻辑门连到 PCI/ISA 总线复位保证堆叠的扩展板也能同步复位。3.3 ISA/PCI 总线路由逻辑设计PC/104 的 ISA 总线是 16 位数据线加 24 位地址线速度不高但对时序要求很“传统”中断和 DMA 是并行优先级结构和现在 PCIe 完全两个思路。Vortex DX-3 虽然内部走的是 PCI 架构但通过片内桥接逻辑提供了 ISA 兼容时序实际上是把 PCI 总线的交易翻译成 ISA 周期。我在这块板子上没有直接让 ISA 信号裸奔到连接器中间加了一级 74LVC245 总线驱动芯片。原因很简单PC/104 堆叠起来之后背板总线上挂着好几块扩展卡每块卡的输入电容和驱动电流需求都不一样SoC 的 IO 驱动能力有限一旦挂载卡太多信号边沿变缓时序裕量就不够了。加上驱动芯片之后总线的灌电流能力大幅提升实测堆叠 4 块扩展卡仍然稳定。地址译码部分我用了一颗小容量 CPLD。ISA 总线的地址译码说简单也简单说复杂也复杂尤其是中断共享和 DMA 请求光靠板上电阻跳线不够灵活。CPLD 里我把 16 位 ISA 扩展板卡的区域译码、中断路由、板上 GPIO 扩展都做在一起。这样改地址和中断映射不用换电阻直接更新 CPLD 逻辑几秒钟就好。3.4 内存与存储选型内存方面Vortex DX-3 支持 DDR3我选了板载 512MB 配置。对 Linux 系统来说512MB 跑精简发行版完全够跑大流量的数据采集也够如果客户需要可以换成 1GB。这里要提醒一句PC/104 板卡面积小DDR3 颗粒通常只能贴 2 到 4 颗容量上不要做太多幻想选型时直接在需求和价格之间取平衡点。存储介质上我在板载了 CF 卡座和 SATA 接口。CF 卡是老工控最经典的选择接口是 IDE 时序Vortex DX-3 原生支持bios 能直接识别系统可以直接从 CF 卡启动。SATA 接口则留给需要大容量存储的应用比如视频监控录存或者数据记录仪。为了可靠性我还预留了 SPI Flash 放引导程序和紧急恢复系统万一 CF 卡系统损坏可以从 SPI Flash 启动一个精简救援系统。4. 软件适配从BIOS到Linux的一整套落地过程4.1 启动流程与启动介质说到 SoC很多人第一反应是 ARM 那颗固化 ROM 里的 BootROM但从 x86 系 SoC 的角度看启动流程反而是传统 BIOS 那一套这是它最大的兼容性优势。Vortex DX-3 上电后先从片内/板载 SPI Flash 加载 BIOSBIOS 完成 POST 自检后按配置的启动顺序去扫描启动介质。我在这块板上把启动顺序配置为CF 卡优先SATA 次之SPI Flash 里的救援系统兜底。BIOS 设置界面可以通过串口重定向输出用一根串口线就能进 BIOS 配置不需要接显卡和显示器。这在工业现场非常实用很多 PC/104 板卡被塞进密闭机箱根本没有显示接口。这里想多说一句“SoC 芯片启动”这个事。很多工程师做惯了 ARM以为所有 SoC 都是“BootROM 引导 Uboot 再引导内核”其实 x86 SoC 的启动链是“BIOS 传统 Bootloader”。这意味着你过去调 U-Boot 的经验用不上而老一代 x86 工程师的 BIOS 配置经验反而能无缝迁移。Vortex DX-3 官方也提供 BIOS也可以按需定制启动 logo、默认启动顺序、串口重定向参数这些都是实际量产时非常必要的功能。4.2 Linux 内核与 BSP 适配Linux 是这块板子的主力操作系统。移植过程比想象中顺利主要原因是 Vortex DX-3 兼容标准 x86 架构内核里大多数驱动都能直接使用。我用的内核版本是长期维护分支配置时重点打开了这些选项传统的 8250 串口驱动、IDE/CF 支持、SATA 支持、百兆网卡驱动、GPIO 驱动、看门狗定时器驱动。由于是 x86 架构没有设备树那套东西硬件资源主要通过内核启动参数和驱动内置的 IO 地址/中断号来配置。对不熟悉设备树的工程师来说反而更直接。BSP 适配工作集中在几个方面一是板级启动参数比如 consolettyS0,115200 把调试信息打到串口方便远程排查二是 rootfs 构建我直接用 BusyBox 做了一个精简根文件系统大小控制在 8MB 以内放在 CF 卡的一个独立分区三是 GPIO 和看门狗驱动如果官方 Linux 源码里没有现成的就需要根据 datasheet 的寄存器说明自己写一个字符驱动工作量不大但必须仔细对照地址映射。我的建议是先用官方提供的 BSP 或者参考设计验证整套硬件确认串口、网口、存储都能正常工作再开始裁剪优化。不要一上来就自己从零写驱动那不是效率最高的路径。4.3 裸机、RTOS 与传统嵌入式OS虽然 Linux 是主流但 VDX-3 这颗 SoC 的优势恰恰在于“什么都能跑”。我在这块板上做过三套系统验证第一是传统 DOS 兼容环境。老产线上很多控制程序是 16 位 DOS 程序当年跑在 386/486 平台上客户不愿意重写。Vortex DX-3 的 x86 兼容性让这些程序可以原样运行只需要把原来的 ISA 板卡地址、中断号在启动配置里对应好。这一点是 ARM 方案完全做不到的。第二是 RTOS比如商用的 VxWorks 或者开源的 FreeRTOS。对于裸机开发Vortex DX-3 也可以直接操作寄存器自己写 UART、GPIO、定时器. 如果应用逻辑简单比如就是循环采集几个串口、控制几个 IO裸机方案反而更可控没有操作系统调度延迟没有驱动栈故障点更少。但裸机开发要求对芯片寄存器非常熟悉我一般不推荐新手直接上。第三是实时 Linux通过 PREEMPT_RT 补丁把内核变成实时内核。实测中断响应延迟能做到几十微秒级别对大多数工业控制够用。这是我最推荐的方案既有 Linux 的生态和网络能力又有接近 RTOS 的实时性。4.4 调试过程中最头疼的“连接断开”问题调试阶段我遇到过一个非常折磨人的问题用 GDB 通过网络远程调试目标板上程序时经常出现类似“disconnected from the target vm, address 127.0.0.1:57436, transport soc”的报错调试会话毫无征兆地断掉。一开始以为是网络问题换了网线、关掉防火墙都没用。排查到最后发现还是内核电压不稳导致 SoC 内部某个环节偶尔复位调试器连接自然就断了。这个报错信息里的 “transport soc” 看起来像是什么协议栈问题实际上底层原因就是目标机没有保持稳定运行。所以如果你做 SoC 相关开发时遇到莫名其妙的调试器断连先不要怀疑调试软件先拿示波器量各路电源的纹波和复位信号往往能更快找到根源。5. 实际部署场景与扩展玩法5.1 工业数据采集与旧卡复用这个项目的真实应用场景是工业数据采集底层是若干台老式机床设备上带有基于 ISA 总线的数据采集卡专门采集振动、温度、电流等模拟量。甲方不想更换这些采集卡因为它们价格不菲而且现场验证了很多年数据可靠性高。我们的 PC/104 板卡在这里承担的角色是“新主控 老外设”。板子上跑 Linux通过 ISA 总线访问老采集卡的内存映射地址读取采集数据然后通过以太网汇总到上位机。整套系统的工作量集中在两点一是采集卡地址空间和中断号的配置二是 Linux 下编写一个简单的字符驱动把采集卡的数据寄存器暴露成 /dev/xxx 接口。这种“新老结合”的模式在工业现场特别常见。PC/104 加 Vortex DX-3 的组合本质上是用现代工艺和低功耗特性延长了大量高价值老外设的使用寿命。对客户来说节省的不仅是设备采购成本更是产线停机改造的时间成本。5.2 堆叠扩展与批量部署经验PC/104 的另一大玩法是堆叠。除了 CPU 卡市面上大量存在串口扩展卡、GPIO 卡、CAN 总线卡、继电器输出卡等。上层每加一块卡系统功能就扩展一块。我在项目里搭配过 4 路串口扩展卡、16 路光隔输入卡和 8 路继电器输出卡四层堆叠整机功耗也只有十几瓦一个标准工控机箱就能装下。批量部署的时候有几个经验想分享一下。一是每块板的 BIOS 参数要统一最好在出厂前用脚本批量配置好避免现场一台一台设置。二是 CF 卡系统镜像要做一个母版批量克隆后用校验工具检查防止个别卡烧写不完整。三是连接器部位建议做一次三防处理PC/104 堆叠后接插件长期暴露在粉尘环境中容易氧化导致接触不良我后来都要求客户在安装时涂一层薄薄的触点润滑脂。6. 常见问题排查实录6.1 上电无显示、不进BIOS这个问题在调试初期最容易碰到。拿到一块新打样的 PC/104 板上电后串口没有任何输出连 BIOS 都没反应。我的排查顺序是先用万用表量各路电源是否正常重点看内核电压是否在规格范围内然后用示波器看 SoC 复位引脚确认复位释放后有没有再被拉低接着查时钟芯片用示波器测 SoC 外部时钟是否有稳定波形。如果电源、复位、时钟都正常下一步直接重点检查 DDR3 内存通道的焊接质量。BGA 封装或者 DDR 颗粒的焊接问题非常隐蔽表面上看锡球都塌了实际上某个关键信号虚焊。我碰到过的案例里十次“不上电”有六次是内存地址线虚焊用放大镜看不出来最后靠边界扫描或者替换法才定位。另一种可能是 SPI Flash 里的 BIOS 没有烧写或者校验失败用编程器离线重烧一次就能排除。6.2 ISA 总线访问偶发失败系统能启动但 ISA 采集卡读数据时偶尔出错这是 PC/104 系统最典型的老大难问题。我踩过的主要有三类原因第一类是总线驱动能力不足。堆叠的扩展卡多了总线信号边沿变缓导致地址建立时间不够。解决办法就是前面说的总线驱动芯片保证驱动电流足够。第二类是地址译码产生毛刺。CPLD 里的译码逻辑如果组合逻辑路径太长输出会出现短暂的不稳定脉冲。解决办法是采用寄存输出把译码结果打一拍再输出牺牲一个周期换取稳定性实测下来误码率降为零。第三类是中断线冲突。ISA 中断是共享优先级的如果两块卡都配置成 IRQ5 而驱动不支持中断共享系统就会出现随机卡死。PC/104 板卡上通常有跳线或者 CPLD 中断路由把每块卡的中断分配到独立 IRQ 是最稳妥的做法。6.3 看门狗误复位与温度相关故障有一次现场反馈设备运行几个小时后自动重启而且没有规律。远程看日志系统是“突然死掉”然后重启怀疑是看门狗超时触发。排查下来发现看门狗喂狗线程在 Linux 系统高负载时偶尔会被延迟执行喂狗间隔超过了超时阈值触发误复位。解决方法是两个方向同时做一是把喂狗操作放到内核定时器里而不是用户态线程这样即使系统负载高内核定时器也能保证在几十毫秒内执行二是把看门狗超时时间从 1.6 秒放宽到 4 秒左右留足余量。另外温度漂移也会影响问题机箱温度升高时晶振的振荡频率会略微偏移导致定时变慢或变快。工业级应用里我强烈建议选用工业级晶振温度系数小的那种能省很多排查功夫。6.4 电源噪声引发的“幽灵”故障最后说一类最头疼的故障现象随机、无法稳定复现比如“USB 口偶尔掉设备”“CF 卡偶尔读写错误”“网卡 ping 不通”。这类问题的根源大部分都能归结到电源噪声。我在系统里增加负载时网卡偶发丢包。用示波器测网络变压器附近的电源发现纹波已经接近 80mV里面还叠着一串振铃。后来在网卡 PHY 供电引脚旁边加了高频去耦电容同时把 DC/DC 的反馈环路补偿调稳纹波回到 20mV 以内问题消失。这里面的经验是数字系统调试不能只盯着数字信号电源纹波才是很多“幽灵故障”的真正元凶。尤其是 SoC 这种集成度高的芯片片内多个模块同时开关瞬态电流变化非常剧烈供电设计上多花点功夫比后期排查效率高得多。结尾一点个人体会项目收尾时我盯着这块冒不出热气、没有风扇、全是插针的 PC/104 板卡想了不少。这类产品确实不性感没有最新的制程、没有动辄几十核的算力但它能稳定地跑在生产线、配电房、轨道列车上一跑就是好几年。工程上真正值钱的往往不是“用了多新的技术”而是“在约束条件下做对了多少取舍”。Vortex DX-3 这颗 SoC 不是什么性能怪兽但它从架构上就盯着“兼容、集成、低功耗”这三个词配合 PC/104 这样的传统总线生态恰好击中了工业存量市场的痛点。如果你手头也有老设备改造、ISA 总线外设复用的需求我建议认真考虑一下这个组合。最后还是那句话选型看数据更要看历史包袱把老设备盘活比无脑换代更有价值。