HID Firmware修改 (HIDtoUARTExample)之二

1.      上位机向HID写数据时,每个包传输的第一个byte为写数据(OUT)report ID上、下位机必须一致

上位机配置位置:


下位机配置位置:




2.      HID向上位机返回数据时,每个包的第一个byte也必须是读数据(IN)report ID, 在下位机中,IN report ID的定义一定要和发送包的第一个byte相一致,否则读取错误。IN report ID与上位机无关





3.      下位机返回数据是通过调用SendPacket() 函数实现的

         SendPacket()函数的参数,是reportID,追进SendPacket函数内部看,可以看到,其发送原理是根据参数的report ID,调用对应的report handle函数(对应的report handle函数会将要发送的数据放入IN_PACKET[64] buffer中),然后将IN_PACKET内的数据(即要发送的数据)发出。

         如目前使用的reportID: IN_DATA,使用时就是SendPacket(IN_DATA),IN_DATA对应的report handle函数是IN_Data(),在IN_Data()中,将外部获取的数据赋值给IN_PACKET[64],代码如下:

void IN_Data (void)

{

         inti;

 

         IN_PACKET[0]= IN_DATA;

 

         for(i=1; i<64; i++)

                   IN_PACKET[i]= PERIPHERAL_READ_BUF[i-1];                  //PERIPHRAL_READ_BUF在main函数或其它函数中被赋值

                                                                                                                                   //PERIPHRAL_READ_BUF用作其它代码与HID lib的发送数据传输桥梁

                                                                                                                                   //这样可以把HID lib独立开

 

         IN_BUFFER.Ptr= IN_PACKET;

     IN_BUFFER.Length = IN_DATA_SIZE + 1;

}

 

注意:PERIPHERAL_READ_BUF就是自定义的外部接收数据存放buffer,为了与HID示例中HID操作的部分独立开,自己的程序可以对PERIPHERAL_READ_BUF进行赋值更改,发送时只要按HID示例的发送程序(SendPacket)操作就行。关键就是如上代码在IN_Data()函数中将两者联系起来。这样就可以把HID示例中,纯粹HID操作的部分独立出来,不用去管F340 的底层操作,这部分就可以做成lib。

自己的主函数中如要发送不同的数据,只要如下操作即可,

         //Read process

                            caseFPGA_R:

                            {

                                     for(cycCnt=0;cycCnt<64; cycCnt++)

                                     {

                                               PERIPHERAL_READ_BUF[cycCnt] = cycCnt +10;

                                     }        // PERIPHERAL_READ_BUF赋值可在任何需要的位置

 

                                SendPacket (IN_DATA);

                                     OUT_PACKET[1]= 0;

                                     break;

                            }

 

4.      SPI接口在FPGA中只有SPI3W和SPI4W两个chipaddress,而上位机和下位机之间的协议针对每种SPI接口都会定义一个chip address,各种SPI接口都可以转变成SPI3W和SPI4W这两种情况,FPGA通过设置拼接寄存器(0x11)完成。

         上位机在chipaddress下拉框中选择某种SPI接口后,就会在下拉框的消息函数中根据选择将FPGA配置成对应的拼接。

         在下位机中,各SPI读写的分支下,要将上位机传过来的chip address分别再设置回FPGASPI3W或SPI4W的chip address


参考:D:\Yifei\WorkPlace\Project\Driver_PG_HDMI2MIPI\Firmware                           readme


STM32F103C8 Serial(UART) to USB HID Keyboard Mouse Joystick 串口 转 USB键盘;鼠标;手柄 (1) 使用Composite Device 组合(复合)设备 (1.1) 1个Device -> 1个 Configuation -> 3个Interfance (Keyboard & Mouse & Joystick) (1.2) 支持BIOS模式中的操作(使用HID boot模式) 以便兼容在计算器中设定BIOS : (1.2.1) Keyboard Interfance -> HID (boot mode) -> 2个Endpoint(IN_0x81 & OUT_0x01) -> KeyboardReportDescriptor(不使用Report ID) (1.2.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x82) -> MouseReportDescriptor(不使用Report ID) (1.3) 支持Windows模式中的操作(使用Report ID) : (1.3.1) Multimedia Keyboard Interfance -> HID -> 1个Endpoint(IN_0x85) -> KeyboardReportDescriptor(使用Report ID) (1.3.1.1) Report ID (1) : HID Usage Page 0x0C, MediaKey (1.3.1.2) Report ID (2) : HID Usage Page 0x01, PowerControl (1.3.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x84) -> MouseReportDescriptor(使用Report ID) (1.3.2.1) Report ID (1) : 相对坐标 (-32768 ~ 32767) (1.3.2.2) Report ID (2) : 绝对坐标 (0 ~ 2048) (1.4) 支持反馈Keyboard_LED灯号: All Off; Num Lock; Caps Lock; Scroll Lock; Compose; Kana (1.5) Joystick Interfance -> HID -> 1个Endpoint(IN_0x83) -> JoyStickReportDescriptor (1.7) 支持GPIO命令, 可控制 12个GPIO 0/1 (hi/low)输出 (1.8) 支持Hardware或Software 插拔(Connect/Disconnect)命令 (1.9) 支持Software Reset命令 (2) 串口接收 命令 (2.1) UART协议: 115200, n, 8, 1 (2.2) 1帧发送字符串格式, 以 '{'开始, '}'结束 ','分隔 共10个10进制数字 例如: {1,2,3,4,5,6,7,8,9,10} (2.3) 第1位 区分 Keyboard(128) 或是 Mouse(64) 或是 Joystick(32) 或是 Control(32) 命令 Control_cmd = 0x10, Joystick_cmd = 0x20, Mouse_cmd = 0x40, MouseHold_cmd = 0x41, AbsMouse_cmd = 0x42, AbsMouseHold_cmd= 0x43, Keyboard_cmd = 0x80, KeyboardHold_cmd= 0x81, MediaKey_cmd = 0x82, MediaKeyHold_cmd= 0x83, Switch_cmd = 0xC0, SwitchHold_cmd = 0xC1 例如: {16, 0,0,0,0,0,0,0,0} --- 发送Control命令 {32, 0,0,0,0,0,0,0,0} --- 发送Joystick命令 {64, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标) {65, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标)(按住不放) {66, 0,0,0,0,0,0,0,0} --- 发送WinMouse命令(相对坐标/绝对坐标) {67, 0,0,0,0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值