📄 nandflash.c
字号:
{
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 + -