MPC8533E eTSEC控制器硬件设计与驱动开发实战解析
1. 项目概述从手册到实战解码MPC8533E eTSEC控制器如果你正在设计一款基于PowerPC架构的网络设备或者正在为MPC8533E这类经典处理器编写以太网驱动那么你肯定绕不开其内置的增强型三速以太网控制器eTSEC。手册里那动辄上百页的信号描述和寄存器列表是不是看得人头大信号线在不同模式下功能各异寄存器位域错综复杂稍有不慎就会导致链路不通、性能低下甚至数据错误。我当年第一次接触eTSEC时也曾在这些细节里迷路。后来在多个实际项目中反复调试、踩坑才逐渐摸清了它的“脾气”。今天我就结合MPC8533E的参考手册抛开那些照本宣科的翻译从一线工程师的视角为你深入解析eTSEC控制器的信号、寄存器与多模式接口。我们不止看它“是什么”更要弄懂“为什么”这么设计以及在实际硬件设计和驱动开发中“怎么用”。无论你是正在画原理图的硬件工程师还是埋头写驱动的软件工程师这篇文章都能帮你建立起清晰、实用的认知框架避开那些我当年踩过的坑。2. eTSEC核心架构与多模式接口设计解析2.1 eTSEC在PowerQUICC III中的定位与价值MPC8533E的eTSEC并非一个独立的芯片而是深度集成在PowerQUICC III处理器平台中的一个复杂IP核。它的设计目标是成为一个高度灵活、高性能的网络数据通路引擎。其“增强型”主要体现在对多种以太网物理接口MII, RMII, GMII, RGMII, TBI, RTBI的硬件级支持以及内建的DMA引擎、多队列支持和丰富的流量管理功能。这意味着单颗处理器就能处理复杂的网络分流、优先级队列和统计任务无需外置复杂的网络协处理器极大地简化了系统设计降低了成本和功耗。从系统架构上看eTSEC位于处理器核心与外部PHY芯片之间。它向上通过内部总线如CoreNet或本地总线与CPU和内存控制器连接处理数据包的搬移和描述符管理向下则通过一组可配置的引脚与外部PHY芯片通信。这种承上启下的位置决定了其信号和寄存器设计必须兼顾软件控制的灵活性和硬件时序的严格性。2.2 多模式接口背后的设计哲学为何需要如此复杂手册中列出了MII、RMII、GMII、RGMII、TBI、RTBI等多种模式新手可能会疑惑一个以太网控制器为什么要搞这么多接口这其实反映了嵌入式系统对成本、功耗、板级空间和性能的多元平衡。MII (Media Independent Interface)经典接口数据线宽4位半字节需要独立的发送和接收时钟TX_CLK, RX_CLK。引脚较多但时序简单是10/100Mbps时代的基石。RMII (Reduced MII)精简版MII数据线宽缩减为2位并且收发共用同一个50MHz参考时钟REF_CLK。引脚数几乎减半非常适用于对成本敏感、空间受限的100Mbps应用。GMII (Gigabit MII)千兆MII数据线宽扩展为8位一个字节需要125MHz的发送时钟GTX_CLK。它是通向千兆网络的桥梁。RGMII (Reduced Gigabit MII)精简版GMII在GMII的基础上通过DDR双倍数据速率技术在时钟的上升沿和下降沿都传输数据从而将数据线从8位减到4位TXD[3:0]/RXD[3:0]同时将TX_EN和TX_ER或RX_DV和RX_ER合并到一根控制线TX_CTL/RX_CTL上。这极大地节省了PCB走线和连接器引脚是千兆以太网最常用的接口。TBI/RTBI (Ten-Bit Interface / Reduced TBI)用于直接连接SerDes串行器/解串器绕过PHY芯片常用于背板通信或与光纤模块直连。它传输的是经过8B/10B编码的10位码组而非原始数据。eTSEC通过复用同一组物理引脚通过上电时的硬件配置通常由特定引脚的上拉/下拉电阻决定或软件寄存器配置来切换这些模式。这种设计赋予了硬件工程师极大的灵活性可以根据产品需求速度、成本、布局选择最合适的PHY和连接方式。实操心得模式选择与硬件设计在原理图设计阶段就必须根据产品需求确定使用哪种模式。例如选择千兆RGMII可以节省引脚但必须注意PCB布线要求TXD[3:0]、RXD[3:0]、TX_CTL、RX_CTL需要与GTX_CLK/RX_CLK进行严格的时序匹配通常要求等长误差在几十mil以内并且最好参考芯片手册的推荐布线层和阻抗控制。如果选择RMII则要确保提供的50MHz参考时钟质量高、抖动小。切忌在板子画好后才纠结模式问题那将导致灾难性的返工。3. 关键信号深度解读与硬件连接实战手册中的信号描述表是理解硬件连接的基础但只看表格容易迷失。我们挑出几个最核心、最容易出错的信号结合模式进行实战化解读。3.1 时钟信号族系统的节拍器时钟是数字电路的灵魂对于高速以太网接口更是如此。eTSEC的时钟信号根据模式扮演不同角色理解错一个整个链路就无法同步。TSECn_TX_CLK (输入)在MII模式这是由PHY提供的发送时钟2.5MHz或25MHzMAC在此时钟的上升沿采样TXD[3:0]、TX_EN、TX_ER。硬件连接必须从PHY的相应时钟输出引脚直接连接到MPC8533E的这个引脚。在RMII模式它变身为参考时钟REF_CLK50MHz由外部晶振或PHY提供同时用于发送和接收路径。这是RMII模式正常工作的绝对前提。在GMII模式10/100Mbps时功能同MII模式。但在1000Mbps时此引脚不被使用发送时序由TSECn_GTX_CLK主导。在RGMII/RTBI模式此信号未使用。发送时钟由TSECn_GTX_CLK担任。在TBI模式作为62.5MHz的PMA接收时钟1PMA_RX_CLK1输入来自SerDes。TSECn_GTX_CLK (输出)这是eTSEC在千兆模式GMII, TBI, RTBI或RGMII模式下主动输出给PHY的发送时钟。在GMII/TBI模式固定输出125MHz时钟。在RGMII模式这是一个神奇的时钟其频率会随速率变化1000Mbps时为125MHz100Mbps时为25MHz10Mbps时为2.5MHz。PHY利用这个时钟来采样MAC发送的数据。特别注意手册提到在RGMII和RTBI模式下此信号反馈的是反相的发送时钟。这意味着PCB布线时需要关注时钟的相位关系有些PHY可能需要在此路径上增加延迟线或通过寄存器配置内部延迟来补偿。EC_GTX_CLK125 (输入)这是eTSEC在千兆模式GMII, TBI, RTBI, RGMII下必需的125MHz源时钟输入。它必须由外部晶振、振荡器或PHY提供。这是最容易忽略的连接之一如果没有这个时钟eTSEC根本无法产生千兆模式所需的内部时序。在硬件设计时务必确保这个时钟源的信号完整性。避坑指南时钟设计与排查时钟源质量EC_GTX_CLK125和RMII的50MHz参考时钟必须使用低抖动的晶振或时钟发生器。过大的抖动会导致比特错误率BER上升。RGMII时钟延迟RGMII规范要求TX_CTL和TXD[3:0]相对于GTX_CLK的输出延迟以及RX_CTL和RXD[3:0]相对于RX_CLK的输入延迟。许多MPU和PHY都提供了内部延迟配置寄存器例如在eTSEC的MACCFG2寄存器中PHY的配置寄存器中以补偿PCB走线延迟。调试时如果数据不稳定应首先检查并调整这些延迟参数。未用时钟引脚处理对于未使用的时钟输入引脚如在某些模式下不的TSECn_TX_CLK建议按照手册要求上拉或下拉至确定的电平避免浮空引入噪声。3.2 数据与控制信号信息传输的载体数据和控制信号是payload它们的行为与时钟紧密耦合。TSECn_TXD[7:0] / RXD[7:0]这是数据的核心通道。在MII模式下只有[3:0]有效每个时钟周期传输4比特半字节在GMII模式下[7:0]全部有效每个时钟周期传输8比特一个字节在RGMII模式下仅[3:0]有效但利用DDR技术在时钟上升沿传低4位[3:0]下降沿传高4位[7:4]从而实现每个时钟周期传输一个字节。硬件连接必须严格对应PHY的引脚。对于RGMII务必确保PCB上这组数据线与时钟线的长度匹配。TSECn_TX_EN / RX_DV (及TX_CTL/RX_CTL)在MII/GMII中TX_EN和RX_DV是简单的数据有效标志。在RGMII中它们被合并为TX_CTL和RX_CTL。以TX_CTL为例在GTX_CLK上升沿传输的是TX_EN信号下降沿传输的是TX_ER信号。这是RGMII调试中最容易混淆的点之一。在逻辑分析仪上抓取波形时你需要分别观察时钟上升沿和下降沿的TX_CTL值才能还原出原始的TX_EN和TX_ER。TSECn_TX_ER / RX_ER错误指示信号。在MII/GMII中用于指示发送/接收过程中的错误。在RGMII中如前所述它们被复用到了控制线上。在TBI模式中TX_ER和RX_ER被赋予了新的含义作为10位码组TCG/RCG的最高位之一参与8B/10B编码。管理接口EC_MDC 和 EC_MDIO这是独立的、低速的、两线制串行管理接口类似I2C用于CPU通过MAC访问PHY的内部寄存器配置PHY的工作模式速度、双工、自协商等、读取状态链路状态、错误信息。EC_MDC是管理时钟EC_MDIO是双向数据线。上拉电阻EC_MDIO线路上通常需要一个上拉电阻例如4.7kΩ至IO电源电压以确保空闲时为高电平。地址冲突每个PHY都有一个管理地址。eTSEC自身的TBI模块也像一个“内部PHY”通过TBIPA寄存器配置其地址。务必确保TBIPA的地址与外部PHY的地址不冲突否则管理命令会发错对象。3.3 其他关键信号COL, CRS, 与 FIFO 模式TSECn_COL (冲突检测) 与 TSECn_CRS (载波侦听)这两个是半双工模式下的经典信号用于CSMA/CD载波侦听多路访问/冲突检测机制。在全双工千兆以太网中它们通常无效。重要提示手册明确指出在RMII、GMII、TBI、RTBI、RGMII模式下TSECn_COL信号未被使用。在硬件设计时如果确定不使用半双工模式这些引脚可以悬空或用作其他功能需查阅芯片引脚复用表。但在MII模式且可能工作在半双工下时必须正确连接。FIFO模式下的信号复用eTSEC支持一种特殊的FIFO模式用于连接外部FIFO存储器实现数据缓冲或与自定义逻辑接口。在此模式下许多信号的功能会发生改变。例如TSECn_CRS可能被用作接收流控信号。当你设计使用FIFO模式的应用时必须仔细阅读手册中关于FIFO模式的具体描述不能简单套用标准以太网模式的连接方法。4. 寄存器地图详解与驱动开发核心理解了硬件连接我们进入软件世界。eTSEC的寄存器是软件驱动控制其行为的唯一途径。手册中的内存映射表看似庞大但我们可以按功能模块来理解。4.1 寄存器访问基础与内存映射eTSEC的寄存器空间被映射到处理器的内存地址上每个eTSEC实例独占4KB的空间。例如eTSEC1的基址偏移是0x2_4000eTSEC3的基址偏移是0x2_6000。所有寄存器访问必须是32位4字节对齐的。对保留位的写操作必须写入0读操作返回值不确定不能依赖其为0。寄存器大致分为以下几大功能区从基址偏移开始0x000 – 0x0FF: eTSEC通用控制/状态寄存器。包含中断、以太网控制、DMA控制等全局设置。0x100 – 0x2FF: 发送控制/状态寄存器。配置发送队列、缓冲区描述符指针、发送中断等。0x300 – 0x4FF: 接收控制/状态寄存器。配置接收队列、缓冲区、过滤规则等。0x500 – 0x5FF: MAC层寄存器。配置MAC地址、帧长、MII管理、流控等核心MAC功能。0x600 – 0x7FF: RMON MIB计数器寄存器。各种收发统计信息用于网络监控和调试。0x800 – 0x8FF: 哈希表寄存器。用于组播地址过滤。0xA00 – 0xAFF: FIFO控制/状态寄存器如果支持。0xB00 – 0xBFF: DMA系统寄存器。0xC00 – 0xC3F: 无损流控寄存器如果支持。4.2 关键寄存器组配置实战驱动开发中初始化eTSEC通常遵循一个标准流程以下是一些最关键的寄存器及其配置思路1. 以太网控制寄存器 (ECNTRL - 0x2_4020)这是eTSEC的“总开关”。在初始化序列的最开始需要在此寄存器中设置ETHER_EN位来使能整个eTSEC模块。在复位或关闭接口前也需要操作此寄存器。2. MAC配置寄存器 (MACCFG1, MACCFG2 - 0x2_4500, 0x2_4504)这是MAC层的核心配置。MACCFG1设置接收/发送使能 (RX_EN,TX_EN)、流控、环回模式、速度10/100/1000和双工模式。特别注意在使能发送或接收前必须确保物理层链路已经建立通过查询PHY状态寄存器否则可能导致异常。MACCFG2包含许多重要设置如PRE_LEN: 前导码长度。IF_MODE:极其重要此字段用于选择eTSEC的工作模式MII, RMII, RGMII等。这个配置必须与硬件板卡上的引脚配置上拉/下拉电阻完全一致否则控制器会以错误的时序与PHY通信导致链路失败。对于RGMII这里还有TBI_MODE、RGMII_EN、RGMII_RXID、RGMII_TXID等位用于控制RGMII的时钟-数据延迟模式ID代表内部延迟。必须根据PHY的特性和PCB布线情况正确配置。3. MII管理接口寄存器 (MIIMCFG, MIIMADD, MIIMCON, MIIMSTAT - 0x2_4520 ~ 0x2_4530)这是驱动与PHY芯片“对话”的桥梁。通过这个接口可以读取PHY的ID、配置自协商、设置速度/双工、读取链路状态等。操作流程通常是在MIIMADD中设置PHY地址和寄存器地址在MIIMCON中写入数据写操作或触发读操作然后轮询MIIMIND寄存器直到操作完成最后从MIIMSTAT读取数据读操作。MIIMCFG可以配置管理时钟EC_MDC的分频比以适应不同PHY对时钟速度的要求。4. 发送/接收控制寄存器 (TCTRL, RCTRL - 0x2_4100, 0x2_4300)TCTRL/RCTRL分别控制发送和接收引擎的详细行为如是否使能CRC生成与检查、是否接收所有组播帧、是否进入混杂模式等。在初始化时通常先配置好这些参数再使能发送/接收。5. 缓冲区描述符指针与基址寄存器 (TBPTRx, TBASEx, RBPTRx, RBASEx)这是eTSEC DMA工作的核心。eTSEC使用“缓冲区描述符环”Buffer Descriptor Ring来管理数据缓冲区。TBASEx/RBASEx指向发送/接收描述符环在内存中的起始地址。这个地址必须是内存对齐的通常是256字节或更高。TBPTRx/RBPTRxeTSEC硬件当前正在操作的描述符指针生产者指针。驱动初始化时需要将它设置为与TBASEx/RBASEx相同的值。当硬件处理完一个描述符后会自动更新这个指针。驱动需要维护一个“软件指针”指向下一个可供驱动使用的描述符消费者指针。通过比较软件指针和硬件指针TBPTRx/RBPTRx来判断是否有数据包发送完成或需要接收新的数据包。6. 中断管理寄存器 (IEVENT, IMASK - 0x2_4010, 0x2_4014)IEVENT中断事件寄存器。当发生发送完成、接收就绪、总线错误、心跳包定时器超时等事件时相应的位会被硬件置1。IMASK中断掩码寄存器。只有IEVENT中对应位为1且IMASK中对应位也为1时才会向CPU产生中断请求。典型的中断服务程序ISR流程进入ISR后读取IEVENT寄存器判断中断源。处理完事件后必须通过向IEVENT中对应位写1来清除中断标志位w1c - write 1 to clear。如果不清除会导致中断持续触发。驱动开发避坑指南初始化顺序至关重要错误的初始化顺序是导致eTSEC无法工作的常见原因。一个稳健的顺序是a) 配置引脚复用通过芯片的I/O控制器确保相关信号连接到eTSEC模块。b) 软件复位eTSEC如果支持。c) 配置ECNTRL、MACCFG1/2等全局和MAC寄存器。d) 通过MIIM接口配置PHY等待链路建立。e) 配置发送/接收控制寄存器(TCTRL/RCTRL)。f) 在内存中创建缓冲区描述符环并正确初始化TBASEx/RBASEx和TBPTRx/RBPTRx。g) 最后使能MACCFG1中的RX_EN和TX_EN位。描述符环对齐与缓存一致性缓冲区描述符和数据缓冲区必须在内存中正确对齐通常要求32字节或64字节对齐。更重要的是在启用数据缓存D-Cache的系统中必须处理好缓存一致性问题。因为eTSEC的DMA引擎会直接访问内存绕过CPU缓存如果描述符或数据被CPU修改后还留在缓存里没有写回内存eTSEC读到的是旧数据反之如果eTSEC写入了数据而CPU缓存中的是旧数据CPU读到的也是错的。解决方法通常是使用非缓存Non-cacheable的内存区域或者在使用前后手动执行缓存无效化invalidate和写回flush操作。中断标志清除务必记住IEVENT是w1c寄存器。清除中断标志的代码必须是IEVENT event_mask;写1清0而不是IEVENT ~event_mask;写0清0这是错误的。后者在某些架构上可能无法清除中断导致系统被同一个中断持续轰炸而死机。5. 多模式配置示例与调试技巧实录理论说再多不如看实际配置。下面以最常见的RGMII模式为例展示关键的初始化代码片段以伪代码/C语言风格表示// 假设 eTSEC1 的寄存器基址为 TSEC1_BASE #define TSEC1_ECNTRL (TSEC1_BASE 0x20) #define TSEC1_MACCFG1 (TSEC1_BASE 0x500) #define TSEC1_MACCFG2 (TSEC1_BASE 0x504) #define TSEC1_TBASE0 (TSEC1_BASE 0x204) #define TSEC1_RBASE0 (TSEC1_BASE 0x404) // ... 其他寄存器定义 void etsec1_rgmii_init(void) { // 1. 可选软件复位 eTSEC (如果ECNTRL有复位位) // *(volatile uint32_t*)TSEC1_ECNTRL | ECNTRL_RESET; // while (*(volatile uint32_t*)TSEC1_ECNTRL ECNTRL_RESET); // 等待复位完成 // 2. 全局使能 eTSEC 模块 *(volatile uint32_t*)TSEC1_ECNTRL ECNTRL_ETHER_EN; // 3. 配置 MACCFG2选择 RGMII 模式并启用内部发送延迟假设PHY需要 uint32_t maccfg2_val 0; maccfg2_val | MACCFG2_IF_MODE_RGMII; // 设置为 RGMII 模式 maccfg2_val | MACCFG2_RGMII_TXID; // 启用 TX 内部延迟 (时钟滞后于数据) // maccfg2_val | MACCFG2_RGMII_RXID; // 如果需要启用 RX 内部延迟 *(volatile uint32_t*)TSEC1_MACCFG2 maccfg2_val; // 4. 通过 MIIM 接口配置 PHY略需实现 miim_read/miim_write 函数 // 例如设置自动协商等待链路建立 phy_configure_and_wait_link(); // 5. 配置 MACCFG1根据PHY协商结果设置速度/双工并使能接收发送 uint32_t maccfg1_val 0; maccfg1_val | MACCFG1_RX_EN | MACCFG1_TX_EN; // 使能收发 if (phy_speed_1000m()) { maccfg1_val | MACCFG1_GMII_EN; } else if (phy_speed_100m()) { maccfg1_val | MACCFG1_SOFT_RATE_100; } else { maccfg1_val | MACCFG1_SOFT_RATE_10; } if (phy_full_duplex()) { maccfg1_val | MACCFG1_FULL_DUPLEX; } *(volatile uint32_t*)TSEC1_MACCFG1 maccfg1_val; // 6. 配置发送/接收控制寄存器根据需求设置过滤、CRC等 *(volatile uint32_t*)(TSEC1_BASE 0x100) TCTRL_DEFAULT; // TCTRL *(volatile uint32_t*)(TSEC1_BASE 0x300) RCTRL_PROM | RCTRL_GRS; // RCTRL: 接收所有广播/组播并接收短帧 // 7. 设置缓冲区描述符环 setup_tx_bd_ring(); // 初始化发送描述符环内存 setup_rx_bd_ring(); // 初始化接收描述符环内存 *(volatile uint32_t*)TSEC1_TBASE0 (uint32_t)tx_bd_ring_phys_addr; // 写入物理地址 *(volatile uint32_t*)TSEC1_RBASE0 (uint32_t)rx_bd_ring_phys_addr; // 初始化硬件指针为环的起始位置 *(volatile uint32_t*)(TSEC1_BASE 0x184) (uint32_t)tx_bd_ring_phys_addr; // TBPTR0 *(volatile uint32_t*)(TSEC1_BASE 0x384) (uint32_t)rx_bd_ring_phys_addr; // RBPTR0 // 8. 配置中断如果需要 *(volatile uint32_t*)(TSEC1_BASE 0x14) IMASK_TXE | IMASK_RXF; // 使能发送错误和接收帧中断 }5.1 常见问题排查技巧即使按照手册和示例配置链路仍可能不通。以下是一些实用的排查思路问题1链路无法建立Link Down检查PHY首先确认PHY芯片本身是否正常工作。测量其供电、复位信号。通过MIIM接口读取PHY的基本状态寄存器如BMCR, BMSR看是否能正确读写以及链路状态位是否有效。检查时钟用示波器测量EC_GTX_CLK125对于千兆/RGMII或RMII的50MHz参考时钟是否存在频率是否准确波形是否干净。这是基础中的基础。检查模式匹配确认MPC8533E的MACCFG2.IF_MODE寄存器配置与硬件板卡上对应引脚的上拉/下拉配置决定启动模式是否一致。这是最常出错的点之一。检查RGMII延迟如果使用RGMII用示波器同时测量GTX_CLK和TXD[0]或TX_CTL的波形。观察数据边沿是否在时钟边沿的中央。如果偏差太大需要调整MAC或PHY内部的延迟配置寄存器。问题2链路已建立但无法收发数据检查描述符环这是驱动层最常见的问题。确认描述符环的物理地址是否正确写入TBASEx/RBASEx寄存器。确认描述符的格式数据结构是否符合手册定义特别是“数据长度”和“就绪R”位是否已正确设置。检查缓存一致性如果启用了Cache强烈建议将描述符环和数据缓冲区放在非缓存内存区域或者严格进行缓存维护操作。一个简单的测试方法是暂时禁用该内存区域的缓存看问题是否消失。检查中断如果使用中断模式检查IEVENT寄存器是否有相应事件标志置起以及IMASK是否已使能。确保中断服务程序正确清除了标志位。抓取信号波形使用逻辑分析仪或带高速数字通道的示波器抓取RGMII/MII接口上的数据线和时钟线信号。对照802.3和RGMII规范检查前导码、SFD帧起始定界符、数据内容是否正确。这是定位物理层问题的终极手段。问题3性能低下或数据错误检查统计计数器eTSEC提供了丰富的RMON MIB计数器RFCS接收FCS错误、RALN对齐错误、RCDE编码错误等。定期读取这些计数器可以发现链路质量问题和错误类型。调整中断 coalescingTXIC和RXIC寄存器可以配置中断合并即积累多个数据包或等待一段时间后再产生一次中断这可以减少CPU中断负载提升大流量下的性能。但设置不当会增加延迟。检查流控如果对端设备发送了PAUSE帧eTSEC会暂停发送。检查RXPF计数器是否在增加并确认流控配置MACCFG1中的相关位是否符合网络需求。6. 总结与进阶思考MPC8533E的eTSEC是一个功能强大但相对复杂的网络控制器。成功驾驭它的关键在于建立清晰的层次化认知物理信号层决定硬件如何连接寄存器配置层决定控制器如何工作驱动软件层决定数据如何流动。对于硬件工程师重点在于根据选定的模式RGMII/RMII等严格按照时序和电气要求完成PCB布局布线并正确配置上下拉电阻来确定启动模式。对于驱动工程师重点在于理解描述符环机制、掌握正确的初始化序列、处理好缓存一致性并善用中断和状态寄存器进行调试。随着网络技术的发展虽然更现代的处理器的网络控制器集成度更高、配置更简单但eTSEC所体现的核心思想——通过寄存器精细控制硬件行为、通过描述符实现高效DMA、支持多种物理接口以适应不同场景——仍然是嵌入式网络开发的精髓。深入理解eTSEC不仅能帮你解决当前项目的问题更能为你理解整个嵌入式网络子系统打下坚实的基础。当你下次遇到一个新的网络控制器时你会发现自己能更快地抓住其手册的重点快速上手而这正是资深工程师价值的体现。