usb.c

来自「SAMSUNG S3C6410 CPU BSP for winmobile6」· C语言 代码 · 共 1,937 行 · 第 1/5 页

C
1,937
字号
{
	int i;
	volatile UINT32 Rdata;

	for (i=0;i<num;i+=4)
	{
		//Rdata = Inp32(bulkOut_EP_FIFO);
		Inp32(bulkOut_EP_FIFO, Rdata);

		buf[i] = (UINT8)Rdata;
		buf[i+1] = (UINT8)(Rdata>>8);
		buf[i+2] = (UINT8)(Rdata>>16);
		buf[i+3] = (UINT8)(Rdata>>24);
	}

	// increase global down pointer for usb download function
	g_pDownPt += num;
}



//////////
// Function Name : OTGDEV_IsUsbOtgSetConfiguration
// Function Desctiption : This function checks if Set Configuration is received from the USB Host.
// Input : NONE
// Output : configuration result
// Version :
BOOL OTGDEV_IsUsbOtgSetConfiguration(void)
{
	if (oOtgDev.m_uIsUsbOtgSetConfiguration == 0)
		return false;
	else
		return true;
}

//////////
// Function Name : OTGDEV_SetOpMode
// Function Desctiption : This function sets CSRs related to the operation mode.
// Input : eMode, operation mode(cpu or dma)
// Output : NONE
// Version :
void OTGDEV_SetOpMode(USB_OPMODE eMode)
{
	oOtgDev.m_eOpMode = eMode;

	Outp32(GINTMSK, INT_RESUME|INT_OUT_EP|INT_IN_EP|INT_ENUMDONE|INT_RESET|INT_SUSPEND|INT_RX_FIFO_NOT_EMPTY); //gint unmask
	Outp32(GAHBCFG, MODE_SLAVE|BURST_SINGLE|GBL_INT_UNMASK);

	OTGDEV_SetOutEpXferSize(EP_TYPE_BULK, 1, oOtgDev.m_uBulkOutEPMaxPktSize);
	OTGDEV_SetInEpXferSize(EP_TYPE_BULK, 1, 0);

	Outp32(bulkOut_DOEPCTL, 1<<31|1<<26|2<<18|1<<15|oOtgDev.m_uBulkOutEPMaxPktSize<<0);		//bulk out ep enable, clear nak, bulk, usb active, next ep3, max pkt
	Outp32(bulkIn_DIEPCTL, 0<<31|1<<26|2<<18|1<<15|oOtgDev.m_uBulkInEPMaxPktSize<<0);		//bulk in ep enable, clear nak, bulk, usb active, next ep1, max pkt
}

//////////
// Function Name : OTGDEV_VerifyChecksum
// Function Desctiption : This function calculates the checksum by summing all downloaded data
//						and then compares the result with the checksum value which DNW sent.
// Input : NONE
// Output : NONE
// Version :
void OTGDEV_VerifyChecksum(void)
{
	UINT8* CalcCSPt;
	UINT16 dnCS;
	UINT16 checkSum;

	EdbgOutputDebugString("\nChecksum is being calculated....\n");

	// checksum calculation
	CalcCSPt = (UINT8*)oOtgDev.m_uDownloadAddress;
	checkSum = 0;
	while((UINT32)CalcCSPt < (oOtgDev.m_uDownloadAddress+(oOtgDev.m_uDownloadFileSize-8)))
		checkSum += *CalcCSPt++;

	// checkSum was calculated including dnCS. So, dnCS should be subtracted.
	checkSum=checkSum - *((unsigned char *)(oOtgDev.m_uDownloadAddress+oOtgDev.m_uDownloadFileSize-8-2))
		- *( (unsigned char *)(oOtgDev.m_uDownloadAddress+oOtgDev.m_uDownloadFileSize-8-1) );

	dnCS=*((unsigned char *)(oOtgDev.m_uDownloadAddress+oOtgDev.m_uDownloadFileSize-8-2))+
		(*( (unsigned char *)(oOtgDev.m_uDownloadAddress+oOtgDev.m_uDownloadFileSize-8-1) )<<8);

	if (checkSum ==dnCS)
	{
		EdbgOutputDebugString("Checksum O.K.\n\n");
	}
	else
	{
		EdbgOutputDebugString("Checksum Value => MEM:%x DNW:%x\n",checkSum,dnCS);
		EdbgOutputDebugString("Checksum failed.\n\n");
	}

}






