USBD_HID_SendReport只能发送4个字节
本帖最后由 jyl518-283289 于 2018-7-26 09:29 编辑初学USB,请大家支持下!
采用STM32Cube生成STM32F103VBT6的MDK程序,
使用如下库函数
USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,20);
发送20个字节的数据,在USB抓到的数据可以看到,分成5次发送了???难道不能一次发送完成 吗??
请大神帮忙解惑下!!!
看红色部分即可
按键盘“a”键的数据明显是一次发送8个字节
代码如下:
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"
#include "usb_device.h"
osThreadId defaultTaskHandle;
osThreadId RS485_1Handle;
uint8_t uart1_rx_buf;
uint8_t uart1_rx_len = 20;
uint8_t uart1_rx_flag = 0;
uint8_t sendbuffer={0x02,0x30,0x31,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x03};
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void StartDefaultTask(void const * argument);
void RS485_1Task(void const * argument);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
osThreadDef(RS485_1, RS485_1Task, osPriorityNormal, 0, 128);
RS485_1Handle = osThreadCreate(osThread(RS485_1), NULL);
osKernelStart();
while (1)
{
}
}
void RS485_1Task(void const * argument)
{
for(;;)
{
if(uart1_rx_flag)
{
HAL_GPIO_WritePin(DR1_GPIO_Port,DR1_Pin, GPIO_PIN_SET); //使能485_1发送
osDelay(100);
HAL_UART_Transmit_IT(&huart1, uart1_rx_buf, uart1_rx_len);
osDelay(100);
HAL_GPIO_WritePin(DR1_GPIO_Port,DR1_Pin, GPIO_PIN_RESET); //使能485_1接收
uart1_rx_flag = 0;
osDelay(100);
USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,20); //此处发送20字节数据到PC机
osDelay(100);
}
}
}
jyl518-283289 发表于 2018-7-27 14:24
1、USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值已由0x04改0x08,此值前期改过不管用,可能是只 ...
HID_EPIN_SIZE 改了没有?不然描述符里虽然说 wMaxPacketSize 是0x8, 但是你的设备因为USB 驱动配置原因自己发不出去 0x8个字节
另外,我说的HID REPORT SIZE 不是 HID_MOUSE_REPORT_DESC_SIZE, 这个可能给你搞糊涂了。HID_MOUSE_REPORT_DESC_SIZE 是 USB HID 描述符本身的大小 (见HID_MOUSE_ReportDesc)。 在这个 USB HID 描述符里面会告诉操作系统这个设备的HID REPORT是多少字节,如何去处理,等等细节。你学习下USB HID规范就了解了。HID_MOUSE_ReportDesc这个array里面奥妙很多的。
具体请看 http://notes.iopush.net/stm32-custom-usb-hid-step-by-step-2/ 和 http://damogranlabs.com/2016/03/stm32-custom-usb-hid-device-yes-please/ 在配置描述符和报告描述符里把单包最大字节数改成64,如果单包用不到64byte,改成你要发送的数据长度也行。 shanji 发表于 2018-7-25 09:18
在配置描述符和报告描述符里把单包最大字节数改成64,如果单包用不到64byte,改成你要发送的数据长度也行。 ...
找了半天,没找到配置描述符,和报告描述符的位置,能否明示下!! 如图,在usb_hid.c文件中
shanji 发表于 2018-7-25 09:18
在配置描述符和报告描述符里把单包最大字节数改成64,如果单包用不到64byte,改成你要发送的数据长度也行。 ...
漂亮 feiante 发表于 2018-7-25 11:45
如图,在usb_hid.c文件中
试着改了几处,还是没成功。 feiante 发表于 2018-7-25 11:45
如图,在usb_hid.c文件中
将配置描述符USB_HID_CONFIG_DESC_SIZ 改为0x08仍不行
另外报告描述符是改下面这里的数据吗?
不对。 你要改的是USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值。
同时,要让操作系统能够理解你的这个20字节Report,HID Report Descriptor里面的HID REPORT SIZE也需要改成20字节。 imgroot 发表于 2018-7-27 04:00
不对。 你要改的是USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值。
同时,要让操作系统能够理解 ...
1、USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值已由0x04改为0x08
2、HID Report Descriptor里面的HID REPORT SIZE也需要改成20字节。这个更改无从下手,试改几处都不行,如将HID_MOUSE_REPORT_DESC_SIZE值由74改为78
3、我把usbd_hid.c的文件内容全部贴在下面,请知道改么改个留个言。谢谢!谢谢!
/**
******************************************************************************
* @file usbd_hid.c
* @authorMCD Application Team
* @version V2.4.2
* @date 11-December-2015
* @brief This file provides the HID core functions.
*
* @verbatim
*
* ===================================================================
* HID ClassDescription
* ===================================================================
* This module manages the HID class V1.11 following the "Device Class Definition
* for Human Interface Devices (HID) Version 1.11 Jun 27, 2001".
* This driver implements the following aspects of the specification:
* - The Boot Interface Subclass
* - The Mouse protocol
* - Usage Page : Generic Desktop
* - Usage : Joystick
* - Collection : Application
*
* @note In HS mode and when the DMA is used, all variables and data structures
* dealing with the DMA during the transaction process should be 32-bit aligned.
*
*
*@endverbatim
*
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "usbd_hid.h"
#include "usbd_desc.h"
#include "usbd_ctlreq.h"
/** @addtogroup STM32_USB_DEVICE_LIBRARY
* @{
*/
/** @defgroup USBD_HID
* @brief usbd core module
* @{
*/
/** @defgroup USBD_HID_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @defgroup USBD_HID_Private_Defines
* @{
*/
/**
* @}
*/
/** @defgroup USBD_HID_Private_Macros
* @{
*/
/**
* @}
*/
/** @defgroup USBD_HID_Private_FunctionPrototypes
* @{
*/
static uint8_tUSBD_HID_Init (USBD_HandleTypeDef *pdev,
uint8_t cfgidx);
static uint8_tUSBD_HID_DeInit (USBD_HandleTypeDef *pdev,
uint8_t cfgidx);
static uint8_tUSBD_HID_Setup (USBD_HandleTypeDef *pdev,
USBD_SetupReqTypedef *req);
static uint8_t*USBD_HID_GetCfgDesc (uint16_t *length);
static uint8_t*USBD_HID_GetDeviceQualifierDesc (uint16_t *length);
static uint8_tUSBD_HID_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum);
/**
* @}
*/
/** @defgroup USBD_HID_Private_Variables
* @{
*/
USBD_ClassTypeDefUSBD_HID =
{
USBD_HID_Init,
USBD_HID_DeInit,
USBD_HID_Setup,
NULL, /*EP0_TxSent*/
NULL, /*EP0_RxReady*/
USBD_HID_DataIn, /*DataIn*/
NULL, /*DataOut*/
NULL, /*SOF */
NULL,
NULL,
USBD_HID_GetCfgDesc,
USBD_HID_GetCfgDesc,
USBD_HID_GetCfgDesc,
USBD_HID_GetDeviceQualifierDesc,
};
/* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc__ALIGN_END =
{
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
/************** Descriptor of Joystick Mouse interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x01, /*bNumEndpoints*/
0x03, /*bInterfaceClass: HID*/
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09, /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
0x11, /*bcdHID: HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22, /*bDescriptorType*/
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Mouse endpoint ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */
0x00,
HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/
/* 34 */
} ;
/* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_Desc__ALIGN_END=
{
/* 18 */
0x09, /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
0x11, /*bcdHID: HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22, /*bDescriptorType*/
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
};
/* USB Standard Device Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc__ALIGN_END =
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
0x00,
0x02,
0x00,
0x00,
0x00,
0x40,
0x01,
0x00,
};
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc__ALIGN_END =
{
0x05, 0x01,
0x09, 0x02,
0xA1, 0x01,
0x09, 0x01,
0xA1, 0x00,
0x05, 0x09,
0x19, 0x01,
0x29, 0x03,
0x15, 0x00,
0x25, 0x01,
0x95, 0x03,
0x75, 0x01,
0x81, 0x02,
0x95, 0x01,
0x75, 0x05,
0x81, 0x01,
0x05, 0x01,
0x09, 0x30,
0x09, 0x31,
0x09, 0x38,
0x15, 0x81,
0x25, 0x7F,
0x75, 0x08,
0x95, 0x03,
0x81, 0x06,
0xC0, 0x09,
0x3c, 0x05,
0xff, 0x09,
0x01, 0x15,
0x00, 0x25,
0x01, 0x75,
0x01, 0x95,
0x02, 0xb1,
0x22, 0x75,
0x06, 0x95,
0x01, 0xb1,
//0x06, 0x95,//
//0x01, 0xb1,//
0x01, 0xc0
};
/**
* @}
*/
/** @defgroup USBD_HID_Private_Functions
* @{
*/
/**
* @briefUSBD_HID_Init
* Initialize the HID interface
* @parampdev: device instance
* @paramcfgidx: Configuration index
* @retval status
*/
static uint8_tUSBD_HID_Init (USBD_HandleTypeDef *pdev,
uint8_t cfgidx)
{
uint8_t ret = 0;
/* Open EP IN */
USBD_LL_OpenEP(pdev,
HID_EPIN_ADDR,
USBD_EP_TYPE_INTR,
HID_EPIN_SIZE);
pdev->pClassData = USBD_malloc(sizeof (USBD_HID_HandleTypeDef));
if(pdev->pClassData == NULL)
{
ret = 1;
}
else
{
((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE;
}
return ret;
}
/**
* @briefUSBD_HID_Init
* DeInitialize the HID layer
* @parampdev: device instance
* @paramcfgidx: Configuration index
* @retval status
*/
static uint8_tUSBD_HID_DeInit (USBD_HandleTypeDef *pdev,
uint8_t cfgidx)
{
/* Close HID EPs */
USBD_LL_CloseEP(pdev,
HID_EPIN_ADDR);
/* FRee allocated memory */
if(pdev->pClassData != NULL)
{
USBD_free(pdev->pClassData);
pdev->pClassData = NULL;
}
return USBD_OK;
}
/**
* @briefUSBD_HID_Setup
* Handle the HID specific requests
* @parampdev: instance
* @paramreq: usb requests
* @retval status
*/
static uint8_tUSBD_HID_Setup (USBD_HandleTypeDef *pdev,
USBD_SetupReqTypedef *req)
{
uint16_t len = 0;
uint8_t*pbuf = NULL;
USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*) pdev->pClassData;
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
case USB_REQ_TYPE_CLASS :
switch (req->bRequest)
{
case HID_REQ_SET_PROTOCOL:
hhid->Protocol = (uint8_t)(req->wValue);
break;
case HID_REQ_GET_PROTOCOL:
USBD_CtlSendData (pdev,
(uint8_t *)&hhid->Protocol,
1);
break;
case HID_REQ_SET_IDLE:
hhid->IdleState = (uint8_t)(req->wValue >> 8);
break;
case HID_REQ_GET_IDLE:
USBD_CtlSendData (pdev,
(uint8_t *)&hhid->IdleState,
1);
break;
default:
USBD_CtlError (pdev, req);
return USBD_FAIL;
}
break;
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
case USB_REQ_GET_DESCRIPTOR:
if( req->wValue >> 8 == HID_REPORT_DESC)
{
len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength);
pbuf = HID_MOUSE_ReportDesc;
}
else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
{
pbuf = USBD_HID_Desc;
len = MIN(USB_HID_DESC_SIZ , req->wLength);
}
USBD_CtlSendData (pdev,
pbuf,
len);
break;
case USB_REQ_GET_INTERFACE :
USBD_CtlSendData (pdev,
(uint8_t *)&hhid->AltSetting,
1);
break;
case USB_REQ_SET_INTERFACE :
hhid->AltSetting = (uint8_t)(req->wValue);
break;
}
}
return USBD_OK;
}
/**
* @briefUSBD_HID_SendReport
* Send HID Report
* @parampdev: device instance
* @parambuff: pointer to report
* @retval status
*/
uint8_t USBD_HID_SendReport (USBD_HandleTypeDef*pdev,
uint8_t *report,
uint16_t len)
{
USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData;
if (pdev->dev_state == USBD_STATE_CONFIGURED )
{
if(hhid->state == HID_IDLE)
{
hhid->state = HID_BUSY;
USBD_LL_Transmit (pdev,
HID_EPIN_ADDR,
report,
len);
}
}
return USBD_OK;
}
/**
* @briefUSBD_HID_GetPollingInterval
* return polling interval from endpoint descriptor
* @parampdev: device instance
* @retval polling interval
*/
uint32_t USBD_HID_GetPollingInterval (USBD_HandleTypeDef *pdev)
{
uint32_t polling_interval = 0;
/* HIGH-speed endpoints */
if(pdev->dev_speed == USBD_SPEED_HIGH)
{
/* Sets the data transfer polling interval for high speed transfers.
Values between 1..16 are allowed. Values correspond to interval
of 2 ^ (bInterval-1). This option (8 ms, corresponds to HID_HS_BINTERVAL */
polling_interval = (((1 <<(HID_HS_BINTERVAL - 1)))/8);
}
else /* LOW and FULL-speed endpoints */
{
/* Sets the data transfer polling interval for low and full
speed transfers */
polling_interval =HID_FS_BINTERVAL;
}
return ((uint32_t)(polling_interval));
}
/**
* @briefUSBD_HID_GetCfgDesc
* return configuration descriptor
* @paramspeed : current device speed
* @paramlength : pointer data length
* @retval pointer to descriptor buffer
*/
static uint8_t*USBD_HID_GetCfgDesc (uint16_t *length)
{
*length = sizeof (USBD_HID_CfgDesc);
return USBD_HID_CfgDesc;
}
/**
* @briefUSBD_HID_DataIn
* handle data IN Stage
* @parampdev: device instance
* @paramepnum: endpoint index
* @retval status
*/
static uint8_tUSBD_HID_DataIn (USBD_HandleTypeDef *pdev,
uint8_t epnum)
{
/* Ensure that the FIFO is empty before a new transfer, this condition could
be caused bya new transfer before the end of the previous transfer */
((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE;
return USBD_OK;
}
/**
* @briefDeviceQualifierDescriptor
* return Device Qualifier descriptor
* @paramlength : pointer data length
* @retval pointer to descriptor buffer
*/
static uint8_t*USBD_HID_GetDeviceQualifierDesc (uint16_t *length)
{
*length = sizeof (USBD_HID_DeviceQualifierDesc);
return USBD_HID_DeviceQualifierDesc;
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 1、USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值已由0x04改0x08,此值前期改过不管用,可能是只改这一处的原因。
2、Report,HID Report Descriptor里面的HID REPORT SIZE也需要改成20字节。
这条不知怎么下手,试改了几处仍不行,如改过HID_MOUSE_REPORT_DESC_SIZE,值由74改为78,但仍不行
页:
[1]
2