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

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

?? sc2410_usb_hw.c

?? usb device driver for samsung2410
?? C
?? 第 1 頁 / 共 4 頁
字號:

/**
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 2001. Samsung Electronics, co. ltd  All rights reserved.

Module Name:  

Abstract:

    S3C2410 USB function(ACTIVE SYNC) device driver (Chip Layer)

rev:
	2003.3.18	: EP3 is replaced by EP4 for DMA operation because DMA2(EP3) is used by audio. (purnnamu)
	2003.3.17	: Every USBD interrupt is followed by the dummy interrupt 
				  because USBD sub-pending interrupt is cleared after clearing INTPND register.
				  So,USBD sub-pending bit is cleared before clearing INTPND register. (purnnamu)
    2002.5.7	: Add to s3c2410_code (Seung-han, Lim)
    2002.1.22	: First release/no error recovery (kwangyoon LEE, kwangyoon@samsung.com)
Notes: 
*/
/* MiTAC Int'l Corp. 2002     

$release notes
Modifier         sign              date                   Description
================================================================================
DicK             dic100            11/04/2005              Remove debug message
Jonathan         Jonatahn01_0915   09/15/2005             Modify S2440 USB Driver to PNA500  
Jonathan         Jonathan02_1007   10/07/2005             Modify max power : 50mA change to 450mA

*/

#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <memory.h>
#include <serhw.h>
#include <nkintr.h>


#include "S2410.h"
#include <SC2410_usb_hw.h>
#include <SC2410_usb_ser.h>
#undef ZONE_INIT
#include <serdbg.h>
#include <drv_glob.h> //:-)
#include <2410usb.h>  //:-)

#define USBDMSG		 DEBUGMSG  //RETAILMSG

PDRIVER_GLOBALS v_pDriverGlobals=NULL; //:-)
volatile USBD_GLOBALS *usbdShMem=NULL;  //:-)
volatile DMAreg *v_pDMAregs=NULL;  //:-)
volatile INTreg *v_pINTregs=NULL;  //:-)
extern volatile IOPreg *s2410IOP;  //Jonatahan01_0915
extern volatile PDRIVER_GLOBALS pDriverGlobals; //Jonatahan01_0915
ULONG realPhysicalAddr_UsbdRxBuf=0;

ULONG totalRxCnt=0; //debug
BOOL bWritefull=FALSE;//Jason0315
/*
#if (USBD_GLOBALS_BUF_SIZE!=0x4000)
	STOP_COMPILE GEN_ERROR
	//drv_glob.h should be changed correctly
#endif	
*/

// This driver defines a simple BULK FIFO device. It supports only one
// interface with one alternate setting, as shown below.  
//
//  Endpoint    Setting 0
//------------------------
//  EP0         Control
//  EP1 In      Bulk  
//  EP3 Out     Bulk   

// Steal the useless IR zone from MDD and use it as EP0 & USB specific stuff
 
#define ZONE_USB ZONE_IR

// Define the configuration descriptor length
 
#define CFGLEN  32   
#define iCONF   18
#define TLEN    (CFGLEN + 18)

// Define the configuration descriptor itself

const BYTE uStd[TLEN]=  {
	0x12,					//  0 desc size                      
	DEVICE,					//  1 desc type (DEVICE)             
	0x00,					//  2 USB release                    
	0x01,					//  3 => 1.00                        
	0xff,					//  4 class                          
	0xff,					//  5 subclass                       
	0xff,					//  6 protocol                       
	EP0_MAXP_SIZE,				//  7 max pack size                  
/*	
	0x47,					//  8 vendor ID LSB (Samsung Semi)   
	0x05,					//  9 vendor ID MSB ( 0x1419 )       
	0x20,					// 10 product ID LSB                 
	0x27,					// 11 product ID MSB                 
*/	
 	idVendorH, idVendorL,      // idVendor 
    idProductH, idProductL,    // idProduct	
	0x00,					// 12 device release LSB             
	0x00,					// 13 device release MSB             
	0x00,					// 14 manufacturer string desc index 
	0x00,					// 15 product string desc index      
	0x00,					// 16 serial num string desc index   
	0x01,					// 17 num of possible configurations 

	// Configuration Descriptor 
	0x09,					//  desc size                            
	CONFIGURATION,			//  desc type (CONFIGURATION)            
	CFGLEN%256,				//  total length of data returned LSB    
	CFGLEN/256,				//  total length of data returned MSB    
	0x01,					//  num of interfaces                    
	0x01,					//  value to select config (1 for now)   
	0x00,					//  index of string desc ( 0 for now)    
	0x80,					//  bus powered                          
	//Jonathan02_1007 25,			//  max power, 50mA for now    
        225,                                    //  max power, 450mA for PNA500/PNA510    //Jonathan02_1007

	// Interface Decriptor 
	0x09,					//  desc size                            
	INTERFACE,				//  desc type (INTERFACE)                
	0x00,					//  interface index.                     
	0x00,					//  value for alternate setting          
	0x02,					//  bNumEndpoints (number endpoints used, excluding EP0)
	0xff,
	0xff,
	0xff,
	0x00,					//  string index,      

	// Endpoint descriptor (EP 1 Bulk IN) 
	0x07,					//  desc size                            
	ENDPOINT,				//  desc type (ENDPOINT)                 
	0x81,					//  endpoint address: endpoint 1, IN    
	0x02,					//  endpoint attributes: Bulk       
	EP1_IN_MAXP_SIZE,			//  max packet size LSB                  
	0x00,					//  max packet size MSB                  
	0x00,					//  polling interval (4ms/bit=time,500ms)  

#if	0
	// Endpoint descriptor (EP 2 Interrupt IN) 
	0x07,					//  desc size                            
	ENDPOINT,				//  desc type (ENDPOINT)                 
	0x82,					//  endpoint address: endpoint 2, IN     
	0x03,					//  endpoint attributes: Interrupt       
	EP2_IN_MAXP_SIZE,			//  max packet size LSB                  
	0x00,					//  max packet size MSB                  
	0xFA,					//  polling interval (4ms/bit=time,100ms)  
#endif

	// Endpoint descriptor (EP 4 Bulk OUT) 
	0x07,					//  desc size                            
	ENDPOINT,				//  desc type (ENDPOINT)                 
	0x04,					//  endpoint address: endpoint 4, OUT    
	0x02,					//  endpoint attributes: Bulk            
	EP4_OUT_MAXP_SIZE,			//  max packet size LSB                  
	0x00,					//  max packet size MSB                  
	0x00					//  polling interval (4ms/bit=time,500ms)  

#if	0
	// Endpoint descriptor (EP 4 Interrupt OUT) 
	0x07,					//  desc size                            
	ENDPOINT,				//  desc type (ENDPOINT)                 
	0x04,					//  endpoint address: endpoint 4, OUT    
	0x03,					//  endpoint attributes: Interrupt            
	EP4_OUT_MAXP_SIZE,			//  max packet size LSB                  
	0x00,					//  max packet size MSB                  
	0x00					//  polling interval (4ms/bit=time,500ms)   // $$$$
#endif
};

// Register writes need to be verified. This macro loops the write until
// the effects are visible and records the number of retries.

#define UDC_REG_WRITE(_struct,_ptr,_field,_val) IOW_REG_FIELD(_struct,_ptr,_field,_val)

#define UDC_REG_BITSET(_struct,_ptr,_field,_val) { _struct xx;														\
  					 	   *(unsigned int *)&xx = 0;										\
  						   xx._field = _val;												\
  						   IOW_REG_SET(_struct,_ptr,*(unsigned int*)&xx); }

#define UDC_REG_WRITEX(_setptr,_setval)		(_setptr) = _setval;

// Variables for EP0 resend control. Keep track of last packet sent.

static char *sendPacket;
static int  sendPacketLength;
static int  sendTotalLength;
static char *savSendPacket;
static int  savSendPacketLength;

// EP1/EP3 packet size. For polling this can not be greater than 16

static unsigned int maxPacketSize = EP1Len;  

// Read the command from the endpoint 0 FIFO 

void HW_USBClocks(PSER_INFO pHWHead);


static
int getCommand(PSER_INFO pHWHead, void *argP)
{
	unsigned char *bufP = (unsigned char*)argP;
	int length	    = pHWHead->pUSBCtrlAddr->OFCR1.out_cnt_low | pHWHead->pUSBCtrlAddr->OFCR2.out_cnt_high<<8;
	int i;

	memset(bufP, 0x55, 8);

	// All setup commands are 8 bytes in length
	if (length != 8) 
	{
		DEBUGMSG(1, (TEXT("UDC bad command length %d\n"), length));
		return 1;
	}
	
	DEBUGMSG(1, (TEXT("[GETCOMMAND : ")));

	for (i=0; i < length; i++) 
	{
		bufP[i] = (BYTE)pHWHead->pUSBCtrlAddr->EP0F.fifo_data;
		DEBUGMSG(1, (TEXT("%2x "), bufP[i]));
	}

	DEBUGMSG(1, (TEXT("]\r\n")));	
	
	return 0;
}

/*************************************************************************
	Command response with data packets
*************************************************************************/
static
void sendData(PSER_INFO pHWHead, void *argP, int length, int totalLen)
{

	unsigned char *bufP = (unsigned char*)argP;
	struct EP0ICSR1Bits EP0ICSR1;
	int i;

	// Endpoint0 mode
	pHWHead->pUSBCtrlAddr->INDEX.index = 0x0;

	DEBUGMSG(1, (TEXT("[UDC WILL SEND] %d bytes\r\n"), length));

	// Send the data back. The FIFO should be turned around for
	// us already. Just blast away ...
 	for (i=0; (i < length) && (i < EP0Len); i++) 
	{
		IOW_REG_FIELD(struct EP0FBits, 
			&pHWHead->pUSBCtrlAddr->EP0F, fifo_data, bufP[i]);
	}

	// Form the register update. Always set IN_PKT_RDY.
	EP0ICSR1 = pHWHead->pUSBCtrlAddr->EP0ICSR1;
	EP0ICSR1.ipr_ = 1;

	// We can complete on a packet which is full. We need to wait till
	// next time and generate a zero length packet, so only complete
	// if we're at the end and it is not the max packet size.
	if ((i == length) && (i != EP0Len)) 
	{
		savSendPacket       = sendPacket;
		savSendPacketLength = sendPacketLength;
		sendPacket          = NULL;
		sendPacketLength    = length - i;
		sendTotalLength     = totalLen - i;
		EP0ICSR1.de_ff = 1;
	}
	// Need to send another packet.
	else {
		sendPacket          = (char*)&bufP[i];
		sendPacketLength    = length - i;
		sendTotalLength     = totalLen - i;
		savSendPacket       = sendPacket;
		savSendPacketLength = sendPacketLength;

		DEBUGMSG(1, (TEXT("UDC WILL SEND %d more bytes later\r\n"), 
							sendPacketLength));
	}

	/* Update the register
	*/
	UDC_REG_WRITEX(*(volatile unsigned *)&pHWHead->pUSBCtrlAddr->EP0ICSR1, 
	 						*(unsigned *)&EP0ICSR1);
}

/*************************************************************************
	Send command done
*************************************************************************/
static
void sendCommandDone(PSER_INFO pHWHead)
{
	BYTE index;

	// Endpoint0 mode
    index = pHWHead->pUSBCtrlAddr->INDEX.index;
    pHWHead->pUSBCtrlAddr->INDEX.index = 0x0;

    // Set SERVICE_OUT_PKY_RDY bit
    pHWHead->pUSBCtrlAddr->EP0ICSR1.sopr_cdt = 0x1;
    
    pHWHead->pUSBCtrlAddr->INDEX.index = index;
}

/*************************************************************************
	Command response with no data packets
*************************************************************************/
static
void sendDone(PSER_INFO pHWHead, int err)
{
    struct EP0ICSR1Bits EP0ICSR1;
    BYTE index;
    
    EP0ICSR1 = pHWHead->pUSBCtrlAddr->EP0ICSR1;
    EP0ICSR1.sopr_cdt   = 1;
    EP0ICSR1.de_ff      = 1;
    EP0ICSR1.sts_ur     = (BYTE)err;

    // Endpoint 0 mode
    index = pHWHead->pUSBCtrlAddr->INDEX.index;
    pHWHead->pUSBCtrlAddr->INDEX.index = 0x0;

    if (err) {
        DEBUGMSG(ZONE_ERROR, (TEXT("SENT_STALL CLEAR\r\n")));
    }

    UDC_REG_WRITEX( *(volatile DWORD *)&pHWHead->pUSBCtrlAddr->EP0ICSR1,
                    *(DWORD *)&EP0ICSR1 );

    pHWHead->pUSBCtrlAddr->INDEX.index = index;
}

/*************************************************************************
	Set the device address
*************************************************************************/
static
void setAddress(PSER_INFO pHWHead, int addr)
{
    DEBUGMSG(ZONE_USB, (TEXT("[SET ADDRESS to %x]\r\n"), addr));

    pHWHead->pUSBCtrlAddr->udcFAR.func_addr = (BYTE)addr;
    pHWHead->pUSBCtrlAddr->udcFAR.addr_up = 1;
}

