自制工业控制系统:平台管理实战——电源控制、风扇调速与内存信息获取

起因

远程运维的机床,晚上加工完要能自己关机省电;风扇卡了转速掉零,报警得比冒烟早;客户报修,第一句先问"机器里是什么内存条"。这三件事落到系统上就是三个问题:电源怎么控制(软关机/重启到底写了什么寄存器)、风扇转速怎么读怎么控、内存容量和条目信息从哪来。教材不讲、教程跳过,这篇把账一次算清。

自制工业控制系统:网络驱动与协议栈实战——e1000有线网卡、USB无线路径与自研TCP/IP

起因

盘能读写、U 盘能交换之后,还缺一条跟外界说话的路:程序下发、参数上传、车间 MES 对接、NTP 校时,后面合规篇的 4G 远程管控,载体全是网。要自研的这套东西年纪都不小:以太网是 Metcalfe 1973 年在 Xerox PARC 写进备忘录的实验,1980 年 DIX 三家(DEC/Intel/Xerox)把它定成标准;TCP/IP 是 Cerf 和 Kahn 1974 年的论文,1983 年 1 月 ARPANET 整网切换换来一战成名。半个世纪过去骨架没换,换的只是速度——自研协议栈要实现的正是这套稳定了几十年的骨架。这篇分三块:有线网卡驱动(PCIe 以太网控制器,寄存器级)、无线的现实路径(USB Wi-Fi 的坑与替代方案)、以及之上的自研 TCP/IP 协议栈——延续零依赖原则,一个字节的外部代码都不引。

自制工业控制系统:显示子系统深入——EDID、模式协商、显存与品牌信息的获取

起因

显卡实战篇(《从GOP帧缓冲接管显示输出》)解决的是"接管帧缓冲自己画像素",但顺着往下还有一串问题躲不掉:高分辨率是靠什么实现的?系统怎么"自动适配"显示器?显示器支持哪些模式从哪查?显卡的显存容量、品牌型号从哪读?——“从哪查"这问的标准答案是 EDID,1994 年 VESA 定的规矩:让显示器在 DDC 线上自报家门,交出 128 字节的"我能干什么”(后来扩到 256 字节 E-EDID)。动机很朴素:VGA 时代显示器是哑巴,刷新率给高了轻则黑屏重则伤机器,显卡只能瞎猜。这篇把这些信息问题逐个落到可操作的层面——涉及三块东西:EDID、模式协商、PCI 配置空间。

自制工业控制系统:USB协议详解——设备类、四种传输与键鼠U盘的数据通路

起因

系列里 EHCI 篇讲了"怎么驱动主机控制器",键鼠篇讲了"怎么解析报表"——中间那层"USB 协议本身怎么运作"一直是背景板。这层的性格全写在出身上:九十年代中期 Intel、微软、康柏这批厂商要终结"装机开机箱拨跳线"的日子,定下的却是一条 Host 主导的主从总线——设备永远被动应答、时间切固定帧,后文的规矩几乎都能从这两条推出来。这篇把它拉到前台单独讲清:设备类是什么、四种传输类型各管什么、Host 与 Device 谁说话、鼠标的坐标和键盘的键值到底是怎么一步步传回来的、U 盘的读写又是一套什么机制。这层想通了,EHCI 和键鼠两篇的代码为什么那么写、U 盘驱动为什么长那个结构,自己就能对上号。

自制工业控制系统:exFAT文件系统实战——引导扇区、目录项与掉电一致性

起因

块设备之上要有文件系统——G 代码程序、加工参数、日志、长时间数据记录都要落在盘上,还要和 U 盘交换。这一族是 1977 年写成、随 DOS 发扬光大的:FAT 的簇链表结构简单到软盘都跑得动,1996 年的 FAT32 把分区撑到 2TB,单文件却从此卡死在 4GB——长录像、大数据记录面前的硬墙。微软 2006 年为闪存和 SD 卡设计的 exFAT 就是来拆这堵墙的,簇链的骨架留着,其余按大容量闪存重画。选 exFAT:U 盘出厂普遍格式、规范公开(微软 2019 年公开完整规范并加入 OIN 向 Linux 生态开放相关专利,自实现的授权风险显著降低;商业产品如有顾虑可让法务复核一遍专利边界)。这篇从引导扇区讲到读写路径,能给表的全给表。

自制工业控制系统:NVMe固态硬盘驱动实战——队列、PRP与块设备抽象

