㈠ 下面是段USB-HID的代碼,MCU如何通過狀態寄存器判斷出要進行發送還是接收的
當發送出數據的時候就會進入發送中斷,從而准備下一次要發送的數據。
㈡ 如何往USB HID鍵盤發送數據,控制鍵盤燈或其他
可以用bus hound發送set_report命令,發送命令數據的各式為 21,09,00,02,00,00,01,00,
㈢ 如何定義STM32 USB HID設備緩沖區地址請求幫助
USB HID報告及報告描述符簡介相關討論:
在USB中,USB HOST是通過各種描述符來識別設備的,有設備描述符,
配置描述符,介面描述符,端點描述符,字元串描述符,報告描述符等等。
USB報告描述符(Report Descriptor)是HID設備中的一個描述符,它是比較
復雜的一個描述符。
USB HID設備是通過報告來給傳送數據的,報告有輸入報告和輸出報告。
輸入報告是USB設備發送給主機的,例如USB滑鼠將滑鼠移動和滑鼠點擊等
信息返回給電腦,鍵盤將按鍵數據數據返回給電腦等;輸出報告是主機發送
給USB設備的,例如鍵盤上的數字鍵盤鎖定燈和大寫字母鎖定燈等。報告是
一個數據包,裡麵包含的是所要傳送的數據。輸入報告是通過中斷輸入端點
輸入的,而輸出報告有點區別,當沒有中斷輸出端點時,可以通過控制輸出
端點0發送,當有中斷輸出端點時,通過中斷輸出端點發出。
而報告描述符,是描述一個報告以及報告裡面的數據是用來干什麼用的。
通過它,USB HOST可以分析出報告裡面的數據所表示的意思。它通過控制輸入
端點0返回,主機使用獲取報告描述符命令來獲取報告描述符,注意這個請求
是發送到介面的,而不是到設備。一個報告描述符可以描述多個報告,不同的
報告通過報告ID來識別,報告ID在報告最前面,即第一個位元組。當報告描述符中
沒有規定報告ID時,報告中就沒有ID欄位,開始就是數據。更詳細的說明請參看
USB HID協議,該協議可從下載。
USB報告描述符可以通過使用HID Descriptor tool來生成,這個工具可以
到下載,為了方便大家,我順便上傳了一份。
下面通過由HID Descriptor tool生成的USB滑鼠和USB鍵盤來說明一下報告
描述符和報告。
code char KeyBoardReportDescriptor[63] = {
//表示用途頁為通用桌面設備
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//表示用途為鍵盤
0x09, 0x06, // USAGE (Keyboard)
//表示應用集合,必須要以END_COLLECTION來結束它,見最後的END_COLLECTION
0xa1, 0x01, // COLLECTION (Application)
//表示用途頁為按鍵
0x05, 0x07, // USAGE_PAGE (Keyboard)
//用途最小值,這里為左ctrl鍵
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
//用途最大值,這里為右GUI鍵,即window鍵
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
//邏輯最小值為0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//邏輯最大值為1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
//報告大小(即這個欄位的寬度)為1bit,所以前面的邏輯最小值為0,邏輯最大值為1
0x75, 0x01, // REPORT_SIZE (1)
//報告的個數為8,即總共有8個bits
0x95, 0x08, // REPORT_COUNT (8)
//輸入用,變數,值,絕對值。像鍵盤這類一般報告絕對值,
//而滑鼠移動這樣的則報告相對值,表示滑鼠移動多少
0x81, 0x02, // INPUT (Data,Var,Abs)
//上面這這幾項描述了一個輸入用的欄位,總共為8個bits,每個bit表示一個按鍵
//分別從左ctrl鍵到右GUI鍵。這8個bits剛好構成一個位元組,它位於報告的第一個位元組。
//它的最低位,即bit-0對應著左ctrl鍵,如果返回的數據該位為1,則表示左ctrl鍵被按下,
//否則,左ctrl鍵沒有按下。最高位,即bit-7表示右GUI鍵的按下情況。中間的幾個位,
//需要根據HID協議中規定的用途頁表(HID Usage Tables)來確定。這里通常用來表示
//特殊鍵,例如ctrl,shift,del鍵等
//這樣的數據段個數為1
0x95, 0x01, // REPORT_COUNT (1)
//每個段長度為8bits
0x75, 0x08, // REPORT_SIZE (8)
//輸入用,常量,值,絕對值
0x81, 0x03, // INPUT (Cnst,Var,Abs)
//上面這8個bit是常量,設備必須返回0
//這樣的數據段個數為5
0x95, 0x05, // REPORT_COUNT (5)
//每個段大小為1bit
0x75, 0x01, // REPORT_SIZE (1)
//用途是LED,即用來控制鍵盤上的LED用的,因此下面會說明它是輸出用
0x05, 0x08, // USAGE_PAGE (LEDs)
//用途最小值是Num Lock,即數字鍵鎖定燈
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
//用途最大值是Kana,這個是什麼燈我也不清楚^_^
0x29, 0x05, // USAGE_MAXIMUM (Kana)
//如前面所說,這個欄位是輸出用的,用來控制LED。變數,值,絕對值。
//1表示燈亮,0表示燈滅
0x91, 0x02, // OUTPUT (Data,Var,Abs)
//這樣的數據段個數為1
0x95, 0x01, // REPORT_COUNT (1)
//每個段大小為3bits
0x75, 0x03, // REPORT_SIZE (3)
//輸出用,常量,值,絕對
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
//由於要按位元組對齊,而前面控制LED的只用了5個bit,
//所以後面需要附加3個不用bit,設置為常量。
//報告個數為6
0x95, 0x06, // REPORT_COUNT (6)
//每個段大小為8bits
0x75, 0x08, // REPORT_SIZE (8)
//邏輯最小值0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//邏輯最大值255
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
//用途頁為按鍵
0x05, 0x07, // USAGE_PAGE (Keyboard)
//使用最小值為0
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
//使用最大值為0x65
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
//輸入用,變數,數組,絕對值
0x81, 0x00, // INPUT (Data,Ary,Abs)
//以上定義了6個8bit寬的數組,每個8bit(即一個位元組)用來表示一個按鍵,所以可以同時
//有6個按鍵按下。沒有按鍵按下時,全部返回0。如果按下的鍵太多,導致鍵盤掃描系統
//無法區分按鍵時,則全部返回0x01,即6個0x01。如果有一個鍵按下,則這6個位元組中的第一
//個位元組為相應的鍵值(具體的值參看HID Usage Tables),如果兩個鍵按下,則第1、2兩個
//位元組分別為相應的鍵值,以次類推。
//關集合,跟上面的對應
0xc0 // END_COLLECTION
};
通過上面的分析,我們知道這個報告中只有一個報告,所以沒有報告ID,
因此返回的都是實際使用的數據。總共有8位元組輸入,1位元組輸出。其中輸入的
第一位元組用來表示特殊按鍵,第二位元組保留,後面的六位元組為普通按鍵。如果
只有左ctrl鍵按下,則返回01 00 00 00 00 00 00 00(十六進制),如果
只有數字鍵1 按下,則返回00 00 59 00 00 00 00 00,如果數字
鍵1 和2 同時按下,則返回00 00 59 5A 00 00 00 00,如果
再按下左shift 鍵,則返回02 00 59 5A 00 00 00 00,
然後再釋放1 鍵,則返回02 00 5A 00 00 00 00 00,
然後全部按鍵釋放,則返回00 00 00 00 00 00 00 00。
這些數據(即報告)都是通過中斷端點返回的。當按下Num Lock鍵時,PC會發送
輸出報告,從報告描述符中我們知道,Num Lock的LED對應著輸出報告的最低位,
當數字小鍵盤打開時,輸出xxxxxxx1(二進制,打x的由其它的LED狀態決定);
當數字小鍵盤關閉時,輸出xxxxxxx0(同前)。取出最低位就可以控制數字鍵鎖定LED了。
下面這個報告描述符是USB滑鼠報告描述符,比起鍵盤的來說要簡單些。
它描述了4個位元組,第一個位元組表示按鍵,第二個位元組表示x軸(即滑鼠左右移動,
0表示不動,正值表示往右移,負值表示往左移),第三個位元組表示y軸(即滑鼠
上下移動,0表示不動,正值表示往下移動,負值表示往上移動),第四個位元組
表示滑鼠滾輪(正值為往上滾動,負值為往下滾動)。
code char MouseReportDescriptor[52] = {
//通用桌面設備
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//滑鼠
0x09, 0x02, // USAGE (Mouse)
//集合
0xa1, 0x01, // COLLECTION (Application)
//指針設備
0x09, 0x01, // USAGE (Pointer)
//集合
0xa1, 0x00, // COLLECTION (Physical)
//按鍵
0x05, 0x09, // USAGE_PAGE (Button)
//使用最小值1
0x19, 0x01, // USAGE_MINIMUM (Button 1)
//使用最大值3。1表示左鍵,2表示右鍵,3表示中鍵
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
//邏輯最小值0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//邏輯最大值1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
//數量為3
0x95, 0x03, // REPORT_COUNT (3)
//大小為1bit
0x75, 0x01, // REPORT_SIZE (1)
//輸入,變數,數值,絕對值
//以上3個bit分別表示滑鼠的三個按鍵情況,最低位(bit-0)為左鍵
//bit-1為右鍵,bit-2為中鍵,按下時對應的位值為1,釋放時對應的值為0
0x81, 0x02, // INPUT (Data,Var,Abs)
//填充5個bit,補足一個位元組
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
//用途頁為通用桌面
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
//用途為X
0x09, 0x30, // USAGE (X)
//用途為Y
0x09, 0x31, // USAGE (Y)
//用途為滾輪
0x09, 0x38, // USAGE (Wheel)
//邏輯最小值為-127
0x15, 0x81, // LOGICAL_MINIMUM (-127)
//邏輯最大值為+127
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
//大小為8個bits
0x75, 0x08, // REPORT_SIZE (8)
//數量為3個,即分別代表x,y,滾輪
0x95, 0x03, // REPORT_COUNT (3)
//輸入,變數,值,相對值
0x81, 0x06, // INPUT (Data,Var,Rel)
//關集合
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
通過對上面的報告分析,我們知道報告返回4個位元組,沒有報告ID。如果滑鼠左鍵按下,
則返回01 00 00 00(十六進制值),如果右鍵按下,則返回02 00 00 00,如果中鍵按下,
則返回04 00 00 00,如果三個鍵同時按下,則返回07 00 00 00。如果滑鼠往右移動則
第二位元組返回正值,值越大移動速度越快。其它的類推。
你的串號我已經記下,採納後我會幫你製作
㈣ USB HID是什麼意思
USB HID 是Human Interface Device的縮寫,由其名稱可以了解HID設備是直接與人交互的設備,例如鍵盤、滑鼠與游戲桿等。
㈤ usbhid 端點0如何發送數據
usbhid端點0發送數據是分兩次發送的。檢查一個端點的發送是否結束有二種方法:
1、當發送結束(設備收到ACK)時,有一個發送結束中斷,這個中斷由USB庫處理,並通過EP1_IN_Callback這個回調函數交由用戶程序確認。
2、查詢這個端點的狀態,如果端點狀態處於EP_TX_VALID,說明發送未結束,如果端點狀態處於EP_TX_NAK,說明發送結束。使用下述調用可以得到端點1的發送狀態:GetEPTxStatus(ENDP1)。
usbhid是Human Interface Device的縮寫,由其名稱可以了解HID設備是直接與人交互的設備,例如鍵盤、滑鼠與游戲桿等。不過HID設備並不一定要有人機介面,只要符合HID類別規范的設備都是HID設備。
交換的數據存儲在稱為報表(report)的結構內,設備的固件必須支持HID報表的格式。主機在控制與中斷傳輸中傳送與要求報表,來傳送與接收數據。報表的格式非常有彈性,可以處理任何類別的數據。
設備除了HID介面之外,它可能同時還包含有其他的USB介面。例如影像顯示設備可能使用HID介面來做亮度,對比,與更新率的軟體控制,而使用傳統的影 像介面來傳送要顯示的數據。USB擴音器可以使用實時傳輸來播放語音,同時使用HID介面來控制音量,震盪,與低音等。HID介面通常比傳統的控制介面來得便宜。
㈥ 如何使用winusb 訪問 hid 設備
這個項目為開源的USB庫 libusb 添加了對Windows 操作系統的支持, libusb 幫助開發者很容易的在Windows操作系統訪問USB設備。現在支持使用WinUSB 和HID 驅動程序的通過USB設備,也支持使用libusb-win32 和 libusbK 驅動程序的USB設備。
請注意 libusb-win32 和 libusbK 是不同的項目. libusb-win32 僅支持Windows,提供了和libusb-0.1 API 兼容的庫和內核驅動libusb0.sys。libusbK 是一個Windows 項目,為Windows和內核驅動程序libusbK.sys提供了一套新的API 。
二進制文件
在 Sourceforge files 提供了預編譯的二進制文件和相關的源代碼. 對於新的版本1.0.21 release, 也可以從 github 下載。
Windows版本的預編譯的二進制文件是使用下面的工具生成的:
㈦ 如何用C#操作usb介面的HID設備
SB學習板:EASYUSB51PROGRAMER配套光碟主頁地址何編寫應用程序與USBHID設備通訊(讀寫USBHID設備)說明:本實例所使用的上位機程序開發工具為Vis
㈧ USB-HID鍵盤輸出描述符控制小鍵盤指示燈的命令
可以用bus hound發送set_report命令,發送命令數據的各式為 21,09,00,02,00,00,01,00,
㈨ USB-HID的USB HID
是Human Interface Device的縮寫,由其名稱可以了解HID設備是直接與人交互的設備,例如鍵盤、滑鼠與游戲桿等。不過HID設備並不一定要有人機介面,只要符合HID類別規范的設備都是HID設備。
㈩ USB-HID的介紹
是Human Interface Device的縮寫,由其名稱可以了解HID設備是直接與人交互的設備,例如鍵盤、滑鼠與游戲桿等。不過HID設備並不一定要有人機介面,只要符合HID類別規范的設備都是HID設備。交換的數據存儲在稱為報表(report)的結構內,設備的固件必須支持HID報表的格式。主機在控制與中斷傳輸中傳送與要求報表,來傳送與接收數據。報表的格式非常有彈性,可以處理任何類別的數據。設備除了HID介面之外,它可能同時還包含有其他的USB介面。例如影像顯示設備可能使用HID介面來做亮度,對比,與更新率的軟體控制,而使用傳統的影 像介面來傳送要顯示的數據。USB擴音器可以使用實時傳輸來播放語音,同時使用HID介面來控制音量,震盪,與低音等。HID介面通常比傳統的控制介面來得便宜。