null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
임베디드 개발자를 위한 네트워크 기초 — IP 주소부터 PHY 레지스터까지
Structure
ip-addressing
•
공인 IP, 사설 IP, 그리고 NAT가 존재하는 이유
•
고정 IP vs 유동 IP — DHCP의 동작 원리
•
네트워크 클래스 — IP 주소를 나누는 논리
•
서브넷 마스크와 게이트웨이 — 네트워크를 쪼개는 방법
•
CIDR 표기법 — /24가 의미하는 것
•
DNS — 이름을 IP로, IP를 이름으로
mac-transmission
•
MAC 주소와 OUI — 하드웨어 식별의 기초
•
유니캐스트, 멀티캐스트, 브로드캐스트 — 전송 방식의 선택
•
멀티캐스트 MAC 주소 — IP에서 MAC으로의 변환 원리
•
VLAN — 하나의 스위치에서 여러 네트워크 분리하기
port-and-layer
•
포트(Port) — 하나의 IP에서 수천 개의 통신 채널을 분리하는 법
•
PDU — 프레임, 패킷, 세그먼트의 차이
•
OSI 7계층 vs TCP/IP 모델 — 두 모델이 공존하는 이유
physical-layer
•
NIC와 PHY — 임베디드 이더넷 하드웨어 구조
•
MDC/MDIO — PHY 레지스터를 제어하는 2-Wire 인터페이스
•
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
•
Extended Register — Clause 22의 32개 제한을 넘는 법
•
"Docker 기초 — 컨테이너의 모든 것"
•
Store-and-Forward vs Cut-through
wireshark-debug
•
Wireshark에서 IP Checksum이 0인 이유
•
"Docker Compose — 멀티 컨테이너 오케스트레이션"
•
FCS/CRC와 Wireshark의 4바이트 미스터리
•
"TypeScript 기초 — JavaScript에 타입을 더하다"
•
임베디드 이더넷 디버깅 — Wireshark 실전 사용법
Flow Structure
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
17 / 24
"Docker 기초 — 컨테이너의 모든 것"
☆ Star
↗ Full
Extended Register — Clause 22의 32개 제한을 넘는 법
#network
#phy
#mdio
#extended-register
#clause22
@devpc
|
2026-05-04 01:59:40
|
GET /api/v1/flows/23/nodes/417?fv=2&nv=1
Context:
Flow v2
→
Node v1
0
Views
1
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"에서 페이지 선택 방식을 확인해야 한다. 페이지를 잘못 설정한 채 레지스터를 쓰면 전혀 다른 기능이 변경되어 디버깅이 어려워진다. 쓰기 작업 후 항상 페이지를 원복하는 습관을 들일 것.
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
"Docker 기초 — 컨테이너의 모든 것"
// COMMENTS
Newest First
ON THIS PAGE
No content selected.