接前一篇文章Linux网络驱动之Fixed-Link34本文内容参考RK3588TRL8367s 四网口千兆交换机配置与性能优化实战-CSDN博客嵌入式Linux驱动开发指南 —— 设备树语法与编译工具 —— 读懂这张“藏宝图“3-CSDN博客特此致谢上一回开始对瑞芯微RK3588 SDK的dts文件和全志T113 SDK的dts文件中涉及到RTL8367交换机芯片的内容进行详细解析。先讲解RK3588的dts文件没有讲完本回继续。RK3588的dts// 这是假设你的RK3588 GMAC0控制器对应的MDIO总线节点是 mdio0 mdio0 { status okay; // 删除可能自动生成的PHY节点因为我们接的是交换机不是直接PHY /delete-node/ phy0; // 定义我们的交换机节点 switch: switch0 { compatible realtek,rtl8367s; // 驱动匹配的关键字 reg 0; // 在MDIO总线上的地址通常是0 reset-gpios gpio3 RK_PC0 GPIO_ACTIVE_LOW; // 复位引脚低电平有效 // ldo-gpios gpio2 RK_PD3 GPIO_ACTIVE_HIGH; // 如果芯片有外部LDO控制则启用 realtek,disable-leds; // 可选禁用交换机的LED指示如果硬件没接LED可以加上避免报错 // DSA相关表明这是交换机成员 dsa,member 0 0; // 中断控制器可选但推荐 switch_intc: interrupt-controller { interrupt-parent gpio3; interrupts 16 IRQ_TYPE_LEVEL_LOW; // 连接的中断GPIO interrupt-controller; #interrupt-cells 1; }; // 端口定义这是核心 ports { #address-cells 1; #size-cells 0; // 定义连接到内部PHY的4个LAN口 port1 { reg 1; // 端口号对应芯片物理端口 label lan1; // 系统内显示的接口名如 sw0p1 phy-handle phy1; // 指向下面MDIO总线定义的PHY // interrupt-parent switch_intc; // 如果需要端口中断则关联 // interrupts 1; }; port2 { reg 2; label lan2; phy-handle phy2; }; port3 { reg 3; label lan3; phy-handle phy3; }; port4 { reg 4; label lan4; phy-handle phy4; }; // 定义CPU口连接RK3588的GMAC port6 { // 注意RTL8367S的扩展口1通常映射为端口6 reg 6; label cpu; ethernet gmac0; // 指向RK3588的以太网控制器节点 phy-mode rgmii; // 连接模式必须与硬件一致 fixed-link { // 因为直连MAC所以是固定链接无需协商 speed 1000; // 强制千兆也可设为100测试 full-duplex; pause; // 启用流控推荐 }; }; }; // 定义交换机内部的MDIO总线用于管理其内部的PHY mdio { compatible realtek,smi-mdio; #address-cells 1; #size-cells 0; phy1: phy1 { reg 1; // 可以关联中断 interrupt-parent switch_intc; interrupts 1; }; phy2: phy2 { reg 2; interrupt-parent switch_intc; interrupts 2; }; phy3: phy3 { reg 3; interrupt-parent switch_intc; interrupts 3; }; phy4: phy4 { reg 4; interrupt-parent switch_intc; interrupts 4; }; }; }; };10第10段// DSA相关表明这是交换机成员 dsa,member 0 0;DSA多交换机级联标识格式如下dsa,member switch-id device-id单交换机场景固定为0 0告诉内核DSA子系统这是第0组、第0台交换机。DSA的全称是Distributed Switch Architecture中文译为分布式交换机架构。DSA的目标是让连接到交换机芯片上的每一个物理端口在Linux系统中都能像一个独立的、标准的网络接口比如LAN0、LAN1、WAN那样被识别、配置和管理同时又能充分利用交换机芯片的硬件转发能力让数据包在端口间“直通”无需CPU干预。11第11段// 中断控制器可选但推荐 switch_intc: interrupt-controller { …… };在设备树语法中节点的命名格式通常如下node-nameunit-addressnode-name节点名字ASCII字符串比如uart1、i2c0。unit-address设备的寄存器首地址可省略。在实际文件中经常看到带标签的写法比如cpu0: cpu0 intc: interrupt-controller00a01000格式是label: node-nameunit-address。冒号前面的cpu0和intc是节点标签方便后面通过label引用不用每次敲那长长的一串名字。这里的switch_intc就是标签代表冒号后边的interrupt-controller省略首地址。// 中断控制器可选但推荐 switch_intc: interrupt-controller { interrupt-parent gpio3; interrupts 16 IRQ_TYPE_LEVEL_LOW; // 连接的中断GPIO interrupt-controller; #interrupt-cells 1; };12第12段interrupt-parent gpio3;interrupt-parent是Linux设备树中用来指定设备的中断信号连接到哪个中断控制器的属性‌简单说就是告诉系统这个设备的中断要交给谁来处理。‌‌‌这里指定设备的中断信号Switch的INT引脚连接到RK3588的GPIO3。13第13段interrupts 16 IRQ_TYPE_LEVEL_LOW; // 连接的中断GPIO在Linux设备树DTS语法中interrupts属性用于描述硬件外设的中断请求信号其具体格式和含义由所连接的‌中断控制器‌决定。这里指定连接的中断GPIO为PC16低电平触发。14第14段interrupt-controller;在 Linux 设备树DTS中interrupt-controller是一个‌空属性‌用于声明某个节点为‌中断控制器‌使其能够接收、管理和路由来自其它外设的中断信号 。‌‌15第15段#interrupt-cells 1;Linux设备树DTS中‌#interrupt-cells是中断控制器节点‌的必选属性用于声明引用该控制器时子节点在interrupts属性中描述一个中断源需要占用多少个32位单元cell‌。‌‌更多内容请看下回。