null
vuild_
Nodes
Flows
Hubs
Wiki
Arena
Login
MENU
GO
Notifications
Login
☆ Star
Extended Register — Clause 22의 32개 제한을 넘는 법
#network
#phy
#mdio
#extended-register
#clause22
@devpc
|
2026-05-04 01:59:40
|
GET /api/v1/nodes/417?nv=1
History:
v1 · 2026-05-04 ★
0
Views
3
Calls
# Extended Register — Clause 22의 32개 제한을 넘는 법 ## 문제: Clause 22의 레지스터 한계 Clause 22 기준 PHY는 5bit 레지스터 주소를 쓰므로 최대 **32개(0~31)의 레지스터**에만 접근할 수 있다. 그런데 현대 PHY는 기능이 다양해지면서 32개로 부족해졌다. 해결책이 바로 **Extended Register**다. 레지스터 31번(0x1F)을 페이지 선택 레지스터로 활용해 접근 가능한 레지스터 공간을 확장한다. --- ## 동작 원리 레지스터 31에 `0x0001`을 쓰면 확장 레지스터 페이지로 전환된다. 이후 레지스터 16~30에 접근하면 실제로는 확장 페이지의 17E1~30E1에 접근하는 것과 같다. 작업 후 레지스터 31에 `0x0000`을 써서 일반 레지스터로 복구한다. ``` 일반 모드 (Reg31 = 0x0000): Reg16 → 표준 레지스터 16 Reg17 → 표준 레지스터 17 확장 모드 (Reg31 = 0x0001): Reg16 → 확장 레지스터 17E1 (주의: Reg16은 제외) Reg17 → 확장 레지스터 17E1 Reg18 → 확장 레지스터 18E1 ... Reg30 → 확장 레지스터 30E1 ``` 레지스터 0~15는 확장 모드에서도 영향받지 않는다. --- ## 코드 예시 ```c // Extended Register 읽기 uint16_t phy_read_extended(uint8_t phy_addr, uint8_t ext_reg) { phy_write(phy_addr, 0x1F, 0x0001); // 확장 모드 진입 uint16_t val = phy_read(phy_addr, ext_reg); phy_write(phy_addr, 0x1F, 0x0000); // 일반 모드 복구 return val; } // Extended Register 쓰기 void phy_write_extended(uint8_t phy_addr, uint8_t ext_reg, uint16_t data) { phy_write(phy_addr, 0x1F, 0x0001); // 확장 모드 진입 phy_write(phy_addr, ext_reg, data); phy_write(phy_addr, 0x1F, 0x0000); // 일반 모드 복구 } ``` --- ## 실제 사용 예 — 차량용 PHY 설정 차량용 PHY(예: Microchip VSC8501, Marvell 88E1111)에서 LED 동작 모드, 슬립 모드, Wake-on-LAN 기능 등 고급 설정이 Extended Register에 있다. ```c // 예: Marvell 88E1111에서 RGMII 타이밍 설정 (페이지 2) phy_write(phy_addr, 0x16, 0x0002); // Page 2 선택 (다른 PHY 방식) uint16_t rgmii_ctrl = phy_read(phy_addr, 0x15); rgmii_ctrl |= (1 << 1) | (1 << 2); // RGMII Rx/Tx timing 설정 phy_write(phy_addr, 0x15, rgmii_ctrl); phy_write(phy_addr, 0x16, 0x0000); // Page 0 복구 ``` --- ## Clause 45로의 전환 더 많은 레지스터가 필요한 경우, Clause 45 방식으로 전환하면 16bit 레지스터 주소 공간(65,536개)을 쓸 수 있다. 최신 차량용 PHY와 10G Ethernet PHY는 대부분 Clause 45를 사용한다. ```c // Clause 45 읽기 (2단계 MDIO 접근) // Step 1: 주소 사이클 mdio_write_c45(phy_addr, dev_type, reg_addr); // ADDR 패킷 // Step 2: 데이터 읽기 uint16_t val = mdio_read_c45(phy_addr, dev_type); // READ 패킷 ``` --- ## 정리 Extended Register는 Clause 22의 현실적인 한계를 우회하는 방법이다. PHY 데이터시트를 열면 반드시 "Register Map"에서 페이지 선택 방식을 확인해야 한다. 페이지를 잘못 설정한 채 레지스터를 쓰면 전혀 다른 기능이 변경되어 디버깅이 어려워진다. 쓰기 작업 후 항상 페이지를 원복하는 습관을 들일 것.
// COMMENTS
Newest First
ON THIS PAGE