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

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

?? sc2410_usb_hw.c

?? usb device driver for samsung2410
?? C
?? 第 1 頁 / 共 4 頁
字號:
				}
				UDC_REG_BITSET(struct INDEXBits, &pHWHead->pUSBCtrlAddr->INDEX, index, 0);
			}
	
			// Command is complete
			sendDone(pHWHead,0);
			//RETAILMSG(1, (TEXT("SF[0x%X]\r\n"), pHWHead->dReq.wIndex & 0xFF));
			break;
	
		case SET_ADDRESS:
			RETAILMSG(1, (TEXT("SET_ADDRESS - 0x%X\r\n"), pHWHead->dReq.wValue));
			
			pHWHead->dAddress = (BYTE)pHWHead->dReq.wValue;
	
			// Note, this write needs to be started here but it will not read back
			// until the command completes. There is no retry mechanism.
			setAddress(pHWHead, pHWHead->dAddress);
	
			// Command is complete
			sendDone(pHWHead,0);
			break;
	
		case GET_DESCRIPTOR:
			switch ((BYTE)(pHWHead->dReq.wValue>>8)) {
			case DEVICE:	// 0x01
				RETAILMSG(1, (TEXT("GET_DESCRIPTOR:DEVICE 0x%X, 0x%X\r\n"), 
						uStd[0], pHWHead->dReq.wLength));
				//sendCommandDone(pHWHead);
				p = (PUCHAR)uStd;
				len = (BYTE)min(uStd[0],pHWHead->dReq.wLength);
				totLen = uStd[0];
				break;
	
			case CONFIGURATION:	// 0x02
				RETAILMSG(1,(TEXT("GET_DESCRIPTOR:CONFIGURATION\r\n")));
				//sendCommandDone(pHWHead);
				p = (PUCHAR)&uStd[iCONF];
				len = (BYTE)min(CFGLEN,pHWHead->dReq.wLength);
				totLen = CFGLEN;
				break;
	
			case STRING:	// 0x03
				DEBUGMSG(1,(TEXT("GET_DESCRIPTOR:STRING\r\n")));
				//sendCommandDone(pHWHead);
				p = NULL;
				len = 0;
				totLen = 0;
				break;
	
			default:
				DEBUGMSG(1,(TEXT("GET_DESCRIPTOR:Unknown %d\r\n"),
					(pHWHead->dReq.wValue>>8) ));
				sendCommandDone(pHWHead);
				p = NULL;
				len = 0;
				totLen = 0;
				break;		
	
			}
	
			// Clear the OPR bit and start the data phase
			sendCommandDone(pHWHead);
	
			// Send the reply data.
			sendData(pHWHead, p, len, totLen);
			DEBUGMSG(1,(TEXT("GET_DESCRIPTOR:EP0ICSR1 status value = 0x%x\r\n"), pHWHead->pUSBCtrlAddr->EP0ICSR1));
			break;
	
		case GET_CONFIG:
			RETAILMSG(1, (TEXT("GET_CONFIG\r\n")));
	
			// Clear the OPR bit and start the data phase
			sendCommandDone(pHWHead);
	
			// Send the reply data.
			sendData(pHWHead, &pHWHead->dConfIdx, 1, 1);
			break;
	
		case GET_INTERFACE:
			DEBUGMSG(1,(TEXT("GET_INTERFACE\r\n")));
	
			// Clear the OPR bit and start the data phase
			sendCommandDone(pHWHead);
	
			// Send the reply data.
			sendData(pHWHead, &pHWHead->dInterface, 1, 1);
			break; 
	
		case SET_CONFIG:
			RETAILMSG(1,(TEXT("SET_CONFIG %d\r\n"),
				pHWHead->dReq.wValue));
			pHWHead->dConfIdx = (BYTE)pHWHead->dReq.wValue;
	
			// Command done
			sendDone(pHWHead,0);
			break;
	
		case SET_DESCRIPTOR:
			RETAILMSG(1, (TEXT("SET_DESCRIPTOR\r\n")));
	
			// Command done
			sendDone(pHWHead,0);
			break;
	
		case SET_INTERFACE:
			DEBUGMSG(1,(TEXT("SET_INTERFACE : %d,%d\r\n"),
				pHWHead->dReq.wIndex,
				pHWHead->dReq.wValue));
			pHWHead->dInterface = (BYTE)pHWHead->dReq.wIndex;
			pHWHead->dSetting = (BYTE)pHWHead->dReq.wValue;
	
			// Command done
			sendDone(pHWHead,0);
			break;
	
		default:
			DEBUGMSG(1,(TEXT("Unhandled Command : %d\r\n"),
				pHWHead->dReq.bRequest));
	
			// Command done
			sendDone(pHWHead,0);
			break;
		}
	}
	
	DEBUGMSG(1, (TEXT("--SC2410_USB_DoEndpoint0\r\n")));
}