//////////
// Function Name : INTC_Enable
// Function Description : This function sets the corresponding bit of interrupt enable register
// Input : intNum, interrupt number to be enabled
// Output : NONE
// Version :
void INTC_Enable(UINT32 intNum)
{
	volatile UINT32 temp;

	if(intNum<32)
	{
		//temp = Inp32(rVIC0INTENABLE);
		temp = s6410VIC0->VICINTENABLE;
		temp |= (1<<intNum);
		//Outp32(rVIC0INTENABLE, temp);
		s6410VIC0->VICINTENABLE = temp;
	}
	else
	{
		//temp = Inp32(rVIC1INTENABLE);
		temp = s6410VIC1->VICINTENABLE;
		temp |= (1<<(intNum-32));
		//Outp32(rVIC1INTENABLE, temp);
		s6410VIC1->VICINTENABLE = temp;
	}

	return;
}

void INTC_Disable(UINT32 intNum)
{
	volatile UINT32 temp;

	if(intNum<32)
	{
		//temp = Inp32(rVIC0INTENCLEAR);
		temp = s6410VIC0->VICINTENCLEAR;
		temp |= (1<<intNum);
		//Outp32(rVIC0INTENCLEAR, temp);
		s6410VIC0->VICINTENCLEAR = temp;
	}
	else
	{
		//temp = Inp32(rVIC1INTENCLEAR);
		temp = s6410VIC1->VICINTENCLEAR;
		temp |= (1<<(intNum-32));
		//Outp32(rVIC1INTENCLEAR, temp);
		s6410VIC1->VICINTENCLEAR = temp;
	}

	return;
}

//////////
// Function Name : INTC_ClearVectAddr
// Function Description : This function clears the vector address register
// Input : NONE
// Output : NONE
// Version :
void INTC_ClearVectAddr(void)
{
	//Outp32(rVIC0ADDR, 0);
	s6410VIC0->VICADDRESS = 0x0;
	//Outp32(rVIC1ADDR, 0);
	s6410VIC1->VICADDRESS = 0x0;

	return;
}

BOOL InitUSB()
{
	OTGDEV_InitOtg(USB_HIGH);

	g_pDownPt = (UINT8 *)DMABUFFER;
	readPtIndex = DMABUFFER;

	return TRUE;
}

