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 + -
显示快捷键?