MII, RMII, GMII, RGMII: interfacce parallele verso il PHY
Le interfacce parallele media-independent collegano un MAC a un chip PHY in rame lungo una manciata di centimetri di PCB — dentro router, piccoli switch, access point, controllori industriali e ogni scheda embedded con un RJ45. Non raggiungono mai una gabbia per ricetrasmettitori, ma sono il punto di riferimento per tutto ciò che lo fa: SGMII è «GMII serializzata», XGMII è «GMII a 10G», e il PHY dentro un SFP in rame ne parla una internamente. Questa pagina fornisce pin, clock e temporizzazioni per MII, RMII, GMII e RGMII, il problema del ritardo RGMII, lo stato in-band, la gestione MDIO e i guasti che produce ciascuna interfaccia.
MII (IEEE 802.3 Clause 22)
| Voce | Valore |
|---|---|
| Rate | 10 e 100 Mb/s |
| Dati | TXD[3:0] a 4 bit, RXD[3:0] a 4 bit |
| Clock | TX_CLK e RX_CLK dal PHY: 25 MHz (100M), 2,5 MHz (10M) |
| Controllo | TX_EN, TX_ER, RX_DV, RX_ER, CRS (carrier sense), COL (collision) |
| Gestione | MDC, MDIO (condivisi) |
| Numero di segnali | 16 dati/controllo + 2 gestione |
| Livelli | 5 V / 3,3 V TTL |
| Portata | pochi cm; un PHY per MAC |
Ancora presente su microcontrollori e FPGA; soppiantata da RMII per il numero di pin.
RMII (specifica RMII Consortium v1.2)
| Voce | Valore |
|---|---|
| Rate | 10 e 100 Mb/s |
| Dati | TXD[1:0] a 2 bit, RXD[1:0] |
| Clock | un solo REF_CLK 50 MHz, condiviso da MAC e PHY; generato da un oscillatore, dal MAC o dal PHY (modalità PHY-clock-out) |
| Controllo | TX_EN, CRS_DV (carrier sense + data valid multiplexati), RX_ER (opzionale) |
| Numero di segnali | 7–9 |
| Modalità 10 Mb/s | ogni nibble ripetuto 10× a 50 MHz |
| Portata | cm |
La topologia del clock di riferimento a 50 MHz è il classico bug di RMII: un PHY che si aspetta un clock esterno mentre il SoC si aspetta che sia il PHY a pilotarlo produce un’interfaccia morta con un LED di link acceso e funzionante.
GMII (Clause 35)
| Voce | Valore |
|---|---|
| Rate | 1000 Mb/s; ripiega sulla segnalazione MII per 10/100 |
| Dati | TXD[7:0] a 8 bit, RXD[7:0] |
| Clock | GTX_CLK 125 MHz dal MAC per la trasmissione; RX_CLK 125 MHz dal PHY per la ricezione; TX_CLK dal PHY usato solo nel fallback 10/100 |
| Controllo | TX_EN, TX_ER, RX_DV, RX_ER, CRS, COL |
| Numero di segnali | 24 + gestione |
| Livelli | 2,5 V (tollerante a 3,3 V su molti) |
| Portata | cm; budget di temporizzazione stretto a 125 MHz single-data-rate |
Oggi è perlopiù un’interfaccia on-chip o da FPGA; RGMII ne ha preso il posto sulle schede.
RGMII (Reduced GMII, specifica HP/Marvell v1.3 e v2.0)
| Voce | Valore |
|---|---|
| Rate | 10/100/1000 |
| Dati | TXD[3:0] e RXD[3:0] a 4 bit a double data rate: nibble basso sul fronte di salita, nibble alto sul fronte di discesa |
| Clock | TXC 125 MHz (dal MAC), RXC 125 MHz (dal PHY); 25 / 2,5 MHz per 100M / 10M |
| Controllo | TX_CTL (TX_EN sul fronte di salita, TX_EN xor TX_ER su quello di discesa), RX_CTL (RX_DV / RX_DV xor RX_ER) |
| Numero di segnali | 12 |
| Livelli | 2,5 V (v1.3), 1,5 V HSTL oppure 1,8 V (opzione v2.0); 3,3 V su alcuni PHY |
| Portata | tracce a lunghezza abbinata ≤ 10–15 cm |
Il problema del ritardo
RGMII richiede che il clock arrivi 1,5–2,0 ns dopo i fronti dei dati al ricevitore (finestra di setup/hold). Tre modi per ottenerlo:
| Modalità | Chi aggiunge il ritardo | phy-mode del device tree | Note |
|---|---|---|---|
| Ritardo su PCB (v1.3) | ~5 cm di traccia di clock aggiuntiva | rgmii | classico, fragile |
| Ritardo interno nel PHY (RGMII-ID, v2.0) | il PHY aggiunge 2 ns sui clock TX e RX | rgmii-id | il più comune oggi |
| Ritardo interno nel MAC/SoC | lo aggiunge il SoC | rgmii con registro di ritardo lato MAC | — |
| Misto | PHY su una sola direzione | rgmii-txid, rgmii-rxid | quando solo un lato lo supporta |
Aggiungere il ritardo due volte (PCB e PHY) oppure non aggiungerlo affatto produce il guasto caratteristico di RGMII: link up a 1G con errori CRC o nessun traffico, mentre a 100M funziona (100M ha un periodo di 40 ns e tollera lo sfasamento). Si corregge cambiando il registro di ritardo del PHY o il phy-mode.
Stato in-band
Quando è inattivo, il PHY pilota link, velocità e duplex su RXD[3:0] in modo che il MAC possa riconfigurare il proprio divisore di clock senza una lettura MDIO: RXD[0] link, RXD[2:1] velocità (00 = 10, 01 = 100, 10 = 1000), RXD[3] duplex. Alcuni MAC lo ignorano e si affidano al polling MDIO; aspettative disallineate danno un link che è up sul PHY e down sul MAC.
TBI e RTBI
Ten-Bit Interface: i simboli 1000BASE-X codificati 8b/10b (10 bit a 125 MHz, RTBI a DDR con 5 bit) tra un MAC/PCS e un SerDes esterno o un PHY ottico. Obsoleta sulle schede; il suo discendente seriale è 1000BASE-X/SGMII (SGMII e gigabit seriale).
Confronto
| Interfaccia | Pin (dati + ctrl) | Clock | Rate massimo | Tensione | Uso tipico |
|---|---|---|---|---|---|
| MII | 16 | 25 MHz dal PHY | 100M | 3,3/5 V | MCU, legacy |
| RMII | 7–9 | 50 MHz condiviso | 100M | 3,3 V | SoC embedded + PHY |
| SMII | 2–3/porta | 125 MHz | 100M | 3,3 V | PHY multi-porta (Cisco) |
| GMII | 24 | 125 MHz (MAC tx / PHY rx) | 1G | 2,5 V | FPGA, on-chip |
| RGMII | 12 | 125 MHz DDR | 1G | 2,5/1,8/1,5 V | SoC ↔ PHY su schede |
| SGMII | 4 (2 coppie) | 1,25 GBd embedded | 1G (10/100 per replicazione) | CML | SoC ↔ PHY, gabbie SFP |
Gestione del PHY: MDIO/MDC
| Voce | Clause 22 | Clause 45 |
|---|---|---|
| Indirizzamento | indirizzo PHY a 5 bit, registro a 5 bit (32 registri) | porta a 5 bit, device a 5 bit (PMA/PMD, PCS, PHY XS, DTE XS, AN, vendor), registro a 16 bit |
| Registri chiave | 0 control (reset, velocità, AN enable, loopback), 1 status (link, AN complete), 2–3 PHY ID (OUI + modello), 4 AN advertisement, 5 link-partner ability, 9/10 control/status 1000BASE-T, 17+ vendor (ritardo RGMII, LED) | 1.x PMA, 3.x PCS, 7.x AN, 30.x/31.x vendor |
| Velocità | MDC ≤ 2,5 MHz (spesso più veloce in pratica) | uguale |
| Strumenti Linux | mii-tool -v eth0, phytool read eth0/1/0, ethtool eth0; driver via phylib, phylink | phytool read eth0/1:1/0 |
Da contrapporre ai moduli pluggable, che sono gestiti via I²C, non via MDIO (Interfaccia a due fili). Il PHY interno di un SFP in rame è l’eccezione: i suoi registri MDIO sono raggiungibili attraverso l’I²C del modulo a un indirizzo secondario in molti design, ed è così che i produttori impostano il comportamento di fallback 10/100 e di auto-negoziazione.
PHY comuni e le loro interfacce
| Famiglia di PHY | Interfacce | Scheda tipica |
|---|---|---|
| Marvell 88E1111 / 88E1512 / 88E1510 | GMII, RGMII, SGMII, TBI | router, moduli SFP in rame (88E1111) |
| Realtek RTL8211F / RTL8201 | RGMII / RMII | SBC, router consumer |
| Microchip KSZ9031 / KSZ8081 / LAN8720 | RGMII / RMII / RMII | industriale, schede MCU |
| TI DP83867 / DP83848 | RGMII, SGMII / MII, RMII | industriale |
| Broadcom BCM54xxx | RGMII, SGMII, QSGMII | switch enterprise (PHY quad/octal) |
| Marvell 88E1543 / 88E1548 | QSGMII quad | switch di accesso a 48 porte |
Guasti per interfaccia
| Sintomo | Interfaccia | Causa |
|---|---|---|
| Mai link, il PHY ID si legge correttamente | RMII | disallineamento di direzione/sorgente del REF_CLK |
| 100M funziona, 1G nessun traffico / CRC | RGMII | modalità di ritardo (ID) sbagliata o raddoppiata |
| Link up sul LED del PHY, il MAC dice down | RGMII/SGMII | stato in-band disabilitato su un lato, oppure polling MDIO assente |
| Metà dei pacchetti persi a 1G | GMII/RGMII | sfasamento da lunghezza delle tracce, livello di tensione sbagliato |
| PHY non trovato su MDIO | qualsiasi | indirizzo PHY sbagliato (pin di strapping), pull-up MDIO assente |
| Velocità bloccata a 10/100 | qualsiasi | registro AN advertisement limitato, cavo, oppure phy-mode senza supporto 1G |
In CodingBox
Niente in questa pagina passa attraverso l’EEPROM del modulo — a eccezione dello SFP in rame, il cui PHY interno (tipicamente un componente di classe 88E1111) sta dietro lo stesso I²C che CodingBox legge. Quando un modulo in rame funziona a 1G ma non a 10/100, la risposta sta nella configurazione di quel PHY e nella modalità SGMII/1000BASE-X dell’host, non nei byte di identità di A0h (Ethernet in rame e DAC, SGMII e gigabit seriale).