펌웨어 분석 - dscr.a51 (1)
다들 FX2 Development Kit을 다운받아 설치 하셨는감?

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

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

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

void main()
{










}

이라고 써 넣어라


할 줄 알았느뇨? . 뻥~이요.








만우절 특집 뻥 되겠당.ㅋㅋㅋ

본좌 아직 맨땅에 헤딩하기 신공은 “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이 끝났다고 할 수 있다.

맨 먼저 디바이스 디스크립터가 나온다.

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의 전류를 끌어당긴다.

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


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

디스크립터들을 주구장창 설명하는 이유는
우리가 우리 용도에 맞는 USB 디바이스를 만들꺼라면
이 우리가 만든 디바이스의 정체를 호스트에게 알려줄
디스크립터를 작성해야(수정해야) 하기 때문이다.
아마 다음 회까지 하면 설명이 끝나지 않을까 한다.
by 바람처럼날다 | 2005/04/01 23:43 | FX2 펌웨어 강좌 | 트랙백(1) | 핑백(1) | 덧글(7)
트랙백 주소 : http://muosys.egloos.com/tb/56097
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from at 2014/03/11 00:27

제목 : garcinia cambogia
line6...more

Linked at 펌웨어 분석 - dscr.a5.. at 2008/03/26 01:22

... http://muosys.egloos.com/56097</a> 다들 FX2 Development Kit을 다운받아 설치 하셨는감? 자 그럼 펌웨어 코딩을 시작해 보자.우선 우리는 C로 코딩을 할 것이기 때문에 main() 함수부터 만들어야겠다. 자 다들 FX2 Development Kit을 설치할 때 같이 설치된 Keil Compiler의 uVision2를 시작하여 새 프로젝트를 하나 만들고, 거기에 main.c라는 이름으로 새 파일을 만들 ... more

Commented by 나선랑 at 2005/04/02 11:46
오늘도 역시 잘읽고 가오.. ^^;; 참 이전 글을 읽다보니 ezusb드라이버 소스가 없다고 하시길래.. c로 작성된 소스가 하나있는데 이게 그 드라이버 소스가 아닐까 한데 제가 드라이버를 작성해본적이 없어서 맞는지 모르겠습니다만 도움이 된다면 드려도 될른지요.. ^^;; 그럼 계속 수고를.. 몸생각 하시면서..리.
Commented by 나선랑 at 2005/04/04 19:32
강좌가 올라오질 않길래 몇가지 궁금한점 물으려고합니다.(팔을 물을려고 그러는게 아니라 질문이.. ㅡ.ㅡ;; 혼자 썰렁했군요.. )
1. VID랑 PID를 바꾸는 방법을 곧 설명해 주시겠죠... ^^;; 급합니다. 제가 성격이..
2. 외부 EEPROM없이 내부램을 사용 할 경우 드라이버에 hardcoding을 한다고 하는데 그 방법이 이제 설명하실 내용이신건가요.. 쩝.. 넘넘 궁금해서 지금 Cypress칩을 가지고 이리돌려보고 저리 돌려보아도 도대체 답이 나오질 않길래.. 돌려보기만 하고있습니다.

질문을 한가지로 줄이면.... VID랑 PID가 default 04b4, 8613에서 어떻게 내가 바꾸고자 하는 것으로 바꿀 수가 잇는지 또 endpoint 설정은 어떻게 하는 건지.. ^^;;; ExEEPROM이 없을 경우..

그럼 우왕좌왕 질문올리고 사라집니다. 오늘도 행복하세요.
Commented by 나선랑 at 2005/04/04 19:35
참, 답변글 달아주시기 귀찮으시거나 질문내용이 이상하면, EZ USB FX2 TRM을 참고할 수 있는 페이지를 갈켜주시면 상당히 감사히 받아들이겠습니다. ^^;;
Commented by 바람처럼날다 at 2005/04/04 20:55
1번답. 네 곧 설명해 드리죠. 이번 주 안에. --;
2번답. 강좌 끄트머리에 간단히 설명하거나 생략할 수도.
(Cypress사이트에 관련자료가 있으니 우리 모두 서핑해 Boa요)
한가지로 줄인질문의 답. 한 2~3일만 기다려 보셈.
Commented by 모로 at 2008/09/28 13:22
안녕하세요 요근래 초음파 센서 하나 잡고 끙끙 앓고 있는 나름 공학도입니다.
마이크로프로세서와 초음파는 배운적이 없어서 쉬운것이라 하는데도 힘든점이 많네요
초음파 센서는 SRF-04 썻구, AT89C51과 11Mhz 크리스탈 썻습니다.
 
프로그램은 uViSion-51 썻구요
트리거 신호는 P1에서 주고, 
초음파 센서 에코를 INT0에 바로 연결시키고 에코에 신호가 들어오면 눈으로 볼 수 있게 P0 PORT에 연결된 LED가 켜지고 꺼집니다. 
전방 장애물의 거리를 잴 것이 아니라 간단히 장애물의 유무를 판단하면 됩니다.
일단 초음파 센서 하나로 동작 여부를 보고 두개까지 늘릴텐데 하나도 안되니 힘드군요

질문의 요지
1. 트리거 신호를 최소 10uSec동안 high 시키고 20uSec 동안 low 시키는 방법.
2. 인터럽터는 high에서 걸리는지 low에서 걸리는지 그리고 문법상으로 맞는지 알고 싶습니다.
3. 초음파 센서를 사용하면서 기본적인 상식들


답변 하나 하나 감사히 받겠습니다
 
아래는 소스입니다.
Commented by 모로 at 2008/09/28 13:22

#include <at89x51.h>
unsigned char TRIGER;
unsigned char i;
void Delay(unsigned int N)

while(N--){}
}
void EXT0_INT(void) interrupt 0

EA=0;
IE0=0; 
P0=0x00; //LED ON
Delay(5000);
EA=1;
}
void main(void)
{
IT0=0;
IE=0;
EA=1;
EX0=1;
PX0=1;
P0=0xff; //LED OFF 
Delay(5000);
 while(1){
P1=TRIGER=1;
Delay(10); // 딜레이를 10으로 줘야 10uSec가 된다는군요
 P1=TRIGER=0;  
Delay(20);
  P0=0xff; //LED 초기화   
Delay(5000); 
}
}
Commented by 마틴 at 2010/07/22 10:48
정말 재미있게 강의 잘 하시네요..

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >