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

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

?? usbdev.c

?? S3C2443的Bootloader程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
	U32  g_uDownloadFileSize;
	U32  g_uDownloadAddress;
	U32  g_cpucnt;

	USB_DEVICE_DESCRIPTOR* g_poDescDevice;
	USB_GET_STATUS* g_poStatusGet;
	USB_INTERFACE_GET* g_poInterfaceGet;
	USB_DESCRIPTORS* g_poDesc;
	DEVICE_REQUEST* g_poDeviceRequest;

	U32  g_uEp0State;
	U32  g_uEp0SubState;	
	USB_SPEED g_eSpeed;
	U32  g_uBulkInCount;
	U32  g_uEp0MaxPktSize;
	U32  g_uEp1MaxPktSize;
	U32  g_uEp3MaxPktSize;	
	U32  g_uBulkInAddr;
	U32  g_uEnumerationDone;



void WrPktEp0(U8 *buf, int num)
{
	int i;
	U16 Wr_Data=0;

	if (num&0x1) num++;
	for(i=0;i<num;i+=2)
	{
		Wr_Data=((*(buf+1))<<8)|*buf;
		Outp32(EP0_FIFO, Wr_Data);
		buf +=2;
	}
}

void WrPktEp1(U8 *buf, int num)
{
	int i;
	U16 Wr_Data=0;

	if (num&0x1) num++;
	for(i=0;i<num;i+=2)
	{
		Wr_Data=((*(buf+1))<<8)|*buf;
	   Outp32(EP1_FIFO, Wr_Data);
	   buf +=2;
	}
}

void PrintEp0Pkt(U8 *pt, U8 count)
{
	int i;
	DbgUsb(("[DBG:"));
	for(i=0;i<count;i++)
		DbgUsb(("%x,", pt[i]));
	DbgUsb(("]"));
}

void RdPktEp3(U8 *buf, int num)
{
	int i;
	U16 Rdata;

	for(i=0;i<num;i+=2)
	{
		Inp32(EP3_FIFO, Rdata);
		buf[i] = (U8)Rdata;
		buf[i+1] = (U8)(Rdata>>8);
	}

	g_pDownPt += num;
}

bool IsEnumerationDone(void)
{
	if (g_uEnumerationDone == 0)
		return FALSE;
	else
		return TRUE;
}

void PrepareEp1Fifo(U32 BaseAddr)
{
	int i;
	U32 in_csr1;
	U8* BulkInBuf = (U8*)BaseAddr;

	if (g_uBulkInCount > g_uEp1MaxPktSize)
	{
		Outp32(INDEX_REG, EP1);
		Outp32(BYTE_WRITE_CNT_REG, g_uEp1MaxPktSize);
		WrPktEp1(BulkInBuf, g_uEp1MaxPktSize);

		g_uBulkInAddr = BaseAddr + g_uEp1MaxPktSize;
		g_uBulkInCount -= g_uEp1MaxPktSize;
	}
	else
	{
		Outp32(INDEX_REG, EP1);
		Outp32(BYTE_WRITE_CNT_REG, g_uBulkInCount);
		WrPktEp1(BulkInBuf, g_uBulkInCount);

		g_uBulkInAddr = BaseAddr + g_uBulkInCount;
		g_uBulkInCount = 0;
	}


}

void FlushEp1Fifo(void)
{
	U32 OrgValue;
	Outp32(INDEX_REG, EP1);
	Inp32(EP_CON_REG, OrgValue);
	Outp32(EP_CON_REG, (1<<6));
	Outp32(EP_CON_REG, OrgValue);
}

void SetMaxPktSizes(USB_SPEED eSpeed)
{
	if (eSpeed == USB_HIGH)
	{
		g_eSpeed = USB_HIGH;
		g_uEp0MaxPktSize = 64;
		g_uEp1MaxPktSize = 512;
		g_uEp3MaxPktSize = 512;
	}
	else
	{
		g_eSpeed = USB_FULL;
		g_uEp0MaxPktSize = 8;
		g_uEp1MaxPktSize = 64;
		g_uEp3MaxPktSize = 64;
	}
	// EP0 Max Packet size settings
	Outp32(INDEX_REG, EP0);
	Outp32(MAX_PKT_REG, g_uEp0MaxPktSize); 	// max packet size

	// EP1 OUT Max Packet size settings
	Outp32(INDEX_REG, EP1);
	Outp32(MAX_PKT_REG, g_uEp1MaxPktSize); 	// max packet size

	// EP2 IN Max Packet size settings
	Outp32(INDEX_REG, EP3);
	Outp32(MAX_PKT_REG, g_uEp3MaxPktSize);	// max packet size
}

void SetOpMode(USB_OP mode)
{
	U32 i;
	g_uDownloadFileSize = 0;
	g_eOpMode = mode;
}

bool VerifyChecksum(void)
{
	U8* CalcCSPt;
	U16 dnCS;
	U16 checkSum;
    U16 i=0;
    
	// checksum calculation
	CalcCSPt = (U8*)g_uDownloadAddress;
	checkSum = 0;
	while((U32)CalcCSPt < (g_uDownloadAddress+(g_uDownloadFileSize-8)))
	{
		checkSum += *CalcCSPt++;
		i++;
	}
	// checkSum was calculated including dnCS. So, dnCS should be subtracted.
	checkSum=checkSum - *((unsigned char *)(g_uDownloadAddress+g_uDownloadFileSize-8-2))
		- *( (unsigned char *)(g_uDownloadAddress+g_uDownloadFileSize-8-1) );

	dnCS=*((unsigned char *)(g_uDownloadAddress+g_uDownloadFileSize-8-2))+
		(*( (unsigned char *)(g_uDownloadAddress+g_uDownloadFileSize-8-1) )<<8);

	if (checkSum!=dnCS)
	{
		printf("Checksum Error!!! MEM:%x DN:%x\n", checkSum, dnCS);
		return FALSE;
	}
	else
	{
		return TRUE;
	}

}

void GetDownFileInfo(U32* uDownAddr, U32* uDownFileSize)
{
	*uDownAddr = g_uDownloadAddress;
	*uDownFileSize = g_uDownloadFileSize;
}

void AllocateUSBDEV(void)
{
	g_poDescDevice = (USB_DEVICE_DESCRIPTOR*)malloc(sizeof (USB_DEVICE_DESCRIPTOR));
	g_poStatusGet = (USB_GET_STATUS*)malloc(sizeof (USB_GET_STATUS));
	g_poInterfaceGet = (USB_INTERFACE_GET*)malloc(sizeof (USB_INTERFACE_GET));
	g_poDesc = (USB_DESCRIPTORS*)malloc(sizeof (USB_DESCRIPTORS));
	g_poDeviceRequest = (DEVICE_REQUEST*)malloc(sizeof (DEVICE_REQUEST));
}

void FreeUSBDEV(void)
{
	if (g_poDescDevice)
		free(g_poDescDevice);
	if (g_poStatusGet)
		free(g_poStatusGet);
	if (g_poInterfaceGet)
		free(g_poInterfaceGet);
	if (g_poDesc)
		free(g_poDesc);
	if (g_poDeviceRequest)
		free(g_poDeviceRequest);
}


void Init(void)
{

	g_uEnumerationDone = 0;
	SetEndpoint();

	g_uEp0State = EP0_STATE_INIT;
	g_uEp0SubState = 0;
}

void SetDescriptorTable(void)
{
	// Standard device descriptor
	g_poDescDevice->bLength=0x12;	// EP0_DEV_DESC_SIZE=0x12 bytes
	g_poDescDevice->bDescriptorType=DEVICE_TYPE;
	g_poDescDevice->bDeviceClass=0xFF; // 0x0
	g_poDescDevice->bDeviceSubClass=0x0;
	g_poDescDevice->bDeviceProtocol=0x0;
	g_poDescDevice->bMaxPacketSize0=g_uEp0MaxPktSize;

	g_poDescDevice->idVendorL=0xe8;     //changed the value 06.10.16
	g_poDescDevice->idVendorH=0x04;     //changed the value 06.10.16

	g_poDescDevice->idProductL=0x34;
	g_poDescDevice->idProductH=0x12;

	g_poDescDevice->bcdDeviceL=0x00;
	g_poDescDevice->bcdDeviceH=0x01;
	g_poDescDevice->iManufacturer=0x1; // index of string descriptor
	g_poDescDevice->iProduct=0x2;	// index of string descriptor
	g_poDescDevice->iSerialNumber=0x0;
	g_poDescDevice->bNumConfigurations=0x1;
	if (g_eSpeed == USB_FULL) {
		g_poDescDevice->bcdUSBL=0x10;
		g_poDescDevice->bcdUSBH=0x01; 	// Ver 1.10
	}
	else {
		g_poDescDevice->bcdUSBL=0x00;
		g_poDescDevice->bcdUSBH=0x02; 	// Ver 2.0
	}

	// Standard configuration descriptor
	g_poDesc->oDescConfig.bLength=0x9;
	g_poDesc->oDescConfig.bDescriptorType=CONFIGURATION_TYPE;
	g_poDesc->oDescConfig.wTotalLengthL=0x20; // <cfg desc>+<if desc>+<endp0 desc>+<endp1 desc>
	g_poDesc->oDescConfig.wTotalLengthH=0;
	g_poDesc->oDescConfig.bNumInterfaces=1;
// dbg    descConf.bConfigurationValue=2; // why 2? There's no reason.
	g_poDesc->oDescConfig.bConfigurationValue=1;
	g_poDesc->oDescConfig.iConfiguration=0;
	g_poDesc->oDescConfig.bmAttributes=CONF_ATTR_SELFPOWERED;//CONF_ATTR_DEFAULT; // bus powered only.
	g_poDesc->oDescConfig.maxPower=25; // draws 50mA current from the USB bus.

	// Standard interface descriptor
	g_poDesc->oDescInterface.bLength=0x9;
	g_poDesc->oDescInterface.bDescriptorType=INTERFACE_TYPE;
	g_poDesc->oDescInterface.bInterfaceNumber=0x0;
	g_poDesc->oDescInterface.bAlternateSetting=0x0; // ?
	g_poDesc->oDescInterface.bNumEndpoints=2;	// # of endpoints except EP0
	g_poDesc->oDescInterface.bInterfaceClass=0xff; // 0x0 ?
	g_poDesc->oDescInterface.bInterfaceSubClass=0x0;
	g_poDesc->oDescInterface.bInterfaceProtocol=0x0;
	g_poDesc->oDescInterface.iInterface=0x0;

	// Standard endpoint0 descriptor
	g_poDesc->oDescEndpt1.bLength=0x7;
	g_poDesc->oDescEndpt1.bDescriptorType=ENDPOINT_TYPE;
	g_poDesc->oDescEndpt1.bEndpointAddress=1|EP_ADDR_IN; // 2400Xendpoint 1 is IN endpoint.
	g_poDesc->oDescEndpt1.bmAttributes=EP_ATTR_BULK;
	g_poDesc->oDescEndpt1.wMaxPacketSizeL=(U8)g_uEp1MaxPktSize; // 64
	g_poDesc->oDescEndpt1.wMaxPacketSizeH=(U8)(g_uEp1MaxPktSize>>8);
	g_poDesc->oDescEndpt1.bInterval=0x0; // not used

	// Standard endpoint1 descriptor
	g_poDesc->oDescEndpt3.bLength=0x7;
	g_poDesc->oDescEndpt3.bDescriptorType=ENDPOINT_TYPE;
	g_poDesc->oDescEndpt3.bEndpointAddress=3|EP_ADDR_OUT; // 2400X endpoint 3 is OUT endpoint.
	g_poDesc->oDescEndpt3.bmAttributes=EP_ATTR_BULK;
	g_poDesc->oDescEndpt3.wMaxPacketSizeL=(U8)g_uEp3MaxPktSize; // 64
	g_poDesc->oDescEndpt3.wMaxPacketSizeH=(U8)(g_uEp3MaxPktSize>>8);
	g_poDesc->oDescEndpt3.bInterval=0x0; // not used
}

void SetEndpoint(void)
{
	// *** End point information ***
	// EP0: control
	U16 SysStatus;
	U16 Temp;

	Outp32(INDEX_REG, EP0);
	// For L18
	Outp32(EP_DIR_REG, 0x02); 		// EP1=> TX, EP2=>RX , 0b=report mode[1], 15b=report mode[2], 3b~8b=ep2 delay_con
	Outp32(EP_INT_EN_REG, 0x4d0f); 	// EP0, 1, 2 Interrupt enable, 15b=report mode[0], 3b~14b=ep0/1 delay_con
	Inp32(EP_DIR_REG, Temp);
	DbgUsb(("EP_DIR_REG : %x \n", Temp));
	Inp32(EP_INT_EN_REG, Temp);
	DbgUsb(("EP_INT_EN_REG : %x \n", Temp));

	Outp32(SYS_CON_REG, 0x4123);		// error interrupt enable, 16bit bus, Little format, suspend&reset enable
	Outp32(EP0_CON_REG, 0x0000);


	// EP1 OUT Max Packet size settings
	Outp32(INDEX_REG, EP1);
	Outp32(EP_CON_REG, 0x0080); // dual enable

	// EP2 IN Max Packet size settings
	Outp32(INDEX_REG, EP3);
	Outp32(EP_CON_REG, 0x0080);    		// dual enable
	Outp32(INDEX_REG, EP0);
}


void HandleEvent(void)
{
	U32 uStatus;
	U32 Temp;
	U16 ep_int_status, ep_int;

	Inp32(SYS_STATUS_REG, uStatus); // System status read
	DbgUsb(("SYS_STATUS_REG : %x \n", uStatus));

	if (uStatus & INT_REG_VBUS)
	{
		Outp32(SYS_STATUS_REG, INT_REG_VBUS); // Interrupt Clear
		DbgUsb(("\n [USB_Diag_Log]  :  INT_REG_VBUS\n"));
	}

	if (uStatus & 0xfc00) 	 // Error interrupt check
	{
		
		Inp32(SYS_STATUS_REG , Temp);
		Outp32(SYS_STATUS_REG, INT_ERR); // Interrupt Clear
		DbgUsb(("\n [USB_Diag_Log]  :  Error_INT\n"));
		
	}

	if (uStatus & INT_REG_SUSPEND)
	{
		Outp32(SYS_STATUS_REG, INT_REG_SUSPEND); // Interrupt Clear
		DbgUsb(("\n [USB_Diag_Log]  : Suspend Mode"));
		
	}

	if (uStatus & INT_REG_RESUME)
	{
		Outp32(SYS_STATUS_REG, INT_REG_RESUME); // Host software send ClearPortFeature. Interrupt Clear
		DbgUsb(("\n [USB_Diag_Log]  : Resume Mode \n"));
		
	}

	if (uStatus & INT_REG_RESET) // Reset interrupt
	{
		Outp32(SYS_STATUS_REG, INT_REG_RESET); // Interrupt Clear
		SetEndpoint();
		g_uEp0State = EP0_STATE_INIT;
		DbgUsb(("\n [USB_Diag_Log]  : Reset Mode \n"));
	}

	if (uStatus & INT_REG_SDE) // Device Speed Detection interrupt
	{
		Outp32(SYS_STATUS_REG, INT_REG_SDE); // Interrupt Clear
		DbgUsb(("\n [USB_Diag_Log]  : Speed Detection interrupt \n"));

		if (uStatus & INT_REG_HSP) // Set if Device is High speed or Full speed
		{
			Outp32(SYS_STATUS_REG, INT_REG_HSP); // High Speed Device Interrupt Clear?? may be not.
			DbgUsb(("\n [USB_Diag_Log]  : High Speed Detection\n"));
			SetMaxPktSizes(USB_HIGH);
			SetDescriptorTable();
		}
		else
		{
			SetMaxPktSizes(USB_FULL);
			SetDescriptorTable();
		}
	}

	

	Inp32(EP_STATUS_REG, ep_int_status); // EP interrrupt status read
	DbgUsb(("EP_STATUS_REG : %x \n", ep_int_status));
	Inp32(EP_INT_REG, ep_int);
	DbgUsb(("EP_INT_REG : %x \n", ep_int));


	if (ep_int & INT_REG_EP0)
	{
 		DbgUsb(("\n [USB_Diag_Log]  :  Control Transfer Interrupt \n"));
		Outp32(EP_INT_REG, INT_REG_EP0); // Interrupt Clear
		HandleEvent_EP0();
	}

	// Endpoint1 bulkIn
	else if (ep_int & INT_REG_EP1)
	{
		Outp32(EP_INT_REG, INT_REG_EP1); // Interrupt Clear
		DbgUsb(("\n [USB_Diag_Log]  :  Ep1 Interrupt  \n"));
		HandleEvent_BulkIn();
	}

	// Endpoint3 bulkOut
	else if (ep_int & INT_REG_EP3)
	{
		DbgUsb(("\n [USB_Diag_Log]  :  Bulk Out Transfer Interrupt  \n"));
		Outp32(EP_INT_REG, INT_REG_EP3); // Interrupt Clear
		HandleEvent_BulkOut();
	}

}

// ======================================================================
// endpointZeroFunction()
//

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99re视频精品| 欧洲色大大久久| 日韩一级片网站| 国产精品国产a| 日韩高清欧美激情| 欧美性一二三区| 亚洲国产色一区| 日本韩国欧美在线| 亚洲一本大道在线| k8久久久一区二区三区| 56国语精品自产拍在线观看| 亚洲色图.com| 91在线精品秘密一区二区| 99综合影院在线| 99麻豆久久久国产精品免费优播| 欧美日韩免费电影| 欧美性xxxxx极品少妇| 亚洲另类春色国产| 国产成人免费网站| 亚洲欧洲在线观看av| 成人高清视频免费观看| 国产精品三级av在线播放| 国内精品第一页| 欧美韩国日本不卡| www.亚洲精品| 一区二区三区电影在线播| 欧美丝袜自拍制服另类| 蜜臀av亚洲一区中文字幕| 日韩免费观看高清完整版| 国产麻豆成人精品| 欧美一区二区三区免费视频| 国产在线精品免费av| 一区二区三区欧美日韩| 亚洲精品高清在线| 51精品秘密在线观看| 欧美精品三级在线观看| 久久亚洲综合av| 99这里只有精品| 日韩激情一二三区| 国产日韩成人精品| 欧美视频一区二区| 国内精品免费在线观看| 欧美一级高清片| 激情小说亚洲一区| 一区二区三区小说| 精品乱人伦小说| 色哟哟欧美精品| 精品一区二区三区久久久| 国产精品白丝在线| 日韩欧美亚洲国产另类 | 亚洲天堂av一区| 91精品国产手机| 国内精品久久久久影院薰衣草| 欧美一区二区在线观看| 日韩视频免费观看高清完整版在线观看| 欧美精品一区二区三区蜜臀| 国产日韩视频一区二区三区| 国产乱码精品一区二区三| 一区二区三区日韩在线观看| 26uuu另类欧美| 在线国产电影不卡| 成人一道本在线| 男女视频一区二区| 亚洲最新视频在线观看| 欧美高清在线精品一区| 91福利社在线观看| 精品综合久久久久久8888| 亚洲精品国产a久久久久久| 欧美不卡激情三级在线观看| 91在线视频播放地址| 青草av.久久免费一区| 亚洲免费观看高清完整版在线观看| 欧美成人女星排行榜| 欧美日韩精品三区| 91麻豆免费看片| 国产1区2区3区精品美女| 人人狠狠综合久久亚洲| 五月婷婷欧美视频| 在线欧美日韩精品| 黄色日韩网站视频| 中文欧美字幕免费| 国产精品18久久久久久久久久久久 | 大胆亚洲人体视频| 日本欧美在线观看| 一区2区3区在线看| 亚洲少妇最新在线视频| 国产午夜亚洲精品午夜鲁丝片| 欧美一级生活片| 欧美高清精品3d| 欧美吻胸吃奶大尺度电影| 国产成a人无v码亚洲福利| 视频在线观看国产精品| 国产精品美女久久久久aⅴ| 国产欧美一区二区精品婷婷| 亚洲一区二区在线免费观看视频| 91福利精品视频| 色综合久久中文综合久久97| 国产精品免费视频网站| 成人性生交大片免费看在线播放| 五月激情综合网| 丝袜a∨在线一区二区三区不卡| 亚洲精品成a人| 一区二区三区不卡视频| 亚洲激情自拍偷拍| 亚洲综合成人在线视频| 日韩欧美亚洲国产另类| 成人av在线播放网站| 丰满岳乱妇一区二区三区| 成人激情电影免费在线观看| 99精品黄色片免费大全| 色综合久久综合网97色综合| 欧美欧美午夜aⅴ在线观看| 欧美日韩国产一二三| 91精品国产麻豆国产自产在线| 制服丝袜亚洲播放| 国产日韩欧美不卡在线| 中文字幕日韩一区二区| 精品国产一区二区精华| 日韩视频在线你懂得| 亚洲人成网站精品片在线观看| 亚洲国产精品久久一线不卡| 欧美日韩成人综合在线一区二区 | 日本少妇一区二区| 久久精品999| 精品亚洲国内自在自线福利| 高清不卡在线观看av| 在线观看精品一区| 91小视频免费观看| 日韩欧美123| 中文字幕中文字幕一区| 日本亚洲电影天堂| 成人精品国产福利| 99久久综合国产精品| 高清不卡一区二区在线| www.99精品| 欧美一级理论片| 日韩伦理av电影| 国产真实乱偷精品视频免| 91色乱码一区二区三区| 91精品国产91久久综合桃花 | 国产一区三区三区| 欧美日韩国产美女| 欧美国产精品一区二区三区| 亚洲制服欧美中文字幕中文字幕| 成人综合在线观看| 91精品国产全国免费观看| 国产精品美日韩| 久久国产精品色| 色婷婷精品大在线视频| 日韩欧美www| 美洲天堂一区二卡三卡四卡视频| 成人丝袜18视频在线观看| 日韩三级在线观看| 一个色在线综合| 成人丝袜视频网| 国产精品久久久久aaaa| 国产自产v一区二区三区c| 在线观看一区不卡| 中文字幕欧美一| 青青国产91久久久久久 | 欧美一区二区视频免费观看| 中文字幕av资源一区| 麻豆国产精品官网| 色婷婷综合久久久中文字幕| 亚洲欧美日韩在线不卡| 国产91色综合久久免费分享| 久久久久久久av麻豆果冻| 日韩国产在线观看一区| 欧美综合天天夜夜久久| 日韩毛片精品高清免费| 成人国产在线观看| 精品国产乱码久久久久久图片| 天天做天天摸天天爽国产一区 | 在线观看成人小视频| 一级日本不卡的影视| 成a人片亚洲日本久久| 国产亚洲成av人在线观看导航 | 国产精品狼人久久影院观看方式| 国产91精品一区二区麻豆亚洲| 精品免费日韩av| 国产一区二区导航在线播放| 欧美电影在线免费观看| 亚洲成人久久影院| 一本一本大道香蕉久在线精品| 亚洲欧美另类在线| 色噜噜狠狠成人中文综合| 亚洲精品日产精品乱码不卡| 91在线观看高清| 一区二区三区免费看视频| 欧美日韩精品一区二区三区四区 | 欧美日韩国产成人在线免费| 亚洲制服丝袜av| 欧美日韩在线播| 秋霞影院一区二区| 日韩无一区二区| 99久久er热在这里只有精品15| 亚洲素人一区二区| 欧美日韩一区二区三区四区| 日韩国产欧美在线播放| 日韩欧美国产一二三区|