유영창
컴퓨터가 느렸던 시절에는 커다란 프로그램을 작성한 후 컴파일을 걸어놓으면 한 30분 정도는 책을 읽을 수 있었다. 개발자에게는 좋은 현상이지만 일을 지시하는 상사의 입장에서는 복장 터지는 일이다. 임베디드에 리눅스 시스템을 적용할 때도 시리얼 통신만 지원하는 개발 보드에 램디스크를 올리려면 마찬가지로 30분의 여유(?)를 가질 수 있다. 그래서 필자는 개발 상태의 보드에는 이더넷 칩을 꼭 넣으라고 당부하고 싶다. 이더넷 통신으로 다운로드하면 5초 이내로 끝낼 일을 30분씩 기다리게 되면 프로그래머도 지치고 개발 일정도 줄어들기 때문이다.
지금까지 연재하고 있는 부트로더인 이지부트는 EZ-X5라는 보드에 실장돼 있는 프로세서인 PXA255를 중심으로 구현되고 있다. 그래서 대부분의 내용이 PXA255 프로세서에 내장된 주변 장치를 제어하는 방법에 대해 설명하고 있다. 하지만 네트워크 통신을 하기 위해서는 PXA255가 지원하지 않는 네트워크 칩에 대해 살펴볼 필요가 있다. EZ-X5에는 시러스로직(Cyrus Logic)의 네트워크 제품인 CS8900A라는 칩을 장착하고 있다. 따라서 이지부트는 CS8900A를 이용해 네트워크를 이용한 이미지 다운로드 루틴을 구현하고 있다.
왜 EZ-X5에 CS8900A를 사용하는가 묻는다면 필자는 단순히 관련 자료를 구하기 쉬워서 선택했다고 대답할 수밖에 없다. 보통 이더넷을 지원하는 칩들은 주로 PCI 버스를 지원하거나 프로세스에 자체적으로 내장되는 경우가 많은데, PXA255는 네트워크 장치를 지원하지 않으므로 로컬 버스에 연결할 수 있는 이더넷 칩을 선정해야 했다. 가격적인 면이나 관련된 제어 소스 지원이 쉽다는 점을 고려해서 CS8900A를 사용했다.
이더넷 컨트롤러 CS8900A의 제어
CS8900A는 시러스로직에서 개발된 10Mbps를 지원하는 이더넷 컨트롤러로, IEEE 802.3 표준을 따르며 ISA 버스 연결을 지원한다. 내부적으로는 PacketPage라는 것을 이용해 I/O 또는 메모리 공간과 DMA 슬레이브로서 동작할 때 사용한다. Full-duplex1을 지원하며 칩 자체에 Tx와 Rx를 위한 버퍼를 가지고 있다. 네트워크 인터페이스로는 10BASE-T와 함께 10BASE2, 10BASE5, 10BASE-F를 지원하기 위한 AUI를 가지고 있으며, 송신시에는 collision2 상태일 때는 자동으로 재전송을 수행하고 Padding과 CRC 생성을 해준다. 수신시에는 CPU의 오버헤드를 줄이기 위해서 StreamTransfer를 제공하며, DMA와 칩에 있는 메모리간의 자동 스위치 또한 제공한다.
또한 프레임의 preprocessing을 위한 Early Interrupt와 잘못된 패킷에 대한 자동 거절(rejection) 기능도 있다. 점퍼(jumper)가 없는 상황의 설정을 위해 EEPROM도 가지고 있으며, 디스크가 없는 시스템의 부팅을 위한 Boot PROM도 가지고 있다. 이 두 가지 기능은 EZ-X5에서는 사용하지 않고 있다. Boundary scan, Loopback test, Link 상태와 LAN의 활동 상황을 알아보기 위한 LED 드라이버, Standby 및 Suspend Sleep Mode 기능도 가지고 있다.
ARM 계열의 버스와 CS8900A를 이용하는 경우에는 <그림 2>와 같은 회로 구성을 갖는 것이 일반적이다. <그림 2>의 회로도에서 보이는 연결 방식을 I/O 방식이라고도 한다.
이더넷 컨트롤러 제어 소스는 리눅스 커널에서 구하자
최종적으로 TCP/IP를 구현해야 정상적인 통신을 구현할 수 있지만 네트워크 제어를 위해서는 이더넷 컨트롤러인 CS8900A을 어떻게 제어해야 하는가에 대해서도 알아야 할 필요가 있다. 여기서 한 가지 네트워크 디바이스 드라이버를 제작하고자 하는 독자들에게 충고하고 싶은 것은 네트워크 컨트롤러를 선택할 때 리눅스 소스에서 지원하는 제품을 선택하라는 것이다. 대부분의 이더넷 컨트롤러는 제어가 무척 복잡한데, CS8900A만 하더라도 매뉴얼의 페이지수가 138페이지에 달한다. 더욱이 내용도 난해하고 설명도 제대로 되어 있다고 보기가 어렵다. 다른 매뉴얼 역시 설명하는 내용을 모두 이해하기에 충분하지 못한 것들이 대부분이다. 그래서 자신이 하나씩 처리 루틴을 만들어 가면 모든 내용을 구현하는데 수많은 시행착오를 겪어야 하고 완전하게 동작한다고 보장하기도 힘들다.
이런 난맥상을 해결하려면 이더넷 컨트롤러를 제어하는 소스가 있는 것이 가장 좋은데, 이더넷 컨트롤러의 디바이스 드라이버가 가장 많이 존재하는 곳은 단언하건데 리눅스 커널 소스이다. 리눅스 커널에서 지원하는 디바이스 드라이버에서 가장 많이 지원되고 있는 하드웨어가 바로 이더넷 컨트롤러이기 때문이다. 현존하는 거의 대부분 이더넷 컨트롤러의 소스가 있으므로 하드웨어에서 채택하고자 하는 이더넷 컨트롤러는 리눅스 커널 소스에서 지원하는 것을 사용하기를 강력하게 권장한다(물론 네트워크에 대한 지식이 풍부하고 디바이스 드라이버를 만드는 방법에 대해 경험이 많다면 직접 제작해도 무방하지만 필자의 경험상 직접 개발하는 것은 무모한 짓이다). CS8900을 제어하는 방식을 이해하고자 한다면 리눅스 커널 소스의 linux/drivers/net/cs89x0.c라는 파일을 참조하는 것이 좋다.
컴퓨터가 느렸던 시절에는 커다란 프로그램을 작성한 후 컴파일을 걸어놓으면 한 30분 정도는 책을 읽을 수 있었다. 개발자에게는 좋은 현상이지만 일을 지시하는 상사의 입장에서는 복장 터지는 일이다. 임베디드에 리눅스 시스템을 적용할 때도 시리얼 통신만 지원하는 개발 보드에 램디스크를 올리려면 마찬가지로 30분의 여유(?)를 가질 수 있다. 그래서 필자는 개발 상태의 보드에는 이더넷 칩을 꼭 넣으라고 당부하고 싶다. 이더넷 통신으로 다운로드하면 5초 이내로 끝낼 일을 30분씩 기다리게 되면 프로그래머도 지치고 개발 일정도 줄어들기 때문이다.
지금까지 연재하고 있는 부트로더인 이지부트는 EZ-X5라는 보드에 실장돼 있는 프로세서인 PXA255를 중심으로 구현되고 있다. 그래서 대부분의 내용이 PXA255 프로세서에 내장된 주변 장치를 제어하는 방법에 대해 설명하고 있다. 하지만 네트워크 통신을 하기 위해서는 PXA255가 지원하지 않는 네트워크 칩에 대해 살펴볼 필요가 있다. EZ-X5에는 시러스로직(Cyrus Logic)의 네트워크 제품인 CS8900A라는 칩을 장착하고 있다. 따라서 이지부트는 CS8900A를 이용해 네트워크를 이용한 이미지 다운로드 루틴을 구현하고 있다.
왜 EZ-X5에 CS8900A를 사용하는가 묻는다면 필자는 단순히 관련 자료를 구하기 쉬워서 선택했다고 대답할 수밖에 없다. 보통 이더넷을 지원하는 칩들은 주로 PCI 버스를 지원하거나 프로세스에 자체적으로 내장되는 경우가 많은데, PXA255는 네트워크 장치를 지원하지 않으므로 로컬 버스에 연결할 수 있는 이더넷 칩을 선정해야 했다. 가격적인 면이나 관련된 제어 소스 지원이 쉽다는 점을 고려해서 CS8900A를 사용했다.
이더넷 컨트롤러 CS8900A의 제어
CS8900A는 시러스로직에서 개발된 10Mbps를 지원하는 이더넷 컨트롤러로, IEEE 802.3 표준을 따르며 ISA 버스 연결을 지원한다. 내부적으로는 PacketPage라는 것을 이용해 I/O 또는 메모리 공간과 DMA 슬레이브로서 동작할 때 사용한다. Full-duplex1을 지원하며 칩 자체에 Tx와 Rx를 위한 버퍼를 가지고 있다. 네트워크 인터페이스로는 10BASE-T와 함께 10BASE2, 10BASE5, 10BASE-F를 지원하기 위한 AUI를 가지고 있으며, 송신시에는 collision2 상태일 때는 자동으로 재전송을 수행하고 Padding과 CRC 생성을 해준다. 수신시에는 CPU의 오버헤드를 줄이기 위해서 StreamTransfer를 제공하며, DMA와 칩에 있는 메모리간의 자동 스위치 또한 제공한다.
또한 프레임의 preprocessing을 위한 Early Interrupt와 잘못된 패킷에 대한 자동 거절(rejection) 기능도 있다. 점퍼(jumper)가 없는 상황의 설정을 위해 EEPROM도 가지고 있으며, 디스크가 없는 시스템의 부팅을 위한 Boot PROM도 가지고 있다. 이 두 가지 기능은 EZ-X5에서는 사용하지 않고 있다. Boundary scan, Loopback test, Link 상태와 LAN의 활동 상황을 알아보기 위한 LED 드라이버, Standby 및 Suspend Sleep Mode 기능도 가지고 있다.
ARM 계열의 버스와 CS8900A를 이용하는 경우에는 <그림 2>와 같은 회로 구성을 갖는 것이 일반적이다. <그림 2>의 회로도에서 보이는 연결 방식을 I/O 방식이라고도 한다.
이더넷 컨트롤러 제어 소스는 리눅스 커널에서 구하자
최종적으로 TCP/IP를 구현해야 정상적인 통신을 구현할 수 있지만 네트워크 제어를 위해서는 이더넷 컨트롤러인 CS8900A을 어떻게 제어해야 하는가에 대해서도 알아야 할 필요가 있다. 여기서 한 가지 네트워크 디바이스 드라이버를 제작하고자 하는 독자들에게 충고하고 싶은 것은 네트워크 컨트롤러를 선택할 때 리눅스 소스에서 지원하는 제품을 선택하라는 것이다. 대부분의 이더넷 컨트롤러는 제어가 무척 복잡한데, CS8900A만 하더라도 매뉴얼의 페이지수가 138페이지에 달한다. 더욱이 내용도 난해하고 설명도 제대로 되어 있다고 보기가 어렵다. 다른 매뉴얼 역시 설명하는 내용을 모두 이해하기에 충분하지 못한 것들이 대부분이다. 그래서 자신이 하나씩 처리 루틴을 만들어 가면 모든 내용을 구현하는데 수많은 시행착오를 겪어야 하고 완전하게 동작한다고 보장하기도 힘들다.
이런 난맥상을 해결하려면 이더넷 컨트롤러를 제어하는 소스가 있는 것이 가장 좋은데, 이더넷 컨트롤러의 디바이스 드라이버가 가장 많이 존재하는 곳은 단언하건데 리눅스 커널 소스이다. 리눅스 커널에서 지원하는 디바이스 드라이버에서 가장 많이 지원되고 있는 하드웨어가 바로 이더넷 컨트롤러이기 때문이다. 현존하는 거의 대부분 이더넷 컨트롤러의 소스가 있으므로 하드웨어에서 채택하고자 하는 이더넷 컨트롤러는 리눅스 커널 소스에서 지원하는 것을 사용하기를 강력하게 권장한다(물론 네트워크에 대한 지식이 풍부하고 디바이스 드라이버를 만드는 방법에 대해 경험이 많다면 직접 제작해도 무방하지만 필자의 경험상 직접 개발하는 것은 무모한 짓이다). CS8900을 제어하는 방식을 이해하고자 한다면 리눅스 커널 소스의 linux/drivers/net/cs89x0.c라는 파일을 참조하는 것이 좋다.
"Embedded" 카테고리의 다른 글
- 부트로터의 네트워크 구현(1) - 3 (0)2005/08/10
- 부트로더의 네트워크 구현(1) - 2 (0)2005/08/10
- 부트로더의 네트워크 구현(1) - 1 (0)2005/08/10
- 부트로더와 플래시 메모리(2)-7 (0)2005/08/03
- 부트로더와 플래시 메모리(2)-6 (0)2005/08/03

수안이의 컴퓨터 연구실



Leave your greetings.