Linux网络驱动之Fixed-Link(35)
接前一篇文章:Linux网络驱动之Fixed-Link(34)
本文内容参考:
RK3588+TRL8367s 四网口千兆交换机配置与性能优化实战-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/ phy@0; // 定义我们的交换机节点 switch: switch@0 { 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口 port@1 { reg = <1>; // 端口号,对应芯片物理端口 label = "lan1"; // 系统内显示的接口名,如 sw0p1 phy-handle = <&phy1>; // 指向下面MDIO总线定义的PHY // interrupt-parent = <&switch_intc>; // 如果需要端口中断则关联 // interrupts = <1>; }; port@2 { reg = <2>; label = "lan2"; phy-handle = <&phy2>; }; port@3 { reg = <3>; label = "lan3"; phy-handle = <&phy3>; }; port@4 { reg = <4>; label = "lan4"; phy-handle = <&phy4>; }; // 定义CPU口,连接RK3588的GMAC port@6 { // 注意: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: phy@1 { reg = <1>; // 可以关联中断 interrupt-parent = <&switch_intc>; interrupts = <1>; }; phy2: phy@2 { reg = <2>; interrupt-parent = <&switch_intc>; interrupts = <2>; }; phy3: phy@3 { reg = <3>; interrupt-parent = <&switch_intc>; interrupts = <3>; }; phy4: phy@4 { 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-name@unit-addressnode-name:节点名字,ASCII字符串,比如uart1、i2c0。unit-address:设备的寄存器首地址,可省略。
在实际文件中,经常看到带标签的写法,比如:
cpu0: cpu@0 intc: interrupt-controller@00a01000格式是:label: node-name@unit-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)。
更多内容请看下回。
