⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbinit.c

📁 将s3c2410作为usb设备
💻 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 + -