static void InitializeVIC(void)
{
	RETAILMSG(1,(TEXT("Initialize IRQ Vector Tables\r\n")));
	// Disable All Interrupts

	s6410VIC0->VICINTENCLEAR = 0xFFFFFFFF;
	s6410VIC1->VICINTENCLEAR = 0xFFFFFFFF;
	s6410VIC0->VICSOFTINTCLEAR = 0xFFFFFFFF;
	s6410VIC1->VICSOFTINTCLEAR = 0xFFFFFFFF;

	// Clear Current Active Vector Address
	s6410VIC0->VICADDRESS = 0x0;
	s6410VIC1->VICADDRESS = 0x0;

	// Fill Vector Address of VIC0
	// Actually, Filled with Physical IRQ Numbers.
	// Because We do not use vectored interrupt feature
	s6410VIC0->VICVECTADDR0 = PHYIRQ_EINT0;
	s6410VIC0->VICVECTADDR1 = PHYIRQ_EINT1;
	s6410VIC0->VICVECTADDR2 = PHYIRQ_RTC_TIC;
	s6410VIC0->VICVECTADDR3 = PHYIRQ_CAMIF_C;
	s6410VIC0->VICVECTADDR4 = PHYIRQ_CAMIF_P;
#if		(CPU_NAME == S3C6410)
	s6410VIC0->VICVECTADDR5 = PHYIRQ_I2C1;
	s6410VIC0->VICVECTADDR6 = PHYIRQ_I2S_V40;
	s6410VIC0->VICVECTADDR7 = PHYIRQ_GPS;
	s6410VIC0->VICVECTADDR8 = PHYIRQ_3D;
#elif	(CPU_NAME == S3C6400)
	s6410VIC0->VICVECTADDR5 = PHYIRQ_CAMIF_MC;
	s6410VIC0->VICVECTADDR6 = PHYIRQ_CAMIF_MP;
	s6410VIC0->VICVECTADDR7 = PHYIRQ_CAMIF_WE_C;
	s6410VIC0->VICVECTADDR8 = PHYIRQ_CAMIF_WE_P;
#endif
	s6410VIC0->VICVECTADDR9 = PHYIRQ_POST;
	s6410VIC0->VICVECTADDR10 = PHYIRQ_ROTATOR;
	s6410VIC0->VICVECTADDR11 = PHYIRQ_2D;
	s6410VIC0->VICVECTADDR12 = PHYIRQ_TVENC;
	s6410VIC0->VICVECTADDR13 = PHYIRQ_TVSCALER;
	s6410VIC0->VICVECTADDR14 = PHYIRQ_BATF;
	s6410VIC0->VICVECTADDR15 = PHYIRQ_JPEG;
	s6410VIC0->VICVECTADDR16 = PHYIRQ_MFC;
	s6410VIC0->VICVECTADDR17 = PHYIRQ_SDMA0;
	s6410VIC0->VICVECTADDR18 = PHYIRQ_SDMA1;
	s6410VIC0->VICVECTADDR19 = PHYIRQ_ARM_DMAERR;
	s6410VIC0->VICVECTADDR20 = PHYIRQ_ARM_DMA;
	s6410VIC0->VICVECTADDR21 = PHYIRQ_ARM_DMAS;
	s6410VIC0->VICVECTADDR22 = PHYIRQ_KEYPAD;
	s6410VIC0->VICVECTADDR23 = PHYIRQ_TIMER0;
	s6410VIC0->VICVECTADDR24 = PHYIRQ_TIMER1;
	s6410VIC0->VICVECTADDR25 = PHYIRQ_TIMER2;
	s6410VIC0->VICVECTADDR26 = PHYIRQ_WDT;
	s6410VIC0->VICVECTADDR27 = PHYIRQ_TIMER3;
	s6410VIC0->VICVECTADDR28 = PHYIRQ_TIMER4;
	s6410VIC0->VICVECTADDR29 = PHYIRQ_LCD0_FIFO;
	s6410VIC0->VICVECTADDR30 = PHYIRQ_LCD1_FRAME;
	s6410VIC0->VICVECTADDR31 = PHYIRQ_LCD2_SYSIF;

	// Fill Vector Address of VIC1
	s6410VIC1->VICVECTADDR0 = PHYIRQ_EINT2;
	s6410VIC1->VICVECTADDR1 = PHYIRQ_EINT3;
	s6410VIC1->VICVECTADDR2 = PHYIRQ_PCM0;
	s6410VIC1->VICVECTADDR3 = PHYIRQ_PCM1;
	s6410VIC1->VICVECTADDR4 = PHYIRQ_AC97;
	s6410VIC1->VICVECTADDR5 = PHYIRQ_UART0;
	s6410VIC1->VICVECTADDR6 = PHYIRQ_UART1;
	s6410VIC1->VICVECTADDR7 = PHYIRQ_UART2;
	s6410VIC1->VICVECTADDR8 = PHYIRQ_UART3;
	s6410VIC1->VICVECTADDR9 = PHYIRQ_DMA0;
	s6410VIC1->VICVECTADDR10 = PHYIRQ_DMA1;
	s6410VIC1->VICVECTADDR11 = PHYIRQ_ONENAND0;
	s6410VIC1->VICVECTADDR12 = PHYIRQ_ONENAND1;
	s6410VIC1->VICVECTADDR13 = PHYIRQ_NFC;
	s6410VIC1->VICVECTADDR14 = PHYIRQ_CFC;
	s6410VIC1->VICVECTADDR15 = PHYIRQ_UHOST;
	s6410VIC1->VICVECTADDR16 = PHYIRQ_SPI0;
	s6410VIC1->VICVECTADDR17 = PHYIRQ_SPI1;
	s6410VIC1->VICVECTADDR18 = PHYIRQ_I2C;
	s6410VIC1->VICVECTADDR19 = PHYIRQ_HSITX;
	s6410VIC1->VICVECTADDR20 = PHYIRQ_HSIRX;
	s6410VIC1->VICVECTADDR21 = PHYIRQ_RESERVED;
	s6410VIC1->VICVECTADDR22 = PHYIRQ_MSM;
	s6410VIC1->VICVECTADDR24 = PHYIRQ_HOSTIF;
	s6410VIC1->VICVECTADDR24 = PHYIRQ_HSMMC0;
	s6410VIC1->VICVECTADDR25 = PHYIRQ_HSMMC1;
	s6410VIC1->VICVECTADDR26 = PHYIRQ_OTG;
	s6410VIC1->VICVECTADDR27 = PHYIRQ_IRDA;
	s6410VIC1->VICVECTADDR28 = PHYIRQ_RTC_ALARM;
	s6410VIC1->VICVECTADDR29 = PHYIRQ_SEC;
	s6410VIC1->VICVECTADDR30 = PHYIRQ_PENDN;
	s6410VIC1->VICVECTADDR31 = PHYIRQ_ADC;

	// Disable Vectored Interrupt Mode on CP15
	System_DisableVIC();

	// Enable IRQ Interrupt on CP15
	System_EnableIRQ();

	// Enable FIQ Interrupt on CP15
	//System_EnableFIQ();
}


void Isr_Init(void)
{
	s6410VIC0 = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC0, FALSE);
	s6410VIC1 = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC1, FALSE);

	InitializeVIC();

	//EdbgOutputDebugString("INFO: (unsigned)C_IsrHandler : 0x%x\r\n", (unsigned)C_IsrHandler);
	//EdbgOutputDebugString("INFO: (unsigned)ASM_IsrHandler : 0x%x\r\n", (unsigned)ASM_IsrHandler);

	// make value to assemble code "b IsrHandler"
	//EdbgOutputDebugString("INFO: (unsigned)pISR : 0x%x\r\n", (unsigned)pISR);
	pISR =(unsigned)(0xEA000000)+(((unsigned)ASM_IsrHandler - (0x80000000 + 0x18 + 0x8) )>>2);

	//EdbgOutputDebugString("INFO: (unsigned)pISR : 0x%x\r\n", (unsigned)pISR);
	//EdbgOutputDebugString("INFO: (unsigned)IsrHandler : 0x%x\r\n", (unsigned)IsrHandler);

	INTC_ClearVectAddr();

	INTC_Enable(PHYIRQ_OTG);
}

void C_IsrHandler(unsigned int val)
{

	INTC_Disable(PHYIRQ_OTG);

	//EdbgOutputDebugString("IsrUsbd is called\r\n");

	OTGDEV_HandleEvent();

	INTC_Enable(PHYIRQ_OTG);

	INTC_ClearVectAddr();

}

#pragma optimize ("",off)
BOOL UbootReadData(DWORD cbData, LPBYTE pbData)
{
   	//volatile S3C6410_VIC0_REG *s6410VIC0 = (S3C6410_VIC0_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC0, FALSE);
	//RETAILMSG(1,(TEXT("UbootReadData\n"));
	volatile UINT8* pbuf = NULL;
	while(1)
	{
		//RETAILMSG(1,(TEXT("0x%x 0x%x\n"), g_pDownPt, (readPtIndex + cbData)));
		if ( (DWORD)g_pDownPt >= (DWORD)(readPtIndex + cbData) )
		{
			pbuf = (PVOID)readPtIndex;
			memcpy((PVOID)pbData, (PVOID)pbuf, cbData);
			pbuf = (PVOID)OALPAtoUA(readPtIndex);
			memset((PVOID)pbuf, 0xff, cbData);
			readPtIndex += cbData;
			break;
		}
		else if((DWORD)g_pDownPt == DMABUFFER)
		{

		}
	}
	return TRUE;
}

#pragma optimize ("",on)

static void delayLoop(int count)
{
	volatile int j,i;
	for(j = 0; j < count; j++)
		for(i=0;i<1000;i++);
}


#if (USE_TRACE32_DOWNLOAD)
// jylee
BOOL Trace32_Init(void)
{
	g_pDownPt = (UINT8 *)(DMABUFFER + 0x1300000);
	readPtIndex = DMABUFFER;
	return TRUE;
}

BOOL Trace32ReadData(DWORD cbData, LPBYTE pbData)
{
	//RETAILMSG(1,(TEXT("Trace32ReadData\n")));
	while(1)
	{
		RETAILMSG(1,(TEXT("0x%x <-> 0x%x + 0x%x = (0x%x)\n"), g_pDownPt, readPtIndex, cbData, (readPtIndex + cbData)));
		if ( (DWORD)g_pDownPt >= readPtIndex + cbData )
		{
			memcpy((PVOID)pbData, (PVOID)readPtIndex, cbData);
			readPtIndex += cbData;
			break;
		}
		else if((DWORD)g_pDownPt == DMABUFFER)
		{
		}
	}

	return TRUE;
}
#endif

⌨️ 快捷键说明

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