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

📄 usb_otg_dev_main.c

📁 三星 S3C2460 USB OTG监控代码
💻 C
字号:
/*******************************************************************************
* File Name    : usb_otg_dev_main.c
* Description  : S3C2460A USB OTG endpoint interrupt handler, OTG initialization
* Author       : Haksoo Kim
* Dept         : Mobile solution, AP
* Created Date : 2005.06.02
* Version      : 1.0
* History
*   R1.0 (2005.06.02): First Release
********************************************************************************/  

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

#include "Option.h"
#include "2460addr.h"
#include "2460lib.h"

#include "2460usb_otg_dev.h"
#include "usb_otg.h"
#include "usb_otg_dev_main.h"
#include "usb_otg_dev_lib.h"
#include "usb_otg_dev_setup.h"
#include "usb_otg_dev_out.h"
#include "usb_otg_dev_in.h"

uint8 *ptrTxFifo0 = OTG_DEV_TX_FIFO(0);
uint8 *ptrTxFifo1 = OTG_DEV_TX_FIFO(1);
uint32 *ptrRxFifo = OTG_DEV_RX_FIFO;
extern volatile int isUsbOtgSetConfiguration;


void UsbOtgDevMain(void)
{
	// Standard USB Descriptor Definitions
	InitDescriptorTable();

	ConfigUsbOtgDev(); 
   
	PrepareEp1Fifo(); 
   
}

extern unsigned char not_suspend;
extern unsigned char not_resume;
extern unsigned char sus_res_print;
void __irq IsrUsbOtgDev(void)
{

	uint32 devIntr, epIntr, i;

	devIntr = apOTG_TLI_DEV_G->devIntr;
		
	
	if (devIntr & OTG_DEV_SUSPEND_INTR) {
	
		//* clear interrupt
		apOTG_TLI_DEV_G->devIntr |= OTG_DEV_SUSPEND_INTR;
		if(apOTG_TLI_DEV_G->devStatus & (0x1<<12))	//suspend interrupt
		{	    	
	    	if(sus_res_print==TRUE)
		    	printf("!!!SUSPEND!!!\n");
		    	
	    	not_suspend = FALSE;
		}
		else if(not_suspend == FALSE)	//resume interrupt
		{			
	    	if(sus_res_print==TRUE)
		    	printf("!!!RESUME!!!\n");
	    	
	    	not_resume = FALSE;
		}
	}
	
	
	if (devIntr & OTG_DEV_BUSRESET_INTR) {
		while (devIntr & OTG_DEV_BUSRESET_INTR) {
			
			apOTG_TLI_DEV_G->threshold = OTG_RX_FIFO_SIZE<<16 | 0<<0;	//no rx/tx threshold interrupt
			//* Disable and clear interrupts
			apOTG_TLI_DEV_G->devIntr = ~0x0;
			apOTG_TLI_DEV_G->epIntr = ~0x0;
			apOTG_TLI_DEV_G->devIntrMask = OTG_DEV_RX_FIFO_INTR | OTG_DEV_SETUP_INTR | OTG_DEV_BUSRESET_INTR | OTG_DEV_SETCFG_INTR;
			apOTG_TLI_DEV_G->epIntrMask = 0x03;	//enable inEP0, inEP1 interrupt	

			/* Set RX FIFO readies so we can receive packets */
			apOTG_TLI_DEV_S->OutEP[OTG_DEV_CTRL_ENDP].control = OTG_DEV_RX_FIFOREADY;
			apOTG_TLI_DEV_S->OutEP[OTG_DEV_BULKOUT_ENDP].control = OTG_DEV_RX_FIFOREADY;

			devIntr = apOTG_TLI_DEV_G->devIntr;
			
			ClearPending(BIT_USB);
			rSUBSRCPND=BIT_SUB_OTG;
		}

		return;
	}
	
	if (devIntr & OTG_DEV_I2C_INTR) {
	
		//* clear interrupt
		apOTG_TLI_DEV_G->devIntr |= OTG_DEV_I2C_INTR;
	}

	if (devIntr & (OTG_DEV_RX_FIFO_INTR | OTG_DEV_SETUP_INTR)) {

		UsbOtgDev_ServiceRxEP(devIntr);
		
	}
	
	if (devIntr & OTG_DEV_SETCFG_INTR) {
		
		isUsbOtgSetConfiguration = 1;
		
		//* clear interrupt
		apOTG_TLI_DEV_G->devIntr |= OTG_DEV_SETCFG_INTR;
	}

	epIntr = apOTG_TLI_DEV_G->epIntr;

	if (epIntr & OTG_DEV_ENDPT_MASK) {
		
		for (i = 0; i < OTG_DEV_NUM_ENDPTS; i++) {

			if (epIntr & OTG_DEV_ENDPT_MASK & (1 << i)) {

				UsbOtgDev_ServiceTxEP(i);
			}

		}
	}

	ClearPending(BIT_USB);
	rSUBSRCPND=BIT_SUB_OTG;

	return;
}

void UsbOtgDev_ServiceRxEP(uint32 devIntr)
{
	uint8 epNum;
	
	//* If Setup interrupt (must check this first) */
	if (devIntr & OTG_DEV_SETUP_INTR)
	{
		//* call sub-function
		UsbOtg_SetupHandler();
		
		//* clear interrupt
		apOTG_TLI_DEV_G->setupStatus = OTG_DEV_SETUP_STATUS_INTR;
		
		//* clear interrupt
		apOTG_TLI_DEV_G->devIntr |= OTG_DEV_SETUP_INTR;
	}
	if (devIntr & OTG_DEV_RX_FIFO_INTR)
	{
		epNum = ((apOTG_TLI_DEV_G->rxStatus) >> OTG_DEV_RX_ENDP_SHIFT) & OTG_DEV_RX_ENDP_MASK;
				
		//* call sub-function
		if(epNum == OTG_DEV_CTRL_ENDP)
		{
			UsbOtg_Ep0RxHandler();
		}
		else if(epNum == OTG_DEV_BULKOUT_ENDP)
		{
			UsbOtg_Ep3RxHandler();
		}
		
		//* clear interrupt
		apOTG_TLI_DEV_G->rxStatus |= OTG_DEV_RX_STATUS_INTR;
		
		//* clear interrupt
		apOTG_TLI_DEV_G->devIntr |= OTG_DEV_RX_FIFO_INTR;
	}
	return;
}

void UsbOtgDev_ServiceTxEP(uint32 epIntr)
{
	//* Check Control EP first
	if(epIntr == 0)
	{
		//* call sub-function
		UsbOtg_Ep0TxHandler();
		
		//* clear interrupt
		apOTG_TLI_DEV_G->epIntr |= 1<<0;
	}
	else
	{
		//* call sub-function
		UsbOtg_Ep1TxHandler();
		
		//* clear interrupt
		apOTG_TLI_DEV_G->epIntr |= 1<<epIntr;
	}
	
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -