⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bulk_only.c

📁 用89C51SND1C实现的USB存储器的代码,包括USB通信和FLASH的读写操作.
💻 C
字号:
/****************************************************************/
/*					UP-MP3DIY100								*/
/*		Beijing Universal Pioneering Technology Co., LTD		*/
/*		CopyRighted,All right Reserved	www.up-tech.com			*/
/*						July,2003								*/
/*				010-62387873  62381842							*/
/****************************************************************/

//this file to process the request about bulk_only
#include <string.h>

#include "bulk_only.h"


#include "uart.h"


//extern unsigned char  EpBuf[];

long unsigned int dDataResiduce=0;
unsigned char bulk_state=0;		//当前传送状态
unsigned char *pCurrentBuf;		//数据传送指针
long int nBufCount=0;		//传送数据当前位置


unsigned char MSC_dCBWSignature[]={0x55,0x53,0x42,0x43};
unsigned char MSC_dCSWSignature[]={0x55,0x53,0x42,0x53};

#define Format_Unit 				0x04
#define Inquiry 					0x12 
#define Mode_Select 				0x55 
#define Mode_Sense 				0x1A 
#define Medium_Removal			0x1E
#define Read10 					0x28 
#define Read12 					0xA8 
#define Read_Capacity 			0x25 
#define Read_Format_Capacities 	0x23 
#define Request_Sense			0x03 
#define Rezero 					0x01 
#define Seek10 					0x2B 
#define Send_Diag 				0x1D 
#define Start_Stop_Unit 			0x1B 
#define Test_Unit_Ready 			0x00 
#define Verify 					0x2F 
#define Write10 					0x2A 
#define Write12 					0xAA 
#define Write_And_Verify 			0x2E 




#define SCSI_MSPGCD_TPP		0x1c
#define SCSI_MSPGCD_RETALL		0x3f

unsigned char Bulk_Out_Buf[64];
unsigned char Page_Buf[512];


short int Transfer_Length;
long int Logical_Block_Address;
long int nCurrentPage,nBeginPage;
long int nCurrentBlock;
code unsigned char B_InquiryData[]={
							0x00,	//Direct Access Device
							0x80,	//RMB
							0x00,	//ISO/ECMA/ANSI
							0x01,	//Response Data Format
							0x1f,	//Additional Length
							0x00,	//Reserved
							0x00,	//Reserved
							0x00,	//Reserved
							'U','P','-','T','E','C','H',' ',	//Vendor Information
							'M','P','3',' ','P','l','a','y','e','r',' ','V','1','.','0','0',//Product Identification
							0,1,0,0};	//Product Revision Level n.nn

code unsigned char CapactiyLstHd[]={0x00,0x00,0x00,0x10};
code unsigned char bBlockLength[]={0x00,0x02,0x00};		//512 Byte
code unsigned char nLastLBAddr[]={0x00,0x01,0xf3,0xff};	//Last  Logical Block Address for 64MB
code unsigned char B_Read_Format_capacities[]={0x00,0x00,0x00,0x10,	//capacity list header
									0x00,0x00,0x04,0x00,	0x01,		0x00,0x02,0x00,	//capacity descriptor
								//	Number of Blocks =1024,unformatted media,blocklength = 512Bytes
									0x00,0x00,0x04,0x00,	0x00,		0x00,0x02,0x00	//Formattable Capacity Descriptors
									};

code unsigned char B_Read_Capacity[]={
								0x00,0x01,0xf30,0xff,	//Last  Logical Block Address for 64MB
								0x00,0x00,0x02,0x00	//block length in bytes
								};

								/*
code unsigned char B_Mode_Sense_ALL[]={0x00,0x3e,//Mode Data Length
							0x00,	//Medium Type Code
							0,//write enabled
							0,0,0,0,//reserved
							//Read-Write Eroor Recovery Page
							0x01,	//Page Code of Read-Write Error Recovery Page
							0x0a,	//Page Length
							0,		//Error Recovery Parameters
							3,		//Read Retry Count
							0,0,0,0,
							3,		//Write Retry Count
							0,0,0,
							//Flexible Disk Page
							0x05,	//Page Code of Flexible Disk Page
							0x1e,	//Page Length
							0x13,0x88,	//Transfer Rate = 512kbps
							0,	//Number of Heads磁头数
							0,	//Sectors per Track每磁道扇区数
							0x02,0x00,	//Data bytes per Sector每扇区字节数
							0x00,0x00,	//Number of Cuylinders柱面数
							0,0,0,0,0,0,0,0,0,//Reserved 保留
							1,		//motor On Delay
							0xff,	//motor Off Delay=Never
							0,0,0,0,0,0,0,//Reserved 保留
							0x00,0x00,	//Medium Rotation Rate介质旋转速率=300rpm
							0,0,	//Reserved 保留
							//Removable Block Access Capabilities Page
							0x1b,	//Page Code
							0x0a,	//Page Length
							0,//0x80,	//SFLP=1
							0x01,	//TLUN=1
							0,0,0,0,0,0,0,0//Reserved 保留
							};
*/

code unsigned char B_Mode_Sense_ALL[]={0x0b,0x00,//Mode Data Length
							0x00,0x08,0x00,0x00,
							0x7d,0,0,0,0x02,0x00
							};
/*
code unsigned char B_Mode_Sense_TPP[]={0x00,0x0d,//Mode Data Length
							0x00,	//Medium Type Code
							0,//write enabled
							0,0,0,0,//reserved
							0x1c,0x06,0,0x05,0,0,0,0
							};
*/
code unsigned char B_Mode_Sense_TPP[]={0xf0,0x00,//Mode Data Length
							05,00,00,00,00,0x0b,00,00,00,00,0x24,00,00,00,00,00
							};
code unsigned char B_Mode_Sense_ZERO[]={0x00,0x06,//Mode Data Length
							0x00,	//Medium Type Code
							0,//write enabled
							0,0,0,0//reserved
};
unsigned char bulk_CSW[]={0x55,0x53,0x42,0x53,	// bytes 4 dCSWSignature
					0x00,0x00,0x00,0x00,	//bytes 4  dCSWTag
					0,0,0,0,		//bytes 4 dDataResiduce
					0x00};			//bCSWStatus  00=good state.
					

typedef struct _STRUCT_CBW
{
	unsigned char dCBWSignature[4];
	unsigned char dCBWTag[4];	//dCBWTag of CBW
	long unsigned int dCBWDataTransferLength;//dCBWDataTransferLength of CBW
	unsigned char bmCBWFlags;
	unsigned char bCBWLUN;
	unsigned char bCBWCBLength;
	unsigned char CBWCB[12];//for UFI Command all have 12bit
} struct_CBW;

struct_CBW bulk_CBW;

void InterpretCBW()
{
	int i;
	printu("InterpretCBW\n");
	
	bulk_CSW[4]				=	Bulk_Out_Buf[4];
	bulk_CSW[5]				=	Bulk_Out_Buf[5];
	bulk_CSW[6]				=	Bulk_Out_Buf[6];
	bulk_CSW[7]				=	Bulk_Out_Buf[7];
	
//	for(i=0;i<4;i++) bulk_CBW.dCBWDataTransferLength = (bulk_CBW.dCBWDataTransferLength<<8) +*(EpBuf+11-i);
//	bulk_CBW.bmCBWFlags			=	*(EpBuf+12);
//	bulk_CBW.bCBWLUN				=	*(EpBuf+13)&0x0f;
//	bulk_CBW.bCBWCBLength			=	*(EpBuf+14)&0x1f;

	for(i=0;i<12;i++)
	bulk_CBW.CBWCB	[i]				=	Bulk_Out_Buf[i+15];
//	printu("\n\nSCSI:");
//	for(j=0;j<12;j++) {printuf("%x ",bulk_CBW.CBWCB[j]);}

	switch(bulk_CBW.CBWCB[0]){
//		case 0x04						:SCSI_Reserved();break;
		case Inquiry					:SCSI_Inquiry();break;
//		case 0x55						:SCSI_Reserved();break;
		case Mode_Sense					:SCSI_Mode_Sense();break;
		case Read10						:SCSI_Read10();break;
//		case 0xA8						:SCSI_Reserved();break;
		case Read_Capacity				:SCSI_Read_Capacity();break;
		case Read_Format_Capacities		:SCSI_Read_Format_Capacities();break;
//		case 0x03						:SCSI_Reserved();break;
//		case 0x01						:SCSI_Reserved();break;
//		case 0x2B						:SCSI_Reserved();break;
//		case 0x1D						:SCSI_Reserved();break;
//		case 0x1B						:SCSI_Reserved();break;
		case Test_Unit_Ready			:SCSI_Test_Unit_Ready();break;
		case Verify						:SCSI_Verify();break;
		case Write10					:SCSI_Write10();break;
//		case 0xAA						:SCSI_Reserved();break;
//		case 0x2E						:SCSI_Reserved();break;
		case Medium_Removal				:SCSI_Medium_Removal();break;
		default							:SCSI_Reserved();break;
	}
		
}

void SCSI_Inquiry()
{
	printu("SCSI_Inquiry\n");

}


void SCSI_Read_Format_Capacities()
{
	printu("SCSI_Read_Format_Capacities\n");
}


void SCSI_Read_Capacity()
{
	printu("SCSI_Read_Format_Capacities\n");

}

void SCSI_Read10()
{
	printu("SCSI_Read10\n");

}

void TransDataGoOn()
{
	printu("TransDataGoOn\n");

}

void SCSI_Write10()
{
	printu("SCSI_Write10\n");
}

	
void RecieveData()
{
	printu("RecieveData\n");

}

void SCSI_Mode_Sense()
{
	printu("SCSI_Mode_Sense\n");

}

void SCSI_Medium_Removal()
{
	printu("SCSI_Medium_Removal\n");
}

void SCSI_Test_Unit_Ready()
{
	printu("SCSI_Test_Unit_Ready\n");
}


void TransmitCSW()
{
	printu("TransmitCSW\n");

}



void TransRequestGoOn()
{
	printu("TransRequestGoOn\n");

}






void SCSI_Reserved()
{
	printuf("\nUFI Function 0x%x doesn't Defined!",bulk_CBW.CBWCB[0]);
	
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -