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

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

?? usb.c

?? HID 設備測試程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*===============================================================================//
//== 文 件 名:USB.c
//== author	 :gnsusn
//== 說    明:對 USB 協議的處理
//== 修改日志:2008.8.20 創建文件
//== 
//===============================================================================*/
#include <reg52.h>
#include "USB.h"
#include "PDIUSBD12.h"
#include "functions.h"
#include "hid_report.h"

//***************************************************************************************
//=======================================================================================

EPPFLAGS 				bEPPflags;				//== 程序運行狀態標志
CONTROL_DATA_BUFF 		Control_Data;			//== setup 包

unsigned char usb_transmit_buf[8];				//== 用于給USB發送數據的緩沖區
unsigned char hid_idle;							//== HID 設備的idle狀態
unsigned char hid_protocol;						//== HID 當前協議

//*********************************************************************************
//== 協議中用到的數據
code unsigned char LANGUAGE_ID[4] = {0x04,0x03,0x09,0x04};		//== 字符串描述符所用的語言種類
									
code unsigned char device_serial_number[] =						//== 設備序列號	
{
	22,STRING_DESCRIPTOR,'2',0,'0',0,'0',0,
	'8',0,'-',0,'0',0,'8',0,'-',0,'2',0,'3',0
};

code unsigned char ManufacturerString[28] =						//== 廠商字符串
{
	28,STRING_DESCRIPTOR,0x3F,0x80,0x11,0x68,0x7E,0x67,0x84,
	0x76,'U',0x00,'S',0x00,'B',0x00,'-',0x00,'H',0x00,'I',
	0x00,'D',0x00,0xBE,0x8B,0x07,0x59
};

code unsigned char ProducterString[30] =						//== 產品字符串
{
	30,STRING_DESCRIPTOR,0x3F,0x80,0x11,0x68,0x7E,0x67,0x84,
	0x76,'U',0x00,'S',0x00,'B',0x00,'-',0x00,'-',0x00,'H',
	0x00,'I',0x00,'D',0x00,0xBE,0x8B,0x07,0x59
};

code DEVICE_DESCRIPTOR_STRUCT device_descriptor =				//== 設備描述符
{
	sizeof(DEVICE_DESCRIPTOR_STRUCT),							//== 設備描述符的字節數大小
	DEVICE_DESCRIPTOR,											//== 設備描述符類型編號
	SWAP16(0x0110),												//== USB版本號
	0x03,														//== USB分配的設備類代碼
	0x00,														//== USB分配的子類代碼
	0x00,														//== USB分配的設備協議代碼
	0x10,														//== 端點0的最大包大小
	SWAP16(0x0471),												//== 廠商編號VID,這里只是作為測試用,請使用自己的VID
	SWAP16(0x1234),												//== 產品編號PID,這里只是作為測試用,請使用自己的PID
	SWAP16(0x0001),												//== 設備出廠編號
	0x01,														//== 設備廠商字符串的索引
	0x02,														//== 描述產品字符串的索引
	0x03,														//== 描述設備序列號字符串的索引
	0x01														//== 可能的配置數量
};

