|
다들 FX2 Development Kit을 다운받아 설치 하셨는감?
자 그럼 펌웨어 코딩을 시작해 보자. 우선 우리는 C로 코딩을 할 것이기 때문에 main() 함수부터 만들어야겠다. 자 다들 FX2 Development Kit을 설치할 때 같이 설치된 Keil Compiler의 uVision2를 시작하여 새 프로젝트를 하나 만들고, 거기에 main.c라는 이름으로 새 파일을 만들자 새 파일을 만들었으면 거기에
이라고 써 넣어라 할 줄 알았느뇨? . 뻥~이요. ![]() 만우절 특집 뻥 되겠당.ㅋㅋㅋ 본좌 아직 맨땅에 헤딩하기 신공은 “Hello World!” 이후로 써보지 못했다. 만약 코딩할 때 빈 파일에 바로 코드를 줄줄 써내려 가는 누군가가 있다면 그가 바로 초절정 고수라 보시면 되겠다. 본좌. 아직 그런 내공에 이르지 못함이 아쉬울 뿐이다. 본좌가 수련하는 초식은 바로 Copy&Paste 신공이다. 아직 Copy&Paste 신공도 다 수련하지 못하여, 고수들의 현란한 마우스 놀림을 볼 때마다 본좌의 미력함이 부끄러울 뿐이다. 자 우리가 이제부터 분석하고, 수정할 소스는 “bulkloop” 이다. C:CypressUSBExamplesFX2ulkloop 폴더에 있는 Bulkloop.Uv2 파일을 더블 클릭하여 프로젝트를 열자. 왼편에 있는 창에 소스파일 다섯개가 보일 것이다. (안보이면 폴더 아이콘 앞의 + 표시를 눌러 보자. 뭔가 펼쳐지기 시작 할 것이다.) 그 중에 Ezusb.lib 와 USBJmpTb.OBJ 는 우리가 편집할 수 없고, 나머지 세개의 파일 fw.c, bulkloop.c, dscr.a51 이 우리가 손봐줄 파일이 되것따. 그 중에서도 dscr.a51 이 오늘의 수련 목표이다. 해당파일을 더블 클릭해서 열자. 왠지 정겨운 이름들이 보이지 않는가? 바로 이제까지 디벼본 디스크립터(Desccriptor)들이 여기 펼쳐져 있다. 이 디스크립터만 분석이 끝나도 펌웨어 작업의 1/3이 끝났다고 할 수 있다. 맨 먼저 디바이스 디스크립터가 나온다.
요건 이미 설명한 것이므로 반복하지 않겠다. 두뇌 주름이 모자라서 기억이 안 나는 행자들은 여기를 다시 보자. 그 다음에 나오는 것이 디바이스 퀄리파이어 디스크립터(Device Qualifier Descriptor)이다. 요놈은 처음 보는 놈일 것이다.
자세히 보시라. 항목들이 왠지 낯익지 않은가? 맞다. 디바이스 디스크립터의 축소판인 모냥이다. Qualifier Descriptor가 무언고 하니, USB 2.0 장치 (이제부터 High Speed 장치라 한다.) 는 Full Speed(USB 1.1)에서도 동작 할 수 있어야 한다. 만일 Full Speed로 동작할 때랑 High Speed로 동작할 때의 Device Descriptor가 달라야 한다면 이 Qualifier Descriptor 에 High Speed로 동작할 때의 특성을 적어주어야 되겠다. 이 예제에서와 마찬가지로, 우리가 만들 디바이스도 Full/High Speed에서의 Device Descriptor 가 동일하므로 기냥 Device Descriptor의 항목들을 베끼면 되겠다. 아마 대부분의 디바이스들이 그럴 것이다. Full Speed만 지원하는 USB 1.1 장치에서는 당빠 이 Qualifier Descriptor 가 필요 없다. 그 다음이 HighSpeedConfigDscr: High Speed 어쩌구 라고 한 걸로 봐서 FullSpeedConfigDscr: 도 있는 모냥이닷. 소스를 밑으로 스크롤 해서 함 찾아봐라. 있다. High Speed 디바이스는 Full Speed도 지원해야 한다. High Speed로만 동작하고, Full Speed로 동작하지 못하는 USB 디바이스는 USB Specification을 만족한다고 볼 수 없다. Configuration Descriptor는 어제 설명하기를 보통 장치마다 하나씩 있고, (High/Full 하나씩 해서 두 개. 요렇게 헤아리지는 않는다.) 디바이스의 전원에 관한 설명이 들어 있다고 했다. 자세히 디벼보자.
첫 번째 1 바이트는 이 Configuration 디스크립터의 길이를 나타낸 것이고, (파일 앞부분에 “DSCR_CONFIG_LEN equ 9”라고 있다.) 두 번째 1 바이트는 자신이 Configuration 디스크립터임을 나타낸 것이고, (“DSCR_CONFIG equ 2”라고 한 걸 봐서는, 디바이스가 난 2번 디스크립터예요 라고 하면 호스트가 아하 이넘은 Configuration Descriptor구나 하고 알아먹는가 보다.) (사실 Device Descriptor는 1번이고, Configuration Descriptor는 2번이고 하는 거슨 USB Spec.에 이렇게 하자고 정해 놓은 것들이다.) 세 번째,네 번째 1바이트 씩은 디스크립터의 길이를 나타내기 위한 것이다.
우리가 지금 분석하고 있는 dscr.a51파일을 자세히 보아라. HighSpeedConfigDscr”End”와 HighSpeedConfigDscr를 찾아보면 HighSpeedConfigDscr”End”가 High Speed Configuration Descriptor가 끝나는 부분에 있지 않고 쪼기 밑에 Endpoint Descriprtor 밑에 위치한 것을 알 수 있을 것이다. 즉 이 두 바이트에 들어가는 길이는 이 Configuration Descriptor 밑에 딸린 모든 디스크립터의 길이라는 말쌈이 되겠따. 이 두 바이트는 동해물과 백두산이 마르고 닳도록 우리가 손댈 일 없으니 이만 하고 패쓰. 다섯 번째 1바이트는 밑에 자기 밑에 딸린 Interface Descriptor의 갯수 여섯 번째 1바이트는 이 Configuration이 1번 Configuration임을 나타낸다. 만일 Configuration Descriptor가 둘인 경우라면 당근, 두 번째 Descriptor는 2가 되겠다. 일곱 번째 1바이트 Index of string descriptor describing this Configuration 쓸 일 없으니, 통과 여덟 번째 1바이트(중요) 주석에 (b7 - buspwr, b6 - selfpwr, b5 - rwu) 라고 달려있듯이 상위비트부터 차례로 b7 : USB Bus로부터 파워를 공급받는다면 1, 아니어도 1, (즉, 무조건 1) b6 : 외부로부터 전원을 공급받는다면 1, 아니라면 0 b5 : remote wakeup을 지원한다면 1, 아니라면 0 (컴퓨터가 절전모드에 있을 때, USB 디바이스가 부르면, 일어날 수 있는 기능) 아홉 번째 1바이트(중요) 이 디바이스가 소모하는 (최대전류/2)mA를 여따가 적어 넣자. 지금 50 이라고 되어 있으니 이 디바이스는 전류를 최대 100mA의 전류를 끌어당긴다. 설명하는 본좌도 슬슬 지겨워질라 그런다. 그림 하나만 더 보고 마치자. ![]() 이 그림이 지금 우리가 보고 있는 이 dscr.a51 파일에 나와있는 디스크립터들의 종속관계를 나타내는 표이다. 그림으로 보니 눈에 더 잘 들어오지 않는가? 디스크립터들을 주구장창 설명하는 이유는 우리가 우리 용도에 맞는 USB 디바이스를 만들꺼라면 이 우리가 만든 디바이스의 정체를 호스트에게 알려줄 디스크립터를 작성해야(수정해야) 하기 때문이다. 아마 다음 회까지 하면 설명이 끝나지 않을까 한다.
|
카테고리
메모장
UniHigh(FX2) Q&A WDM 드라이버(Driver) USB 개발 모듈(module) 장치(Device) High Speed 자작 강좌(강의) 전문가 CYPRESS CY7C68013 FTDI PHILIPS 최근 등록된 덧글
재미있게 쓰셨네요. 도움..
by 김찬 at 11/23 EP2CFG = 0xA2; S.. by 감사~ㅋ at 06/26 하드웨어 구매는 어떻게.. by 하니 at 06/22 강좌 감사합니다 by 하니 at 06/22 쉽게 설명해 주셔서 이해.. by 윤여준 at 05/13 전원부 회로에서 R4 100K.. by 푸른날개 at 02/26 머리가 한계를 느끼기 .. by 어리버리 관절염 at 02/19 검색하다 우연히 들렀습.. by bongpal2 at 02/01 감사합니다. 자료 정말 .. by 정태우 at 11/30 olo 강의 볼때마다 잡는.. by 까불이 at 10/11 skin by 이글루스 | |||