📄 usbinit.c
字号:
#include "s3c2410.h"
#include "smdk2410.h"
#include "Public.h"
#include "Uart.h"
#include "UsbAddr.h"
#include "UsbLib.h"
#include "UsbInit.h"
#include "IntHandler.h"
#include "InOutHandler.h"
extern U32 ep0State;
void SetUsb(void)
{
rGPHCON =(rGPHCON&~(0xf<<18))|(0x5<<18);
rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1
rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.
InitDescriptorTable();
ConfigUsbd();
}
void ConfigUsbd(void) //特殊功能寄存器配置
{
// *** End point information ***
// EP0: control
// EP1: bulk in end point
// EP2: not used
// EP3: bulk out end point
// EP4: not used
rPWR_REG=0; //电源设置disable suspend mode(不要悬挂模式)
rINDEX_REG=0; //索引寄存器 0:指向0端口--------------
rMAXP_REG=0x01; //最大包寄存器,以"字节"为单位:0x01*8=8(位) //EP0 max packit size = 8
rEP0_CSR=EP0_SERVICED_OUT_PKT_RDY|EP0_SERVICED_SETUP_END; //EP0:clear OUT_PKT_RDY & SETUP_END 0x40|0x80:1100,0000
//EP0_SERVICED_OUT_PKT_RDY 0x40 // MCU writes 1 to clear OUT_PKT_READY
//EP0_SERVICED_SETUP_END 0x80 // MCU writes 1 to clear SETUP_END
rINDEX_REG=1; //指向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; //0x08|0x40 0100,1000
rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK|EPI_BULK; //(1<<5)|(1<<4)|(0<<6) 0011,0000 IN mode, IN_DMA_INT=masked
rOUT_CSR1_REG=EPO_CDT; //0x80 1000,0000
rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK; //(0<<6)|(1<<5) 0010,0000
/*
rINDEX_REG=2; //指向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; //指向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; //0x08|0x40|(0<<6) 0100,1000
rIN_CSR2_REG=EPI_MODE_OUT|EPI_IN_DMA_INT_MASK; //(0<<5)|(1<<4) 0001,0000 OUT mode, IN_DMA_INT=masked
rOUT_CSR1_REG=EPO_CDT; //0x80 1000,0000
rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK; //(0<<6)|(1<<5) 0010,0000
//clear OUT_PKT_RDY, data_toggle_bit.
//The data toggle bit should be cleared when initialization.
/*
rINDEX_REG=4; //指向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;
rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK;
//clear OUT_PKT_RDY, data_toggle_bit.
//The data toggle bit should be cleared when initialization.
*/
rEP_INT_REG=EP0_INT|EP1_INT|EP2_INT|EP3_INT|EP4_INT; //5个端口中断清除
rUSB_INT_REG=RESET_INT|SUSPEND_INT|RESUME_INT; //挂起,恢复,重启,中断清除
rEP_INT_EN_REG=EP0_INT|EP1_INT|EP3_INT; //端口0,1,3中断使能
rUSB_INT_EN_REG=RESET_INT; //重启中断使能
ep0State=EP0_STATE_INIT;
}//ConfigUsbd()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -