흔히 'USB 메모리' 라고 부르는 USB Mass Storage 에 대해서 알아보려고 합니다. 관련 문서를 찾다보시면 아시겠지만, 국내에는 관련 자료가 잘 없습니다. 소프트웨어보다는 하드웨어 관련된 곳을 뒤져야 하는 하는 상황이 됩니다. 아무튼 USB Mass Storage 가 어떻게 동작하는지 알아보도록 하겠습니다. 참고로 저는 소프트웨어쪽을 알아볼 생각입니다. 하드웨어 모듈을 만든다거나 관련된 부분은 대부분 생략하도록 하겠습니다. :)



USB 에 대한 기본적인 사전지식


 시작에 앞서서, 퀴즈아닌 퀴즈를 내 보죠. USB Client 와 USB Host 라는 개념이 있습니다. 우리가 만들고자 하는 USB Mass Storage 와 이를 사용하는 PC 중 어느것이 Client 고 Host 일까요? 이것을 제대로 알지 못하면 자료도 제대로 찾을 수가 없습니다. =_= 기껏 문서를 찾아서 읽고 있는데 "이게 아닌가벼..." 하는 상황이 벌어지곤 하지요. USB Client 는 우리가 만들려는 USB Mass Storage 입니다. 그리고 이것을 사용하는 대상은 USB Host 라고 합니다. 즉, PC 가 USB Host 이지요. :)



 USB 란 무엇일까요?

Universal Serial Bus 입니다. 우리나라말로 풀어보면 '범용 직렬 버스' 입니다. 직렬통신(시리얼 통신)이라는 것은 병렬통신과 반대되는 말이죠. 자동차 도로로 비유해 보자면, 1차선 도로입니다. 한번에 한가지 일 밖에는 할 수 없습니다. 그러므로 여러 작업을 동시에 하기 위해서는 고유 키를 가지고 데이터를 주고 받습니다. 즉 통로 하나를 나누어 씁니다.


USB 관련 자료를 찾다보면, USB-IF 라는 단어를 많이 접하게 됩니다. 이것은 USB Implements Forum 의 줄임말입니다. 사이트 주소는 http://usb.org 입니다. USB 스팩 역시 이곳에서 찾을 수 있습니다.


최초의 USB 는 1994년 발표된 0.7 입니다. 이 오랜 역사만큼 여러가지 버전이 나왔는데 크게 USB 1.0, USB 2.0 그리고 USB 3.0 으로 나눌 수 있습니다. 자료를 찾다보면 Full Speed, High Speed 라는 말과 1.0, 2.0 이라는 단어들이 혼재되어 나오는데, 아래를 보시면 도움이 되실거라고 생각합니다.


Low Speed : 1.5Mb/s

Full Speed : 12Mb/s

High Speed: 480Mb/s

Super Speed: 5Gb/s

Super Speed Plus : 10Gb/s


이렇게 각 이름별 스팩에 따른 최고 전송속도입니다. MB(메가 바이트) 가 아니라 Mb(메가 비트)이라는점 주의하세요 ^^;

흔히 Full Speed 라고 하면 USB 1.0 버전을, High Speed 는 USB 2.0 을 의미합니다. Super Speed 이상은 USB 3.0 입니다. 아시다시피 이 글을 쓰는 현재 가장 일반적인 스팩은 USB 2.0 입니다. 웬만한 운영체제나 디바이스에서 2.0을 지원합니다. 


마지막으로 upstream 은 USB mass-storage 에서 Host(PC)로 데이터를 보내는 것이고, downstream 은 반대의 개념입니다. 




USB Mass Storage 가 반드시 지켜야 하는 것들


 시작에 앞서 이론들을 조금은 알고 넘어가는 것이 도움이 될 것 같습니다. 몇 가지 설명을 하고 넘어가도록 하겠습니다. 이론적인 것이니 이런게 있구나 하는 마음으로 가볍게 읽으시면 될 것 같습니다.

 USB mass-storage 디바이스가 반드시 지원해야 하는 인터페이스가 존재합니다. 이 두가지는 무조건 지원해야 합니다. 아니면 동작 자체가 안되지요. 그리고 반드시 구현해야 되는 세 가지 프로토콜과 구조가 있습니다. 이것에 대해서 간단히 알아보겠습니다. 자세한 설명은 추후에 다시 하도록 하겠습니다.