//== 定義配置,接口,端點等描述符結構體,因為它們是隨配置描述符一起返回的
typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
{
	CONFIGURATION_DESCRIPTOR_STRUCT	configuration_descriptor;
	INTERFACE_DESCRIPTOR_STRUCT		interface_descriptor;
	HID_DESCRIPTOR_STRUCT			hid_descriptor;
	ENDPOINT_DESCRIPTOR_STRUCT		endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;

code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor =
{
	//configuration_descriptor									//配置描述符
	{
		sizeof(CONFIGURATION_DESCRIPTOR_STRUCT),				//== 配置描述符的字節數大小
		CONFIGURATION_DESCRIPTOR,								//== 配置描述符類型編號
		SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
		0x01,													//== 只包含一個接口
		0x01,													//== 該配置的編號
		0x00,													//== iConfiguration字段
		0x80,													//== 采用總線供電
		0xC8													//== 從總線獲取最大電流400mA
	},
	//interface_descritor										//== 接口描述符
	{
		sizeof(INTERFACE_DESCRIPTOR_STRUCT),					//== 接口描述符的字節數大小
		INTERFACE_DESCRIPTOR,									//== 接口描述符類型編號
		0x00,													//== 接口編號為0
		0x00,													//== 該接口描述符的編號
		ENDPOINT_NUMBER,										//== 該接口使用的端點數量,非0端點數量為4,只使用端點主端點輸入和輸出
		0x03,													//== 人機接口設備(HID)類
		0x00,													//== 使用的子類:未定義
		0x00,													//== 使用的協議:未定義
		0x00													//== 接口描述符字符串索引
	},
	//hid_descriptor
	{
		sizeof(HID_DESCRIPTOR_STRUCT),							//== HID描述符的字節數大小
		HID_DESCRIPTOR,											//== HID描述符類型編號
		0x1001,													//== HID類協議版本號,為1.1
		0x00,													//== 固件的國家地區代號,0x21為美國
		NUM_SUB_DESCRIPTORS,									//== 下級描述符的數量
		{
			{
				REPORT_DESCRIPTOR,								//== 下級描述符為報告描述符
				SWAP16(sizeof(DataReportDescriptor))			//== 下級描述符的長度
			}
		},
	},
	//endpoint_descriptor[]
	{
		{														//== 主端點輸入描述
			sizeof(ENDPOINT_DESCRIPTOR_STRUCT),					//== 端點描述符的字節數大小
			ENDPOINT_DESCRIPTOR,								//== 端點描述符類型編號
			POINT_1_IN,											//== 控制輸入端點
			ENDPOINT_TYPE_INTERRUPT,							//== 使用的傳輸類型:中斷傳輸
			SWAP16(0x0010),										//== 該端點支持的最大包尺寸,16字節
			0x0A												//== 中斷掃描時間:設置為10ms
		},
  
		{														//== 主端點輸出描述
			sizeof(ENDPOINT_DESCRIPTOR_STRUCT),					//== 端點描述符的字節數大小
			ENDPOINT_DESCRIPTOR,								//== 端點描述符類型編號
			POINT_1_OUT,										//== 控制輸出端點
			ENDPOINT_TYPE_INTERRUPT,							//== 使用的傳輸類型:中斷傳輸
			SWAP16(0x0010),										//== 該端點支持的最大包尺寸,16字節
			0x0A												//== 中斷掃描時間:設置為10ms
		},

		{														//== 主端點輸出描述
			sizeof(ENDPOINT_DESCRIPTOR_STRUCT),					//== 端點描述符的字節數大小
			ENDPOINT_DESCRIPTOR,								//== 端點描述符類型編號
			MAIN_POINT_IN,										//== 端點號,主輸入端點
			ENDPOINT_TYPE_INTERRUPT,							//== 使用的傳輸類型:批量傳輸
			SWAP16(0x0040),										//== 該端點支持的最大包尺寸,64字節
			0x0A												//== 中斷掃描時間:設置為10ms
		},

		{														//== 主端點輸出描述
			sizeof(ENDPOINT_DESCRIPTOR_STRUCT),					//== 端點描述符的字節數大小
			ENDPOINT_DESCRIPTOR,								//== 端點描述符類型編號
			MAIN_POINT_OUT,										//== 端點號,主輸出端點
			ENDPOINT_TYPE_INTERRUPT,							//== 使用的傳輸類型:中斷傳輸
			SWAP16(0x0040),										//== 該端點支持的最大包尺寸,64字節
			0x0A												//== 中斷掃描時間:設置為10ms
		},
	},
};
 
//*********************************************************************************

//===============================================================================//
//== 函 數 名:usb_bus_reset
//== 功    能:USB 總線復位處理
//== 說    明:
//== 時    間:2008.8.13 創建函數
//== 入口參數:無
//== 返 回 值:0
//===============================================================================//
unsigned char usb_bus_reset(void)
{
	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("Runing usb_bus_reset()!\r\n");
	#endif

	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("USB總線復位................................\r\n");
	#endif

	bEPPflags.bits.bus_reset = 1;

	return 0;
}

//===============================================================================//
//== 函 數 名:usb_bus_suspend
//== 功    能:USB 總線掛起處理
//== 說    明:
//== 時    間:2008.8.13 創建函數
//== 入口參數:無
//== 返 回 值:0
//===============================================================================//
unsigned char usb_bus_suspend(void)
{
	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("Runing usb_bus_suspend()!\r\n");
	#endif

	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("USB總線掛起................................\r\n");
	#endif

	bEPPflags.bits.suspend = 1;

	return 0;
}

//===============================================================================//
//== 函 數 名:set_usb_address
//== 功    能:設置D12的地址
//== 說    明:主機請求設置地址時被調用
//== 時    間:2008.8.22 創建函數
//== 入口參數:無
//== 返 回 值:0
//===============================================================================//
unsigned char set_usb_address(void)
{
	set_usb_addr((unsigned char)(Control_Data.DeviceRequest.wValue & DEVICE_ADDRESS_MASK));
	Control_Data.wLength = 0;										//== 發送0字節長度數據到主機做回答
	Control_Data.wCount = 0;
	bEPPflags.bits.control_state = USB_TRANSMIT;					//== 設置為發送狀態,等待in端點中斷
	return 0;
}
//===============================================================================//
//== 函 數 名:stall_ep0
//== 功    能:停止端點0
//== 說    明:
//== 時    間:
//== 入口參數:
//== 返 回 值:0
//===============================================================================//
unsigned char stall_ep0(void)
{
	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("Runing stall_ep0()!\r\n");
	#endif
	set_endpoint_status(0, 1);
	set_endpoint_status(1, 1);
	return 0;
}

//===============================================================================//
//== 函 數 名:reserved
//== 功    能:備用函數
//== 說    明:
//== 時    間:
//== 入口參數:
//== 返 回 值:0
//===============================================================================//
unsigned char reserved(void)
{
	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("Runing reserved()!\r\n");
	#endif
	stall_ep0();
	return 0;
}
//===============================================================================//
//== 函 數 名:control_handler
//== 功    能:得到狀態
//== 說    明:
//== 時    間:2008.8.20 創建函數
//== 入口參數:receiver: 要得到狀態的對象
//== 返 回 值:0
//===============================================================================//
unsigned char get_status(unsigned char receiver)
{
	unsigned char status[2];
	unsigned char endp, endp_state;

	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("Runing get_status()!\r\n");
	#endif

	switch (receiver)
	{
		case USB_RECIPIENT_DEVICE:					//== 獲取設備狀態
		{
			if (bEPPflags.bits.remote_wakeup == 1)	//== 自給供電+遠程喚醒
			{
				status[0] = 0x03;
			}
			else									//== 自給供電
			{
				status[0] = 0x01;
			}
			status[1] = 0x00;
		} break;

		case USB_RECIPIENT_INTERFACE:				//== 獲取接口狀態
		{
			status[0] = 0x00;
			status[1] = 0x00;
		} break;

		case USB_RECIPIENT_ENDPOINT:				//== 獲取端點狀態
		{
			endp = (unsigned char)(Control_Data.DeviceRequest.wIndex & MAX_ENDPOINTS);	//== 得到端點號

			if (Control_Data.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
				endp_state = select_endpoint(endp*2 + 1);	//== Control-in
			else
				endp_state = select_endpoint(endp*2);		//== Control-out

			if (endp_state & D12_STALL)
				status[0] = 0x01;
			else
				status[0] = 0;

			status[1] = 0;
		} break;

		default:stall_ep0(); break;
	}

	usb_transmit_buf[0] = status[0];
	usb_transmit_buf[1] = status[1];
	Control_Data.pData = usb_transmit_buf;
	Control_Data.wLength = 2;
	Control_Data.wCount = 0;
	bEPPflags.bits.control_state = USB_TRANSMIT;		//== 設置為發送狀態,等待in端點中斷
	return 0;
}

//===============================================================================//
//== 函 數 名:get_descriptor
//== 功    能:得到描述符
//== 說    明:
//== 時    間:2008.8.20 創建函數
//== 入口參數:無
//== 返 回 值:0
//===============================================================================//
unsigned char get_descriptor(void)
{
	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("Runing get_descriptor()!\r\n");
	#endif

	#ifdef __DEBUG__ 	//== 打印調試信息
		Print_Msg("獲取描述符................................\r\n");
	#endif
	switch(MSB(Control_Data.DeviceRequest.wValue))
	{
		case DEVICE_DESCRIPTOR:
		{
			#ifdef __DEBUG__ 	//== 打印調試信息
				Print_Msg("	獲取設備描述符................................\r\n");
			#endif
			Control_Data.wCount = sizeof(DEVICE_DESCRIPTOR_STRUCT);
			Control_Data.pData = (unsigned char *)(&device_descriptor);
			if (Control_Data.DeviceRequest.wLength == 0x40)	//== 第一次獲取描述符
			{
				bEPPflags.bits.first_get_descriptor = 1;
			}
		} break;

		case CONFIGURATION_DESCRIPTOR:
		{
			#ifdef __DEBUG__ 	//== 打印調試信息
				Print_Msg("	獲取配置描述符................................\r\n");
			#endif
			Control_Data.wCount = SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
			Control_Data.pData = (unsigned char *)(&con_int_endp_descriptor);
			if (Control_Data.wLength<Control_Data.wCount) Control_Data.wCount = Control_Data.wLength;
		} break;

		case STRING_DESCRIPTOR:
		{
			#ifdef __DEBUG__ 	//== 打印調試信息
				Print_Msg("	獲取字符串描述符................................\r\n");
			#endif
			switch(LSB(Control_Data.DeviceRequest.wValue))
			{
				case 0x00:
				{
					#ifdef __DEBUG__ 	//== 打印調試信息
						Print_Msg("		獲取語言ID................................\r\n");
					#endif
					Control_Data.wCount = LANGUAGE_ID[0];
					Control_Data.pData = LANGUAGE_ID;
				} break;

				case 0x01:
				{
					#ifdef __DEBUG__ 	//== 打印調試信息
						Print_Msg("		獲取廠商字符串................................\r\n");
					#endif
					Control_Data.wCount = ManufacturerString[0];
					Control_Data.pData = ManufacturerString;
				} break;

				case 0x02:
				{
					#ifdef __DEBUG__ 	//== 打印調試信息
						Print_Msg("		獲取產品字符串................................\r\n");
					#endif
					Control_Data.wCount = ProducterString[0];
					Control_Data.pData = ProducterString;
				} break;

				case 0x03:
				{
					#ifdef __DEBUG__ 	//== 打印調試信息
						Print_Msg("		獲取設備序列號................................\r\n");
					#endif
					Control_Data.wCount = device_serial_number[0];
					Control_Data.pData = device_serial_number;
				} break;

				default: break;
			}
		} break;

		case INTERFACE_DESCRIPTOR: break;
		case ENDPOINT_DESCRIPTOR: break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区在线看麻豆| 美腿丝袜在线亚洲一区| av一本久道久久综合久久鬼色| 男男视频亚洲欧美| 欧美一区二区三区系列电影| 亚洲成a人片在线不卡一二三区| 99久久精品国产观看| 色综合天天综合网天天看片| 欧美国产激情二区三区| 日韩不卡一二三区| 日韩精品电影在线| 欧美久久高跟鞋激| 天天综合天天做天天综合| 福利一区二区在线观看| 国产欧美日韩视频一区二区| 粉嫩久久99精品久久久久久夜| 国产精品久久午夜夜伦鲁鲁| 亚洲美女精品一区| 色婷婷狠狠综合| 秋霞成人午夜伦在线观看| 欧美精品一区视频| 在线视频你懂得一区| 免费成人美女在线观看.| 国产精品五月天| 风间由美中文字幕在线看视频国产欧美 | 久久人人97超碰com| www.99精品| 国产自产视频一区二区三区| 亚洲欧美一区二区三区国产精品| 91麻豆精品久久久久蜜臀| 成人午夜视频在线观看| 日韩不卡免费视频| 亚洲视频一二三区| 国产三级精品三级在线专区| 欧美日韩一区二区三区视频| 精品无码三级在线观看视频| 亚洲免费观看在线视频| 欧美高清在线精品一区| 亚洲精品一线二线三线无人区| 91亚洲精品乱码久久久久久蜜桃 | 亚洲欧洲av在线| 亚洲精品在线免费播放| 亚洲精品国产品国语在线app| 日韩欧美一级精品久久| 日韩午夜精品电影| 欧美人妇做爰xxxⅹ性高电影| 91丨九色丨尤物| 99久久精品费精品国产一区二区| 日本欧美一区二区三区| 日本三级韩国三级欧美三级| 一区二区三区免费在线观看| 亚洲一区二区三区在线播放 | 国产午夜精品久久久久久久| 国产一本一道久久香蕉| 国产三级精品三级在线专区| 91福利在线看| 日韩一区二区免费视频| 日本精品裸体写真集在线观看| 99久久久精品| 在线免费精品视频| 久久综合九色欧美综合狠狠| 久久久电影一区二区三区| 久久久精品国产免大香伊 | 奇米色一区二区三区四区| 国产乱色国产精品免费视频| 99久久综合99久久综合网站| 欧美久久久久久蜜桃| 国产人成亚洲第一网站在线播放| 国产精品国产自产拍高清av王其| 亚洲精品免费播放| 国产麻豆精品久久一二三| 欧日韩精品视频| 亚洲一区二区在线播放相泽| 日本不卡1234视频| yourporn久久国产精品| 91精品福利在线一区二区三区| 国产精品女同一区二区三区| 亚洲成a人v欧美综合天堂下载 | 精品欧美一区二区在线观看| 精品国产a毛片| 免费成人av资源网| 欧美蜜桃一区二区三区| 国产91丝袜在线观看| 在线观看亚洲a| 亚洲色图19p| 麻豆精品一二三| 成人午夜激情视频| 欧美日韩卡一卡二| 一区二区三区色| 欧美日韩专区在线| 一区二区三区四区五区视频在线观看 | 成人av片在线观看| 亚洲色图欧洲色图| 色婷婷狠狠综合| 性久久久久久久久久久久| 欧美日韩激情一区二区| 美女久久久精品| 久久综合久久综合亚洲| 成人免费av资源| 一区二区视频在线看| 欧美日韩不卡一区| 国产麻豆日韩欧美久久| 国产精品成人在线观看| 成人免费观看视频| 亚洲成人av一区| 亚洲国产高清在线观看视频| 91亚洲精品久久久蜜桃网站| 日韩精品成人一区二区三区| 久久久精品国产免大香伊| 99久久精品国产导航| 日本在线不卡视频| 亚洲精品久久久久久国产精华液| 欧美日韩情趣电影| 日本道色综合久久| 成人在线视频首页| 久久精品免费观看| 日韩二区在线观看| 久久久电影一区二区三区| 成人国产视频在线观看| 黑人巨大精品欧美一区| 亚洲影视在线观看| 国产精品美女久久久久av爽李琼 | 成人综合在线观看| 一区二区三区不卡在线观看 | 国产精品久久久久桃色tv| 国产色产综合产在线视频| 国精品**一区二区三区在线蜜桃| 欧美aaa在线| 国产69精品久久777的优势| 成人美女视频在线看| 91老师片黄在线观看| 欧美羞羞免费网站| 日韩免费高清av| 国产人成亚洲第一网站在线播放 | 成人久久18免费网站麻豆| 国产精品私房写真福利视频| 亚洲女人的天堂| 麻豆精品蜜桃视频网站| 国产成人在线视频网址| 欧美三级日韩三级| 久久一区二区三区四区| 一区二区三区国产精华| 亚洲国产精品v| 精品一区二区三区不卡| 色综合久久综合中文综合网| 日韩欧美国产午夜精品| 亚洲色大成网站www久久九九| 免费成人在线观看| 欧美日韩国产精品成人| 成人免费视频在线观看| 日本一区二区三区dvd视频在线| 亚洲综合色婷婷| 在线一区二区三区四区五区| 国产偷国产偷亚洲高清人白洁| 亚洲成年人影院| 欧美视频中文字幕| 日韩精品一二三区| 精品卡一卡二卡三卡四在线| 中文字幕一区在线| 成人91在线观看| 中文字幕综合网| 在线观看视频一区| 手机精品视频在线观看| 欧美精品九九99久久| 亚洲va欧美va天堂v国产综合| 中文字幕中文在线不卡住| 成人免费毛片高清视频| 亚洲六月丁香色婷婷综合久久 | 久草中文综合在线| 精品日产卡一卡二卡麻豆| 国模冰冰炮一区二区| 亚洲欧洲另类国产综合| 在线中文字幕一区| 亚洲精品欧美专区| 欧美日韩小视频| 日本不卡在线视频| 精品污污网站免费看| 日韩一区二区在线播放| 国产东北露脸精品视频| 国产精品久久久久四虎| 91精品福利视频| 粉嫩aⅴ一区二区三区四区五区| 国产精品蜜臀在线观看| 一本色道亚洲精品aⅴ| 日韩不卡一区二区| 亚洲三级理论片| 精品国产露脸精彩对白| 91国内精品野花午夜精品| 精品在线免费观看| 婷婷成人激情在线网| 中文字幕免费不卡| 精品少妇一区二区三区在线播放| 91麻豆精品在线观看| 粉嫩绯色av一区二区在线观看 | 美国三级日本三级久久99| 国产精品色婷婷| 国产精品三级久久久久三级| 日韩欧美一二三四区| 日韩一区二区三区视频| 欧美日本在线观看|