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

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

?? chap_9.c

?? ZLG USB 套件
?? C
字號:
/*
   //*************************************************************************
   //
   //                  		ZLGMCU
   //				www.zlgmcu.com
   // File Name:	chap_9.C
   // Revision:		0.4(2002-07-08)
   // Author:		Liu Ying Bin
   // Use library:  USB51S.LIB
   // Note:			USB51S.LIB不帶DMA控制功能
   //*************************************************************************
   */



#include <stdio.h>
#include <string.h>

#include <reg51.h>                /* special function register declarations   */

#include "d12ci.h"
#include "mainloop.h"
#include "isr.h"
#include "usb100.h"
#include "chap_9.h"

#define NUM_ENDPOINTS	4

#define CONFIG_DESCRIPTOR_LENGTH    sizeof(USB_CONFIGURATION_DESCRIPTOR) \
									+ sizeof(USB_INTERFACE_DESCRIPTOR) \
									+ (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))

extern CONTROL_XFER ControlData;
extern IO_REQUEST idata ioRequest;
extern EPPFLAGS bEPPflags;
extern code void (*VendorDeviceRequest[])(void);

//extern void help_devreq(unsigned char typ, unsigned char req);


/*
//*************************************************************************
// USB protocol function pointer arrays
//*************************************************************************
*/

//USB標準設備請求入口地址指針表
code void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};


//設備描述符
code USB_DEVICE_DESCRIPTOR DeviceDescr =
{
	sizeof(USB_DEVICE_DESCRIPTOR),
    USB_DEVICE_DESCRIPTOR_TYPE,
    SWAP(0x0100),
    USB_CLASS_CODE_TEST_CLASS_DEVICE,
    0, 0,
	EP0_PACKET_SIZE,
	SWAP(0x0471),
	SWAP(0x0666),
	SWAP(0x0100),
    0, 0, 0,
	25
};

//配置描述符
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
    sizeof(USB_CONFIGURATION_DESCRIPTOR),
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    SWAP(CONFIG_DESCRIPTOR_LENGTH),
	1,
	1,
    0,
	0x60,
	0x1
};

//接口描述符
code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
    sizeof(USB_INTERFACE_DESCRIPTOR),
    USB_INTERFACE_DESCRIPTOR_TYPE,
    0,
    0,
	NUM_ENDPOINTS,
	USB_CLASS_CODE_TEST_CLASS_DEVICE,
	USB_SUBCLASS_CODE_TEST_CLASS_D12,
	USB_PROTOCOL_CODE_TEST_CLASS_D12,
	0
};

//端點描述符
code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x81,
	USB_ENDPOINT_TYPE_INTERRUPT,
	SWAP(EP1_PACKET_SIZE),
	10
};

code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x1,
	USB_ENDPOINT_TYPE_INTERRUPT,
	SWAP(EP1_PACKET_SIZE),
	10
};

code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x82,
	USB_ENDPOINT_TYPE_BULK,
	SWAP(EP2_PACKET_SIZE),
	10
};

code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x2,
	USB_ENDPOINT_TYPE_BULK,
	SWAP(EP2_PACKET_SIZE),
	10
};

/*
   //*************************************************************************
   // USB Protocol Layer
   //*************************************************************************
*/

void reserved(void)
{
	stall_ep0();
}

/*
   //*************************************************************************
   // USB standard device requests
   //*************************************************************************
*/


void get_status(void)
{
	unsigned char endp, txdat[2];
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
	unsigned char c;

	if (bRecipient == USB_RECIPIENT_DEVICE) {
		if(bEPPflags.bits.remote_wakeup == 1)
			txdat[0] = 3;
		else
			txdat[0] = 1;
		txdat[1]=0;
		single_transmit(txdat, 2);
	} else if (bRecipient == USB_RECIPIENT_INTERFACE) {
		txdat[0]=0;
		txdat[1]=0;
		single_transmit(txdat, 2);
	} else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			c = D12_SelectEndpoint(endp*2 + 1);	/* Control-in */
		else
			c = D12_SelectEndpoint(endp*2);	/* Control-out */
		if(c & D12_STALL)
			txdat[0] = 1;
		else
			txdat[0] = 0;
		txdat[1] = 0;
		single_transmit(txdat, 2);
	} else
		stall_ep0();
}

void clear_feature(void)
{
	unsigned char endp;
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;

	if (bRecipient == USB_RECIPIENT_DEVICE
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
		DISABLE;
		bEPPflags.bits.remote_wakeup = 0;
		ENABLE;
		single_transmit(0, 0);
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			/* clear TX stall for IN on EPn. */
			D12_SetEndpointStatus(endp*2 + 1, 0);
		else
			/* clear RX stall for OUT on EPn. */
			D12_SetEndpointStatus(endp*2, 0);
		single_transmit(0, 0);
	} else
		stall_ep0();
}

void set_feature(void)
{
	unsigned char endp;
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;

	if (bRecipient == USB_RECIPIENT_DEVICE
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
		DISABLE;
		bEPPflags.bits.remote_wakeup = 1;
		ENABLE;
		single_transmit(0, 0);
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			/* clear TX stall for IN on EPn. */
			D12_SetEndpointStatus(endp*2 + 1, 1);
		else
			/* clear RX stall for OUT on EPn. */
			D12_SetEndpointStatus(endp*2, 1);
		single_transmit(0, 0);
	} else
		stall_ep0();
}

void set_address(void)
{
	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
		DEVICE_ADDRESS_MASK), 1);
	single_transmit(0, 0);
}

void get_descriptor(void)
{
	unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);

	if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
		code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
	} else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
		if (ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH) 
			{ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;}
		code_transmit((unsigned char code *)&ConfigDescr, ControlData.DeviceRequest.wLength);
		//code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
	} else
		stall_ep0();
}

void get_configuration(void)
{
	unsigned char c = bEPPflags.bits.configuration;

	single_transmit(&c, 1);
}

void set_configuration(void)
{
	if (ControlData.DeviceRequest.wValue == 0) {
		/* put device in unconfigured state */
		single_transmit(0, 0);
		DISABLE;
		bEPPflags.bits.configuration = 0;
		ENABLE;
		init_unconfig();
	} else if (ControlData.DeviceRequest.wValue == 1) {
		/* Configure device */
		single_transmit(0, 0);

		init_unconfig();
		init_config();
		
		DISABLE;
		bEPPflags.bits.configuration = 1;
		ENABLE;
	} else
		stall_ep0();
}

void get_interface(void)
{
	unsigned char txdat = 0;        /* Only/Current interface = 0 */
	single_transmit(&txdat, 1);
}

void set_interface(void)
{
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
		single_transmit(0, 0);
	else
		stall_ep0();
}






//Move by Liu Ying Bin


void init_unconfig(void)
{
	//unsigned char i;

	D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
}

void init_config(void)
{
	D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
}

void single_transmit(unsigned char * buf, unsigned char len)
{
	if( len <= EP0_PACKET_SIZE) {
		D12_WriteEndpoint(1, len, buf);
	}
}

void code_transmit(unsigned char code * pRomData, unsigned short len)
{
	ControlData.wCount = 0;
	if(ControlData.wLength > len)
		ControlData.wLength = len;

	ControlData.pData = pRomData;
	if( ControlData.wLength >= EP0_PACKET_SIZE) {
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
		ControlData.wCount += EP0_PACKET_SIZE;

		DISABLE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
		ENABLE;
	}
	else {
		D12_WriteEndpoint(1, ControlData.wLength, pRomData);
		ControlData.wCount += ControlData.wLength;
		DISABLE;
		bEPPflags.bits.control_state = USB_IDLE;
		ENABLE;
	}
}

void control_handler()
{
	unsigned char type, req;

	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;

	if (type == USB_STANDARD_REQUEST)
		(*StandardDeviceRequest[req])();
	else if (type == USB_VENDOR_REQUEST)
		(*VendorDeviceRequest[req])();
	else
		stall_ep0();
}

/*
void fn_usb_isr()
{
	unsigned int i_st;

	bEPPflags.bits.in_isr = 1;
	i_st = D12_ReadInterruptRegister();

	if(i_st != 0) {
		if(i_st & D12_INT_BUSRESET) {
		//	bus_reset();
			bEPPflags.bits.bus_reset = 1;
		}

		if(i_st & D12_INT_EOT)
			dma_eot();

		if(i_st & D12_INT_SUSPENDCHANGE)
			bEPPflags.bits.suspend = 1;

		if(i_st & D12_INT_ENDP0IN)
			ep0_txdone();
		if(i_st & D12_INT_ENDP0OUT)
			ep0_rxdone();
		if(i_st & D12_INT_ENDP1IN)
			ep1_txdone();
		if(i_st & D12_INT_ENDP1OUT)
			ep1_rxdone();
		if(i_st & D12_INT_ENDP2IN)
			ep2_txdone();
		if(i_st & D12_INT_ENDP2OUT)
			ep2_rxdone();
	}
		
	bEPPflags.bits.in_isr = 0;
}
*/

void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}

void ep0_rxdone(void)
{
	unsigned char ep_last, i;

	ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag

	if (ep_last & D12_SETUPPACKET) {

		ControlData.wLength = 0;
		ControlData.wCount = 0;

		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {

			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
			bEPPflags.bits.control_state = USB_IDLE;
			
			return;
		}

		ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
		ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
		ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);

		// Acknowledge setup here to unlock in/out endp
		D12_AcknowledgeEndpoint(0);
		D12_AcknowledgeEndpoint(1);

		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;

		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_TRANSMIT;		/* get command */
		}
		else {
			if (ControlData.DeviceRequest.wLength == 0) {
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_IDLE;		/* set command */
			}
			else {
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
					bEPPflags.bits.control_state = USB_IDLE;
					D12_SetEndpointStatus(0, 1);
					D12_SetEndpointStatus(1, 1);
				}
				else {
					bEPPflags.bits.control_state = USB_RECEIVE;	/* set command with OUT token */
				}
			} // set command with data
		} // else set command
	} // if setup packet

	else if (bEPPflags.bits.control_state == USB_RECEIVE) {
		i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,
			ControlData.dataBuffer + ControlData.wCount);

		ControlData.wCount += i;
		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}

	else {
		bEPPflags.bits.control_state = USB_IDLE;
	}
}

void ep0_txdone(void)
{
	short i = ControlData.wLength - ControlData.wCount;

	D12_ReadLastTransactionStatus(1); // Clear interrupt flag

	if (bEPPflags.bits.control_state != USB_TRANSMIT) 
	{
		single_transmit(0, 0);			
		return;
	}
	
	if( i >= EP0_PACKET_SIZE) {
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
		ControlData.wCount += EP0_PACKET_SIZE;

		bEPPflags.bits.control_state = USB_TRANSMIT;
	}
	else if( i != 0) {
		D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
		ControlData.wCount += i;

		bEPPflags.bits.control_state = USB_IDLE;
	}
	else if (i == 0){
		D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???

		bEPPflags.bits.control_state = USB_IDLE;
	}
}


void usbserve(void)
{
	if (bEPPflags.bits.bus_reset) {
		DISABLE;
		bEPPflags.bits.bus_reset = 0;
		ENABLE;
		d12_busreset();
	} // if bus reset

	if (bEPPflags.bits.suspend) {
		DISABLE;
		bEPPflags.bits.suspend= 0;
		ENABLE;
		d12_suspend();
	} // if suspend change

	if (bEPPflags.bits.setup_packet){
		DISABLE;
		bEPPflags.bits.setup_packet = 0;
		control_handler();
		ENABLE;
	} // if setup_packet
}

void GetVer(unsigned char * VerPoint)
{
	unsigned char code Ver[]={"ZLGMCU USB51S V0.4"};
	VerPoint = Ver;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av亚洲精华国产精华| 精品久久免费看| 欧美一级午夜免费电影| 久久精品男人的天堂| 亚洲激情一二三区| 国产精品 欧美精品| 91国偷自产一区二区开放时间| 日韩精品一区在线观看| 亚洲国产精品影院| av一二三不卡影片| 国产日韩精品一区二区三区在线| 婷婷激情综合网| 日本韩国欧美一区| 亚洲视频电影在线| 成人精品视频网站| 久久久久久久久久久久久女国产乱| 午夜天堂影视香蕉久久| 91麻豆免费看片| 中文字幕亚洲区| 福利一区二区在线| 国产无一区二区| 国产一区在线观看麻豆| 欧美变态tickle挠乳网站| 午夜欧美大尺度福利影院在线看| 91精彩视频在线| 亚洲视频一区二区在线观看| 粉嫩av一区二区三区在线播放 | 一区二区三区在线看| 国产精品538一区二区在线| 日韩欧美国产一区二区三区 | 这里只有精品电影| 亚洲一级二级在线| 欧美在线|欧美| 亚洲精品国产品国语在线app| 成人丝袜视频网| 国产精品三级av| 99久久久国产精品免费蜜臀| 欧美国产日产图区| 99热精品一区二区| 亚洲女爱视频在线| 欧美日韩激情一区二区三区| 视频一区二区中文字幕| 在线播放欧美女士性生活| 免费精品视频在线| 2021中文字幕一区亚洲| 成人丝袜高跟foot| 一区二区三区日韩在线观看| 欧美日韩成人激情| 美女久久久精品| 国产欧美日韩中文久久| 99久久精品免费看国产 | 久久综合久久综合久久| 精品制服美女久久| 欧美经典一区二区三区| 99精品热视频| 五月激情综合婷婷| 久久久国产综合精品女国产盗摄| 成人黄色在线网站| 性做久久久久久| 久久久蜜臀国产一区二区| 夫妻av一区二区| 一区二区三区精品在线| 欧美成人猛片aaaaaaa| 国产成人午夜高潮毛片| 亚洲精品久久久久久国产精华液| 欧美一二区视频| 成人一区二区三区视频在线观看| 一区二区三区免费看视频| 日韩欧美资源站| 9i在线看片成人免费| 午夜免费久久看| 国产精品视频九色porn| 在线成人午夜影院| 成人97人人超碰人人99| 日韩在线a电影| 国产精品全国免费观看高清| 欧美高清dvd| 99视频精品在线| 精一区二区三区| 亚洲成国产人片在线观看| 久久久美女艺术照精彩视频福利播放| 日本韩国视频一区二区| 国产精品一级二级三级| 视频在线观看一区| 日韩码欧中文字| 久久九九久久九九| 337p亚洲精品色噜噜噜| 在线观看av一区| 成人app在线观看| 国产一区激情在线| 日韩制服丝袜先锋影音| 一区二区高清在线| 国产精品久久毛片| 国产三级欧美三级日产三级99 | 91精品国产日韩91久久久久久| 成人午夜短视频| 国内精品免费**视频| 视频一区二区三区在线| 亚洲综合色成人| 亚洲视频在线观看三级| 国产精品久久久久久亚洲毛片| 精品日韩99亚洲| 日韩欧美一级二级三级久久久| 欧美影视一区在线| 91久久精品一区二区三区| www.综合网.com| 欧美日韩电影一区| 欧美日韩免费观看一区三区| 91丝袜国产在线播放| 不卡视频一二三| 97精品久久久午夜一区二区三区 | 国产一区二区按摩在线观看| 日韩电影在线观看电影| 香蕉成人伊视频在线观看| 亚洲欧美日韩国产综合| 亚洲女与黑人做爰| 亚洲免费观看高清完整版在线| 国产精品免费网站在线观看| 国产精品色呦呦| 1000部国产精品成人观看| 国产精品婷婷午夜在线观看| 国产精品入口麻豆九色| 亚洲婷婷在线视频| 一区二区三区国产精华| 亚洲国产欧美日韩另类综合 | www.性欧美| 91视频在线看| 色婷婷激情久久| 欧美日韩你懂得| 欧美一区二区三区视频免费| 日韩欧美国产三级电影视频| www亚洲一区| 国产精品久久久久久久久免费樱桃| 亚洲欧洲韩国日本视频| 亚洲一区二区三区在线看| 同产精品九九九| 麻豆国产精品视频| 福利一区二区在线观看| 欧美午夜免费电影| 欧美一区二区三区四区高清| 日韩欧美国产wwwww| 国产精品沙发午睡系列990531| 亚洲激情一二三区| 理论片日本一区| 成人av资源网站| 欧美日韩国产大片| 欧美精品一区二区高清在线观看| 欧美国产精品专区| 午夜国产精品一区| 国产成人日日夜夜| 欧美日韩电影一区| 国产精品久久综合| 日本亚洲最大的色成网站www| 国产一区二区三区综合| 欧美亚日韩国产aⅴ精品中极品| 日韩欧美中文一区| 亚洲色图欧洲色图婷婷| 天天色天天爱天天射综合| 丁香婷婷综合网| 欧美剧情片在线观看| 中文文精品字幕一区二区| 亚洲成人7777| 99久久综合精品| 精品日韩欧美在线| 亚洲va欧美va人人爽| av福利精品导航| 欧美精品一区二区三| 亚洲国产日日夜夜| 99热这里都是精品| 久久久精品免费观看| 日本免费新一区视频| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产精品久久免费看| 欧美aa在线视频| 欧美天天综合网| 中文字幕亚洲一区二区av在线| 精品午夜久久福利影院| 在线不卡的av| 亚洲国产三级在线| 91久久精品一区二区| 欧美激情在线一区二区| 韩国av一区二区三区在线观看| 欧美三级韩国三级日本三斤| 最近中文字幕一区二区三区| 国产精品资源在线| 久久免费视频色| 麻豆国产欧美日韩综合精品二区| 欧美日韩国产系列| 国产成人一区二区精品非洲| 91麻豆精品国产综合久久久久久| 亚洲色欲色欲www| 99久久国产免费看| 国产精品乱子久久久久| 成人一区二区三区视频在线观看| 26uuu国产在线精品一区二区| 久久99热这里只有精品| 精品欧美乱码久久久久久1区2区| 爽爽淫人综合网网站| 日韩欧美成人一区二区| 美女尤物国产一区|