起因

固态盘驱动是基础篇的倒数第二块。NVMe 名声吓人,裸机视角其实是最干净的存储协议:没有端口 IO、没有 ATAPI 历史包袱,一切都是 MMIO 寄存器和内存队列。干净不是偶然:SATA 时代的命令协议 AHCI 是 2004 年照着机械硬盘设计的,单命令队列、逐条排队,闪存根本吃不满;2011 年 Intel 牵头攒起 NVMe 联盟,直接按 SSD 的并行性重新设计——多队列、深队列、寄存器直达,机械时代的包袱一样没背。这篇从 BAR0 一直写到块设备抽象,寄存器表和命令格式全给。

自制工业控制系统:键盘与鼠标驱动实战——USB HID Boot协议解析与输入事件管道

起因

EHCI 立起来之后,这篇写键盘和鼠标的驱动——USB HID class 实战。键鼠对工控系统不是小事:没有它们就没有参数输入和菜单操作。这两样东西的历史也比 USB 长:1987 年 IBM 在 PS/2 机型上把键盘鼠标定成中断驱动的扫描码接口,驱动几十行就写完;USB 时代它们变成通用总线上的一个设备类,为了描述千奇百怪的输入设备,HID 规范设计了自描述的报表描述符——通用性的代价是把解析器变成一个小型语言实现。这篇走的是Boot Protocol 路线:绕开报表描述符解析,把 HID 驱动从"大工程"变"小函数"。

自制工业控制系统:USB 2.0主机控制器实战——EHCI驱动、传输队列与设备枚举

起因

键盘、鼠标、U 盘都骑在 USB 上,这条"骑得上去"的路是 1996 年修的:Intel、微软、康柏那批公司受够了插个外设要开机箱拨跳线,联手定了 USB;2000 年 USB 2.0 把速度抬到 480Mbps,主机控制器规范 EHCI 由 Intel 主导,全速低速留给伴手的 UHCI/OHCI——这个分工就是下面那个矛盾的前传。这篇啃 USB 栈的地基——主机控制器驱动。先说清一个绕不开的事实:USB 2.0 的主机控制器规范是 EHCI,但 EHCI 只管高速(480Mbps)设备;键盘鼠标偏偏是低速(1.5Mbps)/全速(12Mbps)设备,这个矛盾得先解决。照例给到寄存器级。

自制工业控制系统:PCIe总线枚举实战——ECAM配置空间、BAR探测与MSI配置

起因

自研的 GD32F4+FPGA 运动控制卡和 NVMe 固态盘都挂在 PCIe 总线上,用之前得先把它们找出来。PCIe 本身就是"被逼出来"的总线:1992 年的 PCI 是共享并行总线,设备一多频率就上不去,2003 年 PCI-SIG 用串行点对点加交换结构把它整个重做——今天枚举的这棵树就是那场重做的遗产。枚举用的两件工具也各有来历:老配置空间访问走 CF8/CFC 端口,天生 256 条总线的天花板,PCI 固件规范为此补了内存映射的 ECAM;MSI 是 PCI 2.2 引入的消息式中断,设备写一笔内存就算发中断,比拉物理中断线省引脚也好扩展。这篇做 PCIe 枚举:从 MCFG 拿 ECAM 基址、深度优先走拓扑、探测 BAR、使能设备、配好 MSI。枚举产物是一张设备清单,后面 NVMe 驱动和运动控制卡驱动都从这里起步。

自制工业控制系统:图形系统实战——2D渲染、中文点阵字体、控件与事件分发

起因

画布(Screen)之上没有任何 UI 基础设施——没有窗口系统、没有字体、没有控件库,全部自己建。要建的东西里最老的两样各有来历:画斜线的 Bresenham 算法是 1962 年 Jack Bresenham 在绘图仪时代发明的,整数增量、零浮点——那年头浮点运算贵得要用在刀刃上;中文显示走点阵则踩着 1980 年代国产微机汉卡的老路,当年在几百 KB 内存里显示汉字,点阵是唯一现实的选择。这篇把图形系统搭起来:2D 渲染原语、中文点阵字体、控件模型、事件分发,全部跑在协作式主循环里。目标界面在写代码前就该想清楚:一块坐标/进度区、一排规准与状态灯、一条报警栏、几个按钮和编辑框——就这些,没有窗口拖拽没有多层叠加。工业界面长什么样,决定这套系统长什么样:中文、高对比、状态一目了然。