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

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

?? mass_storage.c

?? 這是usb device端的驅動
?? C
字號:
#include "usb.h"#include "udc.h"#if 1#define dprintf(x...) //printf(x)#else#define dprintf(x...)#endif#ifndef NULL#define NULL#endif/* * USB mass storage class subclasses */enum UMASS_SUBCLASS{	MASS_SUBCLASS_RBC = 1,	// Flash	MASS_SUBCLASS_8020,	// CD-ROM	MASS_SUBCLASS_QIC,	// Tape	MASS_SUBCLASS_UFI,	// Floppy disk device	MASS_SUBCLASS_8070,	// Floppy disk device	MASS_SUBCLASS_SCSI	// Any device with a SCSI-defined command set};/* * USB mass storage class protocols */enum UMASS_PROTOCOL{	MASS_PROTOCOL_CBI,	// Command/Bulk/Interrupt	MASS_PROTOCOL_CBI_CCI,	// Command/Bulk/Interrupt	MASS_PROTOCOL_BULK = 0x50	// Bulk-Only transport};static u32 epout, epin;static USB_DeviceDescriptor devDesc = {	sizeof(USB_DeviceDescriptor),	DEVICE_DESCRIPTOR,	//1	0x0200,     //Version 2.0	0x08,	0x01,	0x50,	64,	/* Ep0 FIFO size */	0x07c4,	0xa4a5,	0xffff,	0x00,	0x00,	0x00,	0x01};#define	CONFIG_DESCRIPTOR_LEN	(sizeof(USB_ConfigDescriptor) + \				 sizeof(USB_InterfaceDescriptor) + \				 sizeof(USB_EndPointDescriptor) * 2)static struct {	USB_ConfigDescriptor    configuration_descriptor;	USB_InterfaceDescriptor interface_descritor;	USB_EndPointDescriptor  endpoint_descriptor[2];} __attribute__ ((packed)) confDesc = {	{		sizeof(USB_ConfigDescriptor),		CONFIGURATION_DESCRIPTOR,		CONFIG_DESCRIPTOR_LEN,		0x01,		0x01,		0x00,		0xc0,	// Self Powered, no remote wakeup		0x64	// Maximum power consumption 2000 mA	},	{		sizeof(USB_InterfaceDescriptor),		INTERFACE_DESCRIPTOR,		0x00,		0x00,		0x02,	/* ep number */		CLASS_MASS_STORAGE,		MASS_SUBCLASS_SCSI,		MASS_PROTOCOL_BULK,		0x04	},	{		{			sizeof(USB_EndPointDescriptor),			ENDPOINT_DESCRIPTOR,			(1 << 7) | 1,// endpoint 2 is IN endpoint			2, /* bulk */			/* Transfer Type: Bulk;			 * Synchronization Type: No Synchronization;			 * Usage Type: Data endpoint			 */			//512, /* IN EP FIFO size */			512,			16		},		{			sizeof(USB_EndPointDescriptor),			ENDPOINT_DESCRIPTOR,			(0 << 7) | 1,// endpoint 5 is OUT endpoint			2, /* bulk */			/* Transfer Type: Bulk;			 * Synchronization Type: No Synchronization;			 * Usage Type: Data endpoint			 */			512, /* OUT EP FIFO size */			16		}	}};void sendDevDescString(int size){	u16 str_ret[13] = {		   0x031a,//0x1a=26 byte		   0x0041,		   0x0030,		   0x0030,		   0x0041,		   0x0030,		   0x0030,		   0x0041,		   0x0030,		   0x0030,		   0x0041,		   0x0030,		   0x0030		  };	dprintf("sendDevDescString size = %d\r\n",size);	if(size >= 26)		size = 26;	str_ret[0] = (0x0300 | size);	HW_SendPKT(0, str_ret,size);	}void sendDevDesc(int size){       switch (size) {	case 18:		devDesc.iSerialNumber = GetMassDevNum();		if(devDesc.iSerialNumber > 0)			devDesc.iSerialNumber--;		HW_SendPKT(0, &devDesc, sizeof(devDesc));		break;	default:		HW_SendPKT(0, &devDesc, 8);		break;	}}void sendConfDesc(int size){	switch (size) {	case 9:		HW_SendPKT(0, &confDesc, 9);		break;	case 8:		HW_SendPKT(0, &confDesc, 8);		break;	default:		HW_SendPKT(0, &confDesc, sizeof(confDesc));		break;	}}void usbHandleClassDevReq(u8 *buf){	u8 scsiLUN = 0;		switch (buf[1]) {	case 0xfe:		scsiLUN = GetMassDevNum();		if(scsiLUN > 0)			scsiLUN --;		dprintf("Get max lun\n");				if (buf[0] == 0xa1)			HW_SendPKT(0, &scsiLUN, 1);		break;	case 0xff:		dprintf("Mass storage reset\n");		break;	}}/* * Command Block Wrapper (CBW) */#define	CBWSIGNATURE	0x43425355		// "CBSU"#define	CBWFLAGS_OUT	0x00			// HOST-to-DEVICE#define	CBWFLAGS_IN	0x80			// DEVICE-to-HOST#define	CBWCDBLENGTH	16typedef struct{	u32 dCBWSignature;	u32 dCBWTag;	s32 dCBWDataXferLength;	u8 bmCBWFlags;	/* The bits of this field are defined as follows:	 *     Bit 7 Direction - the device shall ignore this bit if the	 *                       dCBWDataTransferLength zero, otherwise:	 *         0 = Data-Out from host to the device,	 *         1 = Data-In from the device to the host.	 *     Bit 6 Obsolete. The host shall set this bit to zero.	 *     Bits 5..0 Reserved - the host shall set these bits to zero.	 */	u8 bCBWLUN : 4,	   reserved0 : 4;	u8 bCBWCBLength : 5,	   reserved1    : 3;	u8 CBWCB[CBWCDBLENGTH];} __attribute__ ((packed)) CBW;/* * Command Status Wrapper (CSW) */#define	CSWSIGNATURE			0x53425355	// "SBSU"#define	CSWSIGNATURE_IMAGINATION_DBX1	0x43425355	// "CBSU"#define	CSWSIGNATURE_OLYMPUS_C1		0x55425355	// "UBSU"#define	CSWSTATUS_GOOD			0x0#define	CSWSTATUS_FAILED		0x1#define	CSWSTATUS_PHASE_ERR		0x2typedef struct{	u32 dCSWSignature;	u32 dCSWTag;	u32 dCSWDataResidue;	u8 bCSWStatus;	/* 00h Command Passed ("good status")	 * 01h Command Failed	 * 02h Phase Error	 * 03h and 04h Reserved (Obsolete)	 * 05h to FFh Reserved	 */} __attribute__ ((packed)) CSW;/* * Required UFI Commands */#define	UFI_FORMAT_UNIT			0x04	// output#define	UFI_INQUIRY			0x12	// input#define	UFI_MODE_SELECT			0x55	// output#define	UFI_MODE_SENSE_6		0x1A	// input#define	UFI_MODE_SENSE_10		0x5A	// input#define	UFI_PREVENT_MEDIUM_REMOVAL	0x1E#define	UFI_READ_10			0x28	// input#define	UFI_READ_12			0xA8	// input#define	UFI_READ_CAPACITY		0x25	// input#define	UFI_READ_FORMAT_CAPACITY	0x23	// input#define	UFI_REQUEST_SENSE		0x03	// input#define	UFI_REZERO_UNIT			0x01#define	UFI_SEEK_10			0x2B#define	UFI_SEND_DIAGNOSTIC		0x1D#define	UFI_START_UNIT			0x1B#define	UFI_TEST_UNIT_READY		0x00#define	UFI_VERIFY			0x2F#define	UFI_WRITE_10			0x2A	// output#define	UFI_WRITE_12			0xAA	// output#define	UFI_WRITE_AND_VERIFY		0x2E	// output#define	UFI_ALLOW_MEDIUM_REMOVAL	UFI_PREVENT_MEDIUM_REMOVAL#define	UFI_STOP_UNIT			UFI_START_UNIT#define	S_CBW		0#define S_DATA_OUT	1#define	S_DATA_IN	2#define S_CSW		3#define S_NULL          4static u32 massStat = S_CBW;static u32 massBuf[1024];static u32 start_sector;static u16 nr_sectors;static CSW csw;static CBW cbw;void massReset(void){	massStat = S_CBW;	start_sector = 0;	nr_sectors = 0;}static u32 swap32(u32 n){	return (((n & 0x000000ff) >> 0) << 24) |	       (((n & 0x0000ff00) >> 8) << 16) |	       (((n & 0x00ff0000) >> 16) << 8) |	       (((n & 0xff000000) >> 24) << 0);}typedef struct _CAPACITY_DATA {	u32 Blocks;	u32 BlockLen;   	}CAPACITY_DATA;typedef struct _READ_FORMAT_CAPACITY_DATA {	u8 Reserve1[3];	u8 CapacityListLen;	CAPACITY_DATA CurMaxCapacity;	CAPACITY_DATA CapacityData[30];	}READ_FORMAT_CAPACITY_DATA;static void ProcessScsiReadFormatCapacity(u8 cbwLUN,u32 size){	struct {		u32 hiddennum;		u32 headnum;		u32 secnum;		u32 partsize;	} devinfo;	READ_FORMAT_CAPACITY_DATA readfcd;	memset(&readfcd,0,sizeof(readfcd));	readfcd.CapacityListLen = 1;	massDevInfo(cbwLUN,&devinfo);	readfcd.CapacityData[0].Blocks = devinfo.partsize-1;	readfcd.CapacityData[0].BlockLen = 512;	readfcd.CurMaxCapacity.Blocks = devinfo.partsize-1;			readfcd.CurMaxCapacity.BlockLen = 512;	readfcd.CurMaxCapacity.BlockLen = (readfcd.CurMaxCapacity.BlockLen << 8) | 0x2;	if(size > sizeof(READ_FORMAT_CAPACITY_DATA))		size = sizeof(READ_FORMAT_CAPACITY_DATA);	csw.dCSWDataResidue = 0;	csw.bCSWStatus = CSWSTATUS_GOOD;	csw.dCSWTag = cbw.dCBWTag;		HW_SendPKT(epin, (u8 *) &readfcd, size);}int USB_HandleUFICmd(void){	u32 tmp;	//dprintf("massStat:%d\n", massStat);	//printf("\nStart USB_HandleUFICmd!");	switch (massStat) {	case S_CBW:		HW_GetPKT(epout, &cbw, sizeof(CBW));		if (cbw.dCBWSignature != CBWSIGNATURE)			return 0;		csw.dCSWSignature = CSWSIGNATURE;		csw.bCSWStatus = CSWSTATUS_GOOD;		csw.dCSWTag = cbw.dCBWTag;		csw.dCSWDataResidue = 0;		dprintf("cbw.Signature:%08x\n", cbw.dCBWSignature);		dprintf("cbw.dCBWTag:%08x\n", cbw.dCBWTag);		dprintf("cbw.dCBWDataXferLength:%x\n", cbw.dCBWDataXferLength);		dprintf("cbw.bmCBWFlags:%08x\n", cbw.bmCBWFlags);		dprintf("cbw.bCBWLUN:%d\n", cbw.bCBWLUN);		dprintf("cbw.bCBWCBLength:%d\n", cbw.bCBWCBLength);		dprintf("cbw.CBWCB[0]:%02x\n", cbw.CBWCB[0]);		switch (cbw.CBWCB[0]) {		case UFI_INQUIRY:		{			static const u8 inquiry[] = {				0x00,	// Direct-access device (floppy)				0x80,	// 0x80	// Removable Media				0x00,				0x01,	// UFI device				0x5B,				0x00, 0x00, 0x00,				'I', 'n', 'g', 'e', 'n', 'i', 'c', ' ',				'J', 'z', 'S', 'O', 'C', ' ', 'U', 'S',				'B', '-', 'D', 'I', 'S', 'K', ' ', ' ',				'0', '1', '0', '0'			};			u32 size = sizeof(inquiry);			if(cbw.dCBWDataXferLength < sizeof(inquiry))				size = cbw.dCBWDataXferLength;			HW_SendPKT(epin, inquiry, sizeof(inquiry));			massStat = S_NULL;			break;		}		case UFI_REQUEST_SENSE:		{			static const u8 sense[] = {				0x70,				0x00,				0x05,				0x00, 0x00, 0x00, 0x00,				0x0c,				0x00, 0x00, 0x00, 0x00,				0x20,				0x00,				0x00,				0x00, 0x00, 0x00			};			HW_SendPKT(epin, sense, sizeof(sense));			massStat = S_DATA_OUT;			break;		}		case UFI_READ_CAPACITY:		{			struct {				u32 hiddennum;				u32 headnum;				u32 secnum;				u32 partsize;			} devinfo;			u32 resp[2];//			FS_IoCtl(USR_DISK, FS_CMD_GET_DEVINFO, 0, (void*)&devinfo);//			resp[0] = cpu_to_be32(devinfo.partsize - 1);//			resp[1] = cpu_to_be32(FS_FAT_SEC_SIZE);//			USB_EndpOut(1, (const u8*)resp, sizeof(resp), false);			massDevInfo(cbw.bCBWLUN,&devinfo);			resp[0] = swap32(devinfo.partsize-1); /* last sector */			resp[1] = swap32(512);		/* sector size */			HW_SendPKT(epin, (u8 *)resp, sizeof(resp));			massStat = S_DATA_OUT;			break;		}		case UFI_READ_10:		case UFI_WRITE_10:		case UFI_WRITE_AND_VERIFY:		{			start_sector =				((u32)cbw.CBWCB[2] << 24) |				((u32)cbw.CBWCB[3] << 16) |				((u32)cbw.CBWCB[4] << 8) |				(u32)cbw.CBWCB[5];			nr_sectors   =				((u16)cbw.CBWCB[7] << 8) | (u16)cbw.CBWCB[8];			dprintf("s:%d n:%d\n", start_sector, nr_sectors);			if (cbw.CBWCB[0] == UFI_READ_10) {				if (nr_sectors > 8) {					massDevRead(cbw.bCBWLUN ,massBuf, start_sector, 8);					HW_SendPKT(epin, massBuf, 8*512);					start_sector += 8;					nr_sectors -= 8;				} else {					massDevRead(cbw.bCBWLUN,massBuf, start_sector,						    nr_sectors);					HW_SendPKT(epin, massBuf,						   nr_sectors * 512);					start_sector += nr_sectors;					nr_sectors = 0;									}				massStat = S_DATA_OUT;							} else				massStat = S_DATA_IN;			break;		}		case UFI_VERIFY://		FS_IoCtl(USR_DISK, FS_CMD_FLUSH_CACHE, 0, 0);			massStat = S_CSW;			break;		case UFI_READ_FORMAT_CAPACITY:			ProcessScsiReadFormatCapacity(cbw.bCBWLUN,cbw.dCBWDataXferLength);						massStat = S_NULL;						break;		case UFI_MODE_SENSE_10:		case UFI_MODE_SENSE_6:			HW_SendPKT(epin, "\x00\x2a\x00\x00\x00\x00\x00\x00\x01\x0a\x00\x01", 12);						//csw.dCSWTag = cbw.dCBWTag;			//csw.dCSWDataResidue = 0;			//csw.bCSWStatus = CSWSTATUS_GOOD;	/* failed ? */                        massStat = S_NULL;						break;		default:			massStat = S_CSW;			break;		}		break;	case S_DATA_OUT:		if (!hwTxFifoCount()) {			if (!nr_sectors) {				massStat = S_CSW;				break;			}			if (nr_sectors > 8) {				massDevRead(cbw.bCBWLUN,massBuf, start_sector, 8);				HW_SendPKT(epin, massBuf, 8*512);				start_sector += 8;				nr_sectors -= 8;			} else {				massDevRead(cbw.bCBWLUN,massBuf, start_sector, nr_sectors);				HW_SendPKT(epin, massBuf, nr_sectors * 512);				start_sector += nr_sectors;				nr_sectors = 0;			}			return;		}		break;	case S_DATA_IN:		tmp = hwRxFifoCount();		if ((nr_sectors >= 8) && (tmp >= 4096)) {			HW_GetPKT(epout, massBuf, 4096);			massDevWrite(cbw.bCBWLUN,massBuf, start_sector, 8);			start_sector += 8;			nr_sectors -= 8;		} else if ((tmp == nr_sectors * 512) && (nr_sectors < 8)) {			HW_GetPKT(epout, massBuf, tmp);			massDevWrite(cbw.bCBWLUN,massBuf, start_sector, nr_sectors);			start_sector += nr_sectors;			nr_sectors = 0;		}		if (nr_sectors == 0)			massStat = S_CSW;		break;	case S_CSW:		if (hwTxFifoCount())			return;		massStat = S_CBW;		break;	case S_NULL:		if (!hwTxFifoCount())		{			//csw.dCSWTag = CSWSTATUS_FAILED;			//csw.dCSWDataResidue = cbw.dCBWDataXferLength;			//csw.bCSWStatus = 0;	/* failed ? */			massStat = S_CSW;		}				break;	}	if (massStat == S_CSW)	{		//printf("HW_SendPK %d  ep %d\r\n",cbw.CBWCB[0],epin);		HW_SendPKT(epin, &csw, sizeof(CSW));			}	return 0;}void mass_storage_assignep(u32 out, u32 out_size, u32 in, u32 in_size){	epout = out;	epin = in;	confDesc.endpoint_descriptor[0].bEndpointAddress = (1<<7) | epin;	confDesc.endpoint_descriptor[0].wMaxPacketSize = in_size;	confDesc.endpoint_descriptor[1].bEndpointAddress = (0<<7) | epout;	confDesc.endpoint_descriptor[1].wMaxPacketSize = out_size;}void init_mass_storage(u16 out_size,u16 in_size){	massDevInit();	massReset();	mass_storage_assignep(1, out_size, 1, in_size);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
福利一区在线观看| 精品剧情v国产在线观看在线| 91精品国产综合久久香蕉的特点| 久久免费电影网| 香蕉成人伊视频在线观看| 丰满少妇在线播放bd日韩电影| 日本韩国精品在线| 国产女主播一区| 国产一区二区三区黄视频| 欧美一卡2卡3卡4卡| 亚洲不卡在线观看| 欧美日韩精品二区第二页| 一区二区三区丝袜| 日本精品一区二区三区高清| 成人免费在线播放视频| 91麻豆自制传媒国产之光| 国产精品免费久久久久| 99re成人精品视频| 亚洲激情自拍视频| 欧美日韩三级视频| 亚洲va欧美va人人爽午夜| 欧美一级二级三级乱码| 美日韩一区二区| 欧美激情中文字幕一区二区| proumb性欧美在线观看| 一区二区三区欧美日韩| 欧美精品久久一区二区三区 | eeuss鲁片一区二区三区| 国产精品久久午夜| 色视频成人在线观看免| 日本大胆欧美人术艺术动态| 欧美成va人片在线观看| av在线不卡网| 日韩av午夜在线观看| 综合激情成人伊人| 欧美一区二区视频在线观看2020| 丁香婷婷综合网| 奇米影视在线99精品| 国产精品久久久久久一区二区三区 | 亚洲欧美日韩国产综合| 91精选在线观看| 国产成人精品免费视频网站| 自拍偷拍国产亚洲| 久久蜜臀精品av| 欧美日韩免费观看一区二区三区| 另类小说色综合网站| 亚洲欧美一区二区三区国产精品 | 国产电影精品久久禁18| 亚洲香肠在线观看| 亚洲欧洲av在线| 欧美精品一区二区三区在线| 欧美视频精品在线| 成人黄色在线看| www.亚洲免费av| a级精品国产片在线观看| 成人免费视频一区| 欧美伦理电影网| 亚洲欧美偷拍三级| 国产精品国产三级国产aⅴ无密码| 日韩精品在线一区| 欧美白人最猛性xxxxx69交| 精品视频在线看| 在线播放亚洲一区| 欧美电影影音先锋| 日韩三级免费观看| 日韩色视频在线观看| 欧美一级日韩一级| 欧美大片国产精品| 亚洲婷婷国产精品电影人久久| 日韩理论片在线| 日韩电影网1区2区| 喷白浆一区二区| 国产福利不卡视频| 色哟哟精品一区| 日韩一区二区三区在线| 久久综合色婷婷| 亚洲视频1区2区| 免费av网站大全久久| 国产精品18久久久久久久网站| 不卡一卡二卡三乱码免费网站 | 久久久精品影视| 亚洲影视在线播放| 国内偷窥港台综合视频在线播放| 国产·精品毛片| 欧美欧美欧美欧美| 中文字幕在线一区免费| 天天综合日日夜夜精品| 成人爱爱电影网址| 精品精品国产高清a毛片牛牛| 国产精品欧美久久久久无广告 | 日韩精品一区二区三区老鸭窝| 中文字幕一区二区三中文字幕| 天天影视网天天综合色在线播放 | 国产精品久久久久桃色tv| 男女男精品视频网| 欧美日韩极品在线观看一区| 国产亚洲欧美日韩在线一区| 青青草精品视频| 欧美久久久久久蜜桃| 怡红院av一区二区三区| 福利一区福利二区| 国产清纯白嫩初高生在线观看91| 日本中文字幕不卡| 欧美大度的电影原声| 美女网站色91| 精品久久久久久亚洲综合网 | 天堂资源在线中文精品| 日本精品免费观看高清观看| 亚洲欧美偷拍三级| 日本精品一级二级| 亚洲国产另类av| 欧美日韩在线播放三区| 亚洲成人av电影| 日韩一区二区三区免费看| 久久99久久久欧美国产| 国产亚洲精品中文字幕| 成人动漫精品一区二区| 亚洲精品ww久久久久久p站| 在线观看一区二区视频| 免费精品视频在线| 国产精品麻豆网站| 正在播放一区二区| 国产馆精品极品| 亚洲电影在线播放| 久久精品欧美日韩| 欧美精选在线播放| 成人免费看片app下载| 亚洲线精品一区二区三区八戒| 3d动漫精品啪啪1区2区免费| 国产福利一区二区三区在线视频| 国产精品福利一区二区| 日韩一区二区三区三四区视频在线观看 | 国内精品第一页| 亚洲视频免费观看| 精品国产乱码久久久久久1区2区 | 97久久精品人人做人人爽50路| 午夜精品视频一区| 国产精品卡一卡二| 亚洲成人tv网| 久久久亚洲综合| 91精品国产品国语在线不卡| 91在线观看一区二区| 久久91精品国产91久久小草| 亚洲综合自拍偷拍| 国产精品天干天干在观线| 久久理论电影网| 日韩免费福利电影在线观看| 欧洲一区在线电影| 91丨九色丨尤物| 91色porny在线视频| 99久久伊人网影院| 成人激情免费网站| 99精品视频在线观看免费| 丁香啪啪综合成人亚洲小说| 国内精品写真在线观看| 免费观看91视频大全| 免费观看成人av| 日韩影院在线观看| 久久精品99国产精品| 精品在线播放午夜| 国产一区二区三区av电影 | 亚洲成人av中文| 亚洲不卡av一区二区三区| 婷婷久久综合九色综合绿巨人| 午夜视频一区二区| 久久99蜜桃精品| 成人福利视频网站| 欧美肥大bbwbbw高潮| 日韩免费观看高清完整版| 国产日韩欧美一区二区三区综合 | 欧美日韩综合不卡| 日韩女同互慰一区二区| 中国av一区二区三区| 亚洲国产一区视频| 国产酒店精品激情| 欧美三电影在线| 欧美激情综合五月色丁香小说| 夜夜夜精品看看| 国产精品一区二区久激情瑜伽 | 亚洲国产精品99久久久久久久久 | 国产乱码一区二区三区| 91理论电影在线观看| 日韩欧美一区二区免费| 中文字幕亚洲不卡| 国产在线精品一区二区三区不卡| 99久久er热在这里只有精品66| 欧美三区在线视频| 国产精品国产自产拍在线| 麻豆成人综合网| 欧美午夜影院一区| 国产精品对白交换视频| 国产一区二区看久久| 日韩一区二区三区电影在线观看| 亚洲欧美日韩国产手机在线| 国产做a爰片久久毛片| 日韩丝袜情趣美女图片| 午夜精品福利一区二区三区蜜桃| 99综合影院在线| 亚洲精品亚洲人成人网在线播放| 91热门视频在线观看|