/******************************************************************************* * Function Name : DFU_Reset. * Description : DFU reset routine * Input : None. * Output : None. * Return : None. *******************************************************************************/ void DFU_Reset(void) { /* Set DFU_DEVICE as not configured */ Device_Info.Current_Configuration = 0; /* Current Feature initialization */ pInformation->Current_Feature = DFU_ConfigDescriptor[7]; _SetBTABLE(BTABLE_ADDRESS); /* Initialize Endpoint 0 */ _SetEPType(ENDP0, EP_CONTROL); _SetEPTxStatus(ENDP0, EP_TX_NAK); _SetEPRxAddr(ENDP0, ENDP0_RXADDR); SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); _SetEPTxAddr(ENDP0, ENDP0_TXADDR); SetEPTxCount(ENDP0, Device_Property.MaxPacketSize); Clear_Status_Out(ENDP0); SetEPRxValid(ENDP0); /* Set this device to response on default address */ SetDeviceAddress(0); /* Set the new control state of the device to Attached */ bDeviceState = ATTACHED; }
/******************************************************************************* * Function Name : Standard_SetEndPointFeature * Description : Set or enable a specific feature of EndPoint * Input : None. * Output : None. * Return : - Return USB_SUCCESS, if the request is performed. * - Return USB_UNSUPPORT, if the request is invalid. *******************************************************************************/ RESULT Standard_SetEndPointFeature(void) { uint32_t wIndex0; uint32_t Related_Endpoint; uint32_t rEP; uint32_t Status; wIndex0 = pInformation->USBwIndex0; rEP = wIndex0 & ~0x80; Related_Endpoint = ENDP0 + rEP; if(ValBit(pInformation->USBwIndex0, 7)) { /* get Status of endpoint & stall the request if the related_ENdpoint is Disabled*/ Status = _GetEPTxStatus(Related_Endpoint); } else { Status = _GetEPRxStatus(Related_Endpoint); } if(Related_Endpoint >= Device_Table.Total_Endpoint || pInformation->USBwValue != 0 || Status == 0 || pInformation->Current_Configuration == 0) { return USB_UNSUPPORT; } else { if(wIndex0 & 0x80) { /* IN endpoint */ _SetEPTxStatus(Related_Endpoint, EP_TX_STALL); } else { /* OUT endpoint */ _SetEPRxStatus(Related_Endpoint, EP_RX_STALL); } } pUser_Standard_Requests->User_SetEndPointFeature(); return USB_SUCCESS; }
/******************************************************************************* * Function Name : DFU_Reset. * Description : DFU reset routine * Input : None. * Output : None. * Return : None. *******************************************************************************/ void DFU_Reset(void) { /* Set DFU_DEVICE as not configured */ Device_Info.Current_Configuration = 0; /* Current Feature initialization */ pInformation->Current_Feature = DFU_ConfigDescriptor[7]; #ifdef STM32F10X_CL /* EP0 is already configured in DFU_Init by OTG_DEV_Init() function No Other endpoints needed for this firmware */ #else _SetBTABLE(BTABLE_ADDRESS); /* Initialize Endpoint 0 */ _SetEPType(ENDP0, EP_CONTROL); _SetEPTxStatus(ENDP0, EP_TX_NAK); _SetEPRxAddr(ENDP0, ENDP0_RXADDR); SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); _SetEPTxAddr(ENDP0, ENDP0_TXADDR); SetEPTxCount(ENDP0, Device_Property.MaxPacketSize); Clear_Status_Out(ENDP0); SetEPRxValid(ENDP0); /* Set this device to response on default address */ SetDeviceAddress(0); #endif /* STM32F10X_CL */ /* Set the new control state of the device to Attached */ bDeviceState = ATTACHED; }
/******************************************************************************* * Function Name : DFU_Reset * Description : * Input : None * Output : None * Return : None *******************************************************************************/ void DFU_Reset(void) { /* Set DFU_DEVICE as not configured */ Device_Info.Current_Configuration = 0; _SetBTABLE(BTABLE_ADDRESS); /* Initialize Endpoint 0 */ _SetEPType(ENDP0, EP_CONTROL); _SetEPTxStatus(ENDP0, EP_TX_NAK); _SetEPRxAddr(ENDP0, ENDP0_RXADDR); SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); _SetEPTxAddr(ENDP0, ENDP0_TXADDR); SetEPTxCount(ENDP0, Device_Property.MaxPacketSize); Clear_Status_Out(ENDP0); SetEPRxValid(ENDP0); /* Set this device to response on default address */ SetDeviceAddress(0); /* if(!DFU_Button_Read()) { DeviceState=STATE_dfuIDLE; DeviceStatus[4]=DeviceState; DeviceStatus[1]=0; DeviceStatus[2]=0; DeviceStatus[3]=0; }*/ } /* DFU_Reset() */
void usbReset(void) { pInformation->Current_Configuration = 0; /* current feature is current bmAttributes */ pInformation->Current_Feature = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELF_POWERED); _SetBTABLE(USB_BTABLE_ADDRESS); /* setup control endpoint 0 */ _SetEPType(ENDP0, EP_CONTROL); _SetEPTxStatus(ENDP0, EP_TX_STALL); _SetEPRxAddr(ENDP0,VCOM_CTRL_RX_ADDR); _SetEPTxAddr(ENDP0,VCOM_CTRL_TX_ADDR); Clear_Status_Out(ENDP0); SetEPRxCount(ENDP0, pProperty->MaxPacketSize); SetEPRxValid(ENDP0); /* setup management endpoint 1 */ SetEPType (VCOM_NOTIFICATION_ENDP, EP_INTERRUPT); SetEPTxAddr (VCOM_NOTIFICATION_ENDP, VCOM_NOTIFICATION_ADDR); SetEPTxStatus (VCOM_NOTIFICATION_ENDP, EP_TX_NAK); SetEPRxStatus (VCOM_NOTIFICATION_ENDP, EP_RX_DIS); /* setup data endpoint OUT (rx) */ /* SetEPType (VCOM_RX_ENDP, EP_BULK); */ /* SetEPRxAddr (VCOM_RX_ENDP, VCOM_RX_ADDR); */ /* SetEPRxCount (VCOM_RX_ENDP, VCOM_RX_EPSIZE); */ /* // SetEPTxStatus (VCOM_RX_ENDP, EP_TX_DIS); */ /* SetEPRxStatus (VCOM_RX_ENDP, EP_RX_VALID); */ SetEPType (3, EP_BULK); SetEPRxAddr (3, 0x110); SetEPRxCount (3,64); // SetEPTxStatus (VCOM_RX_ENDP, EP_TX_DIS); SetEPRxStatus (3, EP_RX_VALID); /* setup data endpoint IN (tx) */ SetEPType (VCOM_TX_ENDP, EP_BULK); SetEPTxAddr (VCOM_TX_ENDP, VCOM_TX_ADDR); SetEPTxStatus (VCOM_TX_ENDP, EP_TX_NAK); SetEPRxStatus (VCOM_TX_ENDP, EP_RX_DIS); bDeviceState = ATTACHED; SetDeviceAddress(0); /* reset the rx fifo */ recvBufIn = 0; recvBufOut = 0; maxNewBytes = VCOM_RX_EPSIZE; countTx = 0; }
void ep_send(int ep_nr, const u8 * buf, int len) { int i; u32 * ptr = (u32*)(((u16)*EPREG_TXBUF_ADDR(ep_nr)) * 2 + PMA_ADDR); //TRACE("send ep<%d>: ptr %p, len %d\n", ep_nr, ptr, len); //DUMPHEX((u8*)buf, len); for (i=0; i<len; i+=2) { (*ptr++) = ((rt_uint16_t)buf[i+1] << 8) | buf[i]; } if (len & 0x1) (*ptr++) = buf[i]; _SetEPTxCount(ep_nr, len); _SetEPTxStatus(ep_nr, EP_TX_VALID); }
void usbReset(void) { dfuUpdateByReset(); pInformation->Current_Configuration = 0; pInformation->Current_Feature = usbConfigDescriptorDFU.Descriptor[7]; _SetBTABLE(BTABLE_ADDRESS); /* setup the ctrl endpoint */ _SetEPType(ENDP0, EP_CONTROL); _SetEPTxStatus(ENDP0, EP_TX_STALL); _SetEPRxAddr(ENDP0, ENDP0_RXADDR); _SetEPTxAddr(ENDP0, ENDP0_TXADDR); Clear_Status_Out(ENDP0); SetEPRxCount(ENDP0, pProperty->MaxPacketSize); // SetEPTxCount(ENDP0, pProperty->MaxPacketSize); SetEPRxValid(ENDP0); bDeviceState = ATTACHED; SetDeviceAddress(0); /* different than usbSetDeviceAddr! comes from usb_core */ }
/******************************************************************************* * Function Name : CTR_LP. * Description : Low priority Endpoint Correct Transfer interrupt's service * routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void CTR_LP(void) { u32 wEPVal = 0; /* stay in loop while pending ints */ while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) { _SetISTR((u16)CLR_CTR); /* clear CTR flag */ /* extract highest priority endpoint number */ EPindex = (u8)(wIstr & ISTR_EP_ID); if (EPindex == 0) { /* Decode and service control endpoint interrupt */ /* calling related service routine */ /* (Setup0_Process, In0_Process, Out0_Process) */ /* save RX & TX status */ /* and set both to NAK */ SaveRState = _GetEPRxStatus(ENDP0); SaveTState = _GetEPTxStatus(ENDP0); _SetEPRxStatus(ENDP0, EP_RX_NAK); _SetEPTxStatus(ENDP0, EP_TX_NAK); /* DIR bit = origin of the interrupt */ if ((wIstr & ISTR_DIR) == 0) { /* DIR = 0 */ /* DIR = 0 => IN int */ /* DIR = 0 implies that (EP_CTR_TX = 1) always */ _ClearEP_CTR_TX(ENDP0); In0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); _SetEPTxStatus(ENDP0, SaveTState); return; } else { /* DIR = 1 */ /* DIR = 1 & CTR_RX => SETUP or OUT int */ /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ wEPVal = _GetENDPOINT(ENDP0); if ((wEPVal & EP_CTR_TX) != 0) { _ClearEP_CTR_TX(ENDP0); In0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); _SetEPTxStatus(ENDP0, SaveTState); return; } else if ((wEPVal &EP_SETUP) != 0) { _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */ Setup0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); _SetEPTxStatus(ENDP0, SaveTState); return; } else if ((wEPVal & EP_CTR_RX) != 0) { _ClearEP_CTR_RX(ENDP0); Out0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); _SetEPTxStatus(ENDP0, SaveTState); return; } } }/* if(EPindex == 0) */ else { /* Decode and service non control endpoints interrupt */ /* process related endpoint register */ wEPVal = _GetENDPOINT(EPindex); if ((wEPVal & EP_CTR_RX) != 0) { /* clear int flag */ _ClearEP_CTR_RX(EPindex); /* call OUT service function */ (*pEpInt_OUT[EPindex-1])(); } /* if((wEPVal & EP_CTR_RX) */ if ((wEPVal & EP_CTR_TX) != 0) { /* clear int flag */ _ClearEP_CTR_TX(EPindex); /* call IN service function */ (*pEpInt_IN[EPindex-1])(); } /* if((wEPVal & EP_CTR_TX) != 0) */ }/* if(EPindex == 0) else */ }/* while(...) */ }
void Usb_SendData(u8 len) { //UserToPMABufferCopyENDP1(USB_TX_DATA,len); _SetEPTxCount(ENDP1, len); _SetEPTxStatus(ENDP1, EP_TX_VALID); }
/******************************************************************************* * Function Name : CTR_LP. * Description : Low priority Endpoint Correct Transfer interrupt's service * routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void CTR_LP(void) { u32 wEPVal = 0; // wIstr = *ISTR; /* stay in loop while pending ints */ while (((wIstr = (*ISTR)) & ISTR_CTR) != 0) //正确传输 { _SetISTR((u16)CLR_CTR); /* clear CTR flag 清正确传输中断*/ /* extract highest priority endpoint number */ EPindex = (u8)(wIstr & ISTR_EP_ID);//ISTR_EP_ID (0x000F) 这个只读,所以与0X000F& if (EPindex == 0) //如果是端点0 { /* Decode and service control endpoint interrupt */ /* calling related service routine */ /* (Setup0_Process, In0_Process, Out0_Process) */ /* save RX & TX status */ /* and set both to NAK */ SaveRState = _GetEPRxStatus(ENDP0); SaveTState = _GetEPTxStatus(ENDP0); _SetEPRxStatus(ENDP0, EP_RX_NAK); //当一次正确的OUT或SETUP数据传输完成后(CTR_RX=1), _SetEPTxStatus(ENDP0, EP_TX_NAK); //硬件会自动设置此位为NAK状态, //使应用程序有足够的时间在处理完当前传输的数据后, //响应下一个数据分组。 /* DIR bit = origin of the interrupt */ if ((wIstr & ISTR_DIR) == 0) //0x0010 如果是输入 { /* DIR = 0 */ /* DIR = 0 => IN int */ /* DIR = 0 implies that (EP_CTR_TX = 1) always */ _ClearEP_CTR_TX(ENDP0); In0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); _SetEPTxStatus(ENDP0, SaveTState); return; } else //输出 { /* DIR = 1 */ /* DIR = 1 & CTR_RX => SETUP or OUT int */ /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ //EP0的值 wEPVal =(u16)(*((volatile unsigned *)(0x40005C00L) + ENDP0)); if ((wEPVal & EP_CTR_TX) != 0) //硬件在一个正确的IN分组传输完成后置位 { _ClearEP_CTR_TX(ENDP0); In0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); //SaveTState=EP_TX_STALL; 在In0_Process() _SetEPTxStatus(ENDP0, SaveTState); //SaveTState=EP_TX_STALL; 在In0_Process() return; } //控制传输由3个阶段组成,首先是主机发送SETUP分组的SETUP阶段, //然后是主机发送零个或多个数据的数据阶段,最后是状态阶段,由与数据阶段方向相反的数据分组构成 //据SETUP分组的相应字段决定后面的传输是IN还是OUT。 else if ((wEPVal &EP_SETUP) != 0) //在USB模块收到一个正确的SETUP分组后由硬件置位 { _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */ Setup0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); _SetEPTxStatus(ENDP0, SaveTState); return; } else if ((wEPVal & EP_CTR_RX) != 0) { _ClearEP_CTR_RX(ENDP0); Out0_Process(); /* before terminate set Tx & Rx status */ _SetEPRxStatus(ENDP0, SaveRState); _SetEPTxStatus(ENDP0, SaveTState); return; } } }/* if(EPindex == 0) */ else { /* Decode and service non control endpoints interrupt */ /* process related endpoint register */ wEPVal = (u16)(*((volatile unsigned *)(0x40005C00L) + EPindex)); if ((wEPVal & EP_CTR_RX) != 0) { /* clear int flag */ _ClearEP_CTR_RX(EPindex); /* call OUT service function */ (*pEpInt_OUT[EPindex-1])(); } /* if((wEPVal & EP_CTR_RX) */ if ((wEPVal & EP_CTR_TX) != 0) { /* clear int flag */ _ClearEP_CTR_TX(EPindex); /* call IN service function */ // (*pEpInt_IN[EPindex-1])(); } /* if((wEPVal & EP_CTR_TX) != 0) */ }/* if(EPindex == 0) else */ }/* while(...) */ }