亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sc2410_usb_hw.c

?? GEC2410開發板嵌如入式操作系統WinCE5.0
?? C
?? 第 1 頁 / 共 4 頁
字號:
  call the interrupt mechanism will keep things going.
 
  We return the actual number of bytes we've queued to the UDC. Note that
  until the next interrupt we wont know if it has been transmitted. We'll
  deal with the failure by saving the original packet and retransmitting if
  we get an error. In that case we'll return 0 as the number of bytes sent
  since no new bytes have been consumed from the caller's buffer.
 
  When the packet is accepted we return the number of bytes and grab the 
  next packet (or portion thereof).
 
*************************************************************************/
//:-)
void SC2400_USB_TxIntHandler( PSER_INFO pHWHead,
			      PUCHAR pTxBuffer,
			      ULONG *pBuffLen ) 
{
	unsigned int i;
	UCHAR ucLen;
	BYTE saveIndex;
	
	DEBUGMSG(1, (TEXT("++SC2400_USB_TxIntHandler\r\n")));

	USBDMSG(1, (TEXT("<T:%d>"),*pBuffLen));
	
	usbdShMem->usbdEir&=~USBDEIR_EP1;

	// Endpoint 1 mode
	saveIndex=*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX;
	UDC_REG_BITSET(struct INDEXBits, &pHWHead->pUSBCtrlAddr->INDEX, index, 0x1);
    //pHWHead->pUSBCtrlAddr->INDEX.index=0x1; //:-)
	
	pHWHead->CommErrors &= ~CE_TXFULL;

	// If nothing to send, just return after clearing interrupt.
	if (! *pBuffLen ) 
	{
		DEBUGMSG (1, (TEXT("[TX:nothing to send]")));    
		*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX=saveIndex;
		return;
	}
    		      	
	// Don't try to send more than EP1 can handle.
	if( *pBuffLen > EP1Len )
    		ucLen = EP1Len;
	else {

		// If we end exactly on a packet boundary, the host doesn't
		// realize there is no more data.  So if we exactly fill the final 
		// packet, truncate it so we can send a short packet next frame
		// indicating end of the transmission
		if( *pBuffLen == EP1Len ) 
		{
			USBDMSG (1, (TEXT("Tx breaking packet\r\n")));            
			ucLen = EP1Len - 2;
		} else {
			ucLen = (UCHAR)*pBuffLen;
		}

	}

	if (!pHWHead->pUSBCtrlAddr->EP0ICSR1.opr_ipr)
	{
		// Write to the FIFO directly to send the bytes.
		for (i=0; i < ucLen; i++) 
		{
			IOW_REG_FIELD(struct EP1FBits, 
				&pHWHead->pUSBCtrlAddr->EP1F, fifo_data, *pTxBuffer++);
		}

		// Return number of bytes transmitted via pBuffLen.
		*pBuffLen = ucLen;
		UDC_REG_WRITE(struct EP0ICSR1Bits, &pHWHead->pUSBCtrlAddr->EP0ICSR1, opr_ipr, 1);
	} else {
		// Transmit already in progress.  Just return and wait for current
		// transmission to complete before sending more.
		USBDMSG(1, (TEXT("Write Pend !!!\r\n")));
		*pBuffLen = 0; 
	}

	DEBUGMSG(1, (TEXT("--SC2400_USB_TxIntHandler\r\n")));
	*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX=saveIndex;
}



BOOL
HW_PowerOff(
    PSER_INFO pHWHead 
    )
{
	pHWHead->State = OFF;
	// cache the interrupt regs
	pHWHead->cIntStat_uir = *(BYTE *)&pHWHead->pUSBCtrlAddr->UIR;
	pHWHead->cIntStat_eir = *(BYTE *)&pHWHead->pUSBCtrlAddr->EIR;
    
	// disable the USB Clocks
	EnterCriticalSection(&pHWHead->HwRegCritSec);
	//DEBUGMSG(1, (TEXT("USB:HW_PowerOff()\r\n")));
	RETAILMSG(1, (TEXT("USB:HW_PowerOff()\r\n")));
	HW_USBClocks(pHWHead);
	LeaveCriticalSection(&pHWHead->HwRegCritSec);

    return TRUE;
}


BOOL 
HW_PowerOn(
    PSER_INFO pHWHead
    )
{
		
	pHWHead->State = RESUME;

	// enable the USB Clocks
	EnterCriticalSection(&pHWHead->HwRegCritSec);
	//DEBUGMSG(1, (TEXT("USB:HW_PowerOn()\r\n")));
	RETAILMSG(1, (TEXT("USB:HW_PowerOn()\r\n")));
	HW_USBClocks(pHWHead);
	LeaveCriticalSection(&pHWHead->HwRegCritSec);

	SetInterruptEvent(pHWHead->pHWObj->dwIntID); 		
    
    return TRUE;
}



VOID
HW_USBClocks(PSER_INFO pHWHead)
{
	if ((pHWHead->State == IDLE) || (pHWHead->State == RESUME))
	{
		DEBUGMSG(1, (TEXT("HW_USBClocks::IDLE\r\n")));
        //
        // Enable the USB Clocks
        //
        pHWHead->pCLKPWR->rCLKCON |= (1<<7);
        DEBUGMSG(ZONE_INIT, (TEXT("rCLKCON: 0x%X\r\n"), pHWHead->pCLKPWR->rCLKCON));
        
        // Fin=12MHz, Fout=48MHz
        //pHWHead->pCLKPWR->rUPLLCON = 0x48032;   // ((0x48 << 12) + (0x3 << 4) + 0x2)
        //DEBUGMSG(ZONE_INIT, (TEXT("rUPLLCON: 0x%X\r\n"), pHWHead->pCLKPWR->rUPLLCON));

        //
        // MISCCR: USBD Pads, Normal mode
        //
        pHWHead->pIrqCtrlAddr->rMISCCR &= ~((3 << 12) | (1 << 3));

        // TO DO :
        // Enable USB_PULLUP on GPIO PIN (tied to USB D+) & set high
        //
/*	(Example)
        pHWHead->pIrqCtrlAddr->rGPDCON &= ~(3 << 30);    // clear GPE15
        pHWHead->pIrqCtrlAddr->rGPDCON |=  (1 << 30);    // config as output
        pHWHead->pIrqCtrlAddr->rGPDUP  |=  (1 << 15);    // pullup disabled
        pHWHead->pIrqCtrlAddr->rGPDDAT |=  (1 << 15);    // set high
*/
        DEBUGMSG(ZONE_INIT, (TEXT("rGPDCON: 0x%X\r\n"), pHWHead->pIrqCtrlAddr->rGPDCON));
        DEBUGMSG(ZONE_INIT, (TEXT("rGPDUP: 0x%X\r\n"),  pHWHead->pIrqCtrlAddr->rGPDUP));
        DEBUGMSG(ZONE_INIT, (TEXT("rGPDDAT: 0x%X\r\n"), pHWHead->pIrqCtrlAddr->rGPDDAT));
	}
	else if (pHWHead->State == OFF) 
	{
		DEBUGMSG(1, (TEXT("HW_USBClocks::OFF\r\n")));
        //
        // Disable the USB Clocks
        //
        pHWHead->pCLKPWR->rCLKCON &= ~(1<<7);

        DEBUGMSG(ZONE_INIT, (TEXT("rCLKCON: 0x%X\r\n"), pHWHead->pCLKPWR->rCLKCON));
        
        // Fin=12MHz, Fout=48MHz
        //pHWHead->pCLKPWR->rUPLLCON = 0;
        // MISCCR: USBD Pads, Suspend mode
        pHWHead->pIrqCtrlAddr->rMISCCR |= (3 << 12);

        // TO DO :
        // Disable USB_PULLUP to remove us from the bus
        
/*	(Example)
        pHWHead->pIrqCtrlAddr->rGPDCON &= ~(3 << 30);    // clear GPE15
        pHWHead->pIrqCtrlAddr->rGPDCON |=  (1 << 30);    // config as output
        pHWHead->pIrqCtrlAddr->rGPDUP  |=  (1 << 15);    // pullup disabled
        pHWHead->pIrqCtrlAddr->rGPDDAT &= ~(1 << 15);    // set low
*/
		DEBUGMSG(ZONE_INIT, (TEXT("rUPLLCON: 0x%X\r\n"), pHWHead->pCLKPWR->rUPLLCON));
	}
}


// :-)
/***************************************
  Added routines for USBD Rx:DMA Tx:ISR
 ***************************************/

