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

📄 nandflash.c

📁 一个linux下的usb接口源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		{
			ReadSector1(Tep_Buf1, front_startsector, front_sectornum);
		}
		if(back_secternum>0)
		{
			ReadSector1(Tep_Buf2, back_startsector, back_secternum);
		}
		for(i=0;i<blocknum;i++)
		{
			EraseBlock(begin_block++);
		}
		if(front_sectornum>0)
		{
			ProgramSector(Tep_Buf1, front_startsector, front_sectornum);
		}
		if(back_secternum>0)
		{
			ProgramSector(Tep_Buf2, back_startsector, back_secternum);
		}
		ProgramSector(buf, startsector, sectornum);
	}
}
/*UCHAR WriteSector1(UCHAR *buf, ULONG startsector, UWORD sectornum)
{
	int i;
	ULONG tmp = startsector & 0xFFFFFFE0;
	ULONG endsector = startsector + sectornum;
	ULONG blocknum = sectornum >> 5;
	if (startsector & 0x1F != 0)
	{
		ReadSector1(Tep_Buf1, tmp, startsector-tmp);
		blocknum++;
	}
	if (endsector & 0x1F != 0)
	{
		ReadSector1(Tep_Buf2, endsector, 32+(endsector & 0xFFFFFFE0));
		blocknum++;
	}
	
	for(i=0;i<blocknum;i++)
	{
		EraseBlock(startsector+i*32);
	}
	
	if (startsector & 0x1F != 0)
	ProgramSector(Tep_Buf1, tmp, startsector-tmp);
	
	if (endsector & 0x1F != 0)
	ProgramSector(Tep_Buf2, endsector, 32+(endsector & 0xFFFFFFE0));*/
	//ProgramSector(buf, startsector, sectornum);
	
	
	/*ULONG i, beginblock, endblock, endsector;
	endsector = startsector+sectornum-1;
	beginblock = startsector >> 5;
	endblock = endsector >> 5;
	if (endsector&0x1f != 0)
	{
		endblock++;
		ReadSector1(Tep_Buf2, endsector+1, endblock*32-endsector-1);
	}
	
	if (beginblock*32 != startsector)
	{
		ReadSector1(Tep_Buf1, beginblock*32, startsector-beginblock*32);
	}

	for(i=0;i<endblock-beginblock;i++)
	{
		EraseBlock(beginblock+i);
	}

	if (beginblock*32 != startsector)
	{
		ProgramSector(Tep_Buf1, beginblock*32, startsector-beginblock*32);
	}
	
	ProgramSector(buf, startsector, sectornum);
	
	if ((startsector+sectornum)%32 != 0)
	{
		ProgramSector(Tep_Buf2, endsector, endblock*32-endsector);
	}
	return NOERR;
}*/

UWORD Exec_ATAPI_Command1()		//Writed by zhangjj
{
	UCHAR	i;
	UWORD secnum;
	ULONG secindex;
	UCHAR opcode;
	
	opcode = TPBulk_CommandBlock_bAtapi_CommandPackage0;
	
	switch(opcode)
	{
		//ATAPI read command,read data from NANDFlash
		case ATAPI_READ10:
			secnum = TPBulk_CommandBlock_bAtapi_CommandPackage7;
			secnum <<=8;
			secnum |= TPBulk_CommandBlock_bAtapi_CommandPackage8;
			
			//Get the start sector 
			secindex = TPBulk_CommandBlock_bAtapi_CommandPackage2;
			secindex <<=8;
			secindex |= TPBulk_CommandBlock_bAtapi_CommandPackage3;
			secindex <<=8;
			secindex |= TPBulk_CommandBlock_bAtapi_CommandPackage4;
			secindex <<=8;
			secindex |= TPBulk_CommandBlock_bAtapi_CommandPackage5;
			
			ReadSector1(Buffer_Pointer, secindex, secnum);
			break;		
		//ATAPI Write command,Write data to NANDFlash
		case ATAPI_WRITE10:
			secnum = TPBulk_CommandBlock_bAtapi_CommandPackage7;
			secnum <<=8;
			secnum |= TPBulk_CommandBlock_bAtapi_CommandPackage8;
			
			//Get the start sector 
			secindex = TPBulk_CommandBlock_bAtapi_CommandPackage2;
			secindex <<=8;
			secindex |= TPBulk_CommandBlock_bAtapi_CommandPackage3;
			secindex <<=8;
			secindex |= TPBulk_CommandBlock_bAtapi_CommandPackage4;
			secindex <<=8;
			secindex |= TPBulk_CommandBlock_bAtapi_CommandPackage5;

/*			for (i=0; i<12; i++)
				printf("%02x\t", CBWBuf[15+i]);
			printf("\n");
			fflush(stdout);*/
			WriteSector1(Buffer_Pointer, secindex, secnum);
			break;
		case ATAPI_READFORMATCAPA:
			i=0;	
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x10;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0xff;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x01;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x02;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0xff;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x02;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0xd0;
			break;
		case ATAPI_RAEDCAPACITY:		//需要底层提供读NANDFlash容量的函数
			i=0;	
			Buffer_Pointer[i++] = 0x00;
			//Buffer_Pointer[i++] = 0x01;
			//Buffer_Pointer[i++] = 0x00;
			//Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0xff;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x02;
			Buffer_Pointer[i++] = 0x00;
			break;
		case ATAPI_INQUIRE:			//Command 0x12:to request the configuration of the NANDFlash
			i=0;	
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x80;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x01;
			Buffer_Pointer[i++] = 0x75;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x00;
			Buffer_Pointer[i++] = 0x20;
			Buffer_Pointer[i++] = 'E';
			Buffer_Pointer[i++] = '-';
			Buffer_Pointer[i++] = 'W';
			Buffer_Pointer[i++] = 'O';
			Buffer_Pointer[i++] = 'R';
			Buffer_Pointer[i++] = 'L';
			Buffer_Pointer[i++] = 'D';
			Buffer_Pointer[i++] = 0x20;
			Buffer_Pointer[i++] = 'N';
			Buffer_Pointer[i++] = 'A';
			Buffer_Pointer[i++] = 'N';
			Buffer_Pointer[i++] = 'D';
			Buffer_Pointer[i++] = '-';
			Buffer_Pointer[i++] = 'F';
			Buffer_Pointer[i++] = 'L';
			Buffer_Pointer[i++] = 'A';
			Buffer_Pointer[i++] = 'S';
			Buffer_Pointer[i++] = 'H';
			Buffer_Pointer[i++] = '1';
			Buffer_Pointer[i++] = '.';
			Buffer_Pointer[i++] = '0';
			Buffer_Pointer[i++] = 0x20;
			Buffer_Pointer[i++] = 0x20;
			Buffer_Pointer[i++] = 0x33;
			Buffer_Pointer[i++] = 0x31;
			Buffer_Pointer[i++] = 0x61;
			Buffer_Pointer[i++] = 0x59;
			break;
		case ATAPI_REQUESTSENSE:	//Command 0x03:allows the host to request status and sense data from the PocketZip drive.
			for( i=0; i<TPBulk_CommandBlock_bAtapi_CommandPackage4; i++ )
			{
				Buffer_Pointer[i] = 0;
			}
			Buffer_Pointer[0] = 0x70;
			break;
		case ATAPI_MODESENSE5A:
			Buffer_Pointer[0] = 0;
			Buffer_Pointer[1] = 0;
			Buffer_Pointer[2] = 0;
			Buffer_Pointer[3] = 0;
			Buffer_Pointer[4] = 0;
			Buffer_Pointer[5] = 0;
			Buffer_Pointer[6] = 0;
			Buffer_Pointer[7] = 0;
			break;
		case ATAPI_NONSENSE:	//Command 0x06:Non-sense is used to report vendor specific drive and disk data including current status and diagnostic information.
			switch(TPBulk_CommandBlock_bAtapi_CommandPackage2)
			{			//*****Allocation Length is not used
				case 0x00:	//Supported Page Codes Page (00h)
					//Non-Sense Page Header
					Buffer_Pointer[0] = 0;
					Buffer_Pointer[1] = 4;
					
					Buffer_Pointer[2] = 0x00;
					Buffer_Pointer[3] = 0x01;
					Buffer_Pointer[4] = 0x02;
					Buffer_Pointer[5] = 0x03;
					break;
				case 0x01:	//Format Data page (Page 01h)
					//Non-Sense Page Header
					Buffer_Pointer[0] = 1;
					Buffer_Pointer[1] = 0x56;

					Buffer_Pointer[2] = 0x01;
					Buffer_Pointer[3] = 0x00;
					Buffer_Pointer[4] = 0x00;
					Buffer_Pointer[5] = 0x00;
					Buffer_Pointer[6] = 0x00;
					Buffer_Pointer[7] = 0x00;
					Buffer_Pointer[8] = 0x00;
					Buffer_Pointer[9] = 0x00;	
					Buffer_Pointer[10] = 0x00;	//-
					Buffer_Pointer[11] = 0x00;	//w
					Buffer_Pointer[12] = 0x00;	//o
					Buffer_Pointer[13] = 0x00;	//r
					Buffer_Pointer[14] = 0x00;	//l
					Buffer_Pointer[15] = 0x00;	//d
					Buffer_Pointer[16] = 0x00;
					break;
				case 0x02:	//Cartridge Status page (Page 02h)
					//Non-Sense Page Header
					Buffer_Pointer[0] = 2;
					Buffer_Pointer[1] = 62;
					
					Buffer_Pointer[2] = 0x00;
					Buffer_Pointer[3] = 0x01;
					Buffer_Pointer[4] = 0x00;
					Buffer_Pointer[5] = 0x00;
					Buffer_Pointer[6] = 0x00;
					Buffer_Pointer[7] = 0x00;
					Buffer_Pointer[8] = 0x00;
					Buffer_Pointer[9] = 0x00;	
					Buffer_Pointer[10] = 0x00;	//-
					Buffer_Pointer[11] = 0x02;	//w
					Buffer_Pointer[12] = 0x00;	//o
					Buffer_Pointer[13] = 0x00;	//r
					Buffer_Pointer[14] = 0x00;	//l
					Buffer_Pointer[15] = 0x00;	//d
					Buffer_Pointer[16] = 0x00;
					Buffer_Pointer[17] = 0x00;	
					Buffer_Pointer[18] = 0x00;
					Buffer_Pointer[29] = 0x00;
					Buffer_Pointer[20] = 0x00;
					
					for( i=21; i<64; i++ )
					{
						Buffer_Pointer[i] = 0;
					}
					break;
			}
		case ATAPI_MODESELECT55:	//Command 0x15:Mode Select(0x15),specify media or device parameters
			break;		//Is not use to NANDFalsh
		case ATAPI_TESTUNIT:	//Command 0x00:Test unit Ready tests the readiness of the drive for disk access.
			for( i=0; i<TPBulk_CommandBlock_bAtapi_CommandPackage4; i++ )
			{
				Buffer_Pointer[i] = 0;
			}
			break;
		case 0x1e:	//Command 0x00:Test unit Ready tests the readiness of the drive for disk access.
			for( i=0; i<TPBulk_CommandBlock_bAtapi_CommandPackage4; i++ )
			{
				Buffer_Pointer[i] = 0;
			}
			break;
		case 0x2f:	////Command 0x2f: Verify Packet Command confirms that the drive wrote the data correctly in the requested LBAs.
			/*for (i=0; i<12; i++)
				printf("%02x\t", CBWBuf[15+i]);
			printf("\n");*/
			break;		//Is not use to NANDFalsh
	}
	return 0;
}

⌨️ 快捷键说明

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