📄 u_request.c
字号:
#ifndef TEST_MODE_ON
break;
#endif /* TEST_MODE_ON */
if(rEP0SETUP_4){ /* wIndex.l */
break;
}
if(rEP0SETUP_7 || rEP0SETUP_6){ /* wLength */
break;
}
switch(rEP0SETUP_5){
case TEST_J_MODE:
rUSB_Test_BP.Test_J = 1;
usb_flag.TestMode = 1; /* TestMode */
ret = REQUEST_OK;
break;
case TEST_K_MODE:
rUSB_Test_BP.Test_K = 1;
usb_flag.TestMode = 1; /* TestMode */
ret = REQUEST_OK;
break;
case TEST_SE0_NAK_MODE:
rUSB_Test_BP.Test_SE0_NAK = 1;
usb_flag.TestMode = 1; /* TestMode */
ret = REQUEST_OK;
break;
case TEST_PACKET_MODE:
/* TestPacket */
rEPcMaxSize_H = 0x00; /* MaxPacketSize = 64Byte */
rEPcMaxSize_L = 0x40;
rEPcConfig_0_BP.INxOUT = 1;
rEPaConfig_0_BP.EnEndPoint = 0;
rEPbConfig_0_BP.EnEndPoint = 0;
rEPcConfig_0_BP.EnEndPoint = 1;
rEPcConfig_0_BP.EndPointNumber = 0x0F;
rEPcStartAdrs_H = 0x03; /* - 64 */
rEPcStartAdrs_L = 0xC0;
rEPdStartAdrs_H = 0x04; /* */
rEPdStartAdrs_L = 0x00;
rEPeStartAdrs_H = 0x04; /* */
rEPeStartAdrs_L = 0x00;
rEPfStartAdrs_H = 0x04; /* */
rEPfStartAdrs_L = 0x00;
rEPgStartAdrs_H = 0x04; /* */
rEPgStartAdrs_L = 0x00;
rEPhStartAdrs_H = 0x04; /* */
rEPhStartAdrs_L = 0x00;
rEPcIntEnb_BP.EnIN_TranErr = 0;
rEPnControl_BP.AllFIFO_Clr = 1;
rCPU_JoinWr_BP.JoinEPcWr = 1;
rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 1;
for(i=0; i<53; i++){
rEPnFIFOforCPU = test_packet[i];
}
rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 0;
rCPU_JoinWr_BP.JoinEPcWr = 0;
rUSB_Test_BP.Test_Packet = 1;
usb_flag.TestMode = 1; /* TestMode */
ret = REQUEST_OK;
break;
default:
break;
}
}else{
ret = REQUEST_ERROR;
}
}
break;
case RECIPIENT_ENDPOINT:
if(usb_state == DEFAULT_STATE){
break;
}
if(rEP0SETUP_3){ /* wValue.h */
break;
}
if(rEP0SETUP_2 != ENDPOINT_HALT){
break;
}
if(rEP0SETUP_5){ /* wIndex.h */
break;
}
if(rEP0SETUP_7 || rEP0SETUP_6){ /* wLength */
break;
}
if(rEP0SETUP_4 != 0){
/* EndPoint 0 */
if(usb_state == ADDRESS_STATE){
break;
}
for( i=0; i<NUM_ENDPOINT; i++ ){
if( rEP0SETUP_4 == ep_number[i] ){
if( i == 0 ){
/* EndPoint a */
if(rEPaControl_BP.ForceSTALL == 0){
rEPaControl_BP.ForceSTALL = 1;
bulk_in_state = BULK_IN_STALL;
}
}else{
if( i == 1 ){
/* EndPoint b */
if(rEPbControl_BP.ForceSTALL == 0){
rEPbControl_BP.ForceSTALL = 1;
bulk_out_state = BULK_OUT_STALL;
}
}else{
if( i == 2 ){
/* EndPoint c */
if(rEPcControl_BP.ForceSTALL == 0){
rEPcControl_BP.ForceSTALL = 1;
int_in_state = INT_IN_STALL;
}
}
}
}
ret = REQUEST_OK;
}
}
}
break;
default:
ret = REQUEST_ERROR;
}
}
return ret;
}
/*****************************************************************************
*
* : Set Address
* :
* :
* :
* : usb_state
* assigned_addr
* usb_flag USB
*
*****************************************************************************/
int SetAddress(void)
{
int ret;
if(usb_state == CONFIGURED_STATE){
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x80) != 0x00){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
return REQUEST_ERROR;
}
if(rEP0SETUP_3){ /* wValue.h */
return REQUEST_ERROR;
}
if(rEP0SETUP_5 || rEP0SETUP_4){ /* wIndex */
return REQUEST_ERROR;
}
if(rEP0SETUP_7 || rEP0SETUP_6){ /* wLength */
return REQUEST_ERROR;
}
if(rEP0SETUP_2 > 0x7F){
/* 128 */
return REQUEST_ERROR;
}
usb_flag.Address = 1;
return REQUEST_OK;
}
/*****************************************************************************
*
* : Get Descriptor
* :
* :
* :
* : req_tran_cnt
* tran_start_addr
* total_tran_cnt 1
* actual_tran_cnt
* device_desc[] Device
* fs_config_desc[] FSConfiguration
* hs_config_desc[] HSConfiguration
* string1_desc[] String
*
* qualifier_desc[] Device Qualifier
*
*****************************************************************************/
int GetDescriptor(void)
{
int i,j,cnt,len;
BYTE *p;
InterfaceDesc *p_i_desc; /* Interface Descriptor */
ConfigDesc *p_c_desc; /* Config Descriptor */
if((rEP0SETUP_0 & 0x80) != 0x80){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
return REQUEST_ERROR;
}
switch(rEP0SETUP_3){
case DEVICE:
if(rEP0SETUP_2){ /* wValue.l */
return REQUEST_ERROR;
}
if(rEP0SETUP_5 || rEP0SETUP_4){ /* wIndex */
return REQUEST_ERROR;
}
if(req_tran_cnt != 0){
/* FS */
tran_start_addr = (BYTE *)((DWORD)desc_addr_fs_device);
total_tran_cnt = fs_device_desc.bLength;
if(req_tran_cnt < total_tran_cnt){
/* < */
total_tran_cnt = req_tran_cnt;
}
actual_tran_cnt = total_tran_cnt;
usb_flag.ReplyDescriptor = 1; /* Descriptor */
}
break;
case CONFIGURATION:
if(rEP0SETUP_2){ /* wValue.l */
return REQUEST_ERROR;
}
if(rEP0SETUP_5 || rEP0SETUP_4){ /* wIndex */
return REQUEST_ERROR;
}
if(req_tran_cnt != 0){
/* FS */
tran_start_addr = (BYTE *)((DWORD)desc_addr_fs_config);
total_tran_cnt = WD(&(fs_config_desc.wTotalLength));
if(req_tran_cnt < total_tran_cnt){
/* < */
total_tran_cnt = req_tran_cnt;
}
actual_tran_cnt = total_tran_cnt;
usb_flag.ReplyDescriptor = 1; /* Descriptor */
}
break;
case STRING:
if(rEP0SETUP_2 > NUM_STRING){ /* wValue.l */
return REQUEST_ERROR;
}
if(req_tran_cnt != 0){
tran_start_addr = (BYTE *)((DWORD)desc_addr_string[rEP0SETUP_2]);
total_tran_cnt = *((BYTE *)string_table[rEP0SETUP_2]);
if(req_tran_cnt < total_tran_cnt){
/* < */
total_tran_cnt = req_tran_cnt;
}
actual_tran_cnt = total_tran_cnt;
usb_flag.ReplyDescriptor = 1; /* Descriptor */
}
break;
case INTERFACE_POWER:
default:
return REQUEST_ERROR;
}
return REQUEST_OK;
}
/*****************************************************************************
*
* : Get Configuration
* :
* :
* :
* : usb_state
* usb_wk_data[] USB
* total_tran_cnt
* actual_tran_cnt
* tran_start_addr
*
*****************************************************************************/
int GetConfiguration(void)
{
if((rEP0SETUP_0 & 0x80) != 0x80){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
return REQUEST_ERROR;
}
if(usb_state == DEFAULT_STATE){
return REQUEST_ERROR;
}
if(rEP0SETUP_3 || rEP0SETUP_2){ /* wValue */
return REQUEST_ERROR;
}
if(rEP0SETUP_5 || rEP0SETUP_4){ /* wIndex */
return REQUEST_ERROR;
}
if(rEP0SETUP_7 || rEP0SETUP_6 != 0x01){ /* wLength */
return REQUEST_ERROR;
}
if(usb_state == CONFIGURED_STATE){
usb_wk_data[0] = 0x01;
}else{
usb_wk_data[0] = 0x00;
}
total_tran_cnt = actual_tran_cnt = 0x01;
tran_start_addr = &usb_wk_data[0];
return REQUEST_OK;
}
/*****************************************************************************
*
* : Set Configuration
* :
* :
* :
* : usb_state
* current_alt_set AlternateSetting
*
*****************************************************************************/
int SetConfiguration(void)
{
if((rEP0SETUP_0 & 0x80) != 0x00){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
return REQUEST_ERROR;
}
if(usb_state == DEFAULT_STATE){
return REQUEST_ERROR;
}
if(rEP0SETUP_3){ /* wValue.h */
return REQUEST_ERROR;
}
if(rEP0SETUP_5 || rEP0SETUP_4){ /* wIndex */
return REQUEST_ERROR;
}
if(rEP0SETUP_7 || rEP0SETUP_6){ /* wLength */
return REQUEST_ERROR;
}
if(rEP0SETUP_2 > 0x01){
return REQUEST_ERROR;
}
if(rEP0SETUP_2){
/* Configured State */
usb_state = CONFIGURED_STATE;
current_alt_set = 0;
SetAlternateInterface(current_alt_set);
}else{
/* Address State */
usb_state = ADDRESS_STATE;
/* */
rEPaConfig_0_BP.EnEndPoint = 0;
rEPbConfig_0_BP.EnEndPoint = 0;
rEPcConfig_0_BP.EnEndPoint = 0;
}
return REQUEST_OK;
}
/*****************************************************************************
*
* : Get Interface
* :
* :
* :
* : usb_state
* current_alt_set AlternateSetting
* usb_wk_data[] USB
* total_tran_cnt
* actual_tran_cnt
* tran_start_addr
*
*****************************************************************************/
int GetInterface(void)
{
if((rEP0SETUP_0 & 0x80) != 0x80){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_INTERFACE){
return REQUEST_ERROR;
}
if(usb_state != CONFIGURED_STATE){
return REQUEST_ERROR;
}
if(rEP0SETUP_3 || rEP0SETUP_2){ /* wValue */
return REQUEST_ERROR;
}
if(rEP0SETUP_5){ /* wIndex.h */
return REQUEST_ERROR;
}
if(rEP0SETUP_7 || rEP0SETUP_6 != 0x01){ /* wLength */
return REQUEST_ERROR;
}
if(rEP0SETUP_4){ /* Interface */
return REQUEST_ERROR;
}
usb_wk_data[0] = current_alt_set;
total_tran_cnt = actual_tran_cnt = 0x01;
tran_start_addr = &usb_wk_data[0];
return REQUEST_OK;
}
/*****************************************************************************
*
* : Set Interface
* :
* :
* :
* : usb_state
* current_alt_set AlternateSetting
*
*****************************************************************************/
int SetInterface(void)
{
if((rEP0SETUP_0 & 0x80) != 0x00){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_INTERFACE){
return REQUEST_ERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -