USB cho dev (Chap.06 – Các gói tin Setup)
Mỗi thiết bị USB phải trả lời các gói tin Setup (Setup packets) trên Endpoint mặc định (Endpoint Zero). Các gói tin Setup được sử dụng cho việc phát hiện thiết bị, cấu hình, cũng như lấy các thông tin khác như các thông tin về chức năng, địa chỉ thiết bị, kiểm tra trạng thái các Endpoint.
Chuẩn USB yêu cầu Host sẽ mon muốn về mặt thời gian từ phát hiện đến lấy đầy đủ các thông tin trên trong vòng không quá 5 giây. Ngoài ra, nó cũng quy định chặt hơn cho từng Request từ phía Host.
- Yêu cầu thông tin chuẩn của thiết bị (Standard Device request) mà không có dữ liệu (hay DATA Stage) thì phải hoàn thành trong vòng 50ms.
- Nếu yêu cầu có dữ liệu kèm theo (có DATA stage) thì dữ liệu phải được trao đổi sau ít nhất 500ms sau request được gửi đến.
- Mỗi gói dữ liệu phải gửi trong 500ms sau khi gói trước được gửi
- Thông báo trạng thái (Status Stage) phải hoàn thành trong vòng 50ms sau khi gửi gói tin cuối cùng.
- Lệnh SetAddresss (có chưa phần Data) phải được thực hiện và trả lại Status trong vòng 50ms. Phía thiết bị có 2ms để thực hiện thay địa chỉ trước khi request tiếp theo được gửi đến.Nhưng yêu cầu về thời gian ở trên hoàn toàn có thể thực hiện được ngay cả với những thiết bị chậm nhất đi nữa. Nhưng những giới hạn về thời gian này có thể gây khó khăn trong quá trình debug. Trong vòng 50ms, chẳng thể có kí tự debug nào được gửi đi ở 9600bps ở dạng serial không đồng bộ hoặc một Emulator cho mỗi step chạy ở các thanh ghi. Chính vì thế, Khi debug USB, người cần có một vài phương pháp khác. (cái này chưa bàn đến)
Mỗi request sẽ bắt đầu bằng 8 byte, theo định dạng sau:
Offset
Field
Size
Value
Description
0
bmRequestType
1
Bit-Map
D7 Hướng truyền DATA
0 = Host to Device
1 = Device to Host
D6..5 Loại
0 = Standard
1 = Class
2 = Vendor
3 = Reserved
D4..0 Phía nhận
0 = Device
1 = Interface
2 = Endpoint
3 = Other
4..31 = Reserved
1
bRequest
1
Value
Request
2
wValue
2
Value
Value
4
wIndex
2
Index or Offset
Index
6
wLength
2
Count
Số lượng byte truyền trong 1 Data Stage
bmRequestType: Xác định chiều của request (phần DATA), loại request, cũng như loại thông tin sẽ tiếp nhận.
bRequest: Muốn nói rằng, đây là Request.
Thông thường bmRequestType được đọc, và sẽ được chia ra các xử lý theo các handler như Standard Device request Handler, Standard Interface request Handler, hoặc Standard Endpoint request Handler, hay Class Device request handler.etc. Tất nhiên, cách xử lý trên không bắt buộc, biệc đọc nội dung packet Setup cũng như xử lý phụ thuộc hoàn toàn các thiết kế phía Device của bạn. Một số chọn cách đọc bRequest trước tiên sau đó mới xác định đến loại thông tin sẽ tiếp nhận.
Các request chuẩn (Standard request) là phổ biến ở tất cả các thiết bị USB, nó sẽ được nói chi tiết ở bên dưới. Classr request phổ biến cho các lớp Driver. Ví dụ, tất cả các thiết bị tuân theo HID class thì đều có một tập các request class chung. Tập class này khác với Communication class, và tất nhiên khác với Mass Storage class.
Và cuối cùng, là các request mà các vendor tự định nghĩa. Nhưng request này được người thiết kế thiết bị tự đặt, các thiết bị thường không giống nhau. Và tất nhiên, người ta có thể làm bất cứ thứ gì người ta muốn.
Một request phổ biến có thế hướng đến nhiều đối tượng khác nhau (thiết bị, giao diện, hay Endpoint). GetStatus Standard request chẳng hạn, nó có thể cho thiết ị, giao diện hoặc Endpoint. Khi hướng đến thiết bị, nó sẽ trả về trạng thái của remote wake up và nếu thiết bị là tự cung cấp nguồn. Tuy nhiên, nếu cùng request đó được gửi đến interface thì nó luôn trả lại zero, còn đến Endpoint thì nó lại trả lại một dừng tạm thời cho EndPoint đó.
Giá trị wValue và wIndex cho phép các tham số được kèm theo request. wLength chỉ số lượng byte được truyền ở DATA stage.
Request chuẩn (Standard Request)
Ở Section 9.4 trong đặc tả về USB, có nói rằng, “Standard request” phải được thực hiện trên mọi USB Device. Tài liệu đó cũng cung cấp một bảng của các request có thể. Ta hãy coi rằng phía firmware của thiết bị USB sẽ thực hiện đọc các gói Setup chưa chi chúng ra để xử lý tướng ứng vỡi mỗi loại đối tượng là Device, Interface hay Endpoint.
Request chuẩn cho Device (Standard Device Request)
Có 8 loại request chuẩn cho thiết bị, được liệt kê ở bảng dưới đây:
bmRequestType
bRequest
wValue
wIndex
wLength
Data
1000 0000b
GET_STATUS (0x00)
Zero
Zero
Two
Device Status
0000 0000b
CLEAR_FEATURE (0x01)
Feature Selector
Zero
Zero
None
0000 0000b
SET_FEATURE (0x03)
Feature Selector
Zero
Zero
None
0000 0000b
SET_ADDRESS (0x05)
Device Address
Zero
Zero
None
1000 0000b
GET_DESCRIPTOR (0x06)
Descriptor Type & Index
Zero or Language ID
Descriptor Length
Descriptor
0000 0000b
SET_DESCRIPTOR (0x07)
Descriptor Type & Index
Zero or Language ID
Descriptor Length
Descriptor
1000 0000b
GET_CONFIGURATION (0x08)
Zero
Zero
1
Configuration Value
0000 0000b
SET_CONFIGURATION (0x09)
Configuration Value
Zero
Zero
None
- GET_STATUS : Device phải trả lại 2 byte theo dạng dưới đây:
D15
D14
D13
D12
D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
Reserved
Remote Wakeup
Self Powered
Nếu D0 được set, thì có nghĩa thiết bị là nguồn tự cung, ngược lại thì đó là nguồn Bus.
Nếu D1 được set, thì có nghĩa là Remote wakep up được bật, thiết bị có thể wake up Host khi Host đang suspended. Bit này có thể được thay đôi bởi SET_FEATURE hoặc CLEAR_FEATURE.
- CLEAR_FEATURE và SET_FEATURE: Sử dụng để set có hay không các feature. Khi nó hướng đên Device thì chỉ có 2 feature có thể set. Đó là DEVICE_REMOTE_WAKEUP và TEST_MODE. Test mode cho phép thiết bị diễn đạt nhiều điều kiện khác nhau. Chi tiết phần này được nói đến ở đặc tả USB 2.0.
- SET_ADDRESS: Sử dụng để gán một địa chỉ duy nhất cho thiết bị trong quá trình Enumuration. Chính là giá trị của trường wValue, tối đa đến 127. Ở request này, thiết bị dù đã có giá trị địa chỉ nhưng vẫn phải đợi thông báo trạng thái trước khi thực sự set địa chỉ cho chính nó. Còn với các request khác, nó thường được thực hiện trước khi Status đến.
- SET_DESCRIPTOR/GET_DESCRIPTOR: được sử dụng để trả về một descriptor trong wValue. Một request cho miêu tả cấu hình sẽ trả về tất cả các thông tin của miêu tả thiết bị, các interface, các Endpoint nữa. Có 1 chú ý ở đây:
- Endpoint Descriptor: không thể được truy cập trực tiếp từ GET_DESCRIPTOR/SET_DESCRIPTOR request.
- Interface Descriptor: giống với Endpoint Descriptor.
- String Descriptor: cho phép truy cập trực tiếp
- GET_CONFIGURATION/SET_CONFIGURATION: Được sử dụng để lấy thông tin cấu hình thiết bị hoặc set cấu hình. Trạng thái trả về ở Status Stage là 1 byte giá trị. Nếu là 0, thì có nghĩa thiết bị chưa được configured, nếu khác 0 thì có nghĩa thiết bị đã được configured. SET_CONFIGURATION được sử dụng để cho phép một thiết bị chính thức hoạt động. Nó chứa giá trị của bConfigurationValue mà Host muốn thiết lập.
Request Giao diện chuẩn
Định nghĩa 5 loại yêu cầu giao diện chuẩn, chi tiết được nêu dưới bảng sau. Chỉ có 2 request là được sử dụng một cách rõ ràng.
bmRequestType
bRequest
wValue
wIndex
wLength
Data
1000 0001b
GET_STATUS (0x00)
Zero
Interface
Two
Interface Status
0000 0001b
CLEAR_FEATURE (0x01)
Feature Selector
Interface
Zero
None
0000 0001b
SET_FEATURE (0x03)
Feature Selector
Interface
Zero
None
1000 0001b
GET_INTERFACE (0x0A)
Zero
Interface
One
Alternate Interface
0000 0001b
SET_INTERFACE (0x11)
Alternative Setting
Interface
Zero
None
wIndex: Tức là chỉ số của Interface mà request này hướng đến, định dạng được nêu ra ở dưới đây:
D15
D14
D13
D12
D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
Reserved
Interface Number
- GET_STATUS: được sử dụng để trả về trạng thái của interface. Giá trị thường sẽ là 2 byte (0x00, 0x00)
- CLEAR_FEATURE/SET_FEATURE: Sử dụng để set các giá trị boolean. Khi request cho giao diện thì không có đặc trưng này.
- GET_INTERFACE/SET_INTERFACE: sẽ có trường Alternative Interface mà ta đã miêu tả ở các chương trước.
Request Endpoint chuẩn (Standard Endpoint Request)
Có 4 loại khác nhau được đưa ra dưới đây:
bmRequestType
bRequest
wValue
Windex
wLength
Data
1000 0010b
GET_STATUS (0x00)
Zero
Endpoint
Two
Endpoint Status
0000 0010b
CLEAR_FEATURE (0x01)
Feature Selector
Endpoint
Zero
None
0000 0010b
SET_FEATURE (0x03)
Feature Selector
Endpoint
Zero
None
1000 0010b
SYNCH_FRAME (0x12)
Zero
Endpoint
Two
FrameNumber
- wIndex: tham chiếu đến Endpoint và hướng của chúng. Định dạng sẽ như bên dưới:
D15
D14
D13
D12
D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
Reserved
Dir
Reserved
Endpoint Number
-
GET_STATUS:trả lại 2 bytes trạng thái (Halted/Stalled) của Endpoint. Định dạng của 2 byte đó như sau:
-
D15
D14
D13
D12
D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
Reserved
Halt
-
CLEAR_FEATURE/SET_FEATURE: Sử dụng để set Endpoint Features. Hiện tại chỉ có 1 feature selector, ENDPOINT_HALT(0x00) giúp Host có thể ngưng stall hoặc reset một Endpoint. Chỉ những Endpoint khác Endpoint mặc định mới nên sử dụng chức năng này.
-
Synch frame: sử dụng để báo một frame đồng bộ Endpoint.