티스토리 뷰

Hardware

펌웨어 분석 - dscr.a51 (1)

알 수 없는 사용자 2008. 3. 26. 01:21

출처 : http://muosys.egloos.com/56097

 

다들 FX2 Development Kit을 다운받아 설치 하셨는감?

자 그럼 펌웨어 코딩을 시작해 보자.
우선 우리는 C로 코딩을 할 것이기 때문에 main() 함수부터 만들어야겠다.

자 다들 FX2 Development Kit을 설치할 때 같이 설치된 Keil Compiler의 uVision2를 시작하여 새 프로젝트를 하나 만들고, 거기에 main.c라는 이름으로 새 파일을 만들자

새 파일을 만들었으면
거기에

void main()
{

 

 

 

 

 

 

 


}

이라고 써 넣어라

할 줄 알았느뇨? . 뻥~이요.
Array
만우절 특집 뻥 되겠당.ㅋㅋㅋ

본좌 아직 맨땅에 헤딩하기 신공은 “Hello World!” 이후로 써보지 못했다.
만약 코딩할 때 빈 파일에 바로 코드를 줄줄 써내려 가는 누군가가 있다면 그가 바로 초절정 고수라 보시면 되겠다.

본좌. 아직 그런 내공에 이르지 못함이 아쉬울 뿐이다.
본좌가 수련하는 초식은 바로 Copy&Paste 신공이다.

아직 Copy&Paste 신공도 다 수련하지 못하여, 고수들의 현란한 마우스 놀림을 볼 때마다 본좌의 미력함이 부끄러울 뿐이다.

자 우리가 이제부터 분석하고, 수정할 소스는 “bulkloop” 이다.
C:CypressUSBExamplesFX2bulkloop 폴더에 있는 Bulkloop.Uv2 파일을 더블 클릭하여 프로젝트를 열자.

왼편에 있는 창에 소스파일 다섯개가 보일 것이다.
(안보이면 폴더 아이콘 앞의 + 표시를 눌러 보자. 뭔가 펼쳐지기 시작 할 것이다.)
그 중에 Ezusb.lib 와 USBJmpTb.OBJ 는 우리가 편집할 수 없고, 나머지 세개의 파일 fw.c, bulkloop.c, dscr.a51 이 우리가 손봐줄 파일이 되것따.

그 중에서도 dscr.a51 이 오늘의 수련 목표이다.
해당파일을 더블 클릭해서 열자.
왠지 정겨운 이름들이 보이지 않는가?
바로 이제까지 디벼본 디스크립터(Desccriptor)들이 여기 펼쳐져 있다.

이 디스크립터만 분석이 끝나도 펌웨어 작업의 1/3이 끝났다고 할 수 있다.
맨 먼저 디바이스 디스크립터가 나온다.

DeviceDscr:
db DSCR_DEVICE_LEN ;; Descriptor length
db DSCR_DEVICE ;; Decriptor type
dw 0002H ;; Specification Version (BCD)
db 00H ;; Device class
db 00H ;; Device sub-class
db 00H ;; Device sub-sub-class
db 64 ;; Maximum packet size
dw 4705H ;; Vendor ID
dw 0210H ;; Product ID (Sample Device)
dw 0000H ;; Product version ID
db 1 ;; Manufacturer string index
db 2 ;; Product string index
db 0 ;; Serial number string index
db 1 ;; Number of configurations

요건 이미 설명한 것이므로 반복하지 않겠다.
두뇌 주름이 모자라서 기억이 안 나는 행자들은 여기를 다시 보자.

그 다음에 나오는 것이 디바이스 퀄리파이어 디스크립터(Device Qualifier Descriptor)이다.
요놈은 처음 보는 놈일 것이다.

DeviceQualDscr:
db DSCR_DEVQUAL_LEN ;; Descriptor length
db DSCR_DEVQUAL ;; Descriptor type
dw 0002H ;; Specification Version (BCD)
db 00H ;; Device class
db 00H ;; Device sub-class
db 00H ;; Device sub-sub-class
db 64 ;; Maximum packet size
db 1 ;; Number of configurations
db 0 ;; Reserved

자세히 보시라.
항목들이 왠지 낯익지 않은가?
맞다. 디바이스 디스크립터의 축소판인 모냥이다.

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 하나씩 해서 두 개. 요렇게 헤아리지는 않는다.)
디바이스의 전원에 관한 설명이 들어 있다고 했다.
자세히 디벼보자.

db DSCR_CONFIG_LEN ;; Descriptor length
db DSCR_CONFIG ;; Descriptor type
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) mod 256 ;; Total Length (LSB)
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) / 256 ;; Total Length (MSB)
db 1 ;; Number of interfaces
db 1 ;; Configuration number
db 0 ;; Configuration string
db 10000000b ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu)
db 50 ;; Power requirement (div 2 ma)

첫 번째 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바이트 씩은 디스크립터의 길이를 나타내기 위한 것이다.

db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) mod 256 ;; Total Length (LSB)
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) / 256 ;; Total Length (MSB)

우리가 지금 분석하고 있는 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의 전류를 끌어당긴다.

설명하는 본좌도 슬슬 지겨워질라 그런다.
그림 하나만 더 보고 마치자.

Array

이 그림이 지금 우리가 보고 있는 이 dscr.a51 파일에 나와있는 디스크립터들의 종속관계를 나타내는 표이다.
그림으로 보니 눈에 더 잘 들어오지 않는가?

디스크립터들을 주구장창 설명하는 이유는 우리가 우리 용도에 맞는 USB 디바이스를 만들꺼라면 이 우리가 만든 디바이스의 정체를 호스트에게 알려줄 디스크립터를 작성해야(수정해야) 하기 때문이다.
아마 다음 회까지 하면 설명이 끝나지 않을까 한다.