두 가지 인터페이스(Interface)



1. PC 와 같은 USB Host 와 통신하기 위한 인터페이스

2. 디바이스와 저장된 미디어 사이의 인터페이스


 사실 이것들은 하드웨어 레벨이라고 볼 수 있습니다. 



세 가지 프로토콜(Protocol)과 구조체(Structure)



1. 기본적인 USB 프로토콜

2. USB mass-storage 프로토콜

3. SCSI (Small Computer Systems Interface) 명령들

4. 미디어 프로토콜


 첫번째의 기본적인 USB 프로토콜은 USB Host 가 보내는 기본적인 요청에 응답해야 한는 부분을 말합니다. 두번째는 mass-storage 에 특화된 관련된 프로토콜 입니다. 세번째 SCSI 는 Host 가 mass-storage 를 access 할때 사용하는 명령입니다. 네번째는 저장된 미디어 컨텐츠에 access 하기 위한 프로토콜입니다. 많은 flash-memory 카드가 MultiMediaCard 프로토콜이나 SD Card 프로토콜을 사용합니다. 하드 드라이버는 ATA 프로토콜을 쓰고요.

 그리고 이와 더불어 필요한 구조체가 있습니다.

1. 미디어 구조체

2. 파일 시스템


 미디어 구조체란 프로그램이 드라이버를 로직 블럭이나 섹터로 access 하기 위한 구조들 입니다. 그리고 파일 시스템은 잘 아시는 FAT16, FAT32 들을 말합니다.





Host 와 Device 의 역할


 Host 는 PC 와 같은 USB Host 를, 그리고 Device 는 USB mass-storage 같은 장치를 의미합니다. 앞으로 이렇게 용어를 쓰도록 하겠습니다. Host 와 Device 에는 각각의 역할이 있습니다. 이 부분에 대해서 잠시 살펴보도록 합시다.



Host 의 역할



 Host 는 기본적으로 Bus 위에서 전원과 통신을 관리합니다. host 는 모든 USB 장치가 연결된 것을 인지합니다. 그리고 이렇게 연결되거나 분리되었을 때, host 는 모든 이벤트를 받고 이런 사실들을 기록합니다. 그리고 전원을 공급하는 일도 합니다. 이 외에도 버스의 트래픽을 관리하고, 에러를 확인하는 일을 합니다.



Device 의 역할


 Device 는 Bus 에서 들어오는 전원을 감지하고, 전원을 관리합니다. 대부분의 하드 드라이브 같은 기기들은 자체 전원을 사용하지만, 대부분의 플래시 드라이브는 USB 전원만을 사용합니다. 참고로 USB 의 전원은 약 500mA 입니다. 이외에 host 의 기본적인 요청(request)에 응답하며, 에러 체크를 관리합니다. 데이터를 전송했는데, host 에서 제대로 받지 못해 error 가 발생했다고 통보하면, 이에 대해서 당연히 핸들링 해야 겠지요. 그리고 host 와 데이터를 주고 받으며, 각종 device 의 기능을 구현해야 합니다.




우리가 알아볼 것


 USB Client(Device)와 USB Host 는 어떻게 통신을 할까요? 아래 그림과 같습니다.



 보시는것처럼 왼쪽이 USB mass-storage 이고, 오른쪽이 PC 입니다. mass-storage 입장에서 보면, 데이터를 전송할때는 그림의 좌측에서 우측 순서로 나가고, 들어올때는 반대로 우측에서 좌측으로 들어옵니다. 우리는 소프트웨어 영역인, 위 그림에서 빨간색 박스에 있는 'Storage Media' 와 'Media Controller' 에 대해 집중적으로 알아 볼 것 입니다.