Files
QD4C-firmware/libraries/sdk/Peripheral/ch32v30x_usbotg_device.c

909 lines
39 KiB
C
Raw Normal View History

2023-12-11 21:45:06 +08:00
/********************************** (C) COPYRIGHT *******************************
* File Name : zf_usb_cdc.c
* Author : WCH
* Version : V1.0.0
* Date : 2021/06/06
* Description : This file provides all the USBOTG firmware functions.
*******************************************************************************/
#include "stdio.h"
#include "ch32v30x_rcc.h"
#include "ch32v30x_usbotg_device.h"
/* Global define */
/* OTH */
#define pMySetupReqPakHD ((PUSB_SETUP_REQ)EP0_DatabufHD)
#define RepDescSize 62
#define DevEP0SIZE 8
#define PID_OUT 0
#define PID_SOF 1
#define PID_IN 2
#define PID_SETUP 3
typedef struct{
UINT8 dataRat[4];
UINT8 stopBit;
UINT8 parityType;
UINT8 dataBit;
}LINECODINGST;
/******************************************************************************/
/* ȫ<>ֱ<EFBFBD><D6B1><EFBFBD> */
/* Endpoint Buffer */
__attribute__ ((aligned(4))) UINT8 EP0_DatabufHD[8]; //ep0(64)
__attribute__ ((aligned(4))) UINT8 EP1_DatabufHD[64+64]; //ep1_out(64)+ep1_in(64)
__attribute__ ((aligned(4))) UINT8 EP2_DatabufHD[64+64]; //ep2_out(64)+ep2_in(64)
PUINT8 pEP0_RAM_Addr; //ep0(64)
PUINT8 pEP1_RAM_Addr; //ep1_out(64)+ep1_in(64)
PUINT8 pEP2_RAM_Addr; //ep2_out(64)+ep2_in(64)
const UINT8 *pDescr;
volatile UINT8 USBHD_Dev_SetupReqCode = 0xFF; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸Setup<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
volatile UINT16 USBHD_Dev_SetupReqLen = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸Setup<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
volatile UINT8 USBHD_Dev_SetupReqValueH = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸Setup<EFBFBD><EFBFBD>Value<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> */
volatile UINT8 USBHD_Dev_Config = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
volatile UINT8 USBHD_Dev_Address = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵַ */
volatile UINT8 USBHD_Dev_SleepStatus = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸˯<EFBFBD><EFBFBD>״̬ */
volatile UINT8 USBHD_Dev_EnumStatus = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸ö<EFBFBD><EFBFBD>״̬ */
volatile UINT8 USBHD_Dev_Endp0_Tog = 0x01; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ */
volatile UINT8 USBHD_Dev_Speed = 0x01; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD> */
volatile UINT16 USBHD_Endp1_Up_Flag = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>״̬: 0:<3A><><EFBFBD><EFBFBD>; 1:<3A><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>; */
volatile UINT8 USBHD_Endp1_Down_Flag = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>1<EFBFBD>´<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>־ */
volatile UINT8 USBHD_Endp1_Down_Len = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>1<EFBFBD>´<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
volatile BOOL USBHD_Endp1_T_Tog = 0; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>togλ<EFBFBD><EFBFBD>ת */
volatile BOOL USBHD_Endp1_R_Tog = 0;
volatile UINT16 USBHD_Endp2_Up_Flag = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>״̬: 0:<3A><><EFBFBD><EFBFBD>; 1:<3A><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>; */
volatile UINT16 USBHD_Endp2_Up_LoadPtr = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>װ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD> */
volatile UINT8 USBHD_Endp2_Down_Flag = 0x00; /* USB2.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>2<EFBFBD>´<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>־ */
volatile UINT32V Endp2_send_seq=0x00;
volatile UINT8 DevConfig;
volatile UINT8 SetupReqCode;
volatile UINT16 SetupReqLen;
/******************************************************************************/
/* Device Descriptor */
//<2F><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ȫ<EFBFBD><C8AB><EFBFBD>
const UINT8 MyDevDescrHD[] =
{
0x12, //<2F><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>18<31>ֽ<EFBFBD>
0x01, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>0x01Ϊ<31><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x00,0x02, //<2F><><EFBFBD><EFBFBD><E8B1B8>ʹ<EFBFBD><CAB9>USB<53>汾Э<E6B1BE><EFBFBD><E9A3AC>Ϊ<EFBFBD><CEAA>С<EFBFBD>˽ṹ<CBBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ֽ<EFBFBD><D6BD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>USB1.1<EFBFBD>汾Ϊ0x10,0x01<30><31>USB2.0Ϊ0x00,0x02
0x02, //<2F><><EFBFBD><EFBFBD><EFBFBD>룬CDC<44><43>Ϊ0x02<30><32>CDC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>0x02<30><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD>ᱻϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>Ϊһ<CEAA><D2BB>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ϊͨ<CEAA><CDA8><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Э<EFBFBD><EFBFBD><E9B6BC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Ϊ0.
0x00, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bDeviceClassΪ0ʱ<30><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bDeviceSubClassҲ<73><D2B2><EFBFBD><EFBFBD>Ϊ0<CEAA><30>
0x00, //<2F><EFBFBD><E8B1B8>ʹ<EFBFBD>õ<EFBFBD>Э<EFBFBD>飬Э<E9A3AC><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USBЭ<42><D0AD><EFBFBD><EFBFBD><E6B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>Ϊ0ʱ<30><CAB1><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><E8B1B8>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD>
DevEP0SIZE, //<2F>˵<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵ8<D6B5><38>16<31><36>32<33><32>64<36><34><EFBFBD>˴<EFBFBD>Ϊ64<36>ֽ<EFBFBD>
0x86,0x1a, //<2F><><EFBFBD><EFBFBD>ID
0x22,0x57, //<2F><>Ʒ<EFBFBD>豸ID
0x00,0x01, //<2F><EFBFBD><EFBFBD><E6B1BE>
0x01, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ0ʱ<30><CAB1><EFBFBD><EFBFBD>ʾû<CABE>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
0x02, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ0ʱ<30><CAB1><EFBFBD><EFBFBD>ʾû<CABE>в<EFBFBD>Ʒ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
0x03, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ0ʱ<30><CAB1><EFBFBD><EFBFBD>ʾû<CABE><C3BB><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA>ַ<EFBFBD><D6B7><EFBFBD>
0x01, //<2F><><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>Ϊ1
};
/* Configration Descriptor */
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const UINT8 MyCfgDescrHD[] =
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF>
0x09, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>׼USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ9<CEAA>ֽ<EFBFBD>
0x02, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0x02
0x43,0x00, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3>ȣ<EFBFBD>67<36>ֽ<EFBFBD>
0x02, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֵĽӿ<C4BD><D3BF><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ӿ<EFBFBD>
0x01, //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ֵ
0x00, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0x00<30><30>ʾû<CABE><C3BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
0xa0, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>һЩ<D2BB><D0A9><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD>ʽ<E7B7BD>ͻ<EFBFBD><CDBB>ѵȣ<D1B5>0xA0<41><30>ʾ<EFBFBD><EFBFBD><E8B1B8><EFBFBD>߹<EFBFBD><DFB9><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>Զ<EFBFBD>̻<EFBFBD><CCBB><EFBFBD>
0x32, //<2F><EFBFBD><E8B1B8>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x32<33><32>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100ma
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӿ<EFBFBD>0<EFBFBD><30>CDC<44>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EBB8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x09, //<2F>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>׼<EFBFBD><D7BC>USB<53>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ9<CEAA>ֽ<EFBFBD>
0x04, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0x04
0x00, //<2F>ýӿڵı<DAB5><C4B1>ţ<EFBFBD><C5A3><EFBFBD>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD>˴<EFBFBD>Ϊ0x00
0x00, //<2F>ýӿڵı<DAB5><C4B1>ñ<EFBFBD><C3B1><EFBFBD><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
0x01, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õĶ˵<C4B6><CBB5><EFBFBD><EFBFBD><EFBFBD>0x01<30><31>ʾʹ<CABE><CAB9>1<EFBFBD><31><EFBFBD>˵㡣<CBB5><E3A1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾû<CABE>з<EFBFBD>0<EFBFBD>˵㣬ֻʹ<D6BB><CAB9>Ĭ<EFBFBD>ϵĿ<CFB5><C4BF>ƶ˵㡣CDC<44>ӿ<EFBFBD>ֻʹ<D6BB><CAB9>һ<EFBFBD><D2BB><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>
0x02, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5>࣬0x02ΪCDC<44><43>
0x02, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>࣬Ҫʵ<D2AA><CAB5>USBת<42><D7AA><EFBFBD>ڣ<EFBFBD><DAA3>ͱ<EFBFBD><CDB1><EFBFBD>ʹ<EFBFBD><CAB9>Abstract Control Model<65><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><E0A3AC><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>Ϊ0x02
0x01, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Э<EFBFBD>ʹ<E9A3AC><CAB9>Common AT Commands<64><73>ͨ<EFBFBD><CDA8>AT<41><54><EFBFBD>Э<EEA3A9><D0AD>
0x00, //<2F>ýӿڵ<D3BF><DAB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0x00<30><30>ʾû<CABE><C3BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڵĹ<DAB5><C4B9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CDC<44>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD>ӿڣ<D3BF>֮<EFBFBD><D6AE>
//Header Functional Descriptor
0x05, //<2F>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD>5<EFBFBD><35><EFBFBD>ֽ<EFBFBD>
0x24, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>̶<EFBFBD>λ0x24<32><34>CS_INTERFACE<43>ı<EFBFBD><C4B1>
0x00, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x10,0x01, //USBͨ<42><CDA8><EFBFBD>豸Э<E8B1B8><D0AD><EFBFBD>İ汾<C4B0>š<EFBFBD><C5A1>˴<EFBFBD>ΪUSB1.1
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>)
//Call Management Functional Descriptor
0x05, //<2F>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD>5<EFBFBD><35><EFBFBD>ֽ<EFBFBD>
0x24, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>̶<EFBFBD>λ0x24<32><34>CS_INTERFACE<43>ı<EFBFBD><C4B1>
0x01, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x00, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λD0<44><30>D1<44><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3AC><EFBFBD><EFBFBD>λΪ<CEBB><CEAA><EFBFBD><EFBFBD>ֵ0<D6B5><30>D0Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD><EFBFBD>ʾ<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x00, //<2F><>ʾѡ<CABE><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڱ<D3BF><DAB1>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD>ڲ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>Ϊ0
//Abstract Control Management Functional Descriptor <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x04, //<2F>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD>4<EFBFBD><34><EFBFBD>ֽ<EFBFBD>
0x24, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>̶<EFBFBD>λ0x24<32><34>CS_INTERFACE<43>ı<EFBFBD><C4B1>
0x02, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x02, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D7-4λΪ<CEBB><CEAA><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30>֧<EFBFBD><D6A7>Set_Line_Coding<6E><67>Set_Control_Line_State<74><65>Get_Line_Coding<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Serial_State֪ͨ
//D0<44><30>ʾ<EFBFBD>Ƿ<EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Set_Comm_Feature<72><65>Clear_Comm_Feature<72><65>Get_Comm_Feature,Ϊ1<CEAA><31>ʾ֧<CABE>֣<EFBFBD>
//D1λ<31><CEBB>ʾ<EFBFBD>Ƿ<EFBFBD>֧<EFBFBD><D6A7>Set_Line_Coding<6E><67>Set_Control_Line_State<74><65>Get_Line_Coding<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Serial_State֪ͨ<CDA8><D6AA>Ϊ1<CEAA><31>ʾ֧<CABE><D6A7>
//D2Ϊ<32><CEAA>ʾ<EFBFBD>Ƿ<EFBFBD>֧<EFBFBD><D6A7>Send_Break<61><6B>Ϊ1<CEAA><31>ʾ֧<CABE><D6A7>
//D3<44><33>ʾ<EFBFBD>Ƿ<EFBFBD>֧<EFBFBD><D6A7>Network_Connection֪ͨ<CDA8><D6AA>Ϊ1<CEAA><31>ʾ֧<CABE><D6A7>
//Union Functional Descriptor<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ӿ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>Ĺ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD>ӿ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӽӿ<D3BD>
0x05, //<2F>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD>5<EFBFBD><35><EFBFBD>ֽ<EFBFBD>
0x24, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>̶<EFBFBD>λ0x24<32><34>CS_INTERFACE<43>ı<EFBFBD><C4B1>
0x06, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x00, //<2F><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ӿڱ<D3BF><DAB1>ţ<EFBFBD><C5A3>˴<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ϊ0<CEAA><30>CDC<44>ӿ<EFBFBD>
0x01, //<2F><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>һ<EFBFBD>ӽӿڱ<D3BF><DAB1>ţ<EFBFBD><C5A3>˴<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD>ӽӿ<D3BD>
//<2F>ӿ<EFBFBD>0<EFBFBD><30>CDC<44>ӿڣ<D3BF><DAA3>Ķ˵<C4B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˵<EFBFBD>1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x07, //<2F>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>7<EFBFBD>ֽ<EFBFBD>
0x05, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0x05
0x81, //<2F>ö˵<C3B6><CBB5>ĵ<EFBFBD>ַ<EFBFBD><D6B7>0x81<38><31>ʾ<EFBFBD>˵<EFBFBD>1<EFBFBD><31>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
0x03, //<2F>ö˵<C3B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λD1-0<><30>ʾ<EFBFBD>ö˵<C3B6><CBB5>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><30><CEAA><EFBFBD>ƴ<EFBFBD><C6B4>䣬1Ϊ<31><CEAA>ʱ<EFBFBD><CAB1><EFBFBD>䣬2Ϊ<32><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䣬3Ϊ<33>жϴ<D0B6><CFB4><EFBFBD>
0x40,0x00, //<2F>ö˵<C3B6>֧<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>64<36>ֽ<EFBFBD>
0xFF, //<2F>˵<EFBFBD><CBB5>IJ<EFBFBD>ѯʱ<D1AF><CAB1>
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӿ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ݽӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˵<EFBFBD>2
//CDC<44><43><EFBFBD>ӿڣ<D3BF><DAA3>ӿ<EFBFBD>0<EFBFBD><30><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڽ<D3BF><DABD>еġ<D0B5><C4A1><EFBFBD><EFBFBD><EFBFBD>ֻʹ<D6BB><CAB9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD>Ϊ1
0x09, //<2F>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>9<EFBFBD>ֽ<EFBFBD>
0x04, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0x04
0x01, //<2F>ýӿڵı<DAB5><C4B1>ţ<EFBFBD><C5A3><EFBFBD>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD>˴<EFBFBD>Ϊ0x01
0x00, //<2F>ýӿڵı<DAB5><C4B1>ñ<EFBFBD><C3B1><EFBFBD>
0x02, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õĶ˵<C4B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýӿ<C3BD>Ҫʹ<D2AA><CAB9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵㣬<CBB5><E3A3AC><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>Ϊ2
0x0a, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5>࣬0x0aΪCDC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x00, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
0x00, //<2F>ýӿ<C3BD><D3BF><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Э<EFBFBD><D0AD>
0x00, //<2F>ýӿڵ<D3BF><DAB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0x00<30><30>ʾû<CABE><C3BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//<2F>ӿ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF><DAA3>Ķ˵<C4B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˵<EFBFBD>2
0x07, //<2F>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>7<EFBFBD>ֽ<EFBFBD>
0x05, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0x05
0x02, //<2F>ö˵<C3B6><CBB5>ĵ<EFBFBD>ַ<EFBFBD><D6B7>0x02<30><32>ʾ<EFBFBD>˵<EFBFBD>2<EFBFBD><32>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
0x02, //<2F>ö˵<C3B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λD1-0<><30>ʾ<EFBFBD>ö˵<C3B6><CBB5>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><30><CEAA><EFBFBD>ƴ<EFBFBD><C6B4>䣬1Ϊ<31><CEAA>ʱ<EFBFBD><CAB1><EFBFBD>䣬2Ϊ<32><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䣬3Ϊ<33>жϴ<D0B6><CFB4><EFBFBD>
0x40,0x00, //<2F>ö˵<C3B6>֧<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>64<36>ֽ<EFBFBD>
0x00, //<2F>˵<EFBFBD><CBB5>IJ<EFBFBD>ѯʱ<D1AF><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ч
0x07, //<2F>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>7<EFBFBD>ֽ<EFBFBD>
0x05, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0x05
0x82, //<2F>ö˵<C3B6><CBB5>ĵ<EFBFBD>ַ<EFBFBD><D6B7>0x82<38><32>ʾ<EFBFBD>˵<EFBFBD>2<EFBFBD><32>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
0x02, //<2F>ö˵<C3B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λD1-0<><30>ʾ<EFBFBD>ö˵<C3B6><CBB5>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><30><CEAA><EFBFBD>ƴ<EFBFBD><C6B4>䣬1Ϊ<31><CEAA>ʱ<EFBFBD><CAB1><EFBFBD>䣬2Ϊ<32><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䣬3Ϊ<33>жϴ<D0B6><CFB4><EFBFBD>
0x40,0x00, //<2F>ö˵<C3B6>֧<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>64<36>ֽ<EFBFBD>
0x00, //<2F>˵<EFBFBD><CBB5>IJ<EFBFBD>ѯʱ<D1AF><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ч //<2F>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
/* USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
const UINT8 MyReportDescHD[ ] =
{0x14,0x03,0x32,0x00,0x30,0x00,0x31,0x00,0x37,0x00,0x2D,0x00,0x32,0x00,0x2D,0x00,0x32,0x00,0x35,0x00};
/* Language Descriptor */
const UINT8 MyLangDescrHD[] =
{
0x04, 0x03, 0x09, 0x04
};
/* Manufactor Descriptor */
const UINT8 MyManuInfoHD[] =
{
0x0E, 0x03, 'w', 0, 'c', 0, 'h', 0, '.', 0, 'c', 0, 'n', 0
};
/* Product Information */
const UINT8 MyProdInfoHD[] =
{
0x0C, 0x03, 'C', 0, 'H', 0, '3', 0, '0', 0, '7', 0
};
/* USB<53><42><EFBFBD>к<EFBFBD><D0BA>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
const UINT8 MySerNumInfoHD[ ] =
{
/* 0123456789 */
22,03,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0
};
/* USB<53><EFBFBD>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
const UINT8 MyUSBQUADescHD[ ] =
{
0x0A, 0x06, 0x00, 0x02, 0xFF, 0x00, 0xFF, 0x40, 0x01, 0x00,
};
/* USBȫ<42><C8AB>ģʽ,<2C><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
UINT8 TAB_USB_FS_OSC_DESC[ sizeof( MyCfgDescrHD ) ] =
{
0x09, 0x07, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
};
void OTG_FS_IRQHandler(void) __attribute__((interrupt()));
/*******************************************************************************
* Function Name : USBOTG_FS_DeviceInit
* Description : Initializes USB device.
* Input : None
* Return : None
*******************************************************************************/
void USBDeviceInit( void )
{
USBOTG_FS->BASE_CTRL = 0x00;
USBOTG_FS->UEP4_1_MOD = USBHD_UEP4_RX_EN|USBHD_UEP4_TX_EN|USBHD_UEP1_RX_EN|USBHD_UEP1_TX_EN;
USBOTG_FS->UEP2_3_MOD = USBHD_UEP2_RX_EN|USBHD_UEP2_TX_EN|USBHD_UEP3_RX_EN|USBHD_UEP3_TX_EN;
USBOTG_FS->UEP5_6_MOD = USBHD_UEP5_RX_EN|USBHD_UEP5_TX_EN|USBHD_UEP6_RX_EN|USBHD_UEP6_TX_EN;
USBOTG_FS->UEP7_MOD = USBHD_UEP7_RX_EN|USBHD_UEP7_TX_EN;
USBOTG_FS->UEP0_DMA = (UINT32)pEP0_RAM_Addr;
USBOTG_FS->UEP1_DMA = (UINT32)pEP1_RAM_Addr;
USBOTG_FS->UEP2_DMA = (UINT32)pEP2_RAM_Addr;
USBOTG_FS->UEP0_RX_CTRL = USBHD_UEP_R_RES_ACK;
USBOTG_FS->UEP1_RX_CTRL = USBHD_UEP_R_RES_ACK;
USBOTG_FS->UEP2_RX_CTRL = USBHD_UEP_R_RES_ACK;
USBOTG_FS->UEP1_TX_LEN = 8;
USBOTG_FS->UEP2_TX_LEN = 8;
USBOTG_FS->UEP0_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->UEP1_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->UEP2_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->INT_FG = 0xFF;
USBOTG_FS->INT_EN = USBHD_UIE_SUSPEND | USBHD_UIE_BUS_RST | USBHD_UIE_TRANSFER;
USBOTG_FS->DEV_ADDR = 0x00;
USBOTG_FS->BASE_CTRL = USBHD_UC_DEV_PU_EN | USBHD_UC_INT_BUSY | USBHD_UC_DMA_EN;
USBOTG_FS->UDEV_CTRL = USBHD_UD_PD_DIS|USBHD_UD_PORT_EN;
}
/*******************************************************************************
* Function Name : USBOTG_RCC_Init
* Description : USBOTG RCC init
* Input : None
* Return : None
*******************************************************************************/
void USBOTG_RCC_Init( void )
{
RCC_USBCLK48MConfig( RCC_USBCLK48MCLKSource_USBPHY );
RCC_USBHSPLLCLKConfig( RCC_HSBHSPLLCLKSource_HSE );
RCC_USBHSConfig( RCC_USBPLL_Div2 );
RCC_USBHSPLLCKREFCLKConfig( RCC_USBHSPLLCKREFCLK_4M );
RCC_USBHSPHYPLLALIVEcmd( ENABLE );
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_USBHS, ENABLE );
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_OTG_FS, ENABLE );
}
/**********************************************************/
UINT8 Ready = 0;
UINT8 UsbConfig;
//UINT8 SetupReqCode;
//UINT16 SetupReqLen;
//CDC<44><43><EFBFBD><EFBFBD>
UINT8 LineCoding[7]={0x00,0xC2,0x01,0x00,0x00,0x00,0x08}; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ57600<30><30>1ֹͣλ<D6B9><CEBB><EFBFBD><EFBFBD>У<EFBFBD>飬8<E9A3AC><38><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
#define SET_LINE_CODING 0x20 //Configures DTE rate, stop-bits, parity, and number-of-character
#define GET_LINE_CODING 0x21 //This request allows the host to find out the currently configured line coding.
#define SET_CONTROL_LINE_STATE 0x22 //This request generates RS-232/V.24 style control signals.
#define UART_REV_LEN 0x40 //<2F><><EFBFBD>ڽ<EFBFBD><DABD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
UINT8 Receive_Uart_Buf[UART_REV_LEN]; //<2F><><EFBFBD>ڽ<EFBFBD><DABD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
volatile UINT8 Uart_Input_Point = 0; //ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ָ<EFBFBD><EFBFBD><EBA3AC><EFBFBD>߸<EFBFBD>λ<EFBFBD><CEBB>Ҫ<EFBFBD><D2AA>ʼ<EFBFBD><CABC>Ϊ0
volatile UINT8 Uart_Output_Point = 0; //ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ָ<EFBFBD><EFBFBD><EBA3AC><EFBFBD>߸<EFBFBD>λ<EFBFBD><CEBB>Ҫ<EFBFBD><D2AA>ʼ<EFBFBD><CABC>Ϊ0
volatile UINT8 UartByteCount = 0; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
volatile UINT8 USBByteCount = 0; //<2F><><EFBFBD><EFBFBD>USB<53>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
volatile UINT8 USBBufOutPoint = 0; //ȡ<><C8A1><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
volatile UINT8 UpPoint2_Busy = 0; //<2F>ϴ<EFBFBD><CFB4>˵<EFBFBD><CBB5>Ƿ<EFBFBD>æ<EFBFBD><C3A6>־
const UINT8 *pDescr;
/*******************************************************************************
* Function Name : DevEP1_IN_Deal
* Description : Device endpoint1 IN.
* Input : l: IN length(<64B)
* Return : None
*******************************************************************************/
void DevEP1_IN_Deal( UINT8 l )
{
USBOTG_FS->UEP1_TX_LEN = l;
USBOTG_FS->UEP1_TX_CTRL = (USBOTG_FS->UEP1_TX_CTRL & ~USBHD_UEP_T_RES_MASK)| USBHD_UEP_T_RES_ACK;
}
/*******************************************************************************
* Function Name : DevEP2_IN_Deal
* Description : Device endpoint2 IN.
* Input : l: IN length(<64B)
* Return : None
*******************************************************************************/
void DevEP2_IN_Deal( UINT8 l )
{
USBOTG_FS->UEP2_TX_LEN = l;
USBOTG_FS->UEP2_TX_CTRL = (USBOTG_FS->UEP2_TX_CTRL & ~USBHD_UEP_T_RES_MASK)| USBHD_UEP_T_RES_ACK;
}
/*******************************************************************************
* Function Name : DevEP1_OUT_Deal
* Description : Deal device Endpoint 1 OUT.
* Input : l: Data length.
* Return : None
*******************************************************************************/
void DevEP1_OUT_Deal( UINT8 l )
{
UINT8 i;
for(i=0; i<l; i++)
{
pEP1_IN_DataBuf[i] = ~pEP1_OUT_DataBuf[i];
}
DevEP1_IN_Deal( l );
}
/*******************************************************************************
* Function Name : DevEP2_OUT_Deal
* Description : Deal device Endpoint 2 OUT.
* Input : l: Data length.
* Return : None
*******************************************************************************/
void DevEP2_OUT_Deal( UINT8 l )
{
UINT8 i;
for(i=0; i<l; i++)
{
pEP2_IN_DataBuf[i] = ~pEP2_OUT_DataBuf[i];
}
DevEP2_IN_Deal( l );
}
/*******************************************************************************
* Function Name : OTG_FS_IRQHandler
* Description : OTG_FS_IRQHandler OTG<EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Input : None
* Return : None
*******************************************************************************/
void OTG_FS_IRQHandler( void )
{
UINT8 len, chtype;
UINT8 intflag, errflag = 0;
intflag = USBOTG_FS->INT_FG;
if( intflag & USBHD_UIF_TRANSFER )
{
switch ( USBOTG_FS->INT_ST & USBHD_UIS_TOKEN_MASK )
{
/* SETUP<55><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case USBHD_UIS_TOKEN_SETUP:
/* <20><>ӡ<EFBFBD><D3A1>ǰUsbsetup<75><70><EFBFBD><EFBFBD> */
// printf( "Setup Req :\n" );
// printf( "%02X ", pSetupReqPakHD->bRequestType );
// printf( "%02X ", pSetupReqPakHD->bRequest );
// printf( "%04X ", pSetupReqPakHD->wValue );
// printf( "%04X ", pSetupReqPakHD->wIndex );
// printf( "%04X ", pSetupReqPakHD->wLength );
// printf( "\n" );
USBOTG_FS->UEP0_TX_CTRL = USBHD_UEP_T_TOG|USBHD_UEP_T_RES_NAK;
USBOTG_FS->UEP0_RX_CTRL = USBHD_UEP_R_TOG|USBHD_UEP_R_RES_ACK;
SetupReqLen = pSetupReqPakHD->wLength;
SetupReqCode = pSetupReqPakHD->bRequest;
chtype = pSetupReqPakHD->bRequestType;
len = 0;
errflag = 0;
/* <20>жϵ<D0B6>ǰ<EFBFBD>DZ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if ( ( pSetupReqPakHD->bRequestType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD ) //<2F>DZ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
{
//CDC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(SetupReqCode & 0x20)
{
switch( SetupReqCode )
{
case GET_LINE_CODING: //0x21 currently configured
pDescr = LineCoding;
len = sizeof(LineCoding);
len = SetupReqLen >= DEFAULT_ENDP0_SIZE ? DEFAULT_ENDP0_SIZE : SetupReqLen; // <20><><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><E4B3A4>
memcpy(pEP0_DataBuf,pDescr,len);
SetupReqLen -= len;
pDescr += len;
break;
case SET_CONTROL_LINE_STATE: //0x22 generates RS-232/V.24 style control signals
break;
case SET_LINE_CODING: //0x20 Configure
break;
default:
errflag = 0xFF;
}
}
// /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
// if( pSetupReqPakHD->bRequestType & 0x40 )
// {
// /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
// switch( pSetupReqPakHD->bRequest )
// {
// default:
// errflag = 0xFF;/* <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7> */
// break;
// }
// }
// }
/* <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( errflag != 0xFF )
{
if( SetupReqLen > len )
{
SetupReqLen = len;
}
len = ( USBHD_Dev_SetupReqLen >= DevEP0SIZE ) ? DevEP0SIZE : USBHD_Dev_SetupReqLen;
memcpy( EP0_DatabufHD, pDescr, len );
pDescr += len;
}
}
else
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
switch( SetupReqCode )
{
case USB_GET_DESCRIPTOR:
{
switch( ((pSetupReqPakHD->wValue)>>8) )
{
case USB_DESCR_TYP_DEVICE:
/* <20><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = MyDevDescrHD;
len = MyDevDescrHD[0];
break;
case USB_DESCR_TYP_CONFIG:
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = MyCfgDescrHD;
len = MyCfgDescrHD[2];
break;
case USB_DESCR_TYP_STRING:
/* <20><>ȡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
switch( (pSetupReqPakHD->wValue)&0xff )
{
case 0:
/* <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = MyLangDescrHD;
len = MyLangDescrHD[0];
break;
case 1:
/* USB<53><42><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = MyManuInfoHD;
len = MyManuInfoHD[0];
break;
case 2:
/* USB<53><42>Ʒ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = MyProdInfoHD;
len = MyProdInfoHD[0];
break;
case 3:
/* USB<53><42><EFBFBD>к<EFBFBD><D0BA>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = MySerNumInfoHD;
len = sizeof( MySerNumInfoHD );
break;
default:
errflag = 0xFF;
break;
}
break;
case USB_DESCR_TYP_REPORT:
/* USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = MyReportDescHD;
len = sizeof( MyReportDescHD );
break;
case USB_DESCR_TYP_QUALIF:
/* <20><EFBFBD>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
pDescr = ( PUINT8 )&MyUSBQUADescHD[ 0 ];
len = sizeof( MyUSBQUADescHD );
break;
case USB_DESCR_TYP_SPEED:
/* <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( USBHD_Dev_Speed == 0x00 )
{
/* ȫ<><C8AB>ģʽ */
memcpy( &TAB_USB_FS_OSC_DESC[ 2 ], &MyCfgDescrHD[ 2 ], sizeof( MyCfgDescrHD ) - 2 );
pDescr = ( PUINT8 )&TAB_USB_FS_OSC_DESC[ 0 ];
len = sizeof( TAB_USB_FS_OSC_DESC );
}
else
{
errflag = 0xFF;
}
break;
case USB_DESCR_TYP_BOS:
/* BOS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* USB2.0<EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>BOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
errflag = 0xFF;
break;
default :
errflag = 0xff;
break;
}
if( SetupReqLen>len ) SetupReqLen = len;
len = (SetupReqLen >= DevEP0SIZE) ? DevEP0SIZE : SetupReqLen;
memcpy( pEP0_DataBuf, pDescr, len );
pDescr += len;
}
break;
case USB_SET_ADDRESS:
/* <20><><EFBFBD>õ<EFBFBD>ַ */
SetupReqLen = (pSetupReqPakHD->wValue)&0xff;
break;
case USB_GET_CONFIGURATION:
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֵ */
pEP0_DataBuf[0] = DevConfig;
if ( SetupReqLen > 1 ) SetupReqLen = 1;
break;
case USB_SET_CONFIGURATION:
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
DevConfig = (pSetupReqPakHD->wValue)&0xff;
break;
case USB_CLEAR_FEATURE:
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if ( ( pSetupReqPakHD->bRequestType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )
{
/* <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD> */
switch( (pSetupReqPakHD->wIndex)&0xff )
{
case 0x82:
USBOTG_FS->UEP2_TX_CTRL = (USBOTG_FS->UEP2_TX_CTRL & ~( USBHD_UEP_T_TOG|USBHD_UEP_T_RES_MASK )) | USBHD_UEP_T_RES_NAK;
break;
case 0x02:
USBOTG_FS->UEP2_RX_CTRL = (USBOTG_FS->UEP2_RX_CTRL & ~( USBHD_UEP_R_TOG|USBHD_UEP_R_RES_MASK )) | USBHD_UEP_R_RES_ACK;
break;
case 0x81:
USBOTG_FS->UEP1_TX_CTRL = (USBOTG_FS->UEP1_TX_CTRL & ~( USBHD_UEP_T_TOG|USBHD_UEP_T_RES_MASK )) | USBHD_UEP_T_RES_NAK;
break;
case 0x01:
USBOTG_FS->UEP1_RX_CTRL = (USBOTG_FS->UEP1_RX_CTRL & ~( USBHD_UEP_R_TOG|USBHD_UEP_R_RES_MASK )) | USBHD_UEP_R_RES_ACK;
break;
default:
errflag = 0xFF;
break;
}
}
else errflag = 0xFF;
break;
case USB_SET_FEATURE:
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( ( pMySetupReqPakHD->bRequestType & 0x1F ) == 0x00 )
{
/* <20><><EFBFBD><EFBFBD><EFBFBD>豸 */
if( pMySetupReqPakHD->wValue == 0x01 )
{
if( MyCfgDescrHD[ 7 ] & 0x20 )
{
/* <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ʹ<EFBFBD>ܱ<EFBFBD>־ */
USBHD_Dev_SleepStatus = 0x01;
}
else
{
errflag = 0xFF;
}
}
else
{
errflag = 0xFF;
}
}
else if( ( pMySetupReqPakHD->bRequestType & 0x1F ) == 0x02 )
{
/* <20><><EFBFBD>ö˵<C3B6> */
if( pMySetupReqPakHD->wValue == 0x00 )
{
/* <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>˵<EFBFBD>STALL */
switch( ( pMySetupReqPakHD->wIndex ) & 0xff )
{
case 0x82:
/* <20><><EFBFBD>ö˵<C3B6>2 IN STALL */
USBOTG_FS->UEP2_TX_CTRL = ( USBOTG_FS->UEP2_TX_CTRL &= ~USBHD_UEP_T_RES_MASK ) | USBHD_UEP_T_RES_STALL;
//USBHS->UEP2_CTRL = ( USBHS->UEP2_CTRL & ~USBHS_EP_T_RES_MASK ) | USBHS_EP_T_RES_STALL;
break;
case 0x02:
/* <20><><EFBFBD>ö˵<C3B6>2 OUT Stall */
USBOTG_FS->UEP2_RX_CTRL = ( USBOTG_FS->UEP2_RX_CTRL &= ~USBHD_UEP_R_RES_MASK ) | USBHD_UEP_R_RES_STALL;
//USBHS->UEP2_CTRL = ( USBHS->UEP2_CTRL & ~USBHS_EP_R_RES_MASK ) | USBHS_EP_R_RES_STALL;
break;
case 0x81:
/* <20><><EFBFBD>ö˵<C3B6>1 IN STALL */
USBOTG_FS->UEP1_TX_CTRL = ( USBOTG_FS->UEP1_TX_CTRL &= ~USBHD_UEP_T_RES_MASK ) | USBHD_UEP_T_RES_STALL;
//USBHS->UEP1_CTRL = ( USBHS->UEP1_CTRL & ~USBHS_EP_T_RES_MASK ) | USBHS_EP_T_RES_STALL;
break;
case 0x01:
/* <20><><EFBFBD>ö˵<C3B6>1 OUT STALL */
USBOTG_FS->UEP1_RX_CTRL = ( USBOTG_FS->UEP1_RX_CTRL &= ~USBHD_UEP_R_RES_MASK ) | USBHD_UEP_R_RES_STALL;
//USBHS->UEP1_CTRL = ( USBHS->UEP1_CTRL & ~USBHS_EP_R_RES_MASK ) | USBHS_EP_R_RES_STALL;
break;
default:
errflag = 0xFF;
break;
}
}
else
{
errflag = 0xFF;
}
}
else
{
errflag = 0xFF;
}
break;
case USB_GET_INTERFACE:
/* <20><>ȡ<EFBFBD>ӿ<EFBFBD> */
pEP0_DataBuf[0] = 0x00;
if ( SetupReqLen > 1 ) SetupReqLen = 1;
break;
case USB_SET_INTERFACE:
/* <20><><EFBFBD>ýӿ<C3BD> */
EP0_DatabufHD[ 0 ] = 0x00;
if( USBHD_Dev_SetupReqLen > 1 )
{
USBHD_Dev_SetupReqLen = 1;
}
break;
case USB_GET_STATUS:
/* <20><><EFBFBD>ݵ<EFBFBD>ǰ<EFBFBD>˵<EFBFBD>ʵ<EFBFBD><CAB5>״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6> */
EP0_DatabufHD[ 0 ] = 0x00;
EP0_DatabufHD[ 1 ] = 0x00;
if( pMySetupReqPakHD->wIndex == 0x81 )
{
if( ( USBOTG_FS->UEP1_TX_CTRL & USBHD_UEP_T_RES_MASK ) == USBHD_UEP_T_RES_STALL )
{
EP0_DatabufHD[ 0 ] = 0x01;
}
}
else if( pMySetupReqPakHD->wIndex == 0x01 )
{
if( ( USBOTG_FS->UEP1_RX_CTRL & USBHD_UEP_R_RES_MASK ) == USBHD_UEP_R_RES_STALL )
{
EP0_DatabufHD[ 0 ] = 0x01;
}
}
else if( pMySetupReqPakHD->wIndex == 0x82 )
{
if( ( USBOTG_FS->UEP2_TX_CTRL & USBHD_UEP_T_RES_MASK ) == USBHD_UEP_T_RES_STALL )
{
EP0_DatabufHD[ 0 ] = 0x01;
}
}
else if( pMySetupReqPakHD->wIndex == 0x02 )
{
if( ( USBOTG_FS->UEP2_RX_CTRL & USBHD_UEP_R_RES_MASK ) == USBHD_UEP_R_RES_STALL )
{
EP0_DatabufHD[ 0 ] = 0x01;
}
}
if( USBHD_Dev_SetupReqLen > 2 )
{
USBHD_Dev_SetupReqLen = 2;
}
break;
default:
errflag = 0xFF;
break;
}
}
if( errflag == 0xff)
{
// printf("uep0 stall\n");
USBOTG_FS->UEP0_TX_CTRL = USBHD_UEP_T_TOG|USBHD_UEP_T_RES_STALL;
USBOTG_FS->UEP0_RX_CTRL = USBHD_UEP_R_TOG|USBHD_UEP_R_RES_STALL;
}
else
{
if( chtype & 0x80 )
{
len = (SetupReqLen>DevEP0SIZE) ? DevEP0SIZE : SetupReqLen;
SetupReqLen -= len;
}
else len = 0;
USBOTG_FS->UEP0_TX_LEN = len;
USBOTG_FS->UEP0_TX_CTRL = USBHD_UEP_T_TOG|USBHD_UEP_T_RES_ACK;
USBOTG_FS->UEP0_RX_CTRL = USBHD_UEP_R_TOG|USBHD_UEP_R_RES_ACK;
}
break;
case USBHD_UIS_TOKEN_IN:
switch ( USBOTG_FS->INT_ST & ( USBHD_UIS_TOKEN_MASK | USBHD_UIS_ENDP_MASK ) )
{
case USBHD_UIS_TOKEN_IN:
switch( SetupReqCode )
{
case USB_GET_DESCRIPTOR:
len = SetupReqLen >= DevEP0SIZE ? DevEP0SIZE : SetupReqLen;
memcpy( pEP0_DataBuf, pDescr, len );
SetupReqLen -= len;
pDescr += len;
USBOTG_FS->UEP0_TX_LEN = len;
USBOTG_FS->UEP0_TX_CTRL ^= USBHD_UEP_T_TOG;
break;
case USB_SET_ADDRESS:
USBOTG_FS->DEV_ADDR = (USBOTG_FS->DEV_ADDR&USBHD_UDA_GP_BIT) | SetupReqLen;
USBOTG_FS->UEP0_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->UEP0_RX_CTRL = USBHD_UEP_R_RES_ACK;
break;
default:
USBOTG_FS->UEP0_TX_LEN = 0;
USBOTG_FS->UEP0_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->UEP0_RX_CTRL = USBHD_UEP_R_RES_ACK;
break;
}
break;
case USBHD_UIS_TOKEN_IN | 1:
USBOTG_FS->UEP1_TX_CTRL = (USBHD_UEP1_TX_CTRL & ~USBHD_UEP_T_RES_MASK) | USBHD_UEP_T_RES_ACK;
USBOTG_FS->UEP1_TX_CTRL ^= USBHD_UEP_T_TOG;
break;
case USBHD_UIS_TOKEN_IN | 2:
USBOTG_FS->UEP2_TX_CTRL ^= USBHD_UEP_T_TOG;
USBOTG_FS->UEP2_TX_CTRL = (USBOTG_FS->UEP2_TX_CTRL & ~USBHD_UEP_T_RES_MASK) | USBHD_UEP_T_RES_NAK;
break;
default :
break;
}
break;
case USBHD_UIS_TOKEN_OUT:
switch ( USBOTG_FS->INT_ST & ( USBHD_UIS_TOKEN_MASK | USBHD_UIS_ENDP_MASK ) )
{
case USBHD_UIS_TOKEN_OUT:
switch( SetupReqCode )
{
case 0x20:
if((((LINECODINGST *)pEP0_DataBuf)->dataRat[0] || ((LINECODINGST *)pEP0_DataBuf)->dataRat[1] ||
((LINECODINGST *)pEP0_DataBuf)->dataRat[2] || ((LINECODINGST *)pEP0_DataBuf)->dataRat[3]))
{
printf( "\nBaud Rate = %d",
(((LINECODINGST *)pEP0_DataBuf)->dataRat[3] <<24) |
(((LINECODINGST *)pEP0_DataBuf)->dataRat[2] <<16) |
(((LINECODINGST *)pEP0_DataBuf)->dataRat[1] <<8) |
(((LINECODINGST *)pEP0_DataBuf)->dataRat[0]));
}
else
{
printf( "\ndataBit = %d", ((LINECODINGST *)pEP0_DataBuf)->dataBit);
printf( "\nstopBit = %d", ((LINECODINGST *)pEP0_DataBuf)->stopBit);
printf( "\nparityType = %d", ((LINECODINGST *)pEP0_DataBuf)->parityType);
}
break;
}
len = USBOTG_FS->RX_LEN;
break;
case USBHD_UIS_TOKEN_OUT | 1:
if ( USBOTG_FS->INT_ST & USBHD_UIS_TOG_OK )
{
USBOTG_FS->UEP1_RX_CTRL ^= USBHD_UEP_R_TOG;
len = USBOTG_FS->RX_LEN;
// printf( "point 1 len %d\n", len );
DevEP1_OUT_Deal( len );
}
break;
case USBHD_UIS_TOKEN_OUT | 2:
if ( USBOTG_FS->INT_ST & USBHD_UIS_TOG_OK )
{
USBOTG_FS->UEP2_RX_CTRL ^= USBHD_UEP_R_TOG;
len = USBOTG_FS->RX_LEN;
// printf( "point 2 len %d\n", len );
DevEP2_OUT_Deal( len );
}
break;
}
break;
case USBHD_UIS_TOKEN_SOF:
break;
default :
break;
}
USBOTG_FS->INT_FG = USBHD_UIF_TRANSFER;
}
else if( intflag & USBHD_UIF_BUS_RST )
{
USBOTG_FS->DEV_ADDR = 0;
USBOTG_FS->UEP0_RX_CTRL = USBHD_UEP_R_RES_ACK;
USBOTG_FS->UEP1_RX_CTRL = USBHD_UEP_R_RES_ACK;
USBOTG_FS->UEP2_RX_CTRL = USBHD_UEP_R_RES_ACK;
USBOTG_FS->UEP0_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->UEP1_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->UEP2_TX_CTRL = USBHD_UEP_T_RES_NAK;
USBOTG_FS->INT_FG |= USBHD_UIF_BUS_RST;
}
else if( intflag & USBHD_UIF_SUSPEND )
{
if ( USBOTG_FS->MIS_ST & USBHD_UMS_SUSPEND ) {;}
else{;}
USBOTG_FS->INT_FG = USBHD_UIF_SUSPEND;
}
else
{
USBOTG_FS->INT_FG = intflag;
}
}