📄 u_request.c
字号:
if(usb_state != CONFIGURED_STATE){
return REQUEST_ERROR;
}
if(rEP0SETUP_3){ /* wValue.h */
return REQUEST_ERROR;
}
if(rEP0SETUP_5){ /* wIndex.h */
return REQUEST_ERROR;
}
if(rEP0SETUP_7 || rEP0SETUP_6){ /* wLength */
return REQUEST_ERROR;
}
if(rEP0SETUP_4){ /* Interface */
return REQUEST_ERROR;
}
/* FS */
if(rEP0SETUP_2 > NUM_FS_ALT_SET){ /* ? */
return REQUEST_ERROR;
}
current_alt_set = rEP0SETUP_2;
SetAlternateInterface(rEP0SETUP_2);
return REQUEST_OK;
}
/*****************************************************************************
*
* :
*
* :
* : REQUEST_OK
* : REQUEST_ERROR
* :
*
*****************************************************************************/
int RequestError(void)
{
int ret = REQUEST_ERROR;
return ret;
}
/*****************************************************************************
*
* :
* AlternateSettingInterface
* : alternate_valid AlternateSetting
* :
* : fs_interface_table[] FSInterface
*
* hs_interface_table[] HSInterface
*
* max_pkt_size_a EPaMaxPacketSize
* max_pkt_size_b EPbMaxPacketSize
* max_pkt_size_c EPcMaxPacketSize
* bulk_in_state Bulk IN
* bulk_out_state Bulk OUT
* int_in_state Interrupt IN
* tran_protocol
* usb_state
*
*****************************************************************************/
void SetAlternateInterface(BYTE alternate_valid)
{
InterfaceDesc *p_i_desc;
/* FS */
p_i_desc = &fs_interface_desc[alternate_valid];
max_pkt_size_a = WD(&p_i_desc->p_e_desc[0].wMaxPacketSize);
max_pkt_size_b = WD(&p_i_desc->p_e_desc[1].wMaxPacketSize);
/* EPa,EPb */
ep_number[0] = p_i_desc->p_e_desc[0].bEndpointAddress; /* bEndPointAddress */
rEPaConfig_0 = ep_number[0];
rEPaMaxSize_H = WORD2BYTE_H(max_pkt_size_a);
rEPaMaxSize_L = WORD2BYTE_L(max_pkt_size_a);
ep_number[1] = p_i_desc->p_e_desc[1].bEndpointAddress; /* bEndPointAddress */
rEPbConfig_0 = ep_number[1];
rEPbMaxSize_H = WORD2BYTE_H(max_pkt_size_b);
rEPbMaxSize_L = WORD2BYTE_L(max_pkt_size_b);
rEPaControl_BP.ForceNAK = 0;
rEPaControl_BP.ForceSTALL = 0;
rEPaControl_BP.EnShortPkt = 0;
rEPaControl_BP.AutoForceNAK = 0;
rEPaControl_BP.DisAF_NAK_Short = 0;
rEPaControl_BP.ToggleClr = 1;
rEPbControl_BP.ForceNAK = 1;
rEPbControl_BP.ForceSTALL = 0;
rEPbControl_BP.EnShortPkt = 0;
rEPbControl_BP.AutoForceNAK = 0;
rEPbControl_BP.DisAF_NAK_Short = 0;
rEPbControl_BP.ToggleClr = 1;
/* EPa,EPb& */
rEPaIntStat = 0xFF; /* */
/* */
rEPaIntEnb_BP.EnOUT_ShortACK = 0;
rEPaIntEnb_BP.EnIN_TranACK = 0;
rEPaIntEnb_BP.EnOUT_TranACK = 0;
rEPaIntEnb_BP.EnIN_TranNAK = 0;
rEPaIntEnb_BP.EnOUT_TranNAK = 0;
rEPaIntEnb_BP.EnIN_TranErr = 1;
rEPaIntEnb_BP.EnOUT_TranErr = 0;
rEPbIntEnb_BP.EnOUT_ShortACK = 0;
rEPbIntEnb_BP.EnIN_TranACK = 0;
rEPbIntEnb_BP.EnOUT_TranACK = 0;
rEPbIntEnb_BP.EnIN_TranNAK = 0;
rEPbIntEnb_BP.EnOUT_TranNAK = 0;
rEPbIntEnb_BP.EnIN_TranErr = 0;
rEPbIntEnb_BP.EnOUT_TranErr = 1;
bulk_in_state = BULK_IN_IDLE;
bulk_out_state = BULK_OUT_IDLE;
int_in_state = INT_IN_IDLE;
if(p_i_desc->bInterfaceProtocol == 0x50){
/* BulkOnly */
tran_protocol = BULKONLY;
max_pkt_size_c = 0;
ep_number[2] = 0x00;
rEPcIntEnb_BP.EnOUT_ShortACK = 0;
rEPcIntEnb_BP.EnIN_TranACK = 0;
rEPcIntEnb_BP.EnOUT_TranACK = 0;
rEPcIntEnb_BP.EnIN_TranNAK = 0;
rEPcIntEnb_BP.EnOUT_TranNAK = 0;
rEPcIntEnb_BP.EnIN_TranErr = 0;
rEPcIntEnb_BP.EnOUT_TranErr = 0;
}else{
/* CBI */
tran_protocol = CBI;
max_pkt_size_c = WD(&p_i_desc->p_e_desc[2].wMaxPacketSize);
ep_number[2] = p_i_desc->p_e_desc[2].bEndpointAddress; /* bEndPointAddress */
rEPcConfig_0 = ep_number[2];
rEPcMaxSize_H = WORD2BYTE_H(max_pkt_size_c);
rEPcMaxSize_L = WORD2BYTE_L(max_pkt_size_c);
rEPcControl_BP.ForceNAK = 1;
rEPcControl_BP.ForceSTALL = 0;
rEPcControl_BP.EnShortPkt = 0;
rEPcControl_BP.AutoForceNAK = 0;
rEPcControl_BP.DisAF_NAK_Short = 0;
rEPcControl_BP.ToggleClr = 1;
rEPcIntStat = 0xFF; /* */
/* */
rEPcIntEnb_BP.EnOUT_ShortACK = 0;
rEPcIntEnb_BP.EnIN_TranACK = 1;
rEPcIntEnb_BP.EnOUT_TranACK = 0;
rEPcIntEnb_BP.EnIN_TranNAK = 0;
rEPcIntEnb_BP.EnOUT_TranNAK = 0;
rEPcIntEnb_BP.EnIN_TranErr = 1;
rEPcIntEnb_BP.EnOUT_TranErr = 0;
}
if(usb_state == CONFIGURED_STATE){
rEPaConfig_0_BP.EnEndPoint = 1;
rEPbConfig_0_BP.EnEndPoint = 1;
if(tran_protocol == BULKONLY){
rEPcConfig_0_BP.EnEndPoint = 0;
}else{
rEPcConfig_0_BP.EnEndPoint = 1;
}
}
rEPnControl_BP.AllFIFO_Clr = 1;
}
/*****************************************************************************
*
* : Bulk-Only Mass Storage Reset
* :
* :
* :
* : usb_state
* protocol_phase
* initial_state
*
*****************************************************************************/
int BulkOnlyMassStorageReset(void)
{
if((rEP0SETUP_0 & 0x80) != 0x00){ /* */
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){ /* wLength */
return REQUEST_ERROR;
}
if(rEP0SETUP_4){ /* Interface */
return REQUEST_ERROR;
}
if(tran_protocol != BULKONLY){
return REQUEST_ERROR;
}
InitDeviceWorkArea();
ControlLED(PORT_TURN_OFF); /* PortLED */
if( rDMA_Control_BP.DMA_Running ){
/* DMA */
MasterDMAStop(); /* DMA*/
di();
rDMA_Control_BP.DMA_Stop = 1;
while(rDMA_Control_BP.DMA_Running);
rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
rDMA_IntStat = 0x01; /* DMA_Cmp,FIFO_IN_Cmp,FIFO_OUT_Cmp
rFIFO_IntStat = 0x03; *
*/
ei();
}else{
rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
}
rEPbControl_BP.ForceNAK = 1;
bulk_in_state = BULK_IN_IDLE;
bulk_out_state = BULK_OUT_IDLE;
protocol_phase = COMMAND_PHASE;
return REQUEST_OK;
}
/*****************************************************************************
*
* : Get Max LUN
* :
* :
* :
* : usb_state
* usb_wk_data[] USB
* total_tran_cnt
* actual_tran_cnt
* tran_start_addr
*
*****************************************************************************/
int GetMaxLUN(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;
}
if(tran_protocol != BULKONLY) {
return REQUEST_ERROR;
}
usb_wk_data[0] = 0x00;
total_tran_cnt = actual_tran_cnt = 0x01;
tran_start_addr = &usb_wk_data[0];
return REQUEST_OK;
}
/*****************************************************************************
*
* : Accept Device-Specific Command
* :
* :
* :
* : usb_state
* usb_wk_data[] USB
* total_tran_cnt
* actual_tran_cnt
* tran_start_addr
*
*****************************************************************************/
int AcceptDeviceSpecificCmd(void)
{
if((rEP0SETUP_0 & 0x80) != 0x00){ /* */
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 != 0x0C){ /* wLength */
return REQUEST_ERROR;
}
if(rEP0SETUP_4){ /* Interface */
return REQUEST_ERROR;
}
if(tran_protocol != CBI){
return REQUEST_ERROR;
}
/* */
rEPcControl_BP.EnShortPkt = 0;
rEPrFIFO_Clr_BP.EPcFIFO_Clr = 1;
total_tran_cnt = actual_tran_cnt = 0x0C;
tran_start_addr = &usb_wk_data[0];
return REQUEST_OK;
}
/*****************************************************************************
*
* : Test EP0 Out
* :
* :
* :
* : usb_state
* usb_wk_data[] USB
* total_tran_cnt
* actual_tran_cnt
* tran_start_addr
*
*****************************************************************************/
int TestEP0Out(void)
{
if((rEP0SETUP_0 & 0x80) != 0x00){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
return REQUEST_ERROR;
}
if(usb_state != CONFIGURED_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 > 0x01 || (rEP0SETUP_7 == 0x01 && rEP0SETUP_6 != 0x00)){ /* wLength > 0x0100 */
return REQUEST_ERROR;
}
total_tran_cnt = MKWORD(rEP0SETUP_7,rEP0SETUP_6);
actual_tran_cnt = total_tran_cnt;
tran_start_addr = &usb_wk_data[0];
return REQUEST_OK;
}
/*****************************************************************************
*
* : Test EP0 In
* :
* :
* :
* : usb_state
* usb_wk_data[] USB
* total_tran_cnt
* actual_tran_cnt
* tran_start_addr
*
*****************************************************************************/
int TestEP0In(void)
{
if((rEP0SETUP_0 & 0x80) != 0x80){ /* */
return REQUEST_ERROR;
}
if((rEP0SETUP_0 & 0x1F) != RECIPIENT_DEVICE){
return REQUEST_ERROR;
}
if(usb_state != CONFIGURED_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 > 0x01 || (rEP0SETUP_7 == 0x01 && rEP0SETUP_6 != 0x00)){ /* wLength > 0x0100 */
return REQUEST_ERROR;
}
total_tran_cnt = MKWORD(rEP0SETUP_7,rEP0SETUP_6);
actual_tran_cnt = total_tran_cnt;
tran_start_addr = &usb_wk_data[0];
return REQUEST_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -