顯示具有 usb 標籤的文章。 顯示所有文章
顯示具有 usb 標籤的文章。 顯示所有文章

2016年4月10日 星期日

usb mouse setting propross


[4;41mResetting in 1 second..
[4;41mUsbBusReset..
[4;41mUsbBusSuspend..
[4;41mUsbBusSuspend..
[4;41mUsbBusReset..
[4;41mUsbBusSuspend..
[4;41mUsbBusSuspend..
[4;41mUsbBusReset..
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
0
1
0
0
40
0

 end read
dev to host request
GET_DESCRIPTOR
DEVICE_DESCRIPTOR
 
D12 to write 16 bytes to end 1..
data string,hex
121101000108888100112
[4;41mD12ClearInEp0..
D12 to write 2 bytes to end 1..
data string,hex
31
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbBusReset..
[4;41mUsbEp0Out..
start read endp0,len 8
0
5
1
0
0
0
0
0

 end read
SET_ADDRESS
D12 to write 0 bytes to end 1..
data string,hex
[4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
0
1
0
0
12
0

 end read
dev to host request
GET_DESCRIPTOR
DEVICE_DESCRIPTOR
D12 to write 16 bytes to end 1..
data string,hex
121101000108888100112  
[4;41mD12ClearInEp0..
D12 to write 2 bytes to end 1..
data string,hex
31
[4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
0
2
0
0
FF
0

 end read
dev to host request
GET_DESCRIPTOR
CONFIGURATION_DESCRIPTOR
wlength more SendLength
D12 to write 16 bytes to end 1..
data string,hex
9229011080329400131 
[4;41mD12ClearInEp0..
D12 to write 16 bytes to end 1..
data string,hex
20921101211223407581310
[4;41mD12ClearInEp0..
D12 to write 9 bytes to end 1..
data string,hex
0A0000000  
[4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
3
3
9
4
FF
0

 end read
dev to host request
GET_DESCRIPTOR
STRING_DESCRIPTOR
product number

D12 to write 16 bytes to end 1..
data string,hex
1633203003003802D0300370  
[4;41mD12ClearInEp0..
D12 to write 6 bytes to end 1..
data string,hex
2D0310390 
[4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
0
3
0
0
FF
0

 end read
dev to host request
GET_DESCRIPTOR
STRING_DESCRIPTOR
lan id

D12 to write 4 bytes to end 1..
data string,hex
4394 [4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
2
3
9
4
FF
0

 end read
dev to host request
GET_DESCRIPTOR
STRING_DESCRIPTOR
product string

D12 to write 16 bytes to end 1..
data string,hex
363A308578575965604FA973550 [4;41mD12ClearInEp0..
D12 to write 16 bytes to end 1..
data string,hex
530420B304B4E28753762EA819A5B [4;41mD12ClearInEp0..
D12 to write 16 bytes to end 1..
data string,hex
494E8476550530420200480490 [4;41mD12ClearInEp0..
D12 to write 6 bytes to end 1..
data string,hex
440BE8B759 [4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
0
1
0
0
12
0

 end read
dev to host request
GET_DESCRIPTOR
DEVICE_DESCRIPT
OR
D12 to write 16 bytes to end 1..
data string,hex
121101000108888100112 [4;41mD12ClearInEp0..
D12 to write 2 bytes to end 1..
data string,hex
31 [4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
0
2
0
0
9
0

 end read
dev to host request
GET_DESCRIPTOR
CONFIGURATION_DESCRIPTOR

D12 to write 9 bytes to end 1..
data string,hex
922901108032 [4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
80
6
0
2
0
0
29
0

 end read
dev to host request
GET_DESCRIPTOR
CONFIGURATION_DESCRIPTOR
D12 to write 16 bytes to end 1..
data string,hex
9229011080329400131 [4;41mD12ClearInEp0..
D12 to write 16 bytes to end 1..
data string,hex
20921101211223407581310 [4;41mD12ClearInEp0..
D12 to write 9 bytes to end 1..
data string,hex
0A0000000 [4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read
[4;41mUsbEp0Out..
start read endp0,len 8
0
9
1
0
0
0
0
0

 end read
SET_CONFIGURATION
D12 to write 0 bytes to end 1..
data string,hex
[4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
start read endp0,len 8
21
A
0
0
0
0
0
0

 end read
usb class out request
set idle

D12 to write 0 bytes to end 1..
data string,hex
[4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
start read endp0,len 8
81
6
0
22
0
0
74
0

 end read
dev to host request
GET_DESCRIPTOR
REPORT_DESCRIPTOR
D12 to write 16 bytes to end 1..
data string,hex
5192A1191A1059191293
[4;41mD12ClearInEp0..
D12 to write 16 bytes to end 1..
data string,hex
150251953751812951755813 [4;41mD12ClearInEp0..
D12 to write 16 bytes to end 1..
data string,hex
519309319381581257F758953 [4;41mD12ClearInEp0..
D12 to write 4 bytes to end 1..
data string,hex
816C0C0 [4;41mD12ClearInEp0..
[4;41mUsbEp0Out..
for out request
start read endp0,len 0

 end read

usb main descriptor example


設備描述 ***
const uint8_t DeviceDescriptor[12] =
{
//bLength ,
0x12,
//beDescriptorType,說明這裡是用來描述""設備"描述
0x01,
//bcd USB,設定usb版本 1.1
0x10,
0x01,
//bDeviceClass ,不在設備描述中定義出設備類,而在interface Descriptor
//定義設備,故設為0
0x00,
//bDeviceSubClass,同上
0x00,
//bMaxPacketSize *,針對該usb interface EndPoint 0 的大小,
//在PDIUSBD12為16 B ****
0x10,
//idVender,廠商ID。
//實際廠品中不能隨便用,必須向usb協會申請
0x88,
0x88,
//idProduct,產品ID *****
0x01,
0x00,
//bcdDevice, 產品的版本號 *****
0x00,
0x01,
//iManufacturer,廠商的字串索引值。
//當值為0,表示沒有廠商字符串;非0時在主機獲取DeviceDescriptor時,會依此索引值
//放在 wValue中,來選擇不同的字串
0x01,
//iProduct ,產品字串索引值。必須不同 iManufacturer
//即在安裝設備時,系統所跳出的訊息
0x02,
//iSerialNumber,設備序號索引值,指定一個唯一的序號,然後聯合VID及PID來區分不同的設備
0x03,
//bNumConfiguration,該設備所具有的配置數
0x01
};

配置描述集合(配置/接面/端口及HID)
const uint8_t ConfigurationDescriptor[9+9+9+7] =
{
//configure Descriptor
//bLength
0x09,
//bDescriptorType, set 0x02 for Configure
0x02,
//wTotalLenght.配置描述集合的總長度。包含了 configure/interface/endpoint and HID
sizeof(ConfigurationDescriptor)&0xff,
sizeof(ConfigurationDescriptor)>>8 &0xff,
//bNumberInterface,
0x01,
//bConfigure
0x01,
//bmAttribute, **
//D4~D0,always set 0; D5, suport wake from remote; D6 ,device power; D7 ,always set 1
0x80,
//bMaxPower,unit 2mA
0x32,//50mA form bus

//interface descriptor
//bLength ,
0x09,
//bDescriptorType,interface descriptor type 0x04
0x04,
//bIntefaceNumber, start from 0 ,more than zero for use  ... device
0x00,
//bAlternateSetting,備用
0x00,
//bNumEndpoint, 非0 point數目。
0x01,
//bIntefaceClass ,該interface所使用的類。HID mouse is 0x03
0x03,
//bInterfaceSubClass, interface 的子類,HID 1.1 for usb mouse set 0x01
0x01,
//bInterfaceProtocol, keyboard 0x01;mouse 0x02
0x02
//iConfigure, interface的字串索引值,no set 0
0x00,

//HID descriptor
//bLength ,
0x09,
//bDescriptorType,HID descriptor type 0x21
0x21,
//bcdHID  ,HID version 1.1
0x10,
0x01,
//bCountyCode,國家代碼 USA
0x21,
//bNumberDescriptors,下級描述符數目
0x01,
//bDescriptorType, reporttype 0x22
0x22,
//bDescriptorLength
sizeof(ReportDescriptor) & 0xff,
(sizeof(ReportDescriptor) >>8)& 0xff,

//endpoint descriptor
//bLength ,
0x07,
//bDescriptorType,endport descriptor type 0x05
0x05,
//bEndpointAddress, in mouse only one input-endpoint 1
//D7,表示方向,input set 
0x81,
//bmAttributes,D1~D0
//endpoint 傳輸類型,interrupt 3
0x03,
//wMaxPacketSize.
0x10,
0x00,
//bInterval,
0x0A
};

const uint8_t ReportDescriptor[]=//**
{
    //每行的第一行為其該條目的前綴,格式為
    //D7~D4: bTag, D3~D2:bType, D1~D0, bSize
    //全局條目(bType = 1)條目,選擇用途頁為普通桌面(generic Desktop page)
    //其bSize =1,並接上 0x01
    0x05,0x01,      //USAGE_PAGE(generic Desktop page)
    //局部(bType =2)條目,說明接下來的應用集合用途用於mouse
    0x09,0x02,      //USAGE(mouse)
    //主條目(bType =0),開集合,而後面的數據0x01表示該集合是一個應用集合
    //它的性質在前面由usage_page 及 usage定義為 generic Desktop page mouse
    0xa1,0x01,      //Collection(Application)
    //局部條目,用途為指針集合
    0x09,0x01,       //USAGE(pointer)
    //主條目,開集合,數據0x00 表示為該?物理集合
    //用途由前面的局部條目定義為指針集合
    0xa1,0x00,      //Collection(physical)
    //全區條目,用途頁為按鍵(button page(0x09)
    0x05,0x09,      //USAGE_PAGE(button)
    //局部條目,用途最小值為 1,即左鍵
    0x19,0x01,      //USAGE)MINIMUM(button 1)
    //局部條目,用途最大值為 3,即中鍵
    0x29,0x03,      //USAGE)MAx(button 3)
    //全局條目,返回的數據的邏輯值,最小為0;最大為1
    0x15,0x00,      //LOGICAL)MINIMUM(0)
    //全局條目
    0x25,0x01,      //LOGICAL_MAXIMUM(1)
    //為全局條目,設定數據域最大數目3
    0x95,x03,       //REPORT_COUNT(3)
    //全局條目, 每個數據域的長度為1個位
    0x75,0x01,      //REPORT_SIZE(1)
    //主條目,說明有3個長度1位的數據域(數量及長度由上面的全局條目設定)
    //用來作為輸入,屬性為:data,var,abs. data 表示這些數據可以變動;var,表示
    //這些是獨立,abs 表示為絕對值
    //所以結果是,第一個數據域 0表示 按鍵1(右),第二個數據域 1 右鍵,第三數域 2表示
    //中鍵
    0x81,0x02,       //INPUT(data,var,abs)
    //全局條目,說明數據域數量 為1
    0x95,0x01,       //REPORT_COUNT(1)
    //全局條目,每個數據域長度為 5位
    0x75,0x05,       //REPORT_SIZE(5)
    //主條目,輸入,由前二個全局條目,得長度(5)及數量(1)
    //屬性為常數(即返回的值均為0)
    //在這只是為了湊齊1byte(前面只用了3位(左~中)而填充的數據而已沒有實際用途
    0x81,0x03,       //INPUT(data,var,abs)
    //全局條目,用途頁為普通桌面(generic Desktop page,0x01)
    0x05,0x01,       //USAGE_PAGE(generic Desktop)
    //局域條目,用途為X軸
    0x09,0x30,       //USAGE(x)
    //局域條目,用途為y軸
    0x09,0x31,       //USAGE(y)
    //局域條目,用途為w軸
    0x09,0x38,       //USAGE(wheel)
    //全局條目,說明返回的邏輯最小/大值
    //往右為,X+,下時,Y+,wheel up,w+
    015,0x81,         //LOGICAL_MINIMUM(-127)
    025,0x7f,          //LOGICAL_MAXIMUM(127)
    //全局,數據域長度8位
    0x75,0x08,        //REPORT_COUNT(8)
    //全局,數據數量3
    0x95,0x03,        //REPORT_COUNT(3)
    //主條目,由前全局(三個8 數據域)作為輸入. 屬性為:data,var,rel
    //第一個為X,Y,W. rel:相對值
    0x81,0x06,       //input(data,var,rel
    //關集合,並設bSize=0
    0xc0,
    0xc0
};

在 "設備描述符中,有廠商,產品及序號"
const uint8_t LanguageID[4] =
{
0x04,// bLength
0x03,//string type
//for usa
0x09,
0x04
};

//ManufactureStringDescriptor
http://www.ifreesite.com/unicode-ascii-ansi.htm
您好USB設計
\u60a8\u597dUSB\u8a2d\u8a08
const uint8_t ManfactureStringDescriptor[] =
{
0x10 ,//lenght
0x03,//for string type
0xa8,0x60,
0x7d,0x59,
0x55,0x00,
0x53,0x00,
0x42,0x00,
0x2d,0x8a,
0x08,0x8a
}

//ProductStringDescriptor,即安裝時跳出訊息
http://www.ifreesite.com/unicode-ascii-ansi.htm
自己做滑鼠
 \u81ea\u5df1\u505a\u6ed1\u9f20
const uint8_t ProductStrinDescriptor[] =
{
  11,
  .....
};

//產品序號
//1234
const uint8_t SerialNumberStringDescriptor[] =
{
10, //blenght
0x03, //string type
0x31,0x00,
0x32,0x00,
0x33,0x00,
0x34,0x00
};

2014年5月13日 星期二

Ubertooth and Papilio One

Coming Soon

















Fig 1.Ubertooth

 an open source 2.4 GHz wireless development platform suitable for Bluetooth experimentation






















Fig 2. Papillio One
Have you been thinking about jumping into FPGA development but are not sure how to get started? Well, take a look at the Papilio - an Open Source FPGA board with everything you need to get started at a low price. With a friendly and supportive community, free VHDL eBook, Open Source Arduino compatible Soft Processors, and plenty of code examples you will have all the resources needed to get you started on the FPGA path. It's never been easier to jump into the wide-open world of FPGA development!


What Can it do ?










































and














How Can I do ?


http://ubertooth.sourceforge.net/

http://penturalabs.wordpress.com/2013/09/01/ubertooth-open-source-bluetooth-sniffing/


http://papilio.cc/index.php?n=Papilio.Hardware
http://www.gadgetfactory.net/

2013年8月30日 星期五

USB不能做什麼
1.介面限制;傳送距離、P2P及Broadcasting.

對於開發者的挑戰
 有傳輸協定的複雜度、OS對應用的支援;取得Vendor ID.

複雜度,一個usb device需要回應命令及介面上事件的處理。控制器晶片對韌体的支援不相同。而在裝置的設計和程式需要知道usb傳輸協定是如何在介面上交換資料.在pc host中的application 無須知底層硬体介面協定.driver仍需知其usb傳輸協定.

usb是個分享式介面,有其規制的傳輸介面,os不允許AP直接存取usb device.

OS支援;
需內建device class driver.

Vendor ID: 需要向usb if取得Vendor ID and product ID.

術語(terminology);
機能(function);
一個裝置可以有一或多個機能。host可讀取device descriptor and interface descriptor來獲得裝置所有的功能.描述表格descriptor包含裝置的相關資料結構。

device;
實体產品。host 會對各個device給一個唯一的位址。而對於compound device(hub +device)分別個有一個。composite device則共有一個介面位址。

port;
可以被定址的位置.

主機的作業;
  1. 偵測device;列舉,enumeration. 決定其傳送速度、位址並送出額外的資訊.
  2. 管理資料流;因為可能有多個device同時傳收資料故主機需分配其顏宽。而usb2只有半雙工;而usb 3為全雙工.
  3. 錯誤檢驗;由裝置送來的資料可由host來檢驗.
  4. 電源提供及管理.
  5. 與裝置交換資料.
裝置的作業;
  1. 針對晶片偵測通信;位址檢查後,去做回應.
  2. 對標準命令回應;
  3. 錯誤檢查
  4. 電源管理
  5. 與主機交換資料.

2012年11月30日 星期五

USB系統架構

1.USB host :在任何USB系統中,只能有一個USB主機(USB host or Root Hub)。由PC系統控制USB host及周邊裝置的溝通。

2.USB 周邊裝置:

a.網路集線器: 提供更多USB裝置的連接點。

b.USB功能裝置

  • USB通訊協定的使用。
  • 對標準的USB的操作提供反應。
  • 提供裝置性能的描述性資訊。

USB架構

定義在一台主機和若干個附屬的USB裝置之的通信方式。

 

image fig 1.從使用者看

通訊分層:

image

其中,

a. USB physical device:實際硬体。

b.Client Software:針對特定的USB裝置而在主機上運行的軟體。

c. USB System Software: 驅動程式

d. Usb Host controller:匯流排在主機上的介面,同時代表軟体和硬体的介面。透過它可以和USB裝置進行溝通。

   提共主機和裝置的物理連接、發送連接、資料封包連接。

 

USB匯流排拓撲的組成。

  • 主機和裝置;USB系統的基礎組成部份
  • 物理拓撲結構;描述USB系統中的各組成部分是如何連接的.
  • 邏輯拓撲結構;描述USB系統中各組成部分的地位和作用,以及從主機和裝置的角度觀察到的USB系統。
  • 客戶軟體層和應用層的關係;描述從客戶軟体層所看到的應用層的情況,以及從應用層看到的客戶軟体層的情況

 

主機拓撲結構;

其中USB host為負責協調的關鍵及控制USB匯流排使用及監督。

image

 

USB device拓撲結構;描述USB系統中的各組成部分是如何連接的.

為了輔助主機辨認及確定USB device,裝置要提供用於辨識的資料,但其資料格式並不固定。

而是由其device class來決定。

image

USB匯流排的物理拓撲結構;

為樹狀連接,其中Hub也視為USB device,它是由一組USB的連接點所組成。

在連接樹的根部為USB host及一個Root Hub。"但禁止環狀連接"

在USB的架構中,提供具体功能的裝置稱為應用裝置。如果許多不同功能的裝置合在一起,也是一個複合裝置。(經由內部hub連接)。

image

 

USB邏輯拓撲結構

image

在物理結構上,周邊是透過Hub連接到Usb host上。在在程式邏輯上,Usb host可以視為直接與邏輯Usb device通訊。

 

客戶軟體層和應用層的關係

在USB 物理及邏輯上,其USB匯流排是被所有周邊裝置所共用的。但是對操縱USB應用裝置的客戶軟体來說,只需

關心周邊裝置上與它相關的介面,而不需顧慮其它的USB裝置。

 

image

-------------------------------------------

USB 2.0 系統架構及通訊協定

USB系統

  • USB 網路
  • USB 裝置
  • USB 主機

當device連接網路時,該裝置就會有一個唯一個usb address,usb主機就可以此(usb address)來操作device。每個usb device可透過一個或多個通道來與usb host通訊,並all usb device 都會在零埠中有一個控制通道。(註冊,device information)

 

零埠中的描述資訊,可分:

  • 標準;USB共同定義(廠商識別、裝置種類及電源)
  • 類別;提供不同device class define.
  • USB廠商;特定。

Hub;

  1. 將不同性質的usb device連接.
  2. 上遊連接主機,下遊連接device or hub
  3. 可偵測下遊的device step , remote並分配power.
  4. 內分為集線控制器(controller)及集線放大器(repeater)

 

USB匯流排硬体介面

電氣物性

Vbus,D+,D- and GND

傳輸率;

480Mb/s

12Mb/s

1.5Mb/s

編碼方式;NRZI(no return zero inverter)

 

USB 2.0規範概論

  1. USB 1.1 和USB 2.0相容.
  2. USB 1.1 device 在USB 2.0 system時,會工作在12Mb/s.
  3. 特性;
    1. 高速
    2. 連接簡單.
    3. 無須電源
    4. 有不同頻宽及距離
    5. 支援多裝置
    6. 提供電話語音及資訊傳輸(非同步及等時資料傳輸)
    7. 高傳真音效

 

USB 2.0資料通訊流

host and device間的service都是透過資料流來達成。而USB 匯流排使用提升效率,可允許不同資料流(速度及傳輸方式)"彼此獨立"進出同一個USB device。

1. 裝置端點(device endpoint)

device--> address-->endpoint

為host與device間通訊流的終點。USB device則是由一組彼此獨立端點所構成。

屬性;

  • 匯流排頻率
  • 匯流排延遲
  • 端點顏寛
  • 端點序號
  • 除錯
  • 最大長度
  • 資料類型
  • 方向

device init process:

connect USB bus,recive a bus reset signal,設定端點0作為裝置輸人和輸出端點。主機去檢查endpoint 0的設定。

 

2.USB通道(channel)

此為device的endpoint和host application間的溝通管道,其格式

  • Stream 資料流;應用程式自定,不會被翻譯
  • Message 訊息;必需符合USB bus定義,但也不會被翻譯。

其建立方式;

1.application 發出 I/O需求package(IRP)

2.其IRP有指定device, endpoint and data director

3.當device 反應其RIP則channel builder

 

3.傳輸類型;

  1. 控制;可靠、非週期,由host sendor ack 'start'。 usual send instruction and state
  2. 同步;週期、連續。常用於傳送與時間相關的資料。(會保留時間在資料中,但並不立即傳送)
  3. 插斷;低data、低速及固定延遲
  4. 批次;非週期、大量、可靠。

一。控制傳輸;

可傳送device setting、command、state and search。

    1. 建立連線;將資料需求從host -->device
    2. 傳送資料;按所建立連線方向傳送data
    3. 狀態回俴;device-->host

建立連線;host -->device point 發送Setup command package 。(資料可自定或USB定義)

其控制傳輸所用的[訊息通道]是雙向傳送的(具有輸入及輸出)。其中其所指定的最大長度是指其資料而非封包。(8~wMaxPacketSize)

 

傳送資料;

當建立連線後,其後送出資料時其結束點,

  • 已傳輸由Setup封包所指定的資料量
  • 收到一個data package,其長度為0或data length小於最大長度(最後一個package)

狀態回應;

傳送資料完後,host進入等待階段。若host不等待回應,而去送出資料,endpoint會認為被插斷。

或者host or device 收到一佪大於長度的回應則會去中斷controller channel。;若成功回傳,則成正式結束這次控制傳輸。

並由host決定下一個階段。

 

二、同步

特點;

  1. 固定延遲,對USB顏寛使用
  2. 傳送速度
  3. Error Tolerant(允許錯誤)

經由[同步channel]傳送。為單向的資料流通道。其傳送速度可以其最大長度來判斷是否可成立,若可以成可建立成功。

所以傳輸的資料長度,需等於或小於其設定長度,才可免於被匯流排截斷。也可由CRC來檢查是否有錯誤。

但不會因此來重傳(一般的傳輸模式可由handshking來檢查,改由IRP來回應)

 

三;插斷

只傳送或接收少量資料,不需常做動作,但是必須確定在固定時間內完成,故其需求

  • 保證通道的最長反應時間
  • 發生錯誤而重送時,需在下一週期時

也為單向的資料流通道,連接端點的描述資訊會指定通道的資料方向。並其送、發的最大長度。

故在建立插斷通道時,也會依其資料長度判斷是否可有足夠的頻寛。若可時才可有成功建立,與控制通道不同的是,

USB系統不會替插斷通道調整匯流排顏宽,故USB不一定能夠建立插斷通道。

 

由於端點所發送的資料封包,長度不可超過端點所設的wMaxPacketSize。若超過時,則需分割封包,並利用IRP來發送。

而接收端可設一個緩衝區來接收(資料及IRP)

其判斷完成方式;

  • 已傳送的資料量和期待資料量相同
  • 傳送長度為0或小於wMaxPacketSize封包

結束時,host會結束IRP並開始下一個IRP。但發生error時,需中止當前IRP並清除error後重新開始IRP。

因為裝置無法送出插斷要求,故由host發出"輸詢"。由其device回應(NAK or ...)來判斷是否需插斷傳輸。

 

四、批次

為了充分利用顏寛,其特性;

  • 可利用整個匯流排顏寛
  • 發生錯誤時,可重發
  • 保證資料傳輸,但不保證傳送的頻寛及延遲

"只有匯流排有足夠頻宽時,才會進行傳輸",若不足時 並不會動作。其資料的長度可由自己決定(8,16,32及64b 並不會動作。其資料的長度可由自己決定(8,16,32及64byte)。

在傳送端時,其先由USB host讀取最大的長度設定,確定其傳送資料長度不會超過。以及wMaxPacketSize大小,所以在超過時會分割來傳送(只有最後為0或小於)。

在完成後,usb host controller會中止目前的IRP後重新開始IRP,若在接收端收到超出預期長度時則所有在這端端的批次傳輸IRP都會被中止。

因為在系統中的批次傳輸會競爭可用頻寛。所以不能預期其頻宽速度。

匯流排頻率決定於一個週期內最多可進行批次傳輸的數量。usb host controller可自行決定其批次傳輸的週期時間。而其以toggle機制來確保送發的同步。

 

USB匯流排協定層;

其USB封包中,基本上由下列組成單元;(傳輸時為LSB,least significant bit開始)

在封包第一欄SYNC欄位,為產生最大的邊緣轉換密度(edge Transition Density)以及EOF(end of packet,3bit=011)

  1. PID(packet identifier)由其前二bit分為;
    1. 封包類型;標記、資料、交握及專用。
    2. 8bit(PID,檢查碼)組成。(檢查碼為PID的二進制反碼)
  2. ADDR;在輸入、建立及輸出時需其裝置的位址。
    1. 在USB device收到bus packet時會去檢查其device addr及endpoint,若有不同時即會括去。
    2. 而在未初始化端點的裝置也會捨去,而其位址0保留做為特殊用(在被定位的裝置端點,在收到位址0的封包時都必須回應)
    3. 共有7bit(127+1)
  3. ENDP,endpoint
    1. 提供端點欄位,共4bits 除端點0(,1 controller channel)外其它則依設計要求。最多為16個
    2. 低速裝置,則最多2個endpoint ,4 channel
  4. Frame Number,段落序號(在PID,SOF後)
    1. 為一個11bit(最大3FFH)
  5. data
    1. 長度0~1023bytes
  6. CRC ,以其PID決定長度(5~16)

 

由PID可分為標記、資料、交握及專用。

a.標記(token packet);由PID,ADDR and ENDP。用於輸入、輸出及建立上。其參考是由USB HOST看(輸入,由usb device to usb host)

image

b.SOF,start of Frame packet

主機每1.00ms發出SOF packet.

image

c.data packet

其又分為DATA0,DATA1.(高速,DATA2,MDATA)

image

其data length依速度而不同

低速;8 byte

全速;1023

高速;1024

d.交握

image

回報資料傳送狀態,也可用來回應及拒紀命令及要求停止動作。

可分為;

  • ACK;正確收到資料封包且PID也正確。
  • NAK;裝置無法從主機收資料,或裝置沒有傳輸資料到host
  • STALL;回應[輸入、輸出]標記封包,表示裝置無法進行傳、收資料。

-----------------------------------------------------------

並非所有場合中都有交握信號。

可以分為

  • USB device對輸入標記封包的回應
    收到錯標記 發送port 發送data 動作
    Y don't care don't care 不回應
    N reset don't care STALL
    N no reset N NAK
    N no reset Y data
  • USB host對輸入標記封包的回應
    收到錯標記 host 接收資料 動作
    Y N/A 不回應,捨
    N N 不回應,捨
    N Y ACK,收
  • USB device對輸出標記封包的回應
    收到錯標記 接收中斷 時序同步錯 USB可收 動作
    Y N/A N/A N/A none
    N Y N/A N/A STALL
    N N N N/A ACK
    N N Y Y ACK
    N N Y N NAK

接收中斷,USB的接收埠無法接收,回應STALL;時序 錯時回ACK並捨;USB可收,裝置忙錄?

 

  • USB device對建立(setup)標記封包的回應
    • 不能建立時回STALL或NAK。若可接收則須接收建立標記後的資料封包。如果沒經過建立標記的初始化,它必須忽略封包(資料)且不回應

-----------------------------------------------------------

封包交換的流程

A.批次傳輸

特點;錯誤檢測及重試方式。保證host and device間的資料不會傳送錯誤。

接收;

對USB device 發出標記,usb device endpoint會返回資料封包。如端點不能回資料時,就會回傳NAK ,STALL。

NAK,表Endpoint忙碌暫不回傳資料。

STALL,表示Endpoint被永久地停止,需進一步處理

若收到資料錯誤,則host 並不會回應給USB device。

 

發送;

對usb device endpoint發出"輸出標記",並一個data packet。若usb device endpoint正確接收,將返回

  • ACK,正確接收(usb device) ,host可傳下一筆
  • NAK,仍為正確接收(usb device),但因usb device忙碌。故資料捨去,host需重傳
  • STALL,usb device發生error。host 需排除error。
  • CRC16,資料錯誤並不會產生任何回應

 

 

image

image

B.控制傳輸

分為三階段;

建立連線,PID=Setup

傳送資料,?由輸入或輸出的過程構成和批次相同

回應,會以前一階段的資料流向回應,且只用DATA1 PID。

若控制端點在控制傳輸的資料和狀態階段中發送STALL,它必須對所有收的封包回對STALL,直到收到建立封包為止。

image

image

C.插斷

在收到由host發出的"輸入標記,token",裝置會回傳

  • DATA0/1,在收到後host發出的ack。device確主機收到資料,會將device的插斷事件清除。
  • NAK,沒有新的資料可回傳
  • STALL,usb device已停止狀態

"此模式(插斷輸入),可用來測量其傳輸速度"

 

image

D。同步

只有標記和資料二個時間。沒有交握

usb device or host可接收 DATA0/1的資料。

但在發送只會由DATA0

image