设备树 DTS 工控硬件配置:串口、CAN、GPIO、看门狗硬件资源配置
设备树 DTS 工控硬件配置串口、CAN、GPIO、看门狗硬件资源配置设备树是Linux内核的硬件简历——告诉内核板子上有什么资源、怎么接线比源码里硬编码优雅一万倍。一、设备树概念与作用在Linux 3.x之前硬件信息硬编码在内核源码的arch/arm/mach-xxx目录里每换一块板子就要改内核代码、重新编译——痛苦指数极高。设备树Device Tree的出现改变了这一切硬件配置信息从内核代码中剥离出来变成独立的.dts文件描述。内核启动时加载设备树按描述初始化硬件——换板子只换设备树文件不改内核。类比理解设备树就像一份硬件清单——内核是装修队设备树告诉装修队这个房间有3个插座、2个水龙头、1个空调接口装修队照单施工。核心术语术语说明DTSDevice Tree Source人类可读的文本源文件DTSIDevice Tree Source Include可被其他DTS包含的公共片段DTBDevice Tree Blob编译后的二进制文件内核实际加载的格式DTCDevice Tree CompilerDTS→DTB的编译工具compatible兼容字符串匹配内核驱动的关键标识二、DTS文件语法基础2.1 节点与属性DTS的基本结构是节点树每个节点用{}包裹属性用key value定义/dts-v1/; /* DTS版本声明 */ / { /* 根节点代表整块板子 */ model MyBoard v2.0; /* 板子名称 */ compatible myvendor,myboard, arm,cortex-a7; /* 兼容字符串 */ #address-cells 1; /* 地址用1个32位单元格表示 */ #size-cells 1; /* 大小用1个32位单元格表示 */ cpus { cpu0 { compatible arm,cortex-a7; device_type cpu; reg 0; /* CPU编号 */ }; }; memory80000000 { device_type memory; reg 0x80000000 0x20000000; /* 起始地址大小 512MB */ }; };关键语法要点compatible是驱动匹配的核心——内核根据这个字符串找对应驱动reg属性格式取决于父节点的#address-cells和#size-cells字符串属性用双引号数值用布尔属性写上名字就行存在即true2.2 兼容字符串compatiblecompatible是DTS中最重要的属性格式为vendor,devicecompatible ti,am3352, ti,am33xx; /* 优先匹配ti,am3352驱动找不到再匹配ti,am33xx */内核驱动中注册的ID表必须与compatible一致否则驱动不会绑定到这个节点。三、DTS编译流程DTS源文件 (.dts/.dtsi) ↓ dtc编译器 (Device Tree Compiler) ↓ DTB二进制文件 (.dtb) ↓ bootloader传递给内核 (U-Boot: bootm / fdt) ↓ 内核解析DTB创建设备节点3.1 dtc编译命令# 安装dtcapt-getinstalldevice-tree-compiler# Debian/Ubuntu# 编译DTS为DTBdtc-Idts-Odtb-omyboard.dtb myboard.dts# 反编译DTB为DTS调试时有用dtc-Idtb-Odts-omyboard.dts myboard.dtb# 带包含路径编译dtc-Idts-Odtb-iinclude/-omyboard.dtb myboard.dts3.2 DTB加载方式U-Boot加载DTB有两种方式# 方式1DTB单独加载tftp 0x82000000 myboard.dtb tftp 0x80008000 zImage bootz 0x80008000 - 0x82000000# 方式2DTB附加在内核镜像后现代方式# 内核编译时CONFIG_ARM_APPENDED_DTBycatzImage myboard.dtbzImage_with_dtb内核启动后设备树信息可以在/proc/device-tree/查看ls/proc/device-tree/# 可以看到所有节点目录cat/proc/device-tree/model# 输出板子名称四、串口配置实战串口是工控最基础的通信接口DTS配置决定了内核能识别出哪些串口、用什么参数。4.1 UART节点配置/* AM335x平台串口配置示例 */ uart0: serial44e09000 { compatible ti,am3352-uart, ti,omap3-uart; reg 0x44e09000 0x2000; /* 寄存器地址范围 */ interrupts 72; /* 中断号 */ clock-frequency 48000000; /* 输入时钟频率 */ status okay; /* okay启用, disabled禁用 */ /* 自定义属性默认波特率 */ current-speed 115200; /* DMA配置可选大数据量时启用 */ dmas edma 28 0, edma 29 0; dma-names rx, tx; }; /* 工控扩展串口连接PLC */ uart1: serial48022000 { compatible ti,am3352-uart; reg 0x48022000 0x2000; interrupts 73; status okay; current-speed 9600; /* PLC通信波特率9600 */ };关键属性解析status只有写okay才生效disabled的节点内核不会注册current-speed部分驱动支持从DTS读取默认波特率DMA配置高速串口如48MHz时钟配合DMA可减少CPU中断开销4.2 引脚复用pinctrl串口引脚可能和其他功能复用同一个物理pin必须在DTS中明确声明am33xx_pinmux { uart0_pins: pinmux_uart0_pins { pinctrl-single,bits 0x170 0x30 /* RXD */ 0x174 0x00 /* TXD */ ; }; }; uart0 { pinctrl-names default; pinctrl-0 uart0_pins; };五、CAN配置实战CAN总线是工控的标配通信方式DTS配置CAN控制器和波特率。/* CAN节点配置 */ dcan0: can481cc000 { compatible ti,am3352-dcan; reg 0x481cc000 0x2000; interrupts 52; clocks dcan0_fck; status okay; /* CAN波特率配置 */ /* CAN标准波特率通过clock-freq和bit-timing计算 */ /* 500kbps典型配置 */ }; /* CAN引脚复用 */ am33xx_pinmux { dcan0_pins: pinmux_dcan0_pins { pinctrl-single,bits 0x178 0x20 /* CAN_RX */ 0x17c 0x20 /* CAN_TX */ ; }; }; dcan0 { pinctrl-names default; pinctrl-0 dcan0_pins; };CAN波特率通过ip命令配置内核启动后iplinksetcan0typecan bitrate500000iplinksetcan0 up六、GPIO配置实战GPIO是工控的万能接口——控制继电器、读取开关状态、驱动LED全靠它。6.1 GPIO控制器节点gpio0: gpio44e07000 { compatible ti,am3352-gpio; reg 0x44e07000 0x1000; interrupts 96; gpio-controller; /* 标记这是一个GPIO控制器 */ #gpio-cells 2; /* 引用时需要2个参数: bank编号偏移 */ ngpio 32; /* GPIO总数 */ status okay; };6.2 GPIO作为设备引脚使用/* LED设备使用GPIO pin */ leds { compatible gpio-leds; led0 { label status-led; gpios gpio0 21 GPIO_ACTIVE_HIGH; /* gpio0 bank, pin21, 高电平亮 */ default-state off; }; led1 { label alarm-led; gpios gpio1 15 GPIO_ACTIVE_LOW; /* 低电平亮 */ default-state off; }; }; /* 继电器控制 */ relay-controller { compatible myvendor,relay; gpios gpio2 0 GPIO_ACTIVE_HIGH, /* 继电器1 */ gpio2 1 GPIO_ACTIVE_HIGH; /* 继电器2 */ relay-count 2; };gpio0 21 GPIO_ACTIVE_HIGH含义引用gpio0控制器第21号引脚高电平有效。6.3 pinctrl引脚复用am33xx_pinmux { gpio_pins: pinmux_gpio_pins { pinctrl-single,bits /* 配置为GPIO模式而非串口/SPI等 */ 0x1a0 0x7f /* GPIO2_0 */ 0x1a4 0x7f /* GPIO2_1 */ ; }; };七、看门狗配置实战看门狗Watchdog是工控系统的保险丝——程序卡死时自动重启防止设备永久挂死。/* 看门狗节点 */ wdt: watchdog44e35000 { compatible ti,am3352-wdt; reg 0x44e35000 0x1000; interrupts 93; status okay; /* 看门狗超时时间秒 */ timeout-sec 30; /* 喂狗方式 * - magic-close: 关闭设备文件时必须写入特定字符V才停止看门狗 * 防止意外关闭导致看门狗失效 */ };用户空间喂狗程序#includestdio.h#includefcntl.h#includeunistd.h#includelinux/watchdog.hintmain(void){intfdopen(/dev/watchdog,O_WRONLY);if(fd0){perror(open watchdog);return-1;}/* 设置超时30秒 */inttimeout30;ioctl(fd,WDIOC_SETTIMEOUT,timeout);while(1){/* 喂狗写入任意一个字节 */write(fd,\0,1);printf(喂狗成功\n);sleep(10);/* 每10秒喂一次小于30秒超时 */}/* 正常退出时写入V停止看门狗 */write(fd,V,1);close(fd);return0;}注意如果程序崩溃退出没写’V’看门狗会继续计时30秒后触发硬件重启——这正是看门狗的保险作用。八、自定义DTS覆盖板级配置Overlay机制设备树OverlayDTO允许在基础DTS上叠加修改不改原始文件。适合工控场景基础板配置固定扩展板动态叠加。/* 基础板DTS: myboard.dts */ / { uart3: serial48024000 { status disabled; /* 默认禁用扩展板启用 */ }; }; /* Overlay文件: myboard-can-extension.dtso */ /dts-v1/; /plugin/; / { fragment0 { target uart3; __overlay__ { status okay; /* 启用串口3 */ current-speed 115200; }; }; };编译和应用Overlaydtc-Idts-Odtb --ooverlay.dtbo overlay.dtso# 内核运行时动态加载mkdir/sys/kernel/config/device-tree/overlays/my-overlaycatoverlay.dtbo/sys/kernel/config/device-tree/overlays/my-overlay/dtbo九、常见问题排查9.1 修改DTS后串口不出现原因排序status没改okay——最常见的低级错误节点默认disabledpinctrl没配置——引脚还复用给其他功能串口拿不到物理pincompatible字符串不匹配——内核找不到对应驱动reg地址写错——寄存器地址和硬件手册不一致排查步骤# 查看内核是否识别了设备节点ls/proc/device-tree/serial44e09000/# 查看内核日志dmesg|grepuart# 查看pinctrl状态cat/sys/kernel/debug/pinctrl/pinctrl-maps# 查看驱动匹配cat/sys/bus/platform/devices/44e09000.serial/driver/modalias9.2 引脚冲突两个设备要求同一个pin做不同功能内核只会给先申请的那个# 查看引脚当前配置cat/sys/kernel/debug/pinctrl/pinctrl-maps|greppin48# 输出会显示pin48被哪个设备占了# 解决在DTS中确保每个pin只被一个设备引用十、完整DTS配置示例以下是一份工控板的完整DTS配置基于AM335x平台涵盖串口、CAN、GPIO、看门狗/dts-v1/; #include am335x.dtsi /* 芯片级基础定义 */ / { model ICBoard-AM335x-v2; compatible myvendor,icboard, ti,am3352; chosen { stdout-path uart0; /* 系统console用uart0 */ }; memory80000000 { device_type memory; reg 0x80000000 0x20000000; }; /* LED指示灯 */ leds { compatible gpio-leds; pinctrl-names default; pinctrl-0 led_pins; led-status { label status; gpios gpio0 21 GPIO_ACTIVE_HIGH; linux,default-trigger heartbeat; }; led-alarm { label alarm; gpios gpio1 15 GPIO_ACTIVE_LOW; default-state off; }; }; /* 继电器 */ relays { compatible gpio-relays; pinctrl-names default; pinctrl-0 relay_pins; gpios gpio2 0 GPIO_ACTIVE_HIGH, gpio2 1 GPIO_ACTIVE_HIGH; }; }; /* 引脚复用配置 */ am33xx_pinmux { uart0_pins: pinmux_uart0_pins { pinctrl-single,bits 0x170 0x30 0x174 0x00; }; uart1_pins: pinmux_uart1_pins { pinctrl-single,bits 0x180 0x20 0x184 0x00; }; dcan0_pins: pinmux_dcan0_pins { pinctrl-single,bits 0x178 0x20 0x17c 0x20; }; led_pins: pinmux_led_pins { pinctrl-single,bits 0x1a0 0x7f; }; relay_pins: pinmux_relay_pins { pinctrl-single,bits 0x1a4 0x7f 0x1a8 0x7f; }; }; /* 串口配置 */ uart0 { pinctrl-names default; pinctrl-0 uart0_pins; status okay; current-speed 115200; }; uart1 { pinctrl-names default; pinctrl-0 uart1_pins; status okay; current-speed 9600; /* PLC通信 */ }; /* CAN配置 */ dcan0 { pinctrl-names default; pinctrl-0 dcan0_pins; status okay; }; /* 看门狗 */ wdt { status okay; timeout-sec 30; };设备树把硬件配置从内核代码中解放出来DTS文件清晰可读、修改方便、不用重编译内核。串口、CAN、GPIO、看门狗——工控四大硬件资源的配置全在这一份文本文件中搞定。改配置、换板子从改内核源码重新编译的噩梦变成了改几行文本编译dtb的轻松操作。

相关新闻

彻底禁用Windows Defender的技术方案与优化实践

彻底禁用Windows Defender的技术方案与优化实践

1. 项目背景与需求解析Windows Defender作为微软内置的安全防护方案,近年来功能不断增强,但也带来了系统资源占用高、误报频繁等问题。许多专业用户和开发者发现,在特定场景下需要完全禁用这套防护系统。这个工具正是为解决这个痛点而生。我最…

2026/7/25 3:35:46 阅读更多 →
开源Text-to-SQL工具WrenAI:自然语言转数据库查询实战

开源Text-to-SQL工具WrenAI:自然语言转数据库查询实战

1. 项目概述:当自然语言遇见数据库查询在数据驱动的时代,SQL查询一直是数据分析师、开发者和业务人员获取信息的核心技能。但现实情况是,编写SQL语句需要专业训练,这无形中在数据与决策者之间筑起了一道技术壁垒。WrenAI的出现正是…

2026/7/25 3:35:46 阅读更多 →
FreeBSD CBSD 15.0.0升级指南与优化实践

FreeBSD CBSD 15.0.0升级指南与优化实践

1. 项目背景与核心价值 FreeBSD作为企业级开源操作系统,在云计算环境中常被用于高负载网络服务、存储服务器等场景。阿里云提供的FreeBSD镜像虽然稳定,但官方软件仓库更新周期较长,导致用户难以获取最新功能和安全补丁。CBSD作为FreeBSD生态…

2026/7/25 3:34:46 阅读更多 →

最新新闻

3步解锁VMware macOS支持:在普通PC上运行苹果系统的终极方案

3步解锁VMware macOS支持:在普通PC上运行苹果系统的终极方案

3步解锁VMware macOS支持:在普通PC上运行苹果系统的终极方案 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/un/unlocker 你是否想在普通PC上体验macOS系统,却苦于VMware不提供苹果系统选项&…

2026/7/25 3:47:49 阅读更多 →
如何在5分钟内为你的Switch安装大气层自定义固件:新手完整指南

如何在5分钟内为你的Switch安装大气层自定义固件:新手完整指南

如何在5分钟内为你的Switch安装大气层自定义固件:新手完整指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想要为你的任天堂Switch解锁更多可能性吗?大气层系统…

2026/7/25 3:47:49 阅读更多 →
自适应与学习控制:工业自动化的新范式

自适应与学习控制:工业自动化的新范式

1. 控制领域的新范式:自适应与学习控制在工业自动化与机器人技术快速发展的今天,传统PID控制已经难以满足复杂动态系统的需求。我十年前第一次在注塑机温度控制项目上遇到参数时变问题,那时才真正理解自适应控制的价值。自适应控制&#xff0…

2026/7/25 3:47:49 阅读更多 →
如何让老旧电视重获新生:mytv-android电视直播软件的完整指南

如何让老旧电视重获新生:mytv-android电视直播软件的完整指南

如何让老旧电视重获新生:mytv-android电视直播软件的完整指南 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 还在为家中老旧智能电视播放卡顿、系统版本过时而烦恼吗&#xf…

2026/7/25 3:47:49 阅读更多 →
微信AI行情查询机器人:10分钟低成本部署指南

微信AI行情查询机器人:10分钟低成本部署指南

1. 项目概述:当微信遇上AI行情查询最近在折腾一个挺有意思的小项目——用OpenClaw AI引擎微信公众号搭建行情查询机器人。这个组合最吸引我的地方在于:用户不需要安装任何新APP,直接在熟悉的微信对话框里机器人问"茅台股价多少"、&…

2026/7/25 3:47:49 阅读更多 →
TI毫米波雷达IWR6843/IWR6443引脚配置与电源设计实战指南

TI毫米波雷达IWR6843/IWR6443引脚配置与电源设计实战指南

1. 项目概述:从芯片引脚到稳定供电的毫米波雷达硬件设计基石 在毫米波雷达的硬件设计里,有两块内容看似基础,却直接决定了整个系统的成败:一个是芯片与外部世界沟通的桥梁——引脚配置;另一个是为芯片澎湃算力与精准射…

2026/7/25 3:46:49 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