상세 컨텐츠

본문 제목

USB Transaction

청강컴정/시스템프로그래밍

by luckey 2009. 5. 29. 17:52

본문

- GetDescriptor : 명세서, 설명서를 달라
**모든 명령은 PC가 보낼 수 있다.
총 34개의 transaction이 발생한것을 볼 수 있다.
이중 31개는 반응이 없었고 3개만 성공적인 반응을 보였다.
ACK - 성공했다, NAK - 실패했지만 기다린다, stall

GetDescriptor가 수행되기 위해 필요한 packet의 수는 총 9개
PC->Device

transaction : 모든 transaction은 교차하지 않는다.
약속된 시간, 작업량 만큼만 사용을 해서 다른 Device에게도 기회를 준다.(충분히 보장받을 수 있는)
!!!transaction 에 대해서 설명
모든 transaction은 PC에서 시작한다.

transaction
- token packet : 맨처음 시작하는 패킷(무조건 Host -> Device)
- 2D 00 10
- 0x2D : setup
- 0x00 : Device - 주소
- 0x0 : Endpoint - 주소
- Device주소 0번지에 Endpoint의 0번지
- USB가 0번지를 쓴 이유(다른장비는 이미 꽂혀 있기 때문에... 0번일경우 지금방금 꽂은 장비만 인식이 된다.)
- USB는 꽂으면 무조건 0번이라는 주소를 가진다.!!!!(처음 꽂은 장비)
- 조금 기다리면 정확한 주소를 받게된다.
- transaction 진행중에는 다른 transaction이 개입하면 안된다는 약속이 있기 때문에 token에만 주소 값이 들어 있을수 있다.


!!!Host에서 나가는 모든 것은 BroadCasting 이다. 모든 Device에게 전달이 된다.

SETUP transaction(SETUP는 PC가 무조건 명령을 보낸다)
- Setup packet(PC->Device) - 명령을 보내겠다고만 한다.
- DATA0 packet - 실제 명령을 보낸다.(실제 명령은 8개 밖에 안된다.)
C3 80 06 00 01 00 00 40 00 DD 94
실제 명령 : 80 06 00 01 00 00 40 00
9.3의 Table 9-2를 보고 풀어본다.
1000 0000 - bmRequestType (1: Device- to- host(pc)) : Device에게 주는 표준 명령이며 데이터를 나중에 받는다.
1:Device-to-host(디바이스에서 PC로 올라와야 한다는 명령)
0 : Standard (Type)
0 : Device(Recipient)
0000 0110 - bRequest - 6(Table 9-4) : GetDescriptor 라는 명령이다.
0000 0000 0000 0001 - wValue
- 거꾸로 0000 0001 0000 0000
0000 0000 0000 0000 - wIndex - Descritor Type and Descriptor Index
0100 0000 0000 0000 - wLength(데이터를 보내고 받는과정에 실제 수행되는 데이터의 크기 - byte)
- Zero or Language ID
읽을때는 거꾸로 돌려서 읽어야 한다. 그래서 00 40 즉 64byte의 데이터를 읽어오겠다는 뜻이다.
1 : Device-to-host

- ACK packet
D2 : ACK(잘 받았다!!!)

-위의 Setup transaction에서 bmRequestType의 값이 Device-to-host였으므로
IN transaction - 데이터를 받을때(받겠다.)
- IN packet
- DATA1 packet
앞의 데이터 1byte 버리고 뒤의 2byte를 버리고 남은 데이터 총 18byte가 들어온다.
- ACK packet

control 전송에서는 반드시 있다.(모든 작업을 모두 무사히 마쳤다.)
안해도 되지만 control에서는 반드시 넣어줘야 한다.
데이터가 없는 전송
OUT transaction - 데이터를 보낼때(보내겠다.) - bulk, iso~ 에서는 없다.
- OUT packet
- DATA2 packet
- ACK packet

278페이지 Standard Device requests (표준명령)
이중에 하나라도 명령을 보냈는데 stol 이 오면 호환성이 떨어진다.
중요한 명령(지금까지 나온 모든 운영체제에서는 반드시 사용하는 명령어)
- GET_DESCRITOR : 넌 누구냐(제일 중요 : 소프트웨어 입장에서 장치가 무엇인지를 알수 있는 유일한 명령)
wValue의 데이터에 따라 다르게 동작한다.
- SET_ADDRESS : 주소를 지정 (처음 꽂은 장비는 무조건 0번으로 시작하기 때문에) USB장비는 꼽을때마다 주소를 다르게 가진다.
- SET_CONFIGURATION : RUN의 뜻으로 동작을 개시하라는 명령

