📄 u_request.c
字号:
/* 128 */
return REQUEST_ERROR;
}
usb_flag.Address = 1;
return REQUEST_OK;
}
/*****************************************************************************
* GetDescriptor
*****************************************************************************/
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
*****************************************************************************/
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;
}
/*****************************************************************************
* SetConfiguration
*****************************************************************************/
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;
}
/*****************************************************************************
* GetInterface
*****************************************************************************/
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;
}
/*****************************************************************************
* SetInterface
*****************************************************************************/
int SetInterface(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){ /* 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;
}
/*****************************************************************************
* RequestError
*****************************************************************************/
int RequestError(void)
{
return REQUEST_ERROR;
}
/*****************************************************************************
* SetAlternateInterface
*****************************************************************************/
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;
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)
{
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;
}
if(usb_state == CONFIGURED_STATE)
{
rEPaConfig_0_BP.EnEndPoint = 1;
rEPbConfig_0_BP.EnEndPoint = 1;
rEPcConfig_0_BP.EnEndPoint = 0;
}
rEPnControl_BP.AllFIFO_Clr = 1;
}
/*****************************************************************************
* BulkOnlyMassStorageReset
*****************************************************************************/
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;
}
InitDeviceWorkArea();
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
*****************************************************************************/
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;
}
/*****************************************************************************
* AcceptDeviceSpecificCmd
*****************************************************************************/
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;
}
/*****************************************************************************
* TestEP0Out
*****************************************************************************/
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
*****************************************************************************/
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 + -