USB-HID 鍵盤描述符簡介

USB-HID 鍵盤描述符簡介

USB-HID鍵盤設備描述符

#define DEVICE_DESCRIPTOR_SIZE	                0x12
#define USB_CTRL_TEST_SZIE      8
#define CONFIG_DESCRIPTOR_SIZE_DUSB				0x0029 //0x0022//0x0029
#define HID_REPORT_DESCRIPTOR_SIZE_DUSB		 	0x0041 //0x0041//0x007Cconst u8 DEVICEDESC_DUSB[18] = {DEVICE_DESCRIPTOR_SIZE,     // bLength0x01,						// bDescriptorType	= DEVICE0x10,0x01,					// bcdUSB(02.00 full-speed)0x00,						// bDeviceClass0x00,						// bDeviceSubClass0x00,//0x00					// bDeviceProtocolUSB_CTRL_TEST_SZIE,			     // bMaxPacketSize - 64bytes0x93,0x29,					// idVendOR      	= 00790x02,0x60,					// idProduct		= 181C0x00,0x01,					// bcdDevice		= 01.000x02,						// iManufacturer0x01,						// iProduct0x00,						// iSerialNumber0x01,
};

USB-HID鍵盤配置和其他描述符

const u8 HIDCONFIGDESC_DUSB[]={// Configuration Descriptor0x09,						// length of descriptor (9 bytes)0x02,						// descriptor type (CONFIGURATION)BYTE0(CONFIG_DESCRIPTOR_SIZE_DUSB),// Total length bytes (9 + 9 + 9 + 7 + 7)BYTE1(CONFIG_DESCRIPTOR_SIZE_DUSB),0x01,						// bNumInterfaces (1)0x01,						// bConfigurationValue (1)0x00,						// iConfiguration0x80,						// bmAttributes (bus powered)0xc8,						// MaxPower (400mA)// Configuration Descriptor End// Interface 0// InterfaceDescriptor0x09,						// bLength (9 bytes)0x04,						// bDescriptorType (INTERFACE)0x00,						// bInterfaceNumber (0)0x00,						// bAlternateSetting (0)0x02,//0X01						// bNumEndpoints (2)0x03,						// bInterfaceClass0x01,						// bInterfaceSubClass ()0x01,						// bInterfaceProtocol ()0x00,						// iInterface (not supported)// InterfaceDescriptor end// class descriptor0x09,						// bLength0x21,						// bDescritptorType0x10,0x01,					// bcdHID(01.11)0x00,						// bCountryCode0x01,						// bNumDescriptors0x22,						// bDescriptorTypeBYTE0(HID_REPORT_DESCRIPTOR_SIZE_DUSB),// wItemLength (tot. len. of report descriptor )BYTE1(HID_REPORT_DESCRIPTOR_SIZE_DUSB),// Endpoint1Descriptor0x07,						// descriptor length (7 bytes)0x05,						// descriptor type (ENDPOINT)0x81,						// endpoint address (IN endpoint, endpoint 1)0x03,						// endpoint attributes (interrupt)USB_CTRL_TEST_SZIE,0x00,                  //EP1_PACKET_SIZE_LE,			// maximum packet size0x0A,//0x0A,				// 10ms// Endpoint1Descriptor end// Endpoint2Descriptor0x07,						// bLength0x05,						// bDescriptorType0x82,						// bEndpointAddress (ep1, OUT)0x03,						// bmAttributes (INT)USB_CTRL_TEST_SZIE,0x00,  //EP2_PACKET_SIZE_LE,			// wMaxPacketSize (lsb first)0x0A,						// bInterval - 10ms// Endpoint2Descriptor End
}

USB-HID鍵盤報告描述符

const u8 HIDREPORTDESC_DUSB[] =
{0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard0xA1,0x01,// Main app collection0x05,0x07,// Global KeyBoard//第1字節0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)0x15,0x00,// Global Logical Min0x25,0x01,// Global Logical Max0x95,0x08,// Global ReportCount0x75,0x01,// Global ReportSize0x81,0x02,// Main Input(Data,Var,Abs)//第2字節0x95,0x01,// Global ReportCount0x75,0x08,// Global ReportSize0x81,0x01,// Main Input(Cnst,Var,Abs)//第3-8字節0x95,0x03,// Global ReportCount0x75,0x01,// Global ReportSize0x05,0x08,// Global Logical Min0x19,0x01,0x29,0x03,// Local Usage Max0x91,0x02,// Main Output(Data,Ary,Abs)//1字節輸出報告0x95,0x05,// Global Logical Min0x75,0x01,// Global Logical Max0x91,0x01,// Global ReportCount0x95,0x06,// Global ReportSize0x75,0x08,// Global LED0x15,0x00,// Local Usage Min0x26,0x0f,0x00,// Local Usage Max0x05,0x07,// Main Output(Data,Var,Abs)//補足上面變成1個字節0x19,0x00,// Global ReportCount0x2a,0xff,0x00,// Global ReportSize0x81,0x00,// Main Output(Cnst,Var,Abs)0xc0      // Main End collection
}

在設置地址的時候,也需要將數據長度改了

//Set Address
AT(.usbdev.com)
static bool do_set_address(ude_t *ude)
{
//    printf("%s\n", __func__);spb_wrap_t *spb = &ude->spb;if(Read_USB_Mode==USB_Xbox_Mode){ude->ep.epsize = USB_CTRL_SIZE;             //默認為8,收到SetAddress后,將MAXEPSIZE改為64。}else{ude->ep.epsize = USB_CTRL_TEST_SZIE;//這個是鍵盤的}if (ude->cfgval) {return false;                           //已經進行配置,不支持設置地址}ude->devaddr = BYTE0(spb->val);ude->set_faddr = 1;return true;
}

在發送數據的時候,同時需要將len改成8

void ude_hid_tx_process(void)
{//USB - HID 發送數據u8 len=9;epcb_t *epcb=udp_1.int_in;if(bXUsbIntInput_sync==1){if(USB_SendData_Cnt<200) USB_SendData_Cnt++;if(Read_USB_Mode==USB_Switch_Mode){len=64;memcpy(epcb->buf, &PS3InBuffer[1], len);}else{len = 8;//USB_CTRL_TEST_SZIE//printf("ude_hid_tx_process.. send:%d\r\n",len);memcpy(epcb->buf, Send_USB_DataBuf, len);}epcb->xptr=epcb->buf;epcb->xlen = len;epcb->xcnt = 0;epcb->first_pkt=1;}psfr_t sfr =  epcb->sfr;usb_set_cur_ep(epcb);if (0 == (sfr[TXCSR1] & BIT(0)))     //TX OK{if (epcb->first_pkt == 0 && epcb->xlen == 0){
//            if(Read_USB_Mode==USB_Switch_Mode)Send_Switch_ct=5;bXUsbIntInput_sync=0;work_cheak_ct=0;return;     //ok}epcb->first_pkt = 0;len = (epcb->xlen >= epcb->epsize) ? epcb->epsize : epcb->xlen;USB_ENTER_CRITICAL();USBEP1TXADR=DMA_ADR(epcb->xptr);USBCON2 = BIT(16+1) | len;             //設置FIFOsfr[TXCSR1] = BIT(0);                  //Kick TxRdydelay_us(2);                           //等待TxRdy同步USB_EXIT_CRITICAL();epcb->xptr += len;epcb->xlen -= len;epcb->xcnt += len;}bXUsbIntInput_sync=2;
}

最后根據鍵盤鍵值發送數據即可

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14303.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人類交互3 皮膚感覺與運動系統

皮膚感覺概述 皮膚是人體最大的器官之一&#xff0c;具有多種感覺功能&#xff0c;包括&#xff1a; 觸覺&#xff1a;通過觸覺&#xff0c;我們能感知物體的形狀、質地&#xff0c;幫助我們與外界環境進行互動和感知周圍物體的特征。 熱覺&#xff1a;熱覺使我們能感知周圍環…

ridge lightgbm catboost

本文從理論基礎、代碼實踐、內容總結三個方面來展示預測的三大基礎模型與手動調參自動調參內容細節。 一、理論基礎 ridgeRegression 圖片: https://uploader.shimo.im/f/uX43BitluzbQeqht.jpg!thumbnail?accessTokeneyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1Q…

哪款電腦桌面日歷記事本軟件好用?推薦優秀的電腦日歷記事本

對于眾多上班族而言&#xff0c;每天在電腦前忙碌已成為生活常態。若想提升工作效率&#xff0c;簡化繁瑣的工作流程&#xff0c;選擇一款出色的電腦桌面日歷與記事本軟件就顯得至關重要。 然而&#xff0c;在Windows操作系統上設定提醒顯得相當繁瑣&#xff0c;而系統自帶的記…

機器學習之注意力機制

概念 注意力機制(Attention Mechanism)是機器學習,特別是深度學習中一種重要的技術,最初被用于自然語言處理(NLP)任務,如機器翻譯。它的核心思想是,讓模型在處理輸入數據時,能夠“關注”到數據中的重要部分,而不是一視同仁地處理所有部分。這種機制極大地提高了模型…

Python貪心算法

貪心算法&#xff08;Greedy Algorithm&#xff09;是一種常見的算法設計策略&#xff0c;它在每一步選擇當前最優解&#xff0c;希望通過局部最優解最終得到全局最優解。貪心算法通常適用于滿足一些特定條件的問題&#xff0c;例如貨幣找零、活動選擇、任務調度等。貪心算法的…

Discourse 中可能使用的 HMAC 算法 Java 實現

在 DiscourseConnect 中&#xff0c;對數據的簽名使用的是 HMAC 算法。 實際使用的算法為 HmacSHA256。 Java 生成簽名的方法很簡單。 String hmac new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897682511405307018226").hmacHex(ssoPayload);HmacUti…

lvm磁盤創建失敗Couldn‘t create temporary archive name