/*************************************************************************
	SC2410_USB_Init

	Initialize the UDC.
*************************************************************************/
extern
void SC2410_USB_Init(PSER_INFO pHWHead)
{
	BYTE index;
	int i;

        EnterCriticalSection(&pHWHead->HwRegCritSec);

	USBDMSG(1, (TEXT("++SC2410_USB_Init\r\n")));
	//RETAILMSG(1, (TEXT("++SC2410_USB_Init\r\n")));

	//DebugBreak();;;
	pHWHead->dConfIdx    = 0;
	pHWHead->dSetting    = 0;
	pHWHead->dInterface  = 0;
	pHWHead->dAddress    = 0;
	pHWHead->ModemStatus = 0;		// All lines low till we get connected.
	pHWHead->wSOFStableCnt = 0;

_re_enable:
    switch (pHWHead->State) {
        case IDLE:
            //RETAILMSG(1, (TEXT("IDLE\r\n")));
            //
            // Enable the USB Clocks
            //
	    HW_USBClocks(pHWHead);
	    //dic100 RETAILMSG(1, (TEXT("++IDLE\r\n")));
			
	    break;

        case OFF:
            //RETAILMSG(1, (TEXT("OFF\r\n")));
            //
            // Disable the USB Clocks
            //
	    HW_USBClocks(pHWHead);
            RETAILMSG(1, (TEXT("++OFF\r\n")));
            DEBUGMSG(ZONE_INIT, (TEXT("rUPLLCON: 0x%X\r\n"), pHWHead->pCLKPWR->rUPLLCON));
            goto _done;
            break;

        case SUSPEND:
            // should never get here
            RETAILMSG(1, (TEXT("SUSPEND\r\n")));
	    ASSERT(0);
            goto _done;
            break;

        case RESUME:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人激情小说乱人伦| 精品制服美女丁香| 美国十次综合导航| jiyouzz国产精品久久| 欧美一区永久视频免费观看| 中文字幕不卡在线观看| 偷拍亚洲欧洲综合| 成人av在线播放网站| 精品国产伦理网| 亚洲狠狠爱一区二区三区| 国产成人在线视频网址| 91精品国产高清一区二区三区蜜臀| 国产精品欧美久久久久无广告| 日韩成人午夜电影| 欧美午夜精品理论片a级按摩| 久久精品一区二区三区不卡牛牛 | 奇米精品一区二区三区在线观看 | 99久久综合精品| 久久亚洲精品国产精品紫薇| 视频精品一区二区| 91久久线看在观草草青青| 国产欧美一区二区精品性| 美女视频一区二区| 欧美猛男男办公室激情| 一级做a爱片久久| 91蜜桃网址入口| 中文字幕一区二区三区在线播放| 国产麻豆日韩欧美久久| 日韩精品一区二区三区swag| 三级欧美在线一区| 欧美精品乱码久久久久久按摩 | 中文字幕精品一区二区三区精品| 久久99久久99精品免视看婷婷| 欧美一区二区播放| 日本少妇一区二区| 日韩欧美一区二区久久婷婷| 日本va欧美va精品发布| 日韩一区二区高清| 蜜桃av一区二区三区电影| 欧美一级免费大片| 久久超碰97人人做人人爱| 欧美不卡视频一区| 国产自产v一区二区三区c| 久久美女艺术照精彩视频福利播放| 久久www免费人成看片高清| 欧美电影精品一区二区 | 亚洲国产人成综合网站| 欧美网站一区二区| 日韩成人免费在线| 精品国产伦一区二区三区观看方式| 麻豆精品国产传媒mv男同| 亚洲精品在线电影| 丁香网亚洲国际| 亚洲精品自拍动漫在线| 欧美裸体一区二区三区| 九九视频精品免费| 久久精品欧美一区二区三区不卡 | 欧美午夜寂寞影院| 免费成人结看片| 国产精品污www在线观看| 91麻豆精品在线观看| 水蜜桃久久夜色精品一区的特点 | 欧美日韩黄色影视| 麻豆精品视频在线观看免费| 日本一区二区三区视频视频| 一本到不卡精品视频在线观看 | 国产精品影视在线观看| 国产精品日日摸夜夜摸av| 欧美性欧美巨大黑白大战| 看电影不卡的网站| 亚洲欧美一区二区三区国产精品| 欧美电影在线免费观看| 国产精品一二三| 亚洲午夜av在线| 国产亚洲人成网站| 欧美日韩精品免费| 丰满放荡岳乱妇91ww| 日日夜夜免费精品视频| 国产精品久久久久久久久免费相片| 欧美吞精做爰啪啪高潮| 成人亚洲精品久久久久软件| 午夜精品久久久久久久久久 | 亚洲一区二区视频| 久久午夜免费电影| 欧美日韩成人在线| www.66久久| 久久99久久精品欧美| 一区二区三区在线视频观看| 精品入口麻豆88视频| 欧美综合亚洲图片综合区| 国产高清成人在线| 日本vs亚洲vs韩国一区三区二区 | 日本不卡高清视频| 亚洲色图色小说| 国产亚洲精久久久久久| 7777精品伊人久久久大香线蕉超级流畅 | 一区二区三区在线观看欧美| 久久久精品日韩欧美| 91精品国产综合久久精品| 91久久精品日日躁夜夜躁欧美| 精品无人码麻豆乱码1区2区| 午夜精品久久久久久久99樱桃 | 国产视频一区二区在线观看| 91精品婷婷国产综合久久竹菊| 一本一道久久a久久精品综合蜜臀| 国产v综合v亚洲欧| 国产一区二区视频在线播放| 婷婷丁香激情综合| 一区二区三区免费| 亚洲女爱视频在线| 中文字幕在线不卡视频| 国产精品色噜噜| 日本一区二区三区免费乱视频| 精品人在线二区三区| 日韩欧美一级在线播放| 日韩一卡二卡三卡四卡| 欧美一区二区精品在线| 欧美亚洲精品一区| 欧美午夜精品一区二区蜜桃| 欧美日韩国产色站一区二区三区| 色婷婷综合久久久中文字幕| 色呦呦国产精品| 在线一区二区视频| 欧美一a一片一级一片| 56国语精品自产拍在线观看| 宅男噜噜噜66一区二区66| 91精品久久久久久久91蜜桃| 日韩欧美高清dvd碟片| 精品美女被调教视频大全网站| 日韩欧美在线123| 久久婷婷色综合| 中文字幕精品综合| 亚洲综合一二区| 五月天久久比比资源色| 麻豆精品国产传媒mv男同| 国产乱理伦片在线观看夜一区| 成人免费高清视频在线观看| 99久久精品免费看| 欧洲av一区二区嗯嗯嗯啊| 7777精品伊人久久久大香线蕉完整版 | 国产亚洲美州欧州综合国| 欧美国产激情一区二区三区蜜月 | 色狠狠色狠狠综合| 欧美日韩高清一区二区不卡| 精品国产一区二区精华| 欧美高清在线一区| 亚洲第一二三四区| 激情都市一区二区| 91麻豆免费看片| 欧美成人精品高清在线播放| 亚洲国产成人私人影院tom| 亚洲素人一区二区| 日韩福利视频导航| 成人av在线影院| 91精品黄色片免费大全| 国产精品精品国产色婷婷| 午夜精品一区二区三区三上悠亚| 韩国成人在线视频| 色狠狠桃花综合| 久久你懂得1024| 亚洲电影在线免费观看| 国产98色在线|日韩| 欧美欧美午夜aⅴ在线观看| 国产欧美日韩久久| 日本欧美在线观看| 99久久国产综合精品麻豆| 日韩欧美电影在线| 亚洲免费电影在线| 国产激情视频一区二区在线观看 | 久久婷婷国产综合国色天香| 一区二区三区在线免费视频| 国产成人综合自拍| 日韩欧美一二三| 亚洲超丰满肉感bbw| 成人国产精品视频| 精品99一区二区三区| 亚洲成av人片一区二区梦乃| 91在线码无精品| 久久久久久久久伊人| 蜜臀91精品一区二区三区| 91成人免费电影| 亚洲日本电影在线| 国产精品夜夜嗨| 26uuu国产一区二区三区| 丝袜a∨在线一区二区三区不卡| 91亚洲男人天堂| 中文字幕在线观看不卡视频| 国产米奇在线777精品观看| 欧美高清激情brazzers| 亚洲一区二区在线免费看| 91在线精品一区二区| 国产精品女上位| 国产精品亚洲成人| 久久一日本道色综合| 久久99国产精品麻豆| 日韩欧美色综合网站| 青青草伊人久久| 日韩一区二区视频在线观看| 天堂久久一区二区三区| 欧美亚洲综合久久|