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

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

?? chap_9.c

?? 這是應用在Philips的D12上的源代碼。很有用的哦。
?? C
字號:
#include <stdio.h>
#include <string.h>

#include "config.h"
#include "d12ci.h"
#include "mainloop.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;
CONTROL_XFER ControlData;
//extern IO_REQUEST idata ioRequest;
extern EPPFLAGS bEPPflags;
extern code void (*VendorDeviceRequest[])(void);

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

//配置描述符
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
    sizeof(USB_CONFIGURATION_DESCRIPTOR),
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    SWAP(CONFIG_DESCRIPTOR_LENGTH),
	1,
	1,
    0,
	0xa0,
	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),
	1
};

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

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

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


//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
};


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

void reserved(void)
{
	stall_ep0();
}

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

//獲取設備狀態(tài)
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)//獲取遠程喚醒狀態(tài)
			txdat[0] = 3;
		else
			txdat[0] = 1;
		txdat[1]=0;
		single_transmit(txdat, 2);
	} else if (bRecipient == USB_RECIPIENT_INTERFACE) {//獲取接口狀態(tài)
		txdat[0]=0;
		txdat[1]=0;
		single_transmit(txdat, 2);
	} else if (bRecipient == USB_RECIPIENT_ENDPOINT) {//獲取端點狀態(tài)
		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) {//清除端點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) {//設置端點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)
{
	switch (MSB(ControlData.DeviceRequest.wValue))
	{
	    case  USB_DEVICE_DESCRIPTOR_TYPE:
			code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
			break;
		case  USB_CONFIGURATION_DESCRIPTOR_TYPE:
			code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
			break;
		default:
			stall_ep0();
			break;
	}
}


//獲取配置狀態(tài)
void get_configuration(void)
{
	unsigned char c = bEPPflags.bits.configuration;
	single_transmit(&c, 1);
}

//設置配置狀態(tài)
void set_configuration(void)
{
	if (ControlData.DeviceRequest.wValue == 0) {
		//設備進入未配置狀態(tài)
		single_transmit(0, 0);
		DISABLE;
		bEPPflags.bits.configuration = 0;
		ENABLE;
		init_unconfig();
	} else if (ControlData.DeviceRequest.wValue == 1) {
		//配置設備
		single_transmit(0, 0);

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

//獲取接口狀態(tài)
void get_interface(void)
{
	unsigned char txdat = 0;        /* Only/Current interface = 0 */
	single_transmit(&txdat, 1);
}

//設置接口狀態(tài)
void set_interface(void)
{
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
		single_transmit(0, 0);
	else
		stall_ep0();
}



//*****************************************************************************************
//返回stall應答
void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}

//斷開USB總線
void disconnect_USB(void)
{
	// Initialize D12 configuration
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}

//連接USB總線
void connect_USB(void)
{
	// reset event flags
	DISABLE;
	bEPPflags.value = 0;//清除所有狀態(tài)
	ENABLE;

	// V2.1 enable normal+sof interrupt
	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);

	// Initialize D12 configuration
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
}

//重新連接到USB總線
void reconnect_USB(void)
{
//	unsigned long clk_cnt;

//	D12SUSPD = 0;
	disconnect_USB();
	connect_USB();

}

//恢復到未配置狀態(tài)
void init_unconfig(void)
{
//	unsigned char i;

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

//設置配置狀態(tài)
void init_config(void)
{
	D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
}

//從端點號1發(fā)送數(shù)據(jù)
void single_transmit(unsigned char * buf, unsigned char len)
{
	if( len <= EP0_PACKET_SIZE) {
		D12_WriteEndpoint(1, len, buf);
	}
}

//發(fā)送端點號1建立代碼
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);//發(fā)送16字節(jié)數(shù)據(jù)
		ControlData.wCount += EP0_PACKET_SIZE;
		DISABLE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
		ENABLE;
	}
	else {
		D12_WriteEndpoint(1, ControlData.wLength, pRomData);//發(fā)送16字節(jié)內(nèi)數(shù)據(jù)
		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])();//調(diào)用標準請求
	else if (type == USB_VENDOR_REQUEST)
		(*VendorDeviceRequest[req])();//調(diào)用廠商請求
	else
		stall_ep0();
}





?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜免费视频| 色婷婷国产精品久久包臀| 国产成人免费视频网站高清观看视频| 国产aⅴ精品一区二区三区色成熟| 日本丶国产丶欧美色综合| 精品久久人人做人人爰| 一区二区三区在线免费观看| 韩国视频一区二区| 欧美日韩免费一区二区三区| 国产精品少妇自拍| 精品一区二区三区香蕉蜜桃| 欧美日韩精品欧美日韩精品一综合| 日本一区二区三区视频视频| 免费高清不卡av| 欧美私模裸体表演在线观看| 国产精品久久久久影院亚瑟| 国产一区二区三区电影在线观看 | 最新国产成人在线观看| 美女网站视频久久| 欧美福利视频导航| 一区二区三区在线播放| av不卡免费在线观看| 国产日韩精品一区二区三区在线| 日产国产高清一区二区三区| 欧美性大战久久| 一区二区理论电影在线观看| 96av麻豆蜜桃一区二区| 中文字幕欧美一区| 成人avav在线| 中文字幕五月欧美| 99热在这里有精品免费| 国产精品久久久久影院亚瑟| 成人免费av网站| 亚洲欧洲日产国产综合网| 成人av电影在线| 综合激情成人伊人| 色呦呦国产精品| 夜夜嗨av一区二区三区中文字幕 | 99麻豆久久久国产精品免费| 欧美国产日韩一二三区| 成人免费毛片片v| 国产精品国产三级国产普通话三级 | 亚洲欧洲国产日韩| 91蜜桃视频在线| 一区二区三区欧美日| 欧美日韩一区二区三区在线 | 欧美亚洲一区二区三区四区| 亚洲制服丝袜av| 欧美日本不卡视频| 美日韩一级片在线观看| 久久久久久久综合色一本| 大陆成人av片| 亚洲黄色av一区| 欧美一区二区三区影视| 久久9热精品视频| 久久久精品tv| 91国产免费观看| 视频在线观看一区| 精品国产3级a| 99久久777色| 五月激情六月综合| 久久久久久久久97黄色工厂| 成人晚上爱看视频| 亚洲一二三级电影| 精品久久人人做人人爽| 91在线视频观看| 免费在线观看一区| 国产精品热久久久久夜色精品三区 | 久久99热99| 亚洲丝袜精品丝袜在线| 在线成人av影院| jlzzjlzz欧美大全| 日韩精品一级中文字幕精品视频免费观看 | 欧美精品一区二区蜜臀亚洲| 99久久免费国产| 日本不卡不码高清免费观看| 国产精品国产自产拍在线| 欧美日韩不卡在线| 成人国产精品免费观看动漫| 日日噜噜夜夜狠狠视频欧美人 | 在线中文字幕不卡| 精品一区二区三区在线播放视频| 国产精品国产馆在线真实露脸 | 99亚偷拍自图区亚洲| 免费xxxx性欧美18vr| 亚洲人成电影网站色mp4| 欧美成人精品二区三区99精品| 97精品视频在线观看自产线路二| 久久精品噜噜噜成人av农村| 亚洲男人天堂一区| 国产日韩欧美激情| 欧美电影免费观看高清完整版在 | 最新国产の精品合集bt伙计| 日韩精品中文字幕一区| 欧美网站大全在线观看| av资源站一区| 国产精品99久久久| 美女在线视频一区| 午夜久久久影院| 亚洲色图清纯唯美| 国产精品无人区| 国产亚洲欧洲一区高清在线观看| 337p亚洲精品色噜噜噜| 在线观看一区二区视频| 99久久婷婷国产综合精品| 国产传媒一区在线| 激情图片小说一区| 蜜臂av日日欢夜夜爽一区| 亚洲aⅴ怡春院| 亚洲国产精品一区二区尤物区| 亚洲欧美一区二区视频| 中文乱码免费一区二区| 久久精品一区二区三区不卡| 精品久久久久久久人人人人传媒| 欧美一区二区三区在线观看| 在线成人av影院| 69av一区二区三区| 欧美日韩mp4| 欧美日韩三级在线| 欧美剧情片在线观看| 欧美日韩大陆一区二区| 555夜色666亚洲国产免| 欧美精品丝袜久久久中文字幕| 欧美视频三区在线播放| 精品视频免费看| 91 com成人网| 日韩视频在线你懂得| 精品国产乱码久久| 国产日本一区二区| 中文字幕一区二区三区色视频| 最新国产精品久久精品| 最新日韩av在线| 亚洲综合一区二区| 日韩一区欧美二区| 极品美女销魂一区二区三区免费| 国产自产2019最新不卡| 成人午夜看片网址| 色婷婷国产精品| 欧美精品粉嫩高潮一区二区| 日韩欧美国产一区二区三区| www国产成人免费观看视频 深夜成人网| 久久影视一区二区| 一区在线中文字幕| 婷婷中文字幕综合| 国内精品不卡在线| 91美女片黄在线| 日韩欧美国产综合一区 | 色婷婷国产精品| 欧美一区二区三区在线视频 | 1区2区3区国产精品| 亚洲午夜免费福利视频| 蜜桃一区二区三区在线| 高清av一区二区| 欧美日韩在线免费视频| 久久久久久久综合| 亚洲在线观看免费视频| 久久精品国产精品亚洲综合| caoporn国产精品| 欧美岛国在线观看| 亚洲色欲色欲www| 韩国一区二区三区| 在线观看欧美黄色| 久久久精品免费免费| 亚洲综合色自拍一区| 狠狠色丁香久久婷婷综合丁香| 91美女在线看| 久久久美女毛片| 天堂成人免费av电影一区| 国产成人精品1024| 日韩一级二级三级精品视频| 国产精品天美传媒| 久久国产精品免费| 欧美影片第一页| 国产精品短视频| 国产在线播放一区三区四| 欧美性猛交xxxxxxxx| 日本一区二区三级电影在线观看 | 色综合一个色综合| 亚洲精品菠萝久久久久久久| 久久av老司机精品网站导航| 欧美午夜理伦三级在线观看| 久久精品免视看| 久久99久久久欧美国产| 欧美猛男gaygay网站| 亚洲乱码日产精品bd| 成人毛片视频在线观看| 久久蜜桃香蕉精品一区二区三区| 视频一区欧美精品| 欧美日韩国产一二三| 依依成人精品视频| 91片在线免费观看| 国产精品久久久久三级| 国产精品1区二区.| 精品免费99久久| 精品一区二区三区免费毛片爱| 制服.丝袜.亚洲.另类.中文| 亚洲成在人线免费| 欧美综合一区二区| 亚洲一区二区三区国产| 欧美性色aⅴ视频一区日韩精品|