www.pudn.com > arm_uDisk.rar > USBLIB.C
/**************************************************************** NAME: usblib.c DESC: S3C2410X USB library functions HISTORY: Mar.25.2002:purnnamu: ported for S3C2410X. Mar.27.2002:purnnamu: DMA is enabled. ****************************************************************/ #include#include "option.h" #include "2410addr.h" #include "2410lib.h" #include "def.h" #include "2410usb.h" #include "usbmain.h" #include "usblib.h" #include "usbsetup.h" void ConfigUsbd(void) { ReconfigUsbd(); rINTMSK&=~(BIT_USBD); //Just only enable USBD INT @0x4a000008=0xFDFFFFFF } void ReconfigUsbd(void) { // *** End point information *** // EP0: control // EP1: bulk in end point // EP2: not used // EP3: bulk out end point // EP4: not used rPWR_REG=PWR_REG_DEFAULT_VALUE; //disable suspend mode rINDEX_REG=0; rMAXP_REG=FIFO_SIZE_8; //EP0 max packit size = 8 rEP0_CSR=EP0_SERVICED_OUT_PKT_RDY|EP0_SERVICED_SETUP_END; //EP0:clear OUT_PKT_RDY & SETUP_END rINDEX_REG=1; #if (EP1_PKT_SIZE==32) rMAXP_REG=FIFO_SIZE_32; //EP1:max packit size = 32 #else rMAXP_REG=FIFO_SIZE_64; //EP1:max packit size = 64 #endif rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT; #ifdef _FOR_UDISK_ if(USBD_flg==0) rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK|EPI_BULK; //IN mode, IN_DMA_INT=masked else if(USBD_flg==1) rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK|EPI_BULK|EPI_AUTO_SET; #else rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK|EPI_BULK; //IN mode, IN_DMA_INT=masked #endif rOUT_CSR1_REG=EPO_CDT; rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK; rINDEX_REG=2; rMAXP_REG=FIFO_SIZE_64; //EP2:max packit size = 64 rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT|EPI_BULK; rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK; //IN mode, IN_DMA_INT=masked rOUT_CSR1_REG=EPO_CDT; rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK; rINDEX_REG=3; #if (EP3_PKT_SIZE==32) rMAXP_REG=FIFO_SIZE_32; //EP3:max packit size = 32 #else rMAXP_REG=FIFO_SIZE_64; //EP3:max packit size = 64 #endif rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT|EPI_BULK; rIN_CSR2_REG=EPI_MODE_OUT|EPI_IN_DMA_INT_MASK; //OUT mode, IN_DMA_INT=masked rOUT_CSR1_REG=EPO_CDT; //clear OUT_PKT_RDY, data_toggle_bit. //The data toggle bit should be cleared when initialization. #ifdef _FOR_UDISK_ if(USBD_flg==0) rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK; else if(USBD_flg==1) rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK|EPO_AUTO_CLR; #else rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK; #endif rINDEX_REG=4; rMAXP_REG=FIFO_SIZE_64; //EP4:max packit size = 64 rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT|EPI_BULK; rIN_CSR2_REG=EPI_MODE_OUT|EPI_IN_DMA_INT_MASK; //OUT mode, IN_DMA_INT=masked rOUT_CSR1_REG=EPO_CDT; //clear OUT_PKT_RDY, data_toggle_bit. //The data toggle bit should be cleared when initialization. rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK; rEP_INT_REG=EP0_INT|EP1_INT|EP2_INT|EP3_INT|EP4_INT; rUSB_INT_REG=RESET_INT|SUSPEND_INT|RESUME_INT; //Clear all usbd pending bits //EP0,1,3 & reset interrupt are enabled rEP_INT_EN_REG=EP0_INT|EP1_INT|EP3_INT; rUSB_INT_EN_REG=RESET_INT; ep0State=EP0_STATE_INIT; } void RdPktEp0(U8 *buf,int num) { int i; for(i=0;i