/*************************************************************************
	SC2410_USB_GetInterruptType

	Determine the source of an interrupt and return flags to control 
	which function gets called to handle it. EP0 is handled as modem 
	interrupt, EP1 as TX, EP3 as RX and reset is handle as line 
	interrupt.
*************************************************************************/

INTERRUPT_TYPE SC2410_USB_GetInterruptType( PSER_INFO pHWHead) //:-)
{
	INTERRUPT_TYPE interruptFlags = 0;
	//BYTE saveIndex;

        pHWHead->wPrevSOF = pHWHead->wSOF;
        pHWHead->wSOF = (pHWHead->pUSBCtrlAddr->FNR2.fr_n2 << 8) | pHWHead->pUSBCtrlAddr->FNR1.fr_n1; 
	//DEBUGMSG(1, (TEXT("SOF: %u, wPrevSOF: %u\r\n"), pHWHead->wSOF, pHWHead->wPrevSOF));
	//RETAILMSG(1, (TEXT("SOF: %u, wPrevSOF: %u\r\n"), pHWHead->wSOF, pHWHead->wPrevSOF));
        
        ///pHWHead->cIntStat_uir = *(BYTE *)&pHWHead->pUSBCtrlAddr->UIR;
        ///pHWHead->cIntStat_eir = *(BYTE *)&pHWHead->pUSBCtrlAddr->EIR;
  
        ///RETAILMSG(1,(TEXT("::: cIntStat_uir = %d\r\n"), pHWHead->cIntStat_uir)); 
        ///RETAILMSG(1,(TEXT("::: cIntStat_eir = %d\r\n"), pHWHead->cIntStat_eir));
	//important notes
	// 1. INDEX register should be preserved here. //:-)
	// 2. 'else if' should not be used here. //:-) 

	if (usbdShMem->usbdEir& USBDEIR_EP1)	// EP1(IN), ready to TX more data.
	{
		interruptFlags |= INTR_TX;
	}
	//jocky
 	if (usbdShMem->usbdEir& USBDEIR_EP4)//&& (!usbdShMem->usbSwitch)) // EP4(OUT), RX data ready
	{
		interruptFlags |= INTR_RX;
	}
	//jocky
	if (usbdShMem->usbdDma3Int)	// DMA3 done interrupt
	{
		interruptFlags |= INTR_RX;
		USBDMSG(1, (TEXT("<D3Int>\r\n")));
	}

	if (usbdShMem->usbdUir&USBDUIR_RESET)// USB reset, so re-initialize our driver.
	{
		USBDMSG(1, (TEXT("RESET INT\r\n")));
		interruptFlags |= INTR_LINE;	// We use INTR_LINE to handle USB Reset 
		usbdShMem->usbdUir&=~USBDUIR_RESET;
	}	
	
	if (usbdShMem->usbdEir&USBDEIR_EP0) // EP0, Control endpoint
	{
		interruptFlags |= INTR_MODEM;	// Use INTR_MODEM for EP0 interrupts
										// call SerModemIntr function	 by shim 020503
		usbdShMem->usbdEir&=~USBDEIR_EP0;
		*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX=0x0;  
			//temp_kiw, should be repaired officially.
		USBDMSG(1, (TEXT("<EP0 Int>\r\n")));	
	}
	
	
	return (interruptFlags);
}

/*************************************************************************
	SC2410_USB_LineIntHandler

	This handler is called for reset interrupts
*************************************************************************/
void SC2410_USB_LineIntHandler(PSER_INFO pHWHead)
{
	
	ULONG WaitReturn; //Jonathan
	DEBUGMSG(1, (TEXT("++SC2410_USB_LineIntHandler\r\n")));

	SC2410_USB_Init(pHWHead);
	UDC_REG_BITSET(struct INDEXBits, &pHWHead->pUSBCtrlAddr->INDEX, index, 0);
	
	//Jonathan01_0915 Start
        if(pDriverGlobals->misc.InitUSBClient == 0)
        {
            pDriverGlobals->misc.InitUSBClient = 1; 
	               	
            //eltR04_01 s2410IOP->rGPBCON &= ~(0x3 << 6);  
            pDriverGlobals->misc.USBCableEvent =0;//maggie03
            pHWHead->ModemStatus &= ~MS_RLSD_ON;
            EvaluateEventFlag(pHWHead->pMddHead, EV_RLSD);
        
            //make a delay
            WaitReturn = WaitForSingleObject(pHWHead->hSerialEvent, 0x00001000L);
            
            
            if(!(s2410IOP->rGPGDAT & (0x1 << 1)) && (s2410IOP->rGPGDAT & (0x1 << 8)))
            {	
                 s2410IOP->rGPJDAT |= (0x1 << 9);
                 
                 pDriverGlobals->misc.USBCableEvent =1;   
                 RETAILMSG(1,(TEXT("::: SC2400_USB_LineIntHandler -- USB IN \r\n"))); 
            }
            
            //RETAILMSG(1,(TEXT("::: SC2400_USB_LineIntHandler A\r\n"))); 
        
        }
        //Jonathan01_0915 end


	DEBUGMSG(1, (TEXT("--SC2410_USB_LineIntHandler\r\n")));
}

/*************************************************************************
  SC2410_USB_RxIntHandler
 
  Read characters up to the max packet length from the IN FIFO. Return the
  number of characters read in the supplied argument. The function returns
  a boolean indicating whether event characters are present.
*************************************************************************/


BOOL SC2410_USB_RxIntHandler(PSER_INFO pHWHead,
			     PUCHAR pRxBuffer,
			     ULONG *pBuffLen)
{
	BOOL fRXFlag	   = FALSE;
	UCHAR cEvtChar	   = pHWHead->dcb.EvtChar;
	int buflen		   = *pBuffLen;
	UCHAR cRxChar;
	ULONG usbdRxRdPt=0;
	ULONG usbdRxWrPt=0;	
	//ULONG usbdRxCnt;
	int usbdRxCnt;
	BYTE* usbdRxBuf;
	//ULONG cnt,saveCnt;
	ULONG saveCnt;
	int cnt;
	int swRdCnt=0;
	BYTE saveIndex;
	int i=0;
	ULONG uNewusbdRxWrPt=0;
	DEBUGMSG(1, (TEXT("++SC2410_USB_RxIntHandler\r\n")));
    
	usbdRxRdPt=usbdShMem->usbdRxRdPt;
	usbdRxBuf=(BYTE*)usbdShMem->usbdRxBuf;
	*pBuffLen = 0;
    
	// Endpoint 4 mode
	saveIndex=*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX;
	*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX=0x4;

	if (usbdShMem->usbdDma3Int)
	{

	
		USBDMSG(1,(TEXT("[RxPt:%d]"),usbdRxRdPt));	
		if(usbdRxRdPt==0)
		{
			usbdShMem->usbdDma3Int=0;	
			bWritefull=FALSE;
			USBDMSG(1,(TEXT("[D:%d"),pHWHead->pUSBCtrlAddr->OFCR1.out_cnt_low));	
			
			UsbdInitDma3(0,0);
			*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->EP4DTL=(USBD_GLOBALS_BUF_SIZE-swRdCnt)&0xff;
			*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->EP4DTM=((USBD_GLOBALS_BUF_SIZE-swRdCnt)>>8)&0xff;
			*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->EP4DTH=((USBD_GLOBALS_BUF_SIZE-swRdCnt)>>16)&0x0f;
			*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->EP4DC=UDMA_OUT_DMA_RUN|UDMA_DMA_MODE_EN;
			Sleep(1);//wait DMA ready
		}

	}

	for(i=0; i<1000; i++)
	{
		usbdRxWrPt=v_pDMAregs->rDCDST3 - realPhysicalAddr_UsbdRxBuf;
		if(usbdRxWrPt==USBD_GLOBALS_BUF_SIZE)
		{
			bWritefull=TRUE;
		}
		if(bWritefull)
			usbdRxCnt=USBD_GLOBALS_BUF_SIZE-usbdRxRdPt;
		else
			usbdRxCnt=usbdRxWrPt-usbdRxRdPt;
		
		if( buflen < usbdRxCnt)
		{
			saveCnt=cnt=buflen;
			break;
		}
		else
			saveCnt=cnt=usbdRxCnt;
	}

	if (usbdRxCnt == 0) // No data to read
	{ 
		USBDMSG(1, (TEXT("[R0]")));
	}	 
	else
	{

		USBDMSG(1, (TEXT("<%d>"),cnt));

		while(cnt--) 
		{
			*pRxBuffer++ = cRxChar = (UCHAR)usbdRxBuf[usbdRxRdPt++];
			if(usbdRxRdPt==USBD_GLOBALS_BUF_SIZE)
				usbdRxRdPt=0;
			if( cRxChar == cEvtChar )
				fRXFlag = TRUE;
		}

		(*pBuffLen)=saveCnt;
		usbdRxCnt-=saveCnt;

		usbdShMem->usbdRxRdPt=usbdRxRdPt;
		usbdShMem->usbdEir&=~USBDEIR_EP4;
	}

    //not be needed. Only for test
/*	if(pHWHead->pUSBCtrlAddr->OFCR1.out_cnt_low==0 ) 
		if(pHWHead->pUSBCtrlAddr->OCSR1.out_pkt_rdy==1)
		{
		    USBDMSG(1, (TEXT("__OPR__(NEVER EXECUTED)")));
			UDC_REG_BITSET(struct OCSR1Bits,&pHWHead->pUSBCtrlAddr->OCSR1, out_pkt_rdy, 0);
		}
*/
	// If we didn't read the whole buffer we need to come back. Leave with
	// the interrupt still enabled so the MDD will recall.
	uNewusbdRxWrPt=v_pDMAregs->rDCDST3 - realPhysicalAddr_UsbdRxBuf;//Jason0315
//	if (usbdRxCnt>0)//Jason0315
	if((usbdRxCnt>0)||uNewusbdRxWrPt>usbdRxWrPt)//Jason0315
	{
		USBDMSG(1, (TEXT("[%d->MDD]"),usbdRxCnt));
		usbdShMem->usbdEir|=USBDEIR_EP4; 
			// MDD will recall RxIntHandler by chekcing SC2410_USB_GetInterruptType().
			// So, usbdShMem->usbdEir:USBDEIR_EP3 must not be cleared	//:-) 
		//Sleep(100);
		
		*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX=saveIndex;
		return fRXFlag;
	}
	usbdShMem->usbdEir&=~USBDEIR_EP4;
	DEBUGMSG(1, (TEXT("--SC2410_USB_RxIntHandler\r\n")));
	
	*(volatile BYTE *)&pHWHead->pUSBCtrlAddr->INDEX=saveIndex;
	return fRXFlag;
}



/*************************************************************************
  SC2410_USB_TxIntHandler
 
  Send the next packet to the USB. The first packet gets sent by directly
  calling this function (via dispatch table) from the MDD. After the first
  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 SC2410_USB_TxIntHandler( PSER_INFO pHWHead,
			      PUCHAR pTxBuffer,
			      ULONG *pBuffLen ) 
{
	unsigned int i;
	UCHAR ucLen;
	BYTE saveIndex;
	
	//DEBUGMSG(1, (TEXT("++SC2410_USB_TxIntHandler\r\n")));

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美四级电影在线观看| 日本一区二区三区在线观看| 99热精品国产| 高清在线成人网| 高清成人免费视频| 国产高清久久久久| 成人在线视频一区二区| 成人国产精品免费观看视频| 波多野结衣亚洲一区| av在线综合网| 欧美三级视频在线| 日韩欧美aaaaaa| 欧美国产视频在线| 亚洲女爱视频在线| 五月开心婷婷久久| 国产一区二区三区不卡在线观看| 国产成人午夜电影网| 99久久伊人久久99| 欧美人体做爰大胆视频| 精品国产亚洲在线| 国产精品久久久久精k8| 夜夜嗨av一区二区三区 | 欧美日韩免费在线视频| 91精品国产色综合久久不卡蜜臀 | 久久精品视频一区二区三区| 中文字幕一区在线观看| 亚洲成人动漫av| 国产乱码字幕精品高清av| 91一区二区三区在线观看| 欧美精品99久久久**| 精品国产91久久久久久久妲己| 国产精品国产自产拍在线| 亚洲成人自拍偷拍| 国产福利一区二区三区视频在线 | 精品国产乱码久久久久久夜甘婷婷 | www.欧美精品一二区| 欧美三级日韩在线| 久久精品夜色噜噜亚洲a∨| 亚洲品质自拍视频| 精品一二三四区| 91国偷自产一区二区三区观看| 日韩欧美在线网站| 亚洲精品视频在线观看免费| 国产一区二区久久| 欧美日韩激情一区二区三区| 国产亚洲欧美一区在线观看| 日韩av在线免费观看不卡| 91免费看`日韩一区二区| 精品剧情v国产在线观看在线| 樱花影视一区二区| 成人性生交大片免费看中文网站| 日韩一级高清毛片| 亚洲一区二区视频在线| av在线综合网| 日本一二三不卡| 奇米影视一区二区三区小说| 欧美色综合天天久久综合精品| 日本一区二区动态图| 国产一区中文字幕| 精品国产青草久久久久福利| 午夜视频在线观看一区| 欧洲精品一区二区| 亚洲天堂成人在线观看| 99久久婷婷国产| 日本一区二区三区高清不卡| 精品一区二区三区视频| 欧美日本精品一区二区三区| 亚洲国产aⅴ成人精品无吗| 色综合久久久久久久久久久| 亚洲欧美在线aaa| 99亚偷拍自图区亚洲| 成人欧美一区二区三区黑人麻豆| www.成人在线| 伊人性伊人情综合网| 91电影在线观看| 亚洲国产精品久久久男人的天堂| 欧美天堂一区二区三区| 日韩精品五月天| 欧美一区二区三区日韩| 免费日韩伦理电影| 日韩精品在线看片z| 国内精品久久久久影院色| 日韩免费高清视频| 精品一区二区日韩| 国产精品视频一二三区 | 亚洲欧美色一区| 色综合久久中文综合久久97| 亚洲一区二区中文在线| 欧美视频精品在线观看| 青青草精品视频| 精品国产伦理网| 99久久精品免费精品国产| 香蕉加勒比综合久久| 欧美一区在线视频| 国产成人精品1024| 亚洲精品亚洲人成人网在线播放| 欧美日韩一卡二卡| 精彩视频一区二区| 亚洲欧美另类综合偷拍| 日韩欧美亚洲国产精品字幕久久久| 久久精品国产99国产精品| 国产精品萝li| 91精品国产欧美一区二区| 国产成人精品亚洲日本在线桃色| 亚洲人成7777| 欧美精品一区二区三区一线天视频| 成人精品免费看| 婷婷丁香激情综合| 国产精品国产三级国产aⅴ原创| 欧美区视频在线观看| 国产99久久久国产精品免费看| 亚洲女人小视频在线观看| 日韩欧美一区二区久久婷婷| 99久久精品免费| 美女免费视频一区二区| 国产精品久久久久一区| 日韩一区二区在线观看| 91蝌蚪porny成人天涯| 久久精品噜噜噜成人88aⅴ| 国产精品国产三级国产aⅴ入口 | 国产a区久久久| 午夜不卡av在线| 中文字幕日韩av资源站| 精品成人佐山爱一区二区| 欧美这里有精品| 国产不卡一区视频| 日本网站在线观看一区二区三区| 亚洲欧美日韩国产一区二区三区| 久久午夜老司机| 欧美一区二区在线视频| 在线国产电影不卡| 成人精品一区二区三区四区| 国产综合成人久久大片91| 日日夜夜一区二区| 亚洲成av人片一区二区三区| 自拍偷拍国产精品| 国产精品国产自产拍高清av| 欧美精品一区二区蜜臀亚洲| 7799精品视频| 欧美日韩国产高清一区二区三区| 99re热这里只有精品免费视频| 成人做爰69片免费看网站| 国产成人自拍高清视频在线免费播放| 久久福利资源站| 久久99久久久久| 美日韩一级片在线观看| 男女激情视频一区| 麻豆国产精品777777在线| 蜜桃视频第一区免费观看| 麻豆精品在线观看| 韩国v欧美v亚洲v日本v| 精品一区二区日韩| 国产盗摄女厕一区二区三区| 国产成a人亚洲精| 国产福利一区二区三区在线视频| 国产九色精品成人porny| 国产成人精品免费在线| 成人亚洲精品久久久久软件| 99久久精品国产观看| 在线一区二区三区四区| 欧美日韩色综合| 日韩欧美一区二区视频| 久久免费偷拍视频| 国产精品国产三级国产aⅴ原创| 亚洲三级小视频| 亚洲成a人片在线观看中文| 蜜臀99久久精品久久久久久软件| 精彩视频一区二区三区| youjizz久久| 欧美三级电影网站| 久久综合丝袜日本网| 国产精品视频麻豆| 亚洲一区二区精品3399| 精品一区二区三区免费视频| 成人晚上爱看视频| 欧美影院一区二区| 精品卡一卡二卡三卡四在线| 国产精品乱人伦| 天堂va蜜桃一区二区三区漫画版| 久久精品国产成人一区二区三区| 粉嫩蜜臀av国产精品网站| 在线免费观看日本一区| 91精品国产高清一区二区三区蜜臀| 精品国精品国产| 依依成人精品视频| 国产乱妇无码大片在线观看| 色综合久久久久久久久| 久久综合久久99| 亚洲午夜精品一区二区三区他趣| 久久国产精品72免费观看| 一本一本大道香蕉久在线精品| 日韩一级片网址| 亚洲欧美视频在线观看| 国产一区二区三区综合| 欧美在线不卡视频| 国产精品色呦呦| 激情小说亚洲一区| 欧美日韩在线一区二区| 亚洲色图欧美在线| 成人激情午夜影院|