Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.
Upstream: https://github.com/ARMmbed/DAPLink
Diff: source/usb/usb_lib.c
- Revision:
- 0:01f31e923fe2
diff -r 000000000000 -r 01f31e923fe2 source/usb/usb_lib.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/usb/usb_lib.c Tue Apr 07 12:55:42 2020 +0200 @@ -0,0 +1,2741 @@ +/** + * @file usb_lib.c + * @brief USB library + * + * DAPLink Interface Firmware + * Copyright (c) 2009-2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#include <string.h> +#include "rl_usb.h" +#include "usb.h" +#include "settings.h" + +#pragma thumb +#pragma O3 + + +/*------------------------------------------------------------------------------ + * Library for usb_config.c + *----------------------------------------------------------------------------*/ + +#ifdef __USB_CONFIG__ + +/*------------------------------------------------------------------------------ + * USB Device Configuration + *----------------------------------------------------------------------------*/ + +#if (USBD_ENABLE) + +U8 USBD_AltSetting[USBD_IF_NUM_MAX]; +U8 USBD_EP0Buf[USBD_MAX_PACKET0]; +const U8 usbd_power = USBD_POWER; +const U8 usbd_hs_enable = USBD_HS_ENABLE; +const U8 usbd_bos_enable = USBD_BOS_ENABLE; +U16 usbd_if_num = USBD_IF_NUM_MAX; +const U8 usbd_ep_num = USBD_EP_NUM; +const U8 usbd_max_packet0 = USBD_MAX_PACKET0; + + +/*------------------------------------------------------------------------------ + * USB Device Class Configuration + *----------------------------------------------------------------------------*/ + +#if (!USBD_HID_BINTERVAL) +#define USBD_HID_INTERVAL 1 +#else +#define USBD_HID_INTERVAL USBD_HID_BINTERVAL +#endif +#if (!USBD_HID_HS_BINTERVAL) +#define USBD_HID_HS_INTERVAL 1 +#else +#define USBD_HID_HS_INTERVAL (2 << ((USBD_HID_HS_BINTERVAL & 0x0F)-1)) +#endif + +#if (USBD_HID_ENABLE) +U8 usbd_hid_if_num; //assigned during runtime init +const U8 usbd_hid_ep_intin = USBD_HID_EP_INTIN; +const U8 usbd_hid_ep_intout = USBD_HID_EP_INTOUT; +const U16 usbd_hid_interval[2] = {USBD_HID_INTERVAL, USBD_HID_HS_INTERVAL}; +const U16 usbd_hid_maxpacketsize[2] = {USBD_HID_WMAXPACKETSIZE, USBD_HID_HS_WMAXPACKETSIZE}; +const U8 usbd_hid_inreport_num = USBD_HID_INREPORT_NUM; +const U8 usbd_hid_outreport_num = USBD_HID_OUTREPORT_NUM; +const U16 usbd_hid_inreport_max_sz = USBD_HID_INREPORT_MAX_SZ; +const U16 usbd_hid_outreport_max_sz = USBD_HID_OUTREPORT_MAX_SZ; +const U16 usbd_hid_featreport_max_sz = USBD_HID_FEATREPORT_MAX_SZ; +U16 USBD_HID_PollingCnt; +U8 USBD_HID_IdleCnt[USBD_HID_INREPORT_NUM]; +U8 USBD_HID_IdleReload[USBD_HID_INREPORT_NUM]; +U8 USBD_HID_IdleSet[USBD_HID_INREPORT_NUM]; +U8 USBD_HID_InReport[USBD_HID_INREPORT_MAX_SZ + 1]; +U8 USBD_HID_OutReport[USBD_HID_OUTREPORT_MAX_SZ + 1]; +U8 USBD_HID_FeatReport[USBD_HID_FEATREPORT_MAX_SZ + 1]; +#endif + +#if (USBD_MSC_ENABLE) +U8 usbd_msc_if_num; //assigned during runtime init +const U8 usbd_msc_ep_bulkin = USBD_MSC_EP_BULKIN; +const U8 usbd_msc_ep_bulkout = USBD_MSC_EP_BULKOUT; +const U16 usbd_msc_maxpacketsize[2] = {USBD_MSC_WMAXPACKETSIZE, USBD_MSC_HS_WMAXPACKETSIZE}; +const U8 *usbd_msc_inquiry_data = USBD_MSC_INQUIRY_DATA; +const U16 USBD_MSC_BulkBufSize = USBD_MSC_MAX_PACKET; +U8 USBD_MSC_BulkBuf[USBD_MSC_MAX_PACKET]; +#endif + +#if (USBD_ADC_ENABLE) +const U8 usbd_adc_cif_num = USBD_ADC_CIF_NUM; +const U8 usbd_adc_sif1_num = USBD_ADC_SIF1_NUM; +const U8 usbd_adc_sif2_num = USBD_ADC_SIF2_NUM; +const U8 usbd_adc_ep_isoout = USBD_ADC_EP_ISOOUT; +const U32 usbd_adc_cfg_datafreq = USBD_ADC_TSAMFREQ; +const U32 usbd_adc_cfg_p_s = USBD_ADC_CFG_P_S; +const U32 usbd_adc_cfg_p_c = USBD_ADC_CFG_P_C; +const U32 usbd_adc_cfg_b_s = (8 * USBD_ADC_CFG_P_C *USBD_ADC_CFG_P_S); +S16 USBD_ADC_DataBuf[8 * USBD_ADC_CFG_P_C * USBD_ADC_CFG_P_S]; +#endif + +#ifndef USBD_CDC_ACM_ENABLE +#if (USBD_CDC_ENABLE == 1) +#error "Please update usb_config.c file with new definitions for CDC, as new CDC is incompatible with the old one!" +#else +#define USBD_CDC_ACM_ENABLE 0 +#endif +#endif + +#if (USBD_CDC_ACM_ENABLE) +U8 usbd_cdc_acm_cif_num = 0; //assigned during runtime init +U8 usbd_cdc_acm_dif_num = 0; //assigned during runtime init +const U8 usbd_cdc_acm_ep_intin = USBD_CDC_ACM_EP_INTIN; +const U8 usbd_cdc_acm_ep_bulkin = USBD_CDC_ACM_EP_BULKIN; +const U8 usbd_cdc_acm_ep_bulkout = USBD_CDC_ACM_EP_BULKOUT; +const U16 usbd_cdc_acm_sendbuf_sz = USBD_CDC_ACM_SENDBUF_SIZE; +const U16 usbd_cdc_acm_receivebuf_sz = USBD_CDC_ACM_RECEIVEBUF_SIZE; +const U16 usbd_cdc_acm_maxpacketsize[2] = {USBD_CDC_ACM_WMAXPACKETSIZE, USBD_CDC_ACM_HS_WMAXPACKETSIZE}; +const U16 usbd_cdc_acm_maxpacketsize1[2] = {USBD_CDC_ACM_WMAXPACKETSIZE1, USBD_CDC_ACM_HS_WMAXPACKETSIZE1}; +U8 USBD_CDC_ACM_SendBuf[USBD_CDC_ACM_SENDBUF_SIZE]; +U8 USBD_CDC_ACM_ReceiveBuf[USBD_CDC_ACM_RECEIVEBUF_SIZE]; +U8 USBD_CDC_ACM_NotifyBuf[10]; +#endif + +#if (USBD_WEBUSB_ENABLE) +U8 usbd_webusb_if_num; //assigned during runtime init +const U8 usbd_webusb_vendor_code = USBD_WEBUSB_VENDOR_CODE; +#else +const U8 usbd_webusb_vendor_code; +#endif + +#if (USBD_WINUSB_ENABLE) +const U8 usbd_winusb_vendor_code = USBD_WINUSB_VENDOR_CODE; +#else +const U8 usbd_winusb_vendor_code; +#endif + +#if (USBD_BULK_ENABLE) +U8 usbd_bulk_if_num = 0; //assigned during runtime init +const U8 usbd_bulk_ep_bulkin = USBD_BULK_EP_BULKIN; +const U8 usbd_bulk_ep_bulkout = USBD_BULK_EP_BULKOUT; +const U16 usbd_bulk_maxpacketsize[2] = {USBD_BULK_WMAXPACKETSIZE, USBD_BULK_HS_WMAXPACKETSIZE}; +const U16 USBD_Bulk_BulkBufSize = USBD_BULK_MAX_PACKET; +U8 USBD_Bulk_BulkInBuf[USBD_BULK_MAX_PACKET]; +U8 USBD_Bulk_BulkOutBuf[USBD_BULK_MAX_PACKET]; +#endif + +/*------------------------------------------------------------------------------ + * USB Device Override Event Handler Fuctions + *----------------------------------------------------------------------------*/ + +#if (USBD_HID_ENABLE) +#ifndef __RTX +void USBD_Configure_Event(void) +{ + USBD_HID_Configure_Event(); +} +#endif +#ifdef __RTX +#if ((USBD_HID_EP_INTOUT != 0) && (USBD_HID_EP_INTIN != USBD_HID_EP_INTOUT)) +#if (USBD_HID_EP_INTIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_HID_EP_INTIN_Event +#endif + +#if (USBD_HID_EP_INTOUT == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_HID_EP_INTOUT_Event +#endif +#elif (USBD_HID_EP_INTOUT != 0) +#if (USBD_HID_EP_INTIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_HID_EP_INT_Event +#endif +#else +#if (USBD_HID_EP_INTIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_HID_EP_INTIN_Event +#endif +#endif +#else +#if (USBD_HID_EP_INTIN != USBD_HID_EP_INTOUT) +#if (USBD_HID_EP_INTIN == 1) +#define USBD_EndPoint1 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 2) +#define USBD_EndPoint2 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 3) +#define USBD_EndPoint3 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 4) +#define USBD_EndPoint4 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 5) +#define USBD_EndPoint5 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 6) +#define USBD_EndPoint6 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 7) +#define USBD_EndPoint7 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 8) +#define USBD_EndPoint8 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 9) +#define USBD_EndPoint9 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 10) +#define USBD_EndPoint10 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 11) +#define USBD_EndPoint11 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 12) +#define USBD_EndPoint12 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 13) +#define USBD_EndPoint13 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 14) +#define USBD_EndPoint14 USBD_HID_EP_INTIN_Event +#elif (USBD_HID_EP_INTIN == 15) +#define USBD_EndPoint15 USBD_HID_EP_INTIN_Event +#endif + +#if (USBD_HID_EP_INTOUT == 1) +#define USBD_EndPoint1 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 2) +#define USBD_EndPoint2 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 3) +#define USBD_EndPoint3 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 4) +#define USBD_EndPoint4 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 5) +#define USBD_EndPoint5 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 6) +#define USBD_EndPoint6 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 7) +#define USBD_EndPoint7 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 8) +#define USBD_EndPoint8 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 9) +#define USBD_EndPoint9 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 10) +#define USBD_EndPoint10 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 11) +#define USBD_EndPoint11 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 12) +#define USBD_EndPoint12 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 13) +#define USBD_EndPoint13 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 14) +#define USBD_EndPoint14 USBD_HID_EP_INTOUT_Event +#elif (USBD_HID_EP_INTOUT == 15) +#define USBD_EndPoint15 USBD_HID_EP_INTOUT_Event +#endif + +#else + +#if (USBD_HID_EP_INTIN == 1) +#define USBD_EndPoint1 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 2) +#define USBD_EndPoint2 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 3) +#define USBD_EndPoint3 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 4) +#define USBD_EndPoint4 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 5) +#define USBD_EndPoint5 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 6) +#define USBD_EndPoint6 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 7) +#define USBD_EndPoint7 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 8) +#define USBD_EndPoint8 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 9) +#define USBD_EndPoint9 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 10) +#define USBD_EndPoint10 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 11) +#define USBD_EndPoint11 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 12) +#define USBD_EndPoint12 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 13) +#define USBD_EndPoint13 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 14) +#define USBD_EndPoint14 USBD_HID_EP_INT_Event +#elif (USBD_HID_EP_INTIN == 15) +#define USBD_EndPoint15 USBD_HID_EP_INT_Event +#endif + +#endif /* (USBD_HID_EP_INTIN != USBD_HID_EP_INTOUT) */ + +#endif /*#ifdef __RTX*/ +#else +BOOL USBD_ReqGetDescriptor_HID(U8 **pD, U32 *len) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Setup_HID_ReqToIF(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_HID_ReqToIF(void) +{ + return (__FALSE); +} +#endif /* (USBD_HID_ENABLE) */ + +#if (USBD_MSC_ENABLE) +#ifdef __RTX +#if (USBD_MSC_EP_BULKIN != USBD_MSC_EP_BULKOUT) +#if (USBD_MSC_EP_BULKIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_MSC_EP_BULKIN_Event +#endif + +#if (USBD_MSC_EP_BULKOUT == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_MSC_EP_BULKOUT_Event +#endif +#else +#if (USBD_MSC_EP_BULKIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_MSC_EP_BULK_Event +#endif +#endif +#else +#if (USBD_MSC_EP_BULKIN != USBD_MSC_EP_BULKOUT) +#if (USBD_MSC_EP_BULKIN == 1) +#define USBD_EndPoint1 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 2) +#define USBD_EndPoint2 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 3) +#define USBD_EndPoint3 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 4) +#define USBD_EndPoint4 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 5) +#define USBD_EndPoint5 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 6) +#define USBD_EndPoint6 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 7) +#define USBD_EndPoint7 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 8) +#define USBD_EndPoint8 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 9) +#define USBD_EndPoint9 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 10) +#define USBD_EndPoint10 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 11) +#define USBD_EndPoint11 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 12) +#define USBD_EndPoint12 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 13) +#define USBD_EndPoint13 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 14) +#define USBD_EndPoint14 USBD_MSC_EP_BULKIN_Event +#elif (USBD_MSC_EP_BULKIN == 15) +#define USBD_EndPoint15 USBD_MSC_EP_BULKIN_Event +#endif + +#if (USBD_MSC_EP_BULKOUT == 1) +#define USBD_EndPoint1 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 2) +#define USBD_EndPoint2 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 3) +#define USBD_EndPoint3 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 4) +#define USBD_EndPoint4 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 5) +#define USBD_EndPoint5 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 6) +#define USBD_EndPoint6 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 7) +#define USBD_EndPoint7 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 8) +#define USBD_EndPoint8 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 9) +#define USBD_EndPoint9 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 10) +#define USBD_EndPoint10 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 11) +#define USBD_EndPoint11 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 12) +#define USBD_EndPoint12 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 13) +#define USBD_EndPoint13 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 14) +#define USBD_EndPoint14 USBD_MSC_EP_BULKOUT_Event +#elif (USBD_MSC_EP_BULKOUT == 15) +#define USBD_EndPoint15 USBD_MSC_EP_BULKOUT_Event +#endif +#else +#if (USBD_MSC_EP_BULKIN == 1) +#define USBD_EndPoint1 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 2) +#define USBD_EndPoint2 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 3) +#define USBD_EndPoint3 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 4) +#define USBD_EndPoint4 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 5) +#define USBD_EndPoint5 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 6) +#define USBD_EndPoint6 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 7) +#define USBD_EndPoint7 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 8) +#define USBD_EndPoint8 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 9) +#define USBD_EndPoint9 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 10) +#define USBD_EndPoint10 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 11) +#define USBD_EndPoint11 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 12) +#define USBD_EndPoint12 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 13) +#define USBD_EndPoint13 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 14) +#define USBD_EndPoint14 USBD_MSC_EP_BULK_Event +#elif (USBD_MSC_EP_BULKIN == 15) +#define USBD_EndPoint15 USBD_MSC_EP_BULK_Event +#endif +#endif +#endif +#else +void USBD_ReqClrFeature_MSC(U32 EPNum) +{ + +} +BOOL USBD_EndPoint0_Setup_MSC_ReqToIF(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_MSC_ReqToIF(void) +{ + return (__FALSE); +} +#endif /* (USBD_MSC_ENABLE) */ + +#if (USBD_ADC_ENABLE == 0) +BOOL USBD_EndPoint0_Setup_ADC_ReqToIF(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Setup_ADC_ReqToEP(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_ADC_ReqToIF(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_ADC_ReqToEP(void) +{ + return (__FALSE); +} +#endif /* (USBD_ADC_ENABLE) */ + +#if (USBD_CDC_ACM_ENABLE) +#ifdef __RTX +#if (USBD_CDC_ACM_EP_INTIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_CDC_ACM_EP_INTIN_Event +#endif +#else +#if (USBD_CDC_ACM_EP_INTIN == 1) +#define USBD_EndPoint1 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 2) +#define USBD_EndPoint2 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 3) +#define USBD_EndPoint3 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 4) +#define USBD_EndPoint4 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 5) +#define USBD_EndPoint5 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 6) +#define USBD_EndPoint6 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 7) +#define USBD_EndPoint7 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 8) +#define USBD_EndPoint8 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 9) +#define USBD_EndPoint9 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 10) +#define USBD_EndPoint10 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 11) +#define USBD_EndPoint11 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 12) +#define USBD_EndPoint12 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 13) +#define USBD_EndPoint13 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 14) +#define USBD_EndPoint14 USBD_CDC_ACM_EP_INTIN_Event +#elif (USBD_CDC_ACM_EP_INTIN == 15) +#define USBD_EndPoint15 USBD_CDC_ACM_EP_INTIN_Event +#endif +#endif + +#ifdef __RTX +#if (USBD_CDC_ACM_EP_BULKIN != USBD_CDC_ACM_EP_BULKOUT) +#if (USBD_CDC_ACM_EP_BULKIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_CDC_ACM_EP_BULKIN_Event +#endif + +#if (USBD_CDC_ACM_EP_BULKOUT == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_CDC_ACM_EP_BULKOUT_Event +#endif +#else +#if (USBD_CDC_ACM_EP_BULKIN == 1) +#define USBD_RTX_EndPoint1 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 2) +#define USBD_RTX_EndPoint2 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 3) +#define USBD_RTX_EndPoint3 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 4) +#define USBD_RTX_EndPoint4 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 5) +#define USBD_RTX_EndPoint5 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 6) +#define USBD_RTX_EndPoint6 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 7) +#define USBD_RTX_EndPoint7 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 8) +#define USBD_RTX_EndPoint8 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 9) +#define USBD_RTX_EndPoint9 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 10) +#define USBD_RTX_EndPoint10 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 11) +#define USBD_RTX_EndPoint11 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 12) +#define USBD_RTX_EndPoint12 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 13) +#define USBD_RTX_EndPoint13 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 14) +#define USBD_RTX_EndPoint14 USBD_RTX_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 15) +#define USBD_RTX_EndPoint15 USBD_RTX_CDC_ACM_EP_BULK_Event +#endif +#endif +#else +#if (USBD_CDC_ACM_EP_BULKIN != USBD_CDC_ACM_EP_BULKOUT) +#if (USBD_CDC_ACM_EP_BULKIN == 1) +#define USBD_EndPoint1 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 2) +#define USBD_EndPoint2 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 3) +#define USBD_EndPoint3 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 4) +#define USBD_EndPoint4 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 5) +#define USBD_EndPoint5 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 6) +#define USBD_EndPoint6 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 7) +#define USBD_EndPoint7 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 8) +#define USBD_EndPoint8 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 9) +#define USBD_EndPoint9 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 10) +#define USBD_EndPoint10 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 11) +#define USBD_EndPoint11 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 12) +#define USBD_EndPoint12 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 13) +#define USBD_EndPoint13 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 14) +#define USBD_EndPoint14 USBD_CDC_ACM_EP_BULKIN_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 15) +#define USBD_EndPoint15 USBD_CDC_ACM_EP_BULKIN_Event +#endif + +#if (USBD_CDC_ACM_EP_BULKOUT == 1) +#define USBD_EndPoint1 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 2) +#define USBD_EndPoint2 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 3) +#define USBD_EndPoint3 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 4) +#define USBD_EndPoint4 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 5) +#define USBD_EndPoint5 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 6) +#define USBD_EndPoint6 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 7) +#define USBD_EndPoint7 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 8) +#define USBD_EndPoint8 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 9) +#define USBD_EndPoint9 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 10) +#define USBD_EndPoint10 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 11) +#define USBD_EndPoint11 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 12) +#define USBD_EndPoint12 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 13) +#define USBD_EndPoint13 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 14) +#define USBD_EndPoint14 USBD_CDC_ACM_EP_BULKOUT_Event +#elif (USBD_CDC_ACM_EP_BULKOUT == 15) +#define USBD_EndPoint15 USBD_CDC_ACM_EP_BULKOUT_Event +#endif +#else +#if (USBD_CDC_ACM_EP_BULKIN == 1) +#define USBD_EndPoint1 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 2) +#define USBD_EndPoint2 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 3) +#define USBD_EndPoint3 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 4) +#define USBD_EndPoint4 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 5) +#define USBD_EndPoint5 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 6) +#define USBD_EndPoint6 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 7) +#define USBD_EndPoint7 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 8) +#define USBD_EndPoint8 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 9) +#define USBD_EndPoint9 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 10) +#define USBD_EndPoint10 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 11) +#define USBD_EndPoint11 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 12) +#define USBD_EndPoint12 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 13) +#define USBD_EndPoint13 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 14) +#define USBD_EndPoint14 USBD_CDC_ACM_EP_BULK_Event +#elif (USBD_CDC_ACM_EP_BULKIN == 15) +#define USBD_EndPoint15 USBD_CDC_ACM_EP_BULK_Event +#endif +#endif +#endif +#else +BOOL USBD_EndPoint0_Setup_CDC_ReqToIF(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_CDC_ReqToIF(void) +{ + return (__FALSE); +} +#endif /* (USBD_CDC_ACM_ENABLE) */ + +#if (USBD_BULK_ENABLE) + +#if (USBD_BULK_EP_BULKIN != USBD_BULK_EP_BULKOUT) + +#if (USBD_BULK_EP_BULKIN == 1) +#define USBD_EndPoint1 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 2) +#define USBD_EndPoint2 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 3) +#define USBD_EndPoint3 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 4) +#define USBD_EndPoint4 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 5) +#define USBD_EndPoint5 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 6) +#define USBD_EndPoint6 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 7) +#define USBD_EndPoint7 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 8) +#define USBD_EndPoint8 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 9) +#define USBD_EndPoint9 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 10) +#define USBD_EndPoint10 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 11) +#define USBD_EndPoint11 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 12) +#define USBD_EndPoint12 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 13) +#define USBD_EndPoint13 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 14) +#define USBD_EndPoint14 USBD_BULK_EP_BULKIN_Event +#elif (USBD_BULK_EP_BULKIN == 15) +#define USBD_EndPoint15 USBD_BULK_EP_BULKIN_Event +#endif + +#if (USBD_BULK_EP_BULKOUT == 1) +#define USBD_EndPoint1 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 2) +#define USBD_EndPoint2 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 3) +#define USBD_EndPoint3 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 4) +#define USBD_EndPoint4 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 5) +#define USBD_EndPoint5 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 6) +#define USBD_EndPoint6 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 7) +#define USBD_EndPoint7 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 8) +#define USBD_EndPoint8 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 9) +#define USBD_EndPoint9 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 10) +#define USBD_EndPoint10 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 11) +#define USBD_EndPoint11 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 12) +#define USBD_EndPoint12 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 13) +#define USBD_EndPoint13 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 14) +#define USBD_EndPoint14 USBD_BULK_EP_BULKOUT_Event +#elif (USBD_BULK_EP_BULKOUT == 15) +#define USBD_EndPoint15 USBD_BULK_EP_BULKOUT_Event +#endif + +#else +#if (USBD_BULK_EP_BULKIN == 1) +#define USBD_EndPoint1 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 2) +#define USBD_EndPoint2 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 3) +#define USBD_EndPoint3 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 4) +#define USBD_EndPoint4 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 5) +#define USBD_EndPoint5 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 6) +#define USBD_EndPoint6 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 7) +#define USBD_EndPoint7 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 8) +#define USBD_EndPoint8 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 9) +#define USBD_EndPoint9 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 10) +#define USBD_EndPoint10 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 11) +#define USBD_EndPoint11 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 12) +#define USBD_EndPoint12 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 13) +#define USBD_EndPoint13 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 14) +#define USBD_EndPoint14 USBD_BULK_EP_BULK_Event +#elif (USBD_BULK_EP_BULKIN == 15) +#define USBD_EndPoint15 USBD_BULK_EP_BULK_Event +#endif +#endif + +#endif /* (USBD_BULK_ENABLE) */ + +#if (USBD_CLS_ENABLE) +#else +BOOL USBD_EndPoint0_Setup_CLS_ReqToDEV(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Setup_CLS_ReqToIF(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Setup_CLS_ReqToEP(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_CLS_ReqToDEV(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_CLS_ReqToIF(void) +{ + return (__FALSE); +} +BOOL USBD_EndPoint0_Out_CLS_ReqToEP(void) +{ + return (__FALSE); +} +#endif /* (USBD_CLS_ENABLE) */ + +#if ((USBD_CDC_ACM_ENABLE)) +#ifndef __RTX +void USBD_Reset_Event(void) +{ +#if (USBD_CDC_ACM_ENABLE) + USBD_CDC_ACM_Reset_Event(); +#endif +#if (USBD_MSC_ENABLE) + USBD_MSC_Reset_Event(); +#endif +} +#endif +#endif /* ((USBD_CDC_ACM_ENABLE)) */ + +#if ((USBD_HID_ENABLE) || (USBD_ADC_ENABLE) || (USBD_CDC_ACM_ENABLE) || (USBD_CLS_ENABLE)) +#ifndef __RTX +void USBD_SOF_Event(void) +{ +#if (USBD_HID_ENABLE) + USBD_HID_SOF_Event(); +#endif +#if (USBD_ADC_ENABLE) + USBD_ADC_SOF_Event(); +#endif +#if (USBD_CDC_ACM_ENABLE) + USBD_CDC_ACM_SOF_Event(); +#endif +#if (USBD_CLS_ENABLE) + USBD_CLS_SOF_Event(); +#endif +} +#endif +#endif /* ((USBD_HID_ENABLE) || (USBD_ADC_ENABLE) || (USBD_CDC_ACM_ENABLE) || (USBD_CLS_ENABLE)) */ + +/* USB Device - Device Events Callback Functions */ +__weak void USBD_Power_Event(BOOL power); +__weak void USBD_Reset_Event(void); +__weak void USBD_Suspend_Event(void); +__weak void USBD_Resume_Event(void); +__weak void USBD_WakeUp_Event(void); +__weak void USBD_SOF_Event(void); +__weak void USBD_Error_Event(U32 error); + +/* USB Device - Device Events Callback Pointers */ +void (* const USBD_P_Power_Event)(BOOL power) = USBD_Power_Event; +void (* const USBD_P_Reset_Event)(void) = USBD_Reset_Event; +void (* const USBD_P_Suspend_Event)(void) = USBD_Suspend_Event; +void (* const USBD_P_Resume_Event)(void) = USBD_Resume_Event; +void (* const USBD_P_WakeUp_Event)(void) = USBD_WakeUp_Event; +void (* const USBD_P_SOF_Event)(void) = USBD_SOF_Event; +void (* const USBD_P_Error_Event)(U32 error) = USBD_Error_Event; + +/* USB Device - Endpoint Events Callback Functions */ +extern void USBD_EndPoint0(U32 event); +#ifndef USBD_EndPoint1 +__weak void USBD_EndPoint1(U32 event); +#endif +#ifndef USBD_EndPoint2 +__weak void USBD_EndPoint2(U32 event); +#endif +#ifndef USBD_EndPoint3 +__weak void USBD_EndPoint3(U32 event); +#endif +#ifndef USBD_EndPoint4 +__weak void USBD_EndPoint4(U32 event); +#endif +#ifndef USBD_EndPoint5 +__weak void USBD_EndPoint5(U32 event); +#endif +#ifndef USBD_EndPoint6 +__weak void USBD_EndPoint6(U32 event); +#endif +#ifndef USBD_EndPoint7 +__weak void USBD_EndPoint7(U32 event); +#endif +#ifndef USBD_EndPoint8 +__weak void USBD_EndPoint8(U32 event); +#endif +#ifndef USBD_EndPoint9 +__weak void USBD_EndPoint9(U32 event); +#endif +#ifndef USBD_EndPoint10 +__weak void USBD_EndPoint10(U32 event); +#endif +#ifndef USBD_EndPoint11 +__weak void USBD_EndPoint11(U32 event); +#endif +#ifndef USBD_EndPoint12 +__weak void USBD_EndPoint12(U32 event); +#endif +#ifndef USBD_EndPoint13 +__weak void USBD_EndPoint13(U32 event); +#endif +#ifndef USBD_EndPoint14 +__weak void USBD_EndPoint14(U32 event); +#endif +#ifndef USBD_EndPoint15 +__weak void USBD_EndPoint15(U32 event); +#endif + +/* USB Device - Endpoint Events Callback Pointers */ +void (* const USBD_P_EP[16])(U32 event) = { + USBD_EndPoint0, + USBD_EndPoint1, + USBD_EndPoint2, + USBD_EndPoint3, + USBD_EndPoint4, + USBD_EndPoint5, + USBD_EndPoint6, + USBD_EndPoint7, + USBD_EndPoint8, + USBD_EndPoint9, + USBD_EndPoint10, + USBD_EndPoint11, + USBD_EndPoint12, + USBD_EndPoint13, + USBD_EndPoint14, + USBD_EndPoint15 +}; + +/* USB Device - Core Events Callback Functions */ +__weak void USBD_Configure_Event(void); +__weak void USBD_Interface_Event(void); +__weak void USBD_Feature_Event(void); + +/* USB Device - Core Events Callback Pointers */ +void (* const USBD_P_Configure_Event)(void) = USBD_Configure_Event; +void (* const USBD_P_Interface_Event)(void) = USBD_Interface_Event; +void (* const USBD_P_Feature_Event)(void) = USBD_Feature_Event; + +#ifdef __RTX +const BOOL __rtx = __TRUE; + +#if ((USBD_HID_ENABLE) || (USBD_ADC_ENABLE) || (USBD_CDC_ACM_ENABLE) || (USBD_CLS_ENABLE)) +__weak void USBD_RTX_Device(void) +{ + U16 evt; + + for (;;) { + os_evt_wait_or(0xFFFF, 0xFFFF); /* Wait for an Event */ + evt = os_evt_get(); /* Get Event Flags */ + + if (evt & USBD_EVT_RESET) { +#if (USBD_CDC_ACM_ENABLE) + USBD_CDC_ACM_Reset_Event(); +#endif +#if (USBD_MSC_ENABLE) + USBD_MSC_Reset_Event(); +#endif + } + + if (evt & USBD_EVT_SOF) { +#if (USBD_HID_ENABLE) + USBD_HID_SOF_Event(); +#endif +#if (USBD_ADC_ENABLE) + USBD_ADC_SOF_Event(); +#endif +#if (USBD_CDC_ACM_ENABLE) + USBD_CDC_ACM_SOF_Event(); +#endif +#if (USBD_CLS_ENABLE) + USBD_CLS_SOF_Event(); +#endif + } + } +} +#else +__weak void USBD_RTX_Device(void); +#endif + +/* USB Device - Device Events Callback Pointer */ +void (* const USBD_RTX_P_Device)(void) = USBD_RTX_Device; + +/* USB Device Endpoint Events Callback Functions */ +extern void USBD_RTX_EndPoint0(void); +#ifndef USBD_RTX_EndPoint1 +__weak void USBD_RTX_EndPoint1(void); +#endif +#ifndef USBD_RTX_EndPoint2 +__weak void USBD_RTX_EndPoint2(void); +#endif +#ifndef USBD_RTX_EndPoint3 +__weak void USBD_RTX_EndPoint3(void); +#endif +#ifndef USBD_RTX_EndPoint4 +__weak void USBD_RTX_EndPoint4(void); +#endif +#ifndef USBD_RTX_EndPoint5 +__weak void USBD_RTX_EndPoint5(void); +#endif +#ifndef USBD_RTX_EndPoint6 +__weak void USBD_RTX_EndPoint6(void); +#endif +#ifndef USBD_RTX_EndPoint7 +__weak void USBD_RTX_EndPoint7(void); +#endif +#ifndef USBD_RTX_EndPoint8 +__weak void USBD_RTX_EndPoint8(void); +#endif +#ifndef USBD_RTX_EndPoint9 +__weak void USBD_RTX_EndPoint9(void); +#endif +#ifndef USBD_RTX_EndPoint10 +__weak void USBD_RTX_EndPoint10(void); +#endif +#ifndef USBD_RTX_EndPoint11 +__weak void USBD_RTX_EndPoint11(void); +#endif +#ifndef USBD_RTX_EndPoint12 +__weak void USBD_RTX_EndPoint12(void); +#endif +#ifndef USBD_RTX_EndPoint13 +__weak void USBD_RTX_EndPoint13(void); +#endif +#ifndef USBD_RTX_EndPoint14 +__weak void USBD_RTX_EndPoint14(void); +#endif +#ifndef USBD_RTX_EndPoint15 +__weak void USBD_RTX_EndPoint15(void); +#endif + +#if (USBD_HID_ENABLE) +__weak void USBD_RTX_Core(void) +{ + U16 evt; + + for (;;) { + os_evt_wait_or(0xFFFF, 0xFFFF); /* Wait for an Event */ + evt = os_evt_get(); /* Get Event Flags */ + + if (evt & USBD_EVT_SET_CFG) { + USBD_HID_Configure_Event(); + } + } +} +#else +__weak void USBD_RTX_Core(void); +#endif + +/* USB Device - Core Events Callback Pointer */ +void (* const USBD_RTX_P_Core)(void) = USBD_RTX_Core; + +/* USB Device Endpoint Events Callback Pointers */ +void (* const USBD_RTX_P_EP[16])(void) = { + USBD_RTX_EndPoint0, + USBD_RTX_EndPoint1, + USBD_RTX_EndPoint2, + USBD_RTX_EndPoint3, + USBD_RTX_EndPoint4, + USBD_RTX_EndPoint5, + USBD_RTX_EndPoint6, + USBD_RTX_EndPoint7, + USBD_RTX_EndPoint8, + USBD_RTX_EndPoint9, + USBD_RTX_EndPoint10, + USBD_RTX_EndPoint11, + USBD_RTX_EndPoint12, + USBD_RTX_EndPoint13, + USBD_RTX_EndPoint14, + USBD_RTX_EndPoint15, +}; + +void usbd_os_evt_set(U16 event_flags, U32 task) +{ + if (task) { + os_evt_set(event_flags, task); + } +} +U16 usbd_os_evt_get(void) +{ + return (os_evt_get()); +} +U32 usbd_os_evt_wait_or(U16 wait_flags, U16 timeout) +{ + return (os_evt_wait_or(wait_flags, timeout)); +} + +#else +const BOOL __rtx = __FALSE; + +void usbd_os_evt_set(U16 event_flags, U32 task) +{ + +} +U16 usbd_os_evt_get(void) +{ + return (0); +} +U32 usbd_os_evt_wait_or(U16 wait_flags, U16 timeout) +{ + return (0); +} +#endif + +#ifdef __RTX + +typedef struct { + void *stack; + U16 size; +} user_stack_t; + +#if USBD_ENABLE && !defined(USBD_RTX_CORE_STACK) +#error "USB core stack must be defined" +#endif +#if USBD_ENABLE && !defined(USBD_RTX_DEVICE_STACK) +#error "USB device stack must be defined" +#endif +#if USBD_ENABLE && !defined(USBD_RTX_ENDPOINT0_STACK) +#error "USB endpoint 0 must be defined" +#endif + +#if !defined(USBD_HID_EP_INTIN_STACK) +#define USBD_HID_EP_INTIN_STACK 0 +#endif +#if !defined(USBD_HID_EP_INTOUT_STACK) +#define USBD_HID_EP_INTOUT_STACK 0 +#endif +#if !defined(USBD_MSC_EP_BULKIN_STACK) +#define USBD_MSC_EP_BULKIN_STACK 0 +#endif +#if !defined(USBD_MSC_EP_BULKOUT_STACK) +#define USBD_MSC_EP_BULKOUT_STACK 0 +#endif +#if !defined(USBD_ADC_EP_ISOOUT_STACK) +#define USBD_ADC_EP_ISOOUT_STACK 0 +#endif +#if !defined(USBD_CDC_ACM_EP_INTIN_STACK) +#define USBD_CDC_ACM_EP_INTIN_STACK 0 +#endif +#if !defined(USBD_CDC_ACM_EP_BULKIN_STACK) +#define USBD_CDC_ACM_EP_BULKIN_STACK 0 +#endif +#if !defined(USBD_CDC_ACM_EP_BULKOUT_STACK) +#define USBD_CDC_ACM_EP_BULKOUT_STACK 0 +#endif + +#if USBD_HID_EP_INTIN == 0 && USBD_HID_EP_INTIN_STACK > 0 +#error "USBD_HID_EP_INTIN stack unused - must be 0" +#endif +#if USBD_HID_EP_INTOUT == 0 && USBD_HID_EP_INTOUT_STACK > 0 +#error "USBD_HID_EP_INTOUT stack unused - must be 0" +#endif +#if USBD_MSC_EP_BULKIN == 0 && USBD_MSC_EP_BULKIN_STACK > 0 +#error "USBD_MSC_EP_BULKIN stack unused - must be 0" +#endif +#if USBD_MSC_EP_BULKOUT == 0 && USBD_MSC_EP_BULKOUT_STACK > 0 +#error "USBD_MSC_EP_BULKOUT stack unused - must be 0" +#endif +#if USBD_ADC_EP_ISOOUT == 0 && USBD_ADC_EP_ISOOUT_STACK > 0 +#error "USBD_ADC_EP_ISOOUT stack unused - must be 0" +#endif +#if USBD_CDC_ACM_EP_INTIN == 0 && USBD_CDC_ACM_EP_INTIN_STACK > 0 +#error "USBD_CDC_ACM_EP_INTIN stack unused - must be 0" +#endif +#if USBD_CDC_ACM_EP_BULKIN == 0 && USBD_CDC_ACM_EP_BULKIN_STACK > 0 +#error "USBD_CDC_ACM_EP_BULKIN stack unused - must be 0" +#endif +#if USBD_CDC_ACM_EP_BULKOUT == 0 && USBD_CDC_ACM_EP_BULKOUT_STACK > 0 +#error "USBD_CDC_ACM_EP_BULKOUT stack unused - must be 0" +#endif + +#if USBD_ENABLE +static U64 usbd_core_stack[USBD_RTX_CORE_STACK / 8]; +static U64 usbd_device_stack[USBD_RTX_DEVICE_STACK / 8]; +static U64 usbd_endpoint0_stack[USBD_RTX_ENDPOINT0_STACK / 8]; +#endif + +#if (USBD_HID_EP_INTIN_STACK > 0) +static U64 usbd_hid_ep_intin_stack[USBD_HID_EP_INTIN_STACK / 8]; +#endif +#if (USBD_HID_EP_INTOUT_STACK > 0) +static U64 usbd_hid_ep_intout_stack[USBD_HID_EP_INTOUT_STACK / 8]; +#endif +#if (USBD_MSC_EP_BULKIN_STACK > 0) +static U64 usbd_msc_ep_bulkin_stack[USBD_MSC_EP_BULKIN_STACK / 8]; +#endif +#if (USBD_MSC_EP_BULKOUT_STACK > 0) +static U64 usbd_msc_ep_bulkout_stack[USBD_MSC_EP_BULKOUT_STACK / 8]; +#endif +#if (USBD_ADC_EP_ISOOUT_STACK > 0) +static U64 usbd_adc_ep_isoout_stack[USBD_ADC_EP_ISOOUT_STACK / 8]; +#endif +#if (USBD_CDC_ACM_EP_INTIN_STACK > 0) +static U64 usbd_cdc_acm_ep_intin_stack[USBD_CDC_ACM_EP_INTIN_STACK / 8]; +#endif +#if (USBD_CDC_ACM_EP_BULKIN_STACK > 0) +static U64 usbd_cdc_acm_ep_bulkin_stack[USBD_CDC_ACM_EP_BULKIN_STACK / 8]; +#endif +#if (USBD_CDC_ACM_EP_BULKOUT_STACK > 0) +static U64 usbd_cdc_acm_ep_bulkout_stack[USBD_CDC_ACM_EP_BULKOUT_STACK / 8]; +#endif + +// Check HID +#if (USBD_HID_ENABLE && !USBD_HID_EP_INTIN_STACK && USBD_HID_EP_INTIN != USBD_HID_EP_INTOUT) +#error "USBD_HID_EP_INTIN_STACK must be defined" +#endif +#if (USBD_HID_ENABLE && !USBD_HID_EP_INTOUT_STACK && USBD_HID_EP_INTIN != USBD_HID_EP_INTOUT && USBD_HID_EP_INTOUT != 0) +#error "USBD_HID_EP_INTOUT_STACK must be defined" +#endif +#if (USBD_HID_ENABLE && USBD_HID_EP_INTIN_STACK == 0 && USBD_HID_EP_INTOUT_STACK == 0) +#error "HID stack must be defined" +#endif +#if (USBD_HID_EP_INTIN_STACK > 0 && USBD_HID_EP_INTOUT_STACK > 0 && USBD_HID_EP_INTIN == USBD_HID_EP_INTOUT) +#error "Multiple HID stacks defined for same EP" +#endif + +// Check MSC +#if (USBD_MSC_ENABLE && !USBD_MSC_EP_BULKIN_STACK && USBD_MSC_EP_BULKIN != USBD_MSC_EP_BULKOUT) +#error "USBD_MSC_EP_BULKIN_STACK must be defined" +#endif +#if (USBD_MSC_ENABLE && !USBD_MSC_EP_BULKOUT_STACK && USBD_MSC_EP_BULKIN != USBD_MSC_EP_BULKOUT) +#error "USBD_MSC_EP_BULKIN_STACK must be defined" +#endif +#if (USBD_MSC_ENABLE && USBD_MSC_EP_BULKIN_STACK == 0 && USBD_MSC_EP_BULKOUT_STACK == 0) +#error "MSC stack must be defined" +#endif +#if (USBD_MSC_EP_BULKIN_STACK > 0 && USBD_MSC_EP_BULKOUT_STACK > 0 && USBD_MSC_EP_BULKIN == USBD_MSC_EP_BULKOUT) +#error "Multiple MSC stacks defined for same EP" +#endif + +// Check ADC +#if (USBD_ADC_ENABLE && !USBD_ADC_EP_ISOOUT_STACK) +#error "ADC stack must be defined" +#endif + +// Check CDC +#if (USBD_CDC_ACM_ENABLE && !USBD_CDC_ACM_EP_INTIN_STACK) +#error "CDC ACM INTIN stack must be defined" +#endif +#if (USBD_CDC_ACM_ENABLE && !USBD_CDC_ACM_EP_BULKIN_STACK && USBD_CDC_ACM_EP_BULKIN != USBD_CDC_ACM_EP_BULKOUT) +#error "USBD_CDC_ACM_EP_BULKIN must be defined" +#endif +#if (USBD_CDC_ACM_ENABLE && !USBD_CDC_ACM_EP_BULKOUT_STACK && USBD_CDC_ACM_EP_BULKIN != USBD_CDC_ACM_EP_BULKOUT) +#error "USBD_CDC_ACM_EP_BULKOUT must be defined" +#endif +#if (USBD_CDC_ACM_ENABLE && USBD_CDC_ACM_EP_BULKIN_STACK == 0 && USBD_CDC_ACM_EP_BULKOUT_STACK == 0) +#error "CDC BULK stack must be defined" +#endif +#if (USBD_CDC_ACM_EP_BULKIN_STACK > 0 && USBD_CDC_ACM_EP_BULKOUT_STACK > 0 && USBD_CDC_ACM_EP_BULKIN == USBD_CDC_ACM_EP_BULKOUT) +#error "Multiple CDC stacks defined for same EP" +#endif + +static const user_stack_t user_stack_list[16] = { +#if USBD_ENABLE + [0] = {usbd_endpoint0_stack, sizeof(usbd_endpoint0_stack)}, +#endif +#if (USBD_HID_EP_INTIN_STACK > 0) + [USBD_HID_EP_INTIN] = {usbd_hid_ep_intin_stack, sizeof(usbd_hid_ep_intin_stack)}, +#endif +#if (USBD_HID_EP_INTOUT_STACK > 0) + [USBD_HID_EP_INTOUT] = {usbd_hid_ep_intout_stack, sizeof(usbd_hid_ep_intout_stack)}, +#endif +#if (USBD_MSC_EP_BULKIN_STACK > 0) + [USBD_MSC_EP_BULKIN] = {usbd_msc_ep_bulkin_stack, sizeof(usbd_msc_ep_bulkin_stack)}, +#endif +#if (USBD_MSC_EP_BULKOUT_STACK > 0) + [USBD_MSC_EP_BULKOUT] = {usbd_msc_ep_bulkout_stack, sizeof(usbd_msc_ep_bulkout_stack)}, +#endif +#if (USBD_ADC_EP_ISOOUT_STACK > 0) + [USBD_ADC_EP_ISOOUT] = {usbd_adc_ep_isoout_stack, sizeof(usbd_adc_ep_isoout_stack)}, +#endif +#if (USBD_CDC_ACM_EP_INTIN_STACK > 0) + [USBD_CDC_ACM_EP_INTIN] = {usbd_cdc_acm_ep_intin_stack, sizeof(usbd_cdc_acm_ep_intin_stack)}, +#endif +#if (USBD_CDC_ACM_EP_BULKIN_STACK > 0) + [USBD_CDC_ACM_EP_BULKIN] = {usbd_cdc_acm_ep_bulkin_stack, sizeof(usbd_cdc_acm_ep_bulkin_stack)}, +#endif +#if (USBD_CDC_ACM_EP_BULKOUT_STACK > 0) + [USBD_CDC_ACM_EP_BULKOUT] = {usbd_cdc_acm_ep_bulkout_stack, sizeof(usbd_cdc_acm_ep_bulkout_stack)}, +#endif +}; + +#endif /* __RTX */ + +void USBD_RTX_TaskInit(void) +{ +#ifdef __RTX + /* Initialize memory pools for endpoints */ + U32 i; + USBD_RTX_DevTask = 0; + + if (USBD_RTX_P_Device) { + USBD_RTX_DevTask = os_tsk_create_user(USBD_RTX_Device, 3, usbd_device_stack, + sizeof(usbd_device_stack)); + } + + for (i = 0; i <= 15; i++) { + USBD_RTX_EPTask[i] = 0; + + if (USBD_RTX_P_EP[i]) { + // Set the control endpoint (endpoint 0) thread to a high priority. + // According to the USB 2.0 specification, the time to complete standard + // request with no data must be under 50ms. If a long caluclation + // such as a CRC is running on a higher priority thread, USB enumeration + // can fail because of this timeout. + uint8_t priority = 0 == i ? 200 : 20; + USBD_RTX_EPTask[i] = os_tsk_create_user(USBD_RTX_P_EP[i], priority, user_stack_list[i].stack, + user_stack_list[i].size); + } + } + + USBD_RTX_CoreTask = 0; + + if (USBD_RTX_P_Core) { + USBD_RTX_CoreTask = os_tsk_create_user(USBD_RTX_Core, 2, usbd_core_stack, + sizeof(usbd_core_stack)); + } + +#endif +} + +/*------------------------------------------------------------------------------ + * CDC Sizes + *----------------------------------------------------------------------------*/ +#define CDC_HEADER_SIZE 5 +#define CDC_CALL_MANAGEMENT_SIZE 5 +#define CDC_ABSTRACT_CONTROL_MANAGEMENT_SIZE 4 +#define CDC_UNION_SIZE 5 + +/*------------------------------------------------------------------------------ + * USB Device Descriptors + *----------------------------------------------------------------------------*/ +#define USBD_MSC_DESC_LEN (USB_INTERFACE_DESC_SIZE + 2*USB_ENDPOINT_DESC_SIZE) +#define USBD_CDC_ACM_DESC_LEN (USBD_MULTI_IF * USB_INTERFACE_ASSOC_DESC_SIZE + \ + /* CDC Interface 1 */ \ + USB_INTERFACE_DESC_SIZE + CDC_HEADER_SIZE + CDC_CALL_MANAGEMENT_SIZE + \ + CDC_ABSTRACT_CONTROL_MANAGEMENT_SIZE + CDC_UNION_SIZE + USB_ENDPOINT_DESC_SIZE + \ + /* CDC Interface 2 */ \ + USB_INTERFACE_DESC_SIZE + USB_ENDPOINT_DESC_SIZE + USB_ENDPOINT_DESC_SIZE) +#define USBD_HID_DESC_LEN (USB_INTERFACE_DESC_SIZE + USB_HID_DESC_SIZE + \ + (USB_ENDPOINT_DESC_SIZE*((USBD_HID_EP_INTIN != 0)+(USBD_HID_EP_INTOUT != 0)))) +#define USBD_BULK_DESC_LEN (USB_INTERFACE_DESC_SIZE + 2*USB_ENDPOINT_DESC_SIZE) + +#define USBD_HID_DESC_OFS (USB_CONFIGUARTION_DESC_SIZE + USB_INTERFACE_DESC_SIZE + \ + USBD_MSC_ENABLE * USBD_MSC_DESC_LEN + USBD_CDC_ACM_ENABLE * USBD_CDC_ACM_DESC_LEN) + +#define USBD_WTOTALLENGTH_MAX (USB_CONFIGUARTION_DESC_SIZE + \ + USBD_CDC_ACM_DESC_LEN * USBD_CDC_ACM_ENABLE + \ + USBD_HID_DESC_LEN * USBD_HID_ENABLE + \ + (USB_INTERFACE_DESC_SIZE) * USBD_WEBUSB_ENABLE + \ + USBD_BULK_DESC_LEN * USBD_BULK_ENABLE + \ + USBD_MSC_DESC_LEN * USBD_MSC_ENABLE) + +/*------------------------------------------------------------------------------ + Default HID Report Descriptor + *----------------------------------------------------------------------------*/ + +/* Bit Input Output + 0 IN0 OUT0 + 1 IN1 OUT1 + 2 IN2 OUT2 + 3 IN3 OUT3 + 4 IN4 OUT4 + 5 IN5 OUT5 + 6 IN6 OUT6 + 7 IN7 OUT7 +*/ + +__weak \ +const U8 USBD_HID_ReportDescriptor[] = { + HID_UsagePageVendor(0x00), + HID_Usage(0x01), + HID_Collection(HID_Application), + HID_LogicalMin(0), /* value range: 0 - 0xFF */ + HID_LogicalMaxS(0xFF), + HID_ReportSize(8), /* 8 bits */ +#if (USBD_HID_INREPORT_MAX_SZ > 255) + HID_ReportCountS(USBD_HID_INREPORT_MAX_SZ), +#else + HID_ReportCount(USBD_HID_INREPORT_MAX_SZ), +#endif + HID_Usage(0x01), + HID_Input(HID_Data | HID_Variable | HID_Absolute), +#if (USBD_HID_OUTREPORT_MAX_SZ > 255) + HID_ReportCountS(USBD_HID_OUTREPORT_MAX_SZ), +#else + HID_ReportCount(USBD_HID_OUTREPORT_MAX_SZ), +#endif + HID_Usage(0x01), + HID_Output(HID_Data | HID_Variable | HID_Absolute), +#if (USBD_HID_FEATREPORT_MAX_SZ > 255) + HID_ReportCountS(USBD_HID_FEATREPORT_MAX_SZ), +#else + HID_ReportCount(USBD_HID_FEATREPORT_MAX_SZ), +#endif + HID_Usage(0x01), + HID_Feature(HID_Data | HID_Variable | HID_Absolute), + HID_EndCollection, +}; + +__weak \ +const U16 USBD_HID_ReportDescriptorSize = sizeof(USBD_HID_ReportDescriptor); + +__weak \ +U16 USBD_HID_DescriptorOffset = USBD_HID_DESC_OFS; + +/* USB Device Standard Descriptor */ +__weak \ +const U8 USBD_DeviceDescriptor[] = { + USB_DEVICE_DESC_SIZE, /* bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */ +#if (USBD_BOS_ENABLE) + WBVAL(0x0210), /* 2.10 */ /* bcdUSB */ +#elif ((USBD_HS_ENABLE) || (USBD_MULTI_IF)) + WBVAL(0x0200), /* 2.00 */ /* bcdUSB */ +#else + WBVAL(0x0110), /* 1.10 */ /* bcdUSB */ +#endif +#if (USBD_MULTI_IF) + USB_DEVICE_CLASS_MISCELLANEOUS, /* bDeviceClass */ + 0x02, /* bDeviceSubClass */ + 0x01, /* bDeviceProtocol */ +#elif (USBD_CDC_ACM_ENABLE) + USB_DEVICE_CLASS_COMMUNICATIONS, /* bDeviceClass CDC*/ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ +#else + 0x00, /* bDeviceClass */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ +#endif + USBD_MAX_PACKET0, /* bMaxPacketSize0 */ + WBVAL(USBD_DEVDESC_IDVENDOR), /* idVendor */ + WBVAL(USBD_DEVDESC_IDPRODUCT), /* idProduct */ + WBVAL(USBD_DEVDESC_BCDDEVICE), /* bcdDevice */ + 0x01, /* iManufacturer */ + 0x02, /* iProduct */ + 0x03 * USBD_STRDESC_SER_ENABLE, /* iSerialNumber */ + 0x01 /* bNumConfigurations: one possible configuration*/ +}; + +#if (USBD_HS_ENABLE) +/* USB Device Qualifier Descriptor (for Full Speed) */ +__weak \ +const U8 USBD_DeviceQualifier[] = { + USB_DEVICE_QUALI_SIZE, /* bLength */ + USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE, /* bDescriptorType */ +#if (USBD_BOS_ENABLE) + WBVAL(0x0210), /* 2.10 */ /* bcdUSB */ +#else + WBVAL(0x0200), /* 2.00 */ /* bcdUSB */ +#endif + 0x00, /* bDeviceClass */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + USBD_MAX_PACKET0, /* bMaxPacketSize0 */ + 0x01, /* bNumConfigurations */ + 0x00 /* bReserved */ +}; + +/* USB Device Qualifier Descriptor for High Speed */ +__weak \ +const U8 USBD_DeviceQualifier_HS[] = { + USB_DEVICE_QUALI_SIZE, /* bLength */ + USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE, /* bDescriptorType */ +#if (USBD_BOS_ENABLE) + WBVAL(0x0210), /* 2.10 */ /* bcdUSB */ +#else + WBVAL(0x0200), /* 2.00 */ /* bcdUSB */ +#endif + 0x00, /* bDeviceClass */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + USBD_MAX_PACKET0, /* bMaxPacketSize0 */ + 0x01, /* bNumConfigurations */ + 0x00 /* bReserved */ +}; +#else +/* USB Device Qualifier Descriptor (for Full Speed) */ +__weak \ +const U8 USBD_DeviceQualifier[] = { 0 }; + +/* USB Device Qualifier Descriptor for High Speed */ +__weak \ +const U8 USBD_DeviceQualifier_HS[] = { 0 }; +#endif + +#if (USBD_WINUSB_ENABLE) + +#define FUNCTION_SUBSET_LEN 160 +#define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132 + +#define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN) + +U8 USBD_WinUSBDescriptorSetDescriptor[] = { + WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ + WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ + 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ + WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ +#if (USBD_WEBUSB_ENABLE) + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE),// wLength + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE),// wDescriptorType + 0, // bFirstInterface USBD_WINUSB_IF_NUM + 0, // bReserved + WBVAL(FUNCTION_SUBSET_LEN), // wSubsetLength + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), // wLength + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), // wDescriptorType + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleId + 0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleId + WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN),// wLength + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), // wDescriptorType + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType + WBVAL(42), // wPropertyNameLength + 'D',0,'e',0,'v',0,'i',0,'c',0,'e',0, + 'I',0,'n',0,'t',0,'e',0,'r',0,'f',0,'a',0,'c',0,'e',0, + 'G',0,'U',0,'I',0,'D',0,'s',0,0,0, + WBVAL(80), // wPropertyDataLength + '{',0, + '9',0,'2',0,'C',0,'E',0,'6',0,'4',0,'6',0,'2',0,'-',0, + '9',0,'C',0,'7',0,'7',0,'-',0, + '4',0,'6',0,'F',0,'E',0,'-',0, + '9',0,'3',0,'3',0,'B',0,'-', + 0,'3',0,'1',0,'C',0,'B',0,'9',0,'C',0,'5',0,'A',0,'A',0,'3',0,'B',0,'9',0, + '}',0,0,0,0,0, +#endif +#if (USBD_BULK_ENABLE) + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE),/* wLength */ + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE),/* wDescriptorType */ + 0, /* bFirstInterface USBD_BULK_IF_NUM*/ + 0, /* bReserved */ + WBVAL(FUNCTION_SUBSET_LEN), /* wSubsetLength */ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ + 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ + WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN),/* wLength */ + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ + WBVAL(42), /* wPropertyNameLength */ + 'D',0,'e',0,'v',0,'i',0,'c',0,'e',0, + 'I',0,'n',0,'t',0,'e',0,'r',0,'f',0,'a',0,'c',0,'e',0, + 'G',0,'U',0,'I',0,'D',0,'s',0,0,0, + WBVAL(80), /* wPropertyDataLength */ + '{',0, + 'C',0,'D',0,'B',0,'3',0,'B',0,'5',0,'A',0,'D',0,'-',0, + '2',0,'9',0,'3',0,'B',0,'-',0, + '4',0,'6',0,'6',0,'3',0,'-',0, + 'A',0,'A',0,'3',0,'6',0,'-', + 0,'1',0,'A',0,'A',0,'E',0,'4',0,'6',0,'4',0,'6',0,'3',0,'7',0,'7',0,'6',0, + '}',0,0,0,0,0, +#endif +}; + +#else + +const U8 USBD_WinUSBDescriptorSetDescriptor[] = { 0 }; + +BOOL USBD_EndPoint0_Setup_WinUSB_ReqToDevice(void) +{ + return (__FALSE); +} + +#endif + +#if (USBD_BOS_ENABLE) + +#define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE) + +#define USBD_WEBUSB_DESC_LEN (sizeof(WEBUSB_PLATFORM_CAPABILITY_DESCRIPTOR)) + +#define USBD_WINUSB_DESC_LEN (sizeof(WINUSB_PLATFORM_CAPABILITY_DESCRIPTOR)) + +#define USBD_BOS_WTOTALLENGTH (USB_BOS_DESC_SIZE + \ + USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \ + USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE) + +__weak \ +const U8 USBD_BinaryObjectStoreDescriptor[] = { + USB_BOS_DESC_SIZE, /* bLength */ + USB_BINARY_OBJECT_STORE_DESCRIPTOR_TYPE,/* bDescriptorType */ + WBVAL(USBD_BOS_WTOTALLENGTH), /* wTotalLength */ + USBD_NUM_DEV_CAPABILITIES, /* bNumDeviceCaps */ +#if (USBD_WEBUSB_ENABLE) + USBD_WEBUSB_DESC_LEN, /* bLength */ + USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE, /* bDescriptorType */ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ + 0x00, /* bReserved */ + 0x38, 0xB6, 0x08, 0x34, /* PlatformCapabilityUUID */ + 0xA9, 0x09, 0xA0, 0x47, + 0x8B, 0xFD, 0xA0, 0x76, + 0x88, 0x15, 0xB6, 0x65, + WBVAL(0x0100), /* 1.00 */ /* bcdVersion */ + USBD_WEBUSB_VENDOR_CODE, /* bVendorCode */ + 0, /* iLandingPage */ +#endif +#if (USBD_WINUSB_ENABLE) + USBD_WINUSB_DESC_LEN, /* bLength */ + USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE, /* bDescriptorType */ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ + 0x00, /* bReserved */ + 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */ + 0x89, 0x45, 0xC7, 0x4C, + 0x9C, 0xD2, 0x65, 0x9D, + 0x9E, 0x64, 0x8A, 0x9F, + 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 *//* dwWindowsVersion*/ + WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ + USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ + 0, /* bAltEnumCode */ +#endif +}; + +#else +__weak \ +const U8 USBD_BinaryObjectStoreDescriptor[] = { 0 }; + +#endif + +#define HID_DESC \ + /* Interface, Alternate Setting 0, HID Class */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber USBD_HID_IF_NUM*/ \ + 0x00, /* bAlternateSetting */ \ + 0x00+(USBD_HID_EP_INTIN != 0)+(USBD_HID_EP_INTOUT != 0), /*0x01+(USBD_HID_EP_INTOUT != 0),*/ /* bNumEndpoints */ \ + USB_DEVICE_CLASS_HUMAN_INTERFACE, /* bInterfaceClass */ \ + HID_SUBCLASS_NONE, /* bInterfaceSubClass */ \ + HID_PROTOCOL_NONE, /* bInterfaceProtocol */ \ + USBD_HID_IF_STR_NUM, /* iInterface */ \ + \ +/* HID Class Descriptor */ \ + USB_HID_DESC_SIZE, /* bLength */ \ + HID_HID_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + WBVAL(0x0100), /* 1.00 */ /* bcdHID */ \ + 0x00, /* bCountryCode */ \ + 0x01, /* bNumDescriptors */ \ + HID_REPORT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + WBVAL(USB_HID_REPORT_DESC_SIZE), /* wDescriptorLength */ + +#define VENDOR_DESC_IAD(first,num_of_ifs) /* Vendor: Interface Association Descriptor */ \ + USB_INTERFACE_ASSOC_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + (first), /* bFirstInterface */ \ + (num_of_ifs), /* bInterfaceCount */ \ + USB_DEVICE_CLASS_VENDOR_SPECIFIC, /* bFunctionClass */ \ + 0x00, /* bFunctionSubclass */ \ + 0x00, /* bFunctionProtocol */ \ + 0x00, /* iFunction */ + +#define WEBUSB_DESC \ +/* Interface, Alternate Setting 0, VENDOR_SPECIFIC Class */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber USBD_WEBUSB_IF_NUM */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_VENDOR_SPECIFIC, /* bInterfaceClass */ \ + USB_DEVICE_CLASS_HUMAN_INTERFACE, /* bInterfaceSubClass */ \ + HID_PROTOCOL_NONE, /* bInterfaceProtocol */ \ + USBD_WEBUSB_IF_STR_NUM, /* iInterface */ \ + +#define HID_EP_IN /* HID Endpoint for Low-speed/Full-speed */ \ +/* Endpoint, HID Interrupt In */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_HID_EP_INTIN), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_BINTERVAL, /* bInterval */ + +#define HID_EP_OUT /* HID Endpoint for Low-speed/Full-speed */ \ +/* Endpoint, HID Interrupt Out */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_HID_EP_INTOUT), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_BINTERVAL, /* bInterval */ + +#define HID_EP_INOUT /* HID Endpoint for Low-speed/Full-speed */ \ +/* Endpoint, HID Interrupt In */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_HID_EP_INTIN), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_BINTERVAL, /* bInterval */ \ + \ +/* Endpoint, HID Interrupt Out */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_HID_EP_INTOUT), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_BINTERVAL, /* bInterval */ + +#define HID_EP_IN_HS /* HID Endpoint for High-speed */ \ +/* Endpoint, HID Interrupt In */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_HID_EP_INTIN), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_HS_BINTERVAL, /* bInterval */ + +#define HID_EP_OUT_HS /* HID Endpoint for High-speed */ \ +/* Endpoint, HID Interrupt Out */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_HID_EP_INTOUT), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_HS_BINTERVAL, /* bInterval */ + +#define HID_EP_INOUT_HS /* HID Endpoint for High-speed */ \ +/* Endpoint, HID Interrupt In */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_HID_EP_INTIN), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_HS_BINTERVAL, /* bInterval */ \ + \ +/* Endpoint, HID Interrupt Out */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_HID_EP_INTOUT), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_HID_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_HID_HS_BINTERVAL, /* bInterval */ + +#define MSC_DESC \ +/* Interface, Alternate Setting 0, MSC Class */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber USBD_MSC_IF_NUM*/ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_STORAGE, /* bInterfaceClass */ \ + MSC_SUBCLASS_SCSI, /* bInterfaceSubClass */ \ + MSC_PROTOCOL_BULK_ONLY, /* bInterfaceProtocol */ \ + USBD_MSC_IF_STR_NUM, /* iInterface */ + +#define MSC_EP /* MSC Endpoints for Low-speed/Full-speed */ \ +/* Endpoint, EP Bulk IN */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_MSC_EP_BULKIN), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_MSC_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ \ + \ +/* Endpoint, EP Bulk OUT */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_MSC_EP_BULKOUT),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_MSC_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ + +#define MSC_EP_HS /* MSC Endpoints for High-speed */ \ +/* Endpoint, EP Bulk IN */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_MSC_EP_BULKIN), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_MSC_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_MSC_HS_BINTERVAL, /* bInterval */ \ + \ +/* Endpoint, EP Bulk OUT */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_MSC_EP_BULKOUT),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_MSC_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_MSC_HS_BINTERVAL, /* bInterval */ + +#define BULK_DESC \ +/* Interface, Alternate Setting 0, MSC Class */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber USBD_BULK_IF_NUM*/ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_VENDOR_SPECIFIC, /* bInterfaceClass */ \ + 0x00, /* bInterfaceSubClass */ \ + 0x00, /* bInterfaceProtocol */ \ + USBD_BULK_IF_STR_NUM, /* iInterface */ + +#define BULK_EP /* MSC Endpoints for Low-speed/Full-speed */ \ +/* Endpoint, EP Bulk OUT */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_BULK_EP_BULKOUT),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_BULK_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ \ + \ +/* Endpoint, EP Bulk IN */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_BULK_EP_BULKIN), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_BULK_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ + +#define BULK_EP_HS /* MSC Endpoints for Low-speed/Full-speed */ \ +/* Endpoint, EP Bulk OUT */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_BULK_EP_BULKOUT), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_BULK_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ \ + \ +/* Endpoint, EP Bulk IN */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_BULK_EP_BULKIN),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_BULK_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ + +#define ADC_DESC_IAD(first,num_of_ifs) /* ADC: Interface Association Descriptor */ \ + USB_INTERFACE_ASSOC_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + (first), /* bFirstInterface */ \ + (num_of_ifs), /* bInterfaceCount */ \ + USB_DEVICE_CLASS_AUDIO, /* bFunctionClass */ \ + AUDIO_SUBCLASS_AUDIOCONTROL, /* bFunctionSubclass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bFunctionProtocol */ \ + USBD_ADC_CIF_STR_NUM, /* iFunction */ \ + +#define ADC_DESC \ +/* Interface, Alternate Setting 0, Audio Control */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USBD_ADC_CIF_NUM, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + USBD_ADC_CIF_STR_NUM, /* iInterface */ \ +/* Audio Control Interface */ \ + AUDIO_CONTROL_INTERFACE_DESC_SZ(1), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ \ + WBVAL(0x0100), /* 1.00 */ /* bcdADC */ \ + WBVAL( /* wTotalLength */ \ + AUDIO_CONTROL_INTERFACE_DESC_SZ(1) + \ + AUDIO_INPUT_TERMINAL_DESC_SIZE + \ + AUDIO_FEATURE_UNIT_DESC_SZ(1,1) + \ + AUDIO_OUTPUT_TERMINAL_DESC_SIZE \ + ), \ + 0x01, /* bInCollection */ \ + 0x01, /* baInterfaceNr */ \ + \ +/* Audio Input Terminal */ \ + AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ \ + 0x01, /* bTerminalID */ \ + WBVAL(AUDIO_TERMINAL_USB_STREAMING), /* wTerminalType */ \ + 0x00, /* bAssocTerminal */ \ + 0x01, /* bNrChannels */ \ + WBVAL(AUDIO_CHANNEL_M), /* wChannelConfig */ \ + 0x00, /* iChannelNames */ \ + 0x00, /* iTerminal */ \ + \ +/* Audio Feature Unit */ \ + AUDIO_FEATURE_UNIT_DESC_SZ(1,1), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ \ + 0x02, /* bUnitID */ \ + 0x01, /* bSourceID */ \ + 0x01, /* bControlSize */ \ + AUDIO_CONTROL_MUTE | \ + AUDIO_CONTROL_VOLUME, /* bmaControls(0) */ \ + 0x00, /* bmaControls(1) */ \ + 0x00, /* iTerminal */ \ + \ +/* Audio Output Terminal */ \ + AUDIO_OUTPUT_TERMINAL_DESC_SIZE, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ \ + 0x03, /* bTerminalID */ \ + WBVAL(AUDIO_TERMINAL_SPEAKER), /* wTerminalType */ \ + 0x00, /* bAssocTerminal */ \ + 0x02, /* bSourceID */ \ + 0x00, /* iTerminal */ \ + \ +/* Interface, Alternate Setting 0, Audio Streaming - Zero Bandwith */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USBD_ADC_SIF1_NUM, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + USBD_ADC_SIF1_STR_NUM, /* iInterface */ \ + \ +/* Interface, Alternate Setting 1, Audio Streaming - Operational */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USBD_ADC_SIF1_NUM, /* bInterfaceNumber */ \ + 0x01, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + USBD_ADC_SIF2_STR_NUM, /* iInterface */ \ + \ +/* Audio Streaming Interface */ \ + AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + 0x01, /* bTerminalLink */ \ + 0x01, /* bDelay */ \ + WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag */ \ + \ +/* Audio Type I Format */ \ + AUDIO_FORMAT_TYPE_I_DESC_SZ(1), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + 0x01, /* bNrChannels */ \ + USBD_ADC_BSUBFRAMESIZE, /* bSubFrameSize */ \ + USBD_ADC_BBITRESOLUTION, /* bBitResolution */ \ + 0x01, /* bSamFreqType */ \ + B3VAL(USBD_ADC_TSAMFREQ), /* tSamFreq */ + +#define ADC_EP /* ADC Endpoints for Low-speed/Full-speed */ \ +/* Endpoint, EP ISO OUT - Standard Descriptor */ \ + AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_ADC_EP_ISOOUT), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_ISOCHRONOUS, /* bmAttributes */ \ + WBVAL(USBD_ADC_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_ADC_BINTERVAL, /* bInterval */ \ + 0x00, /* bRefresh */ \ + 0x00, /* bSynchAddress */ \ + \ +/* Endpoint - Audio Streaming */ \ + AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + 0x00, /* bmAttributes */ \ + 0x00, /* bLockDelayUnits */ \ + WBVAL(0x0000), /* wLockDelay */ + +#define ADC_EP_HS /* ADC Endpoints for High-speed */ \ +/* Endpoint, EP ISO OUT - Standard Descriptor */ \ + AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_ADC_EP_ISOOUT), /* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_ISOCHRONOUS, /* bmAttributes */ \ + WBVAL(USBD_ADC_HS_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_ADC_BINTERVAL, /* bInterval */ \ + 0x00, /* bRefresh */ \ + 0x00, /* bSynchAddress */ \ + \ +/* Endpoint - Audio Streaming */ \ + AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + 0x00, /* bmAttributes */ \ + 0x00, /* bLockDelayUnits */ \ + WBVAL(0x0000), /* wLockDelay */ + +#define CDC_ACM_DESC_IAD(first,num_of_ifs) /* CDC: Interface Association Descriptor */ \ + USB_INTERFACE_ASSOC_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + (first), /* bFirstInterface */ \ + (num_of_ifs), /* bInterfaceCount */ \ + CDC_COMMUNICATION_INTERFACE_CLASS, /* bFunctionClass (Communication Class) */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bFunctionSubclass (Abstract Control Model) */ \ + 0x01, /* bFunctionProtocol (V.25ter, Common AT commands) */ \ + USBD_CDC_ACM_CIF_STR_NUM, /* iFunction */ \ + +#define CDC_ACM_DESC_IF0 \ +/* Interface, Alternate Setting 0, CDC Class */ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber: Number of Interface USBD_CDC_ACM_CIF_NUM*/ \ + 0x00, /* bAlternateSetting: Alternate setting */ \ + 0x01, /* bNumEndpoints: One endpoint used */ \ + CDC_COMMUNICATION_INTERFACE_CLASS, /* bInterfaceClass: Communication Interface Class */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass: Abstract Control Model */ \ + 0x01, /* bInterfaceProtocol: no protocol used */ \ + USBD_CDC_ACM_CIF_STR_NUM, /* iInterface: */ \ + \ +/* Header Functional Descriptor */ \ + CDC_HEADER_SIZE, /* bLength: Endpoint Descriptor size */ \ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \ + CDC_HEADER, /* bDescriptorSubtype: Header Func Desc */ \ + WBVAL(CDC_V1_10), /* 1.10 */ /* bcdCDC */ \ +/* Call Management Functional Descriptor */ \ + CDC_CALL_MANAGEMENT_SIZE, /* bFunctionLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \ + CDC_CALL_MANAGEMENT, /* bDescriptorSubtype: Call Management Func Desc */ \ + 0x03, /* bmCapabilities: device handles call management */ \ + 0x02, /* bDataInterface: CDC data IF ID */ \ +/* Abstract Control Management Functional Descriptor */ \ + CDC_ABSTRACT_CONTROL_MANAGEMENT_SIZE, /* bFunctionLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \ + CDC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype: Abstract Control Management desc */ \ + 0x06, /* bmCapabilities: SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported */ \ +/* Union Functional Descriptor */ \ + CDC_UNION_SIZE, /* bFunctionLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ \ + CDC_UNION, /* bDescriptorSubtype: Union func desc */ \ + 0x00, /* bMasterInterface: Communication class interface is master USBD_CDC_ACM_CIF_NUM*/ \ + 0x00, /* bSlaveInterface0: Data class interface is slave 0 USBD_CDC_ACM_DIF_NUM*/ + +#define CDC_ACM_EP_IF0 /* CDC Endpoints for Interface 0 for Low-speed/Full-speed */ \ +/* Endpoint, EP Interrupt IN */ /* event notification (optional) */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_CDC_ACM_EP_INTIN),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_CDC_ACM_WMAXPACKETSIZE), /* wMaxPacketSize */ \ + USBD_CDC_ACM_BINTERVAL, /* bInterval */ + +#define CDC_ACM_EP_IF0_HS /* CDC Endpoints for Interface 0 for High-speed */ \ +/* Endpoint, EP Interrupt IN */ /* event notification (optional) */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_CDC_ACM_EP_INTIN),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ \ + WBVAL(USBD_CDC_ACM_HS_WMAXPACKETSIZE),/* wMaxPacketSize */ \ + USBD_CDC_ACM_HS_BINTERVAL, /* bInterval */ + +#define CDC_ACM_DESC_IF1 \ +/* Interface, Alternate Setting 0, Data class interface descriptor*/ \ + USB_INTERFACE_DESC_SIZE, /* bLength */ \ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber: Number of Interface USBD_CDC_ACM_DIF_NUM*/ \ + 0x00, /* bAlternateSetting: no alternate setting */ \ + 0x02, /* bNumEndpoints: two endpoints used */ \ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass: Data Interface Class */ \ + 0x00, /* bInterfaceSubClass: no subclass available */ \ + 0x00, /* bInterfaceProtocol: no protocol used */ \ + USBD_CDC_ACM_DIF_STR_NUM, /* iInterface */ + +#define CDC_ACM_EP_IF1 /* CDC Endpoints for Interface 1 for Low-speed/Full-speed */ \ +/* Endpoint, EP Bulk OUT */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_CDC_ACM_EP_BULKOUT),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_CDC_ACM_WMAXPACKETSIZE1), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ \ + \ +/* Endpoint, EP Bulk IN */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_CDC_ACM_EP_BULKIN),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_CDC_ACM_WMAXPACKETSIZE1), /* wMaxPacketSize */ \ + 0x00, /* bInterval: ignore for Bulk transfer */ + +#define CDC_ACM_EP_IF1_HS /* CDC Endpoints for Interface 1 for High-speed */ \ +/* Endpoint, EP Bulk OUT */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_OUT(USBD_CDC_ACM_EP_BULKOUT),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_CDC_ACM_HS_WMAXPACKETSIZE1),/* wMaxPacketSize */ \ + USBD_CDC_ACM_HS_BINTERVAL1, /* bInterval */ \ + \ +/* Endpoint, EP Bulk IN */ \ + USB_ENDPOINT_DESC_SIZE, /* bLength */ \ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + USB_ENDPOINT_IN(USBD_CDC_ACM_EP_BULKIN),/* bEndpointAddress */ \ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ \ + WBVAL(USBD_CDC_ACM_HS_WMAXPACKETSIZE1),/* wMaxPacketSize */ \ + USBD_CDC_ACM_HS_BINTERVAL1, /* bInterval */ + +/* USB Device Configuration Descriptor (for Full Speed) */ +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor) */ +__weak \ +U8 USBD_ConfigDescriptor[200] = { 0 }; + +#if (USBD_HS_ENABLE == 0) /* If High-speed not enabled, declare dummy descriptors for High-speed */ +__weak \ +U8 USBD_ConfigDescriptor_HS[] = { 0 }; +#else +/* USB Device Configuration Descriptor (for High Speed) */ +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor) */ +__weak \ +U8 USBD_ConfigDescriptor_HS[200] = { 0 }; + +#endif + +/* USB Device Create String Descriptor */ +#define USBD_STR_DEF(n) \ + struct { \ + U8 len; \ + U8 type; \ + U16 str[sizeof(USBD_##n)/2-1]; \ + } desc##n + +#define USBD_STR_VAL(n) \ + { sizeof(USBD_##n), USB_STRING_DESCRIPTOR_TYPE, USBD_##n } + +__weak \ +const struct { + struct { + U8 len; + U8 type; + U16 langid; + } desc_langid; + USBD_STR_DEF(STRDESC_MAN); + USBD_STR_DEF(STRDESC_PROD); +#if (USBD_STRDESC_SER_ENABLE) + USBD_STR_DEF(STRDESC_SER); +#endif +#if (USBD_ADC_ENABLE) + USBD_STR_DEF(ADC_CIF_STRDESC); + USBD_STR_DEF(ADC_SIF1_STRDESC); + USBD_STR_DEF(ADC_SIF2_STRDESC); +#endif +#if (USBD_CDC_ACM_ENABLE) + USBD_STR_DEF(CDC_ACM_CIF_STRDESC); + USBD_STR_DEF(CDC_ACM_DIF_STRDESC); +#endif +#if (USBD_HID_ENABLE) + USBD_STR_DEF(HID_STRDESC); +#endif +#if (USBD_WEBUSB_ENABLE) + USBD_STR_DEF(WEBUSB_STRDESC); +#endif +#if (USBD_MSC_ENABLE) + USBD_STR_DEF(MSC_STRDESC); +#endif +#if (USBD_BULK_ENABLE) + USBD_STR_DEF(BULK_STRDESC); +#endif +} USBD_StringDescriptor += { + { 4, USB_STRING_DESCRIPTOR_TYPE, USBD_STRDESC_LANGID }, + USBD_STR_VAL(STRDESC_MAN), + USBD_STR_VAL(STRDESC_PROD), +#if (USBD_STRDESC_SER_ENABLE) + USBD_STR_VAL(STRDESC_SER), +#endif +#if (USBD_ADC_ENABLE) + USBD_STR_VAL(ADC_CIF_STRDESC), + USBD_STR_VAL(ADC_SIF1_STRDESC), + USBD_STR_VAL(ADC_SIF2_STRDESC), +#endif +#if (USBD_CDC_ACM_ENABLE) + USBD_STR_VAL(CDC_ACM_CIF_STRDESC), + USBD_STR_VAL(CDC_ACM_DIF_STRDESC), +#endif +#if (USBD_HID_ENABLE) + USBD_STR_VAL(HID_STRDESC), +#endif +#if (USBD_WEBUSB_ENABLE) + USBD_STR_VAL(WEBUSB_STRDESC), +#endif +#if (USBD_MSC_ENABLE) + USBD_STR_VAL(MSC_STRDESC), +#endif +#if (USBD_BULK_ENABLE) + USBD_STR_VAL(BULK_STRDESC), +#endif +}; + +#if (USBD_WEBUSB_ENABLE) + +#define WEBUSB_NUM_FUNCTIONS (1) + +#define WEBUSB_WTOTALLENGTH (WEBUSB_DESCRIPTOR_SET_HEADER_SIZE + \ + WEBUSB_CONFIGURATION_SUBSET_HEADER_SIZE +\ + (WEBUSB_NUM_FUNCTIONS * (WEBUSB_FUNCTION_SUBSET_HEADER_SIZE + 1))) + +/* WebUSB Create URL Descriptor */ +#define WEBUSB_URL_DEF(n) \ + struct { \ + U8 bLength; \ + U8 bDescriptorType; \ + U8 bScheme; \ + U8 URL[sizeof(USBD_##n)+3];\ + } url##n + +#define WEBUSB_HTTP_URL_VAL(n) \ +{ \ + (sizeof(USBD_##n) + 3) + 3, \ + WEBUSB_URL_TYPE, \ + WEBUSB_URL_SCHEME_HTTP, \ + USBD_##n \ +} + +#define WEBUSB_HTTPS_URL_VAL(n) \ +{ \ + (sizeof(USBD_##n) + 3) + 3, \ + WEBUSB_URL_TYPE, \ + WEBUSB_URL_SCHEME_HTTPS, \ + USBD_##n \ +} + +__weak \ +struct { + WEBUSB_URL_DEF(WEBUSB_LANDING_URL); + WEBUSB_URL_DEF(WEBUSB_ORIGIN_URL); +} USBD_WebUSBURLDescriptor += { + WEBUSB_HTTPS_URL_VAL(WEBUSB_LANDING_URL), + WEBUSB_HTTPS_URL_VAL(WEBUSB_ORIGIN_URL), +}; + +#else + +U8 USBD_WebUSBURLDescriptor[] = { 0 }; + +BOOL USBD_EndPoint0_Setup_WebUSB_ReqToDevice(void) +{ + return (__FALSE); +} + +#endif //USBD_WEBUSB_ENABLE + + +extern uint8_t flash_algo_valid(void); + +static U16 start_desc_fill(U8 * config_desc, U8 * config_desc_hs, U8 if_num) { + U8 * pD = 0; + const U8 start_desc[] = { + /* Configuration 1 */ + USB_CONFIGUARTION_DESC_SIZE, // bLength + USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType + WBVAL(USBD_WTOTALLENGTH_MAX), // wTotalLength + USBD_IF_NUM_MAX, // bNumInterfaces + 0x01, // bConfigurationValue: 0x01 is used to select this configuration + 0x00, // iConfiguration: no string to describe this configuration + USBD_CFGDESC_BMATTRIBUTES | // bmAttributes + (USBD_POWER << 6), + USBD_CFGDESC_BMAXPOWER // bMaxPower, device power consumption + }; + pD = config_desc; + memcpy(pD, start_desc, sizeof(start_desc)); + +#if (USBD_HS_ENABLE == 1) + pD = config_desc_hs; + memcpy(pD, start_desc, sizeof(start_desc)); +#endif + + return sizeof(start_desc); +} + +static U16 hid_desc_fill(U8 * config_desc, U8 * config_desc_hs, U8 if_num) { + U8 * pD = 0; + const U8 hid_desc[] = { + HID_DESC + #if ((USBD_HID_EP_INTOUT != 0) && (USBD_HID_EP_INTIN != 0)) + HID_EP_INOUT + #elif (USBD_HID_EP_INTIN != 0) + HID_EP_IN + #elif (USBD_HID_EP_INTOUT != 0) + HID_EP_OUT + #endif + }; + pD = config_desc; + memcpy(pD, hid_desc, sizeof(hid_desc)); + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; +#if (USBD_HS_ENABLE == 1) + const U8 hid_desc_hs[] = { + HID_DESC + #if ((USBD_HID_EP_INTOUT != 0) && (USBD_HID_EP_INTIN != 0)) + HID_EP_INOUT_HS + #elif (USBD_HID_EP_INTIN != 0) //#else + HID_EP_IN_HS + #elif (USBD_HID_EP_INTOUT != 0) + HID_EP_OUT_HS + #endif + }; + pD = config_desc_hs; + memcpy(pD, hid_desc_hs, sizeof(hid_desc_hs)); + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; +#endif + return sizeof(hid_desc); +} + +static U16 acm_cdc_desc_fill(U8 * config_desc, U8 * config_desc_hs, U8 if_num) { + U8 * pD = 0; + const U8 cdc_desc[] = { + #if (USBD_MULTI_IF) + CDC_ACM_DESC_IAD(0, 2) + #endif + CDC_ACM_DESC_IF0 + CDC_ACM_EP_IF0 + CDC_ACM_DESC_IF1 + CDC_ACM_EP_IF1 + }; + pD = config_desc; + memcpy(pD, cdc_desc, sizeof(cdc_desc)); + +#if (USBD_MULTI_IF) + ((USB_INTERFACE_ASSOCIATION_DESCRIPTOR *)pD)->bFirstInterface = if_num; + pD += USB_INTERFACE_ASSOC_DESC_SIZE; +#endif + + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; + pD += USB_INTERFACE_DESC_SIZE + CDC_HEADER_SIZE + CDC_CALL_MANAGEMENT_SIZE + CDC_ABSTRACT_CONTROL_MANAGEMENT_SIZE; + ((UNION_FUNCTIONAL_DESCRIPTOR*)pD)->bMasterInterface = if_num; + ((UNION_FUNCTIONAL_DESCRIPTOR*)pD)->bSlaveInterface0 = if_num + 1; + pD += CDC_UNION_SIZE + USB_ENDPOINT_DESC_SIZE; + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num + 1; + +#if (USBD_HS_ENABLE == 1) + const U8 cdc_desc_hs[] = { + #if (USBD_MULTI_IF) + CDC_ACM_DESC_IAD(0, 2) + #endif + CDC_ACM_DESC_IF0 + CDC_ACM_EP_IF0_HS + CDC_ACM_DESC_IF1 + CDC_ACM_EP_IF1_HS + }; + pD = config_desc_hs; + memcpy(pD, cdc_desc_hs, sizeof(cdc_desc_hs)); + +#if (USBD_MULTI_IF) + ((USB_INTERFACE_ASSOCIATION_DESCRIPTOR *)pD)->bFirstInterface = if_num; + pD += USB_INTERFACE_ASSOC_DESC_SIZE; +#endif + + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; + pD += USB_INTERFACE_DESC_SIZE + CDC_HEADER_SIZE + CDC_CALL_MANAGEMENT_SIZE + CDC_ABSTRACT_CONTROL_MANAGEMENT_SIZE; + ((UNION_FUNCTIONAL_DESCRIPTOR*)pD)->bMasterInterface = if_num; + ((UNION_FUNCTIONAL_DESCRIPTOR*)pD)->bSlaveInterface0 = if_num + 1; + pD += CDC_UNION_SIZE + USB_ENDPOINT_DESC_SIZE; + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num +1 ; +#endif //(USBD_HS_ENABLE == 1) + return sizeof(cdc_desc); +} + +static U16 msc_desc_fill(U8 * config_desc, U8 * config_desc_hs, U8 if_num) { + U8 * pD = 0; + const U8 msc_desc[] = { + MSC_DESC + MSC_EP + }; + pD = config_desc; + memcpy(pD, msc_desc, sizeof(msc_desc)); + + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; + +#if (USBD_HS_ENABLE == 1) + const U8 msc_desc_hs[] = { + MSC_DESC + MSC_EP_HS + }; + pD = config_desc_hs; + memcpy(pD, msc_desc_hs, sizeof(msc_desc_hs)); + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; +#endif + + return sizeof(msc_desc); +} + +#if (USBD_WEBUSB_ENABLE) +static U16 webusb_desc_fill(U8 * config_desc, U8 * config_desc_hs, U8 if_num) { + U8 * pD = 0; + const U8 webusb_desc[] = { + WEBUSB_DESC + }; + pD = config_desc; + memcpy(pD, webusb_desc, sizeof(webusb_desc)); + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; + +#if (USBD_HS_ENABLE == 1) + pD = config_desc_hs; + memcpy(pD, webusb_desc, sizeof(webusb_desc)); + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; +#endif + +#if (USBD_WINUSB_ENABLE) + pD = USBD_WinUSBDescriptorSetDescriptor + WINUSB_DESCRIPTOR_SET_HEADER_SIZE; + ((WINUSB_FUNCTION_SUBSET_HEADER*)pD)->bFirstInterface = if_num; +#else +#error "WEBUSB requires WINUSB!" +#endif + + return sizeof(webusb_desc); +} +#endif + +#if (USBD_BULK_ENABLE) +static U16 bulk_desc_fill(U8 * config_desc, U8 * config_desc_hs, U8 if_num) { + U8 * pD = 0; + const U8 bulk_desc[] = { + BULK_DESC + BULK_EP + }; + pD = config_desc; + memcpy(pD, bulk_desc, sizeof(bulk_desc)); + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; +#if (USBD_HS_ENABLE == 1) + const U8 bulk_desc_hs[] = { + BULK_DESC + BULK_EP_HS + }; + pD = config_desc_hs; + memcpy(pD, bulk_desc_hs, sizeof(bulk_desc_hs)); + ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber = if_num; +#endif + +#if (USBD_WINUSB_ENABLE) + pD = USBD_WinUSBDescriptorSetDescriptor + WINUSB_DESCRIPTOR_SET_HEADER_SIZE; +#if (USBD_WEBUSB_ENABLE) + pD += WINUSB_FUNCTION_SUBSET_HEADER_SIZE + WINUSB_FEATURE_COMPATIBLE_ID_SIZE + DEVICE_INTERFACE_GUIDS_FEATURE_LEN; +#endif + ((WINUSB_FUNCTION_SUBSET_HEADER*)pD)->bFirstInterface = if_num; +#else +#error "BULK interfaces requires WINUSB!" +#endif + + return sizeof(bulk_desc); +} +#endif + +void usbd_class_init(void) +{ + U8 if_num = 0; + U16 desc_ptr = 0; + + desc_ptr += start_desc_fill(&USBD_ConfigDescriptor[desc_ptr], &USBD_ConfigDescriptor_HS[desc_ptr], if_num); + +#if (USBD_ADC_ENABLE) + usbd_adc_init(); +#endif + + +#if (USBD_MSC_ENABLE) + +#if !(defined(DAPLINK_BL)) && defined(DRAG_N_DROP_SUPPORT) + //change descriptors here + if (config_ram_get_disable_msd() == 1 || flash_algo_valid()==0 ){ + usbd_if_num -= USBD_MSC_ENABLE; + USB_CONFIGURATION_DESCRIPTOR * usb_conf_desc = (USB_CONFIGURATION_DESCRIPTOR *)USBD_ConfigDescriptor; + usb_conf_desc->bNumInterfaces = usbd_if_num; + U16 usb_wtotal_len = USBD_WTOTALLENGTH_MAX - (USBD_MSC_DESC_LEN * USBD_MSC_ENABLE); + usb_conf_desc->wTotalLength = usb_wtotal_len; + USBD_ConfigDescriptor[usb_wtotal_len] = 0; + USBD_HID_DescriptorOffset -= USBD_MSC_ENABLE * USBD_MSC_DESC_LEN; +#if (USBD_HS_ENABLE == 1) + usb_conf_desc = (USB_CONFIGURATION_DESCRIPTOR *)USBD_ConfigDescriptor_HS; + usb_conf_desc->bNumInterfaces = usbd_if_num; + usb_conf_desc->wTotalLength = usb_wtotal_len; + USBD_ConfigDescriptor_HS[usb_wtotal_len] = 0; +#endif + } else +#endif + { + usbd_msc_if_num = if_num++; + desc_ptr += msc_desc_fill(&USBD_ConfigDescriptor[desc_ptr], &USBD_ConfigDescriptor_HS[desc_ptr], usbd_msc_if_num); + usbd_msc_init(); + + } +#endif //#if (USBD_MSC_ENABLE) + +#if (USBD_CDC_ACM_ENABLE) + usbd_cdc_acm_cif_num = if_num++; + usbd_cdc_acm_dif_num = if_num++; + desc_ptr += acm_cdc_desc_fill(&USBD_ConfigDescriptor[desc_ptr], &USBD_ConfigDescriptor_HS[desc_ptr], usbd_cdc_acm_cif_num); + USBD_CDC_ACM_Initialize(); +#endif + +#if (USBD_HID_ENABLE) + usbd_hid_if_num = if_num++; + desc_ptr += hid_desc_fill(&USBD_ConfigDescriptor[desc_ptr], &USBD_ConfigDescriptor_HS[desc_ptr], usbd_hid_if_num); + usbd_hid_init(); +#endif + +#if (USBD_WEBUSB_ENABLE) + usbd_webusb_if_num = if_num++; + desc_ptr += webusb_desc_fill(&USBD_ConfigDescriptor[desc_ptr], &USBD_ConfigDescriptor_HS[desc_ptr], usbd_webusb_if_num); +#endif + +#if (USBD_BULK_ENABLE) + usbd_bulk_if_num = if_num++; + desc_ptr += bulk_desc_fill(&USBD_ConfigDescriptor[desc_ptr], &USBD_ConfigDescriptor_HS[desc_ptr], usbd_bulk_if_num); + usbd_bulk_init(); +#endif + +#if (USBD_CLS_ENABLE) + usbd_cls_init(); +#endif + +} + +#endif //USBD_ENABLE + +#endif /* __USB_CONFIG__ */