로그인 | 회원가입
   이용안내    장바구니    주문조회    마이쇼핑    게시판
상품검색 검색 
아이디  
비밀번호
보안접속 보안접속
회원가입
  아이디찾기
  비밀번호찾기
상품목록
  ARM
  PIC
  AVR
  DSP
  MAXQ
  MSP430
  OTHER
게시판
공지사항
자유게시판
강좌-USB기타
자료실
샘플 기획전
전화: 031-429-0845
팩스: 031-477-1407
운영시간
  09:00 ~ 18:00
 
현재위치: > 게시판 > 강좌-USB기타
강좌-USB기타
USB및 기타자료입니다.


찾기
제목 [부록] STALL & USB BUS RESET 0  추천하기
작성자 글쓴이 작성일 2014-10-29 16:22:33 조회수 396
   
   

오늘은 본좌가 취권을 수련하다가 그만 주화입마에 빠져 벼렸으니

혀가 잘 안 돌아가.

말이 짧아도 이해 바래.

 

오늘 풀 “Stall”에 대한 야부리는 그냥 쓱 읽고 넘어가길 바래

직접 기능을 구현하는 펌웨어를 짜는 데는 별 도움이 되질 안아. 떼스~.

읽고 어렴풋이 개념을 잡는 데나 쫌 도움이 될까?

 

 

Stall이 뭐냐 하면 말야, 원래 항공용어인 거 알아?

비행기의 속도가 양력을 얻지 못하는 정도로 낮아지면 실속(stall)하게 돼.

그럼 그냥 자이로드롭 타는 거지.

그런 찔끔한 상황을 가리키는 용어를 빌려온 것 같아.

 

그럼 어떤 때 stall이 일어나쓸까?

 

제일 뻔한 스토리는

호스트가 Control Pipe를 통해서 디바이스에게 명령을 전송 했는데,

디바이스가 이것을 받아 보니 당최 알아들을 수가 없는 거라.

왜냐하면 그 딴 명령을 처리할 루틴이 펌웨어에 없거던.

프로그래머가 게을러서 그랬는지,

애시당초 그딴 시덥잖은 명령 따위는 지원하지 않아도 별 상관이 없어서 그랬는지는 모르겠지만 말이야.

 

또 있어

이노무 프로그래머가 발정기가 온 건지

평소 밤새고 놀아주던 코드는 내팽개 치고 살랑살랑 돌아다니는데 정신이 없는거라.

어떻게 되겠어?

안 놀아줘서 삐져버린 펌웨어 코드가 일하다 말고 배째라 하고 뻣어 버린 거지.

 

그거 말고도 더 있는데 머리 아플까봐 그만할께.

 

이럴 땐 어떡해야 한다고?

호스트에게 살포시 stall을 날려 줘야 돼.

 

그니깐 디바이스에게 호스트가 stall을 날리는 상황이라면

그건 엿 같은 상황인 거야.

 

어떻게 날려주냐 하면 handshake 패킷에 실어서 날려.

 

아 또 머리에 쥐날라고 하는게 보여.

이제 쥐약 발라주께.

USB transfer는 말이야 isochronous transfer를 빼고는

호스트든 디바이스든 데이터를 받는 쪽이 상대방이 보낸 데이터를 잘 받았는지 못 받았는지를 확인해 줘야 한다고.

이걸 소위 handshake(악수) packet을 날려서 하는 거야.

그니깐 예를 들자면 호스트가 데이터 패킷을 날리면

디바이스가 핸드쉐이크 패킷을 날려줘야 하는거지.

뭐 여기까지 자세히 알 필요까지는 없어.

알면 나중에 똥통에 빠져 허우적거릴 때 좀 더 빨리 헤어나오는데 도움이 되긴 하지만 말이야.

일단은 넘어가자고.

첨부터 너무 많이 집어넣을라 그러다간 머리 터져.

 

총 정리를 하자면

호스트가 디바이스에게 어빵없는 선빵을 날리면

디바이스는 핸드쉐이크 패킷에 stall이라고 써서 福YOU(ㅗ--ㅗ)를 먹이는 거지.

알간?

 

그럼 디바이스가 호스트가 stall을 날리면 호스트는 어찌해쓰가나?

호스트는 당근 해당 엔드포인트로 데이터전송을 중단해야 하지.

그 다음엔 무얼 하냐 하면

Default Control Endpoint ( Endpoint 0 )와 다른 Endpoint에서의 경우가 쫌 달러.

 

일단 Endpoint 0의 경우에는 말야

새로 전송을 하지.

새로운 전송이 성공하면 다행이고,

그것마저 실패한다면 호스트는 다른 뭔가를 해야 되겠지?

USB 버스 리셋을 먹여주는 거야.

이전에도 얘기 했겠지만 USB bus reset를 마이크로 프로세서의 power on reset이랑 달라.

헛갈리지 안길 바래.

디바이스가 bus reset을 받으면

stall을 일으켰던 원인을 제거하기 위해 뭔가를 하는 거쥐.

초기화 말이야.

 

EP0는 그렇고 말이야

Bulk, Interrupt, Control( “Default Control”이 아냐 ) 같은 다른 타입의 엔드포인트가 스톨에 걸린 경우엔

호스트는 Clear Feature/Stall Request를 디바이스에게 보내지.

그럼 디바이스는 Stall 상태에서 헤어나기 위해 뭔가를 해야 하는 거얌.

 

그럼 UniFull Firmware에서 stall_ep0() 함수를 들여다 볼꺼나?

void stall_ep0( void )

{

    D12_SetEndpointStatus ( 0, 1 ); ←Stall Default Control OUT Endpoint ( EP0 OUT )

    D12_SetEndpointStatus ( 1, 1 ); ←Stall Default Control IN Endpoint ( EP0 IN )

}

 

void D12_SetEndpointStatus ( unsigned char bEndp, unsigned char bStalled )

{

    if( cFlags & IN_ISR ) DISABLE;

 

    D12_Write ( D12_COMMAND, 0x40 + bEndp );

    D12_Write ( D12_DATA, bStalled );

 

    if( cFlags & IN_ISR ) ENABLE;

}

PDIUSBD12 Datasheet p.20 11.3.9 Set endpoint status 를 한번 봐봐 먼 말인지 감이 올꺼얌.

 

Unifull.c의 main 루프에 보면 USB bus reset을 처리하는 부분도 있어.

if( cFlags & BUS_RESET )

{

    DISABLE;

    cFlags &= ~BUS_RESET;

    ENABLE;

 

    D12_ACTIVATE;

} // if bus reset

 

댓글달기 회원에게만 댓글 작성 권한이 있습니다. 회원가입하여 정보공유를 하면 좋겠습니다.
첨부파일
답변
  스팸신고 스팸해제
글쓰기
 
이전글 UniFull 펌웨어 v1.1 - Default Control Endpoint 를 이용한 LED On/Off
다음글 Setup Data 활용하기
 
 
| 회사소개 | 이용약관 | 개인정보취급방침 | 이용안내
Copyright ⓒ 2010 KitKorea All rights reserved.
전화 : 031-429-0845 FAX : 031-477-1407
Contact open@kitkorea.com for more information.
법인명(상호):인터전자 주식회사 주소:14120 경기도 안양시 동안구 흥안대로 112-1 (호계동)
사업자 등록번호 안내 [138-81-28277] / 통신판매업 신고 제 안양 1753호 [사업자정보확인]
개인정보보호책임자 :홍성호(open@kitkorea.com) / 대표자(성명):홍성호
cafe24