--290페이지 정리!!!
bcdUSB : 2.0
idVendor : 제조회사명
idProduct : 제조회사에서 부여한 번호
bcdDevice : 제품버전
i가 붙어있으면 문자열이라는 설명
iProduct
iserialNumber

GetMaxLun : 컨트롤 장치가 몇개냐 (0 이면 1개)
Inquiry : Direct-access device(스펙은 같은데 장비가 무엇인지 결정난다.)
read format Capacities : 용량이 얼마냐 1,015,808 (마지막 블럭), 한블럭당 512bytes
총 용량 = 1015808 * 512 = 520093696 = 대략 50M?


--Required UFI Commands 에 준비되어 있다. usbmass-ufi10.pdf의 11쪽(Class 스펙)
Read Capacity
PING transaction(USB2.0에 추가된 기능)
OUT transaction : 데이터를 보내겠다.

In transaction : 데이터를 줘라

In transaction : 데이터를 줘라

Mode Sense
OUT transaction

In transaction

In transaction

Read Capacity와 Mode Sense를 어떻게 구분할 것인가??
USB 표준이 아니다.
USB Class

1차 : Standard 명령(처리하는 기능 - 운영체제가 개입 [주체 : 운영체제])
- 모든 장비는 Standard를 먼저 처리해야 한다.

2차 : Class 명령 or Vendor 명령(장비에 따라서 알아서 처리 - 운영체제가 개입하지 않는다. [주체 : Driver])

USB레이어
http://www.usb.org 사이트에서 스펙을 확인해야 한다.

dCBWSignature : 최초 시작부터 43425355h(USBC)로 시작한다.

[Control Transfer]
Setup Transaction(명령을 보낼때)
    Setup Token Packet(Host->Device) - 주소
    DATA packet(Host -> Device) - 명령어
    ACK packet(Device -> Host)
IN Transaction - 데이터를 받겠다.
    IN packet(Host -> Device) - 주소
    DATA packet(Device -> Host) - 데이터
    ACK packet(Host -> Device)
OUT Transaction - 데이터를 보내겠다.
    OUT packet(Host -> Device) - 주소
    DATA packet(Host -> Device) - 데이터
    ACK packet(Device -> Host)


[Control Transfer]
Status packet이 있다.
Setup packet
복수개의 Data Transaction(IN or OUT)
Status Transaction(IN or OUT)

[Bulk Transfer, Interrupt Transfer]
Status packet이 있다.
복수개의 Data Transaction(IN or OUT)

[Isochronous Transfer]
Status packet이 없다.
복수개의 Data Transaction(IN or OUT)

각각의 Transaction은 명령 또는 데이터를 주거나 받기위해서 사용된다.
보내고자 하는 데이터가 많을 경우에는 Transaction을 여러번 하면된다.
이유는? 하나의 Transaction에서는 다른 작업이 끼어들수 없기 때문에

연습문제) 하나의 데이터 패킷이 최대 64byte의 데이터를 보낼 수 있다면,(payload = 64)
Host가 벌크전송을 사용하여 1000byte의 데이터를 Device로 전송하고자 하면
이때 발생되는 모든 packet과 Transaction을 도식화 하여라.

payload = 64, 벌크전송

1. Out Data Transaction
Out Transaction
   OUT Token Packet(H->D)
   Data Packet(H->D) 64
   Status Packet(H->D)
...
15. Out Data Transaction
Out Transaction
   OUT Token Packet(H->D)
   Data Packet(H->D) 64
   Status Packet(H->D)

16. Out Data Transaction
Out Transaction
   OUT Token Packet
   Data Packet - 40
   Status Packet

총 Packet의 수 : 3*16
총 Transaction : 16개

과제 . 하나의 데이터 패킷이 최대 512byte의 데이터를 보낼 수 있다면,(payload = 64)
Host가 Control전송을 사용하여 10,000byte의 Descriptor데이터를 Device로부터 받고자
(GET_DESCRIPTOR)하면 이때 발생되는 모든 packet과 Transaction을 도식화 하여라.


관련글 더보기

댓글 영역