USB를 해 봅시다.
벌써 USB 네번째 입니다. 저번 시간까지는 Device의 프로토콜 중 초기화 부분을 봤었고 이번 시간에는 실제로 이런 통신이
이루어 지는지 확인해 본다고 했습니다. 제가 사용할 MCU도 언급을 했었죠~ CC2540입니다. 블루투스 로우 에너지 용으로
출시된 SOC인데 USB가 내장되어 있습니다. 그럼 시작해 볼까여?
초기화 과정의 시작은 USB 버스를 Reset시킨다고 했습니다. Reset은 10ms 정도 Low로 만들어 주면 디바이스가 알아먹어야
하는데 CC2540은 USB 리셋이 걸리면 인터럽트가 걸리게 되어 있네요. (CC2540의 USB 기능은 따로 언급하지 않겠습니다.
USB만 신경써도 산더미같은데 MCU까지 하려면 늙고 병듭니다.) 그래서 실제로 USB를 꽂았을 때 버스 리셋이 걸리는지 확인
해 보았습니다. 인터럽트에서 리셋이 걸리면 그대로 멈추면 RESET이라는 글자를 표시하도록 프로그램 했습니다.
뿅 하고 USB를 꽂자마자 위 사진처럼 리셋이 걸리는 군요! 코드는 USB 활성화화 USB 인터럽트 루틴만 추가했습니당. ㅎㅎ
별거 없다라는 생각이 드는군요. 이제 SETUP 토큰을 EP0부터 읽어들여야 할까요? 아닙니다. SETUP 토큰의 내용은 PID +
ADDRESS + Endpoint + CRC5 입니다. 이런 건 하드웨어에서 처리해 줘야쥐~~ 예상하건데 거의 대부분의 MCU에 내장된
USB는 왠만한 건 거의 하드웨어로 구성되어 있을 거에요. CC2540도 마찬가지입니다. 따라서 특별히 Setup으로 날라온 PID
의 종류를 구분하는 루틴도 Address가 내 Address가 맞는지 몇번 Ep로 통신할건지 등등의 프로그램이 필요가 없죠. 물론
순수하게 소프트웨어로 구현하고 싶으신 분들도 계실거에요. RESET 부터 시작해서 전부. 도전해보셔도 될 것 같네요. ㅎㅎ
그럼 SETUP 패킷은 넘어가구요. SETUP 다음에 오는 데이터가 어떤 데이터인가 봅시다. 리셋 다음에는 어드레스라고
나와 있었기 때문에 어드레스를 설정하겠다는 내용이 나가겠죠? 역시 PID는 MCU에서 알아서 처리할 거에요. 그러면 EP0를
읽어봅시당. MCU는 SETUP 토큰 후에 DATA 토큰에서 데이터가 8byte가 아니면 버려버립니다. SETUP DATA는 8BYTE!
정상적이면 FIFO에 저장을 하고 인터럽트를 발생시킵니다. 자 예상은 00(type) : 05(type number) : XX(주소) : 00 00 : 00 00
이었죠? 자! 확인들어 갑니다!!!
뷁!!!!!!!!!!!!!! 80 06 00 01 00 00 40 00 이 나왔습니다. -_-;;; 죽여붜려~~ 에라이~ 실패군요. ㅎㅎ 실패라기보단 USB 메뉴얼을
너무 허접하게 읽은게죠. ㅠㅠ 뭐 어쨌든 이 코드는 뭘까요. 봅시다. (전으로 돌아가기 싫으시죠? 표 또 올립니다. ㅎㅎ)
80은 bmRequestType 필드였죠? 첫번째 비트가 1이니까.... Device to Host입니다. 호스트가 뭔가 정보를 받길 원하는 군요.
무슨 정보 일까요? 다음 필드에 있겠죠? bRequest 번호가 0x06 6번이네요. 6번은 GET_DESCRIPTOR입니다. 그 다음 2byte는
wValue인데 설명에 Descriptor type and Descriptor Index 네요. 이건 뭘까요? 또 표 갑니다. 표를 보니 1은 Device입니다.
후 또 그다음 2byte는 wIndex인데 Zero or Language ID 라고 되어 있지만 00 00인거 보니까 그냥 Zero군요. 마지막 필드는
wLength이고 40 00입니다. Descriptor Length라고 되어 있는데 -_- 헥사로 40 00 이면 열나 큰데?????!!!! 뭐지? 16384(Dec)?
아~~ 여기서 안드로메다로~~~ 잘못 이해하고 있나요? 받는 구문이 틀렸나요? 아~ 몇번을 다시 해도 마찬가지입니다. ㅠㅠ
그래도 -_-+ 한가지는 건졌네요. reset -> address 이지만 그 전에 몰래 descriptor를 먼저 요청한다는거 ㅋㅋㅋㅋ
USB 이좌식! 어쨌든 Device descriptor를 요청한다는 것은 확실하구요. Device는 모든 Standard Request에 요청할 의무가
있으므로 Descriptor를 보내야겠죠? 하지만 아직 우리는 Device Descriptor를 공부한 적이~~~~ 없어여~~~~~ ㅎㅎ
자 정리하자면 USB RESET을 확인하였고 그 다음에는 주소를 설정하는 것이 아니라 Device Descriptor를 요청합니다.
그럼 당연히 다음 시간에는 Device Descriptor를 살펴봐야겠죠? 뭐 40 00 이라는 사소한 문제가 남아있긴 하지만 ... 음...
다음 시간까지 찾아내서 반드시 -_-+ 저놈의 정체를 밝히도록 하겠습니다.
다음 시간에 뵈여 - Dwarp -