BOOL InitUsbdDriverGlobals(void)
{
	BOOL	Ret;
	int i;

	if ( v_pDriverGlobals == NULL )
	{
		v_pDriverGlobals =(PDRIVER_GLOBALS)VirtualAlloc( 0,
						DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,
						MEM_RESERVE,
						PAGE_NOACCESS);
		if ( v_pDriverGlobals == NULL )
		{
		    USBDMSG( 1, (TEXT( "InitUsbdDriverGlobals : VirtualAlloc failed!\r\n")) );
			return ( FALSE );
		}

		Ret = VirtualCopy( (LPVOID)v_pDriverGlobals,
						   (LPVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START,
						   DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,
						   PAGE_READWRITE | PAGE_NOCACHE
						   );

		if ( Ret == FALSE )
		{
			DEBUGMSG( ZONE_ERROR, (TEXT( "InitUsbdDriverGlobals: VirtualCopy failed!\r\n")) );
			if ( v_pDriverGlobals )
			{
				VirtualFree( v_pDriverGlobals,
							 DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE ,
							 MEM_RELEASE
							);
				v_pDriverGlobals = NULL;
			} 
			return ( FALSE );
		}
	}
	
	usbdShMem=&(v_pDriverGlobals->usbd);	

    for(i=0;i<USBD_GLOBALS_BUF_SIZE;i++)
    {
        usbdShMem->usbdRxBuf[i]=0x0;
		//usbdShMem->usbdTxBuf[i]=0x0;
    }
	usbdShMem->usbdRxRdPt=0;
	usbdShMem->usbdRxWrPt=0;
	usbdShMem->usbdRxCnt=0;
	//usbdShMem->usbdTxRdPt=0;
	//usbdShMem->usbdTxWrPt=0;
	//usbdShMem->usbdTxCnt=0;
	usbdShMem->usbdEir=0;
 	usbdShMem->usbdUir=0;
	usbdShMem->usbdDma3Int=0; 
	//usbdShMem->usbdMddRxCnt=0;
	USBDMSG( 1, (TEXT( "USBD:DRIVER_GLOBALS is initialized\r\n")) );
	return( TRUE ); 
}



BOOL UsbdAllocateVm(void)
{
	if(v_pDMAregs == NULL) 
	{
		v_pDMAregs = (volatile DMAreg *) 
			VirtualAlloc(0,sizeof(DMAreg),MEM_RESERVE, PAGE_NOACCESS);
		if(v_pDMAregs == NULL)
		{
			ERRORMSG(1,(TEXT("For DMAreg: VirtualAlloc failed!\r\n")));
			return (FALSE);
		}
		else 
		{
			if(!VirtualCopy((PVOID)v_pDMAregs,(PVOID)(DMA_BASE),sizeof(DMAreg),
				PAGE_READWRITE | PAGE_NOCACHE )) 
			{
				ERRORMSG(1,(TEXT("For pIOPregs: VirtualCopy failed!\r\n")));
				UsbdDeallocateVm();
				return (FALSE);
			}
		}
	}

	if(v_pINTregs == NULL)
	{
    	v_pINTregs = (volatile INTreg *) 
	    		VirtualAlloc(0,sizeof(INTreg),MEM_RESERVE, PAGE_NOACCESS);
   		if(v_pINTregs == NULL)
		{
	   		ERRORMSG(1,(TEXT("For INTreg: VirtualAlloc failed!\r\n")));
			return (FALSE);
	   	}
    	else 
		{
	    	if(!VirtualCopy((PVOID)v_pINTregs,(PVOID)(INT_BASE),sizeof(INTreg),
		    	   PAGE_READWRITE | PAGE_NOCACHE ))
		   	{
				ERRORMSG(1,(TEXT("For INTreg: VirtualCopy failed!\r\n")));
    				return (FALSE);
	    	}
	   	}
	}
	
	return TRUE;
}



void UsbdDeallocateVm(void)
{
	if(v_pDMAregs)
	{
		VirtualFree((void*)v_pDMAregs, sizeof(DMAreg), MEM_RELEASE);
		v_pDMAregs=NULL;
	}

	if(v_pINTregs)
	{
		VirtualFree((void*)v_pINTregs, sizeof(INTreg), MEM_RELEASE);
		v_pINTregs=NULL;
	}
}



void UsbdInitDma3(int bufIndex,int bufOffset)
{
	//ULONG usbdRxRdPt,usbdRxWrPt;

  	//If DMA3 is turned on, DMA3 should be turned off.
	if((v_pDMAregs->rDMASKTRIG3&(1<<1))!=0)
	{
		v_pDMAregs->rDMASKTRIG3=(1<<2);	//DMA3 stop
		while(v_pDMAregs->rDMASKTRIG3&(1<<1)); //wait until DMA3 stop
		usbdShMem->usbdRxRdPt=0;
		USBDMSG( 1, (TEXT("[DMA3 is stopped]\r\n")));
	}

	v_pDMAregs->rDISRCC3 = (1<<1)|(1<<0);		   //src=APB, srcAddr=fixed
	v_pDMAregs->rDISRC3 = REAL_PHYSICAL_ADDR_EP4_FIFO; //srcAddr=EP4_FIFO 
	v_pDMAregs->rDIDSTC3 = (0<<1)|(0<<0);		   //dst=AHB(memory),increase,

#if (DRIVER_GLOBALS_PHYSICAL_MEMORY_START<0xA0000000 || DMA_BUFFER_BASE<0xA0000000) 
	GENERATE_ERROR
		   	//The above two address should be non-cacheable area.
#endif  	

	realPhysicalAddr_UsbdRxBuf = \
		(ULONG)&((DRIVER_GLOBALS *)DRIVER_GLOBALS_PHYSICAL_MEMORY_START)->usbd.usbdRxBuf \
		- DMA_BUFFER_BASE + DMA_PHYSICAL_BASE;	
	//USBDMSG( 1, (TEXT( "[USBD:RPA_URxBuf=%x]"),realPhysicalAddr_UsbdRxBuf) );
	//Real physical address of usbdShMem->usbdRxBuf

	if(bufIndex==0)
	{
	   	v_pDMAregs->rDIDST3=realPhysicalAddr_UsbdRxBuf+0+bufOffset;
	}
	else
	{
		v_pDMAregs->rDIDST3=realPhysicalAddr_UsbdRxBuf+(USBD_GLOBALS_BUF_SIZE/2)+bufOffset;
	}

   	v_pDMAregs->rDCON3=(USBD_GLOBALS_BUF_SIZE-bufOffset)|(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(4<<24)|(1<<23)|(1<<22)|(0<<20); 
	//handshake,requestor=APB,CURR_TC int enable,unit transfer,
	//single service,src=USBD,H/W request,no_autoreload,byte,CURR_TC

	v_pDMAregs->rDMASKTRIG3=(1<<1);	//DMA 3 on
	   

	USBDMSG( 1, (TEXT( "[USBD:rDIDST3=%x,rDCDST3=%x]\r\n"),v_pDMAregs->rDIDST3,v_pDMAregs->rDCDST3) );

}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久免费精品视频在线观看| 亚洲精品自拍动漫在线| 美女视频网站久久| 日韩一二三区不卡| 男人操女人的视频在线观看欧美 | 精品久久人人做人人爰| 青青草原综合久久大伊人精品| 欧美高清视频www夜色资源网| 日韩二区在线观看| 欧美xxxx老人做受| 成人午夜免费av| 亚洲啪啪综合av一区二区三区| 色哟哟国产精品| 亚洲国产va精品久久久不卡综合| 欧美一区二区三区小说| 七七婷婷婷婷精品国产| 久久久精品日韩欧美| av爱爱亚洲一区| 一区二区三区免费网站| 91精品国产综合久久久蜜臀图片| 麻豆成人在线观看| 国产精品私房写真福利视频| 色狠狠一区二区三区香蕉| 三级一区在线视频先锋| www亚洲一区| 91国产免费看| 久久国产综合精品| 中文幕一区二区三区久久蜜桃| 在线视频你懂得一区二区三区| 久久国产成人午夜av影院| 国产精品伦理一区二区| 欧美精品乱人伦久久久久久| 国产福利电影一区二区三区| 亚洲六月丁香色婷婷综合久久| 6080日韩午夜伦伦午夜伦| 国产福利一区二区| 日韩av电影一区| 综合网在线视频| 日韩一区二区电影| 91麻豆精品视频| 久久se精品一区精品二区| 亚洲精品日韩一| 久久综合九色综合欧美亚洲| 日本乱码高清不卡字幕| 韩国av一区二区三区| 一区二区在线免费观看| 久久精品一区二区三区不卡| 7777精品久久久大香线蕉| 成年人午夜久久久| 老司机精品视频在线| 亚洲成在线观看| 1区2区3区国产精品| 久久精品男人天堂av| 欧美一区二区三区免费观看视频| 色综合一区二区| 国产精品91一区二区| 久久精品国产成人一区二区三区| 亚洲麻豆国产自偷在线| 中文字幕免费观看一区| 精品久久国产97色综合| 欧美日韩国产另类不卡| 91视频免费播放| 粉嫩aⅴ一区二区三区四区五区| 婷婷夜色潮精品综合在线| 亚洲人精品午夜| 中文字幕av一区二区三区高 | 国产乱人伦偷精品视频不卡| 男人的天堂亚洲一区| 亚洲v中文字幕| 一区二区三区不卡视频 | 亚洲综合色婷婷| 成人欧美一区二区三区在线播放| 国产欧美一区二区精品性| 精品国产乱码久久久久久免费| 欧美一级搡bbbb搡bbbb| 欧美日韩1234| 欧美日韩一卡二卡三卡 | 国内精品写真在线观看| 美女尤物国产一区| 久久精品国产亚洲a| 美国三级日本三级久久99| 免费成人在线网站| 美女视频黄 久久| 精品一区二区三区不卡| 九九国产精品视频| 久久99久久99精品免视看婷婷| 激情综合网av| 国产精品伊人色| 成人激情校园春色| www.日韩av| 欧美在线一区二区三区| 欧美性三三影院| 日韩一区二区三区在线视频| 精品不卡在线视频| 国产日韩高清在线| 日韩理论片在线| 亚洲高清久久久| 久久aⅴ国产欧美74aaa| 国产成人免费视频网站| av成人免费在线| 欧美日韩国产精选| 亚洲精品一区二区三区香蕉| 国产嫩草影院久久久久| 亚洲免费av高清| 亚洲电影第三页| 国产一区二区影院| 国产成人午夜精品5599| 色天使色偷偷av一区二区| 欧美日韩一区二区电影| 26uuu另类欧美亚洲曰本| 国产精品久久毛片a| 一区二区三区在线视频播放| 日韩精品乱码免费| 国产精品综合视频| 欧美影视一区二区三区| 欧美电影免费观看高清完整版在| 日本一二三不卡| 一卡二卡三卡日韩欧美| 国产一区二区中文字幕| 日本精品免费观看高清观看| 欧美不卡123| 亚洲天堂av老司机| 美国一区二区三区在线播放| 91污在线观看| 日韩欧美一区在线| 18成人在线视频| 国内精品视频666| 欧美三级三级三级| 欧美经典一区二区| 五月天一区二区| 成人福利视频在线看| 91麻豆精品久久久久蜜臀| 国产精品免费av| 蜜臀av性久久久久蜜臀aⅴ流畅 | 99久久99精品久久久久久| 欧美一区二区三区白人| 日韩伦理免费电影| 国产又黄又大久久| 欧美性猛片xxxx免费看久爱| 亚洲国产精品成人综合| 美女网站色91| 色狠狠桃花综合| 欧美日韩aaaaa| 中文子幕无线码一区tr| 亚洲成av人片观看| 成a人片国产精品| 久久在线免费观看| 亚洲一区二区在线视频| 91香蕉国产在线观看软件| 精品粉嫩超白一线天av| 免费的国产精品| 色婷婷综合五月| 国产亚洲va综合人人澡精品| 亚洲综合免费观看高清在线观看| 奇米精品一区二区三区四区| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 久久久久久9999| 亚洲一区二区三区四区五区黄 | 日韩一区二区三区在线视频| 亚洲一区av在线| 成人精品免费看| 久久久国际精品| 青青草原综合久久大伊人精品优势| 欧美午夜电影网| 国产亚洲视频系列| 国精产品一区一区三区mba视频 | 久久疯狂做爰流白浆xx| 欧美天堂亚洲电影院在线播放| 玉米视频成人免费看| 国产91精品露脸国语对白| 久久久精品综合| 久久国产精品色婷婷| 日韩一区二区三| 亚洲va欧美va国产va天堂影院| 欧美日韩中文国产| 亚洲电影一区二区三区| 91传媒视频在线播放| 亚洲一区二区精品视频| 欧美亚洲自拍偷拍| 日韩高清一级片| 欧美三级电影精品| 日产欧产美韩系列久久99| 欧美浪妇xxxx高跟鞋交| 午夜伦欧美伦电影理论片| 欧美一区二区高清| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲综合一区在线| 福利视频网站一区二区三区| 成人欧美一区二区三区视频网页| 色噜噜狠狠一区二区三区果冻| 亚洲欧美日本在线| 欧美乱熟臀69xxxxxx| 午夜精品久久久久久久久久久| 日韩色在线观看| 26uuu亚洲| 91小宝寻花一区二区三区| 亚洲成人av一区| 日韩亚洲欧美一区| 粗大黑人巨茎大战欧美成人| 国产精品国产成人国产三级 |