問題情況: 在客戶單位創建lvm時,執行vgextend提示異常信息: 掛載磁盤報如下錯誤: ]# vgextend centos /dev/xvdb Physical volume “/dev/xvdb” successfully created. Couldn’t create temporary archive name. 原因:存儲使用100%,無法掛載,須預留部分空間出來。 解…

工程項目核算報價-項目CPQ報價系統控成本高效完成工程項目報價

首先了解一下CPQ報價如何解決工程項目報價難的? 目前市場上的工程項目報價方案制作效率低&#xff0c;易出錯&#xff0c;反復修改&#xff0c;成本核算的過程不夠嚴謹&#xff0c;憑以經驗和數據大差不差的估算當下項目&#xff0c;報價過程中會忽略側面因素&#xff0c;導致…

Elasticsearch 分析器的高級用法二(停用詞,拼音搜索)

Elasticsearch 分析器的高級用法二&#xff08;停用詞&#xff0c;拼音搜索&#xff09; 停用詞簡介停用詞分詞過濾器自定義停用詞分詞過濾器內置分析器的停用詞過濾器注意&#xff0c;有一個細節 拼音搜索安裝使用相關配置 停用詞 簡介 停用詞是指&#xff0c;在被分詞后的詞…

uwsgi狀態監控

使用 uWSGI 內置的狀態服務器 uWSGI 提供了一個內置的狀態服務器&#xff0c;你可以通過配置 uWSGI 來啟用它&#xff0c;并使用 Web 瀏覽器或者通過 HTTP 請求來查看 uWSGI 的狀態信息。 啟用狀態服務器 在 uWSGI 的配置文件中添加以下配置&#xff1a; [uwsgi] ... sta…

【MySQL精通之路】InnoDB(3)-MVCC多版本管理

InnoDB是一個多版本&#xff08;MVCC&#xff09;的存儲引擎。 它保留有關更改行的舊版本的信息&#xff0c;以支持事務性功能&#xff0c;如并發和回滾。 這些信息存儲在稱為回滾段的數據結構中的Undo表空間中。 參見“Undo表空間”。 InnoDB使用回滾段&#xff08;rollback…

TTS相關

文章目錄 VALL-E-X簡介code vist論文解讀代碼解讀模塊loss代碼 valle名詞解釋 VALL-E-X 簡介 微軟VALL-E-X&#xff1a;夸克在用 可以預訓練模型 端到端 code code&#xff1a;https://github.com/Plachtaa/VALL-E-X/tree/master 報錯1: File "/mnt/TTS/VALL-E-X/tes…

RabbitMQ有哪些優缺點

一&#xff0c;RabbitMQ有哪些優勢 RabbitMQ 作為一款流行的消息隊列服務&#xff0c;具有許多優勢&#xff0c;這些優勢使得它在各種應用場景中都能發揮出色的作用。以下是 RabbitMQ 的一些主要優勢&#xff1a; 高可靠性&#xff1a; RabbitMQ 使用持久化功能&#xff0c;無…

路由導航守衛-全局前置守衛

路由導航守衛中的全局前置守衛&#xff08;Global Before Guards&#xff09;是Vue Router中的一個重要概念。當路由即將改變&#xff08;導航觸發&#xff09;時&#xff0c;這些守衛會按照創建順序調用。它們允許你在路由跳轉之前執行一些操作或判斷&#xff0c;例如檢查用戶…

epoch的數據不能隨便截取,不是特征,要根據時間!!!

長個記性&#xff0c;這半個多月像個笑話&#xff0c;哈哈哈哈

pip如何快速install packet

1、在后面加-i https://mirrors.aliyun.com//pypi//simple或https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://mirrors.aliyun.com//pypi//simplepip install numpy1.21.0 -i https://pypi.tuna.tsinghua.edu.cn/simple2、需要注意的是&#xff0c;如果…

IDEA指南

IDEA簡介 截止到2021.08.31&#xff0c;是全世界最流行的Java集成開發環境 tips 快捷鍵 ctrl alt v&#xff1a;快速生成方法返回值接收代碼/** enter&#xff1a;生成javaDoc注釋 IDEA常見error Error: java: System Java Compiler was not found in classpath Proj…

【Python設計模式04】策略模式

策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;并將每個算法封裝起來&#xff0c;使它們可以互相替換。策略模式讓算法的變化不會影響使用算法的客戶端&#xff0c;使得算法可以獨立于客戶端的變化而變化。…

Langchain:數據連接封裝、緩存封裝和LCEL學習和探索

&#x1f335; 目錄 &#x1f335; &#x1f60b; 數據連接封裝 &#x1f354; 文檔加載器&#xff1a;Document Loaders 文檔處理器&#xff1a;TextSplitter 向量數據庫與向量檢索 總結 &#x1f349; 緩存封裝&#xff1a;Memory &#x1f3d6;? 對話上下文&#xf…

上位機圖像處理和嵌入式模塊部署(mcu之芯片選擇)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 目前市面上的mcu很多&#xff0c;有國產的&#xff0c;有進口的&#xff0c;總之種類很多。以stm32為例&#xff0c;這里面又包括了stm32f1、stm32…