📄 ide_test.c
字号:
errcount = 0;
//translate buffer[512] to buffer[256]
for (i = 0; i < 512; i++)
{
temp[i/2] = buffer[i] | buffer[i+1] << 8;
i++;
}
for (i = 0;i < 256; i++)
buffer[i]=temp[i];
while (error)
{
if(!Check_NoRequest())
return 0;
DEV_HEAD = DEV_HEAD & 0xEF;
for(i=0;i<10;i++);
if(!Check_NoRequest())
return 0;
SECTOR_COUNT = sector_count;
SECTOR_NUMBER = (unsigned char) (lba & 0xFF);
CYLINDER_LOW = (unsigned char) ((lba >> 8) & 0xFF);
CYLINDER_HIGH = (unsigned char) ((lba >> 16) & 0xFF);
DEV_HEAD = ((unsigned char) ((lba >> 24) & 0xF)) | LBAMODE;
for(i=0;i<10;i++);
if(!Check_DateReady())
return 0;
COMMAND = WRITE_MULTIPLE;
for(i=0;i<10000000;i++);
if(!Check_HaveRequest())
return 0;
for (i = 0; i < 256; i++)
DATA = ((unsigned short *)buffer)[i];
for(i=0;i<10;i++);
if(!Check_NoRequest())
return 0;
if (status & ERRBIT)
{
error = ERRORREG;
errcount++;
}
else
error = 0;
if (errcount > 10)
break;
}
if(error)
return 0;
else
return 1;
}
//read Hard disk quickly
unsigned char atadev_get_block_quick(unsigned int lba, unsigned char sector_count, unsigned char* buffer)
{
unsigned char error = 1;
unsigned int i = 0;
errcount = 0;
while (error)
{
if(!Check_NoRequest())
return 0;
DEV_HEAD = DEV_HEAD & 0xEF;
for(i=0;i<10;i++);
if(!Check_NoRequest())
return 0;
SECTOR_COUNT = sector_count;
SECTOR_NUMBER = (unsigned char) (lba & 0xFF);
CYLINDER_LOW = (unsigned char) ((lba >> 8) & 0xFF);
CYLINDER_HIGH = (unsigned char) ((lba >> 16) & 0xFF);
DEV_HEAD = ((unsigned char) ((lba >> 24) & 0xF)) | LBAMODE;
for(i=0;i<10;i++);
if(!Check_DateReady())
return 0;
COMMAND = READ_MULTIPLE;
for(i=0;i<10;i++);
if(!Check_HaveRequest())
return 0;
for (i = 0; i < 256; i++)
{
((unsigned short *)buffer)[i] = DATA;
}
for(i=0;i<10;i++);
//translate buffer[256] to buffer[512]
for (i = 0; i < 256; i++)
{
temp[2*i] = buffer[i] & 0x000000FF;
temp[2*i+1] = (buffer[i] & 0x0000FF00) >> 8;
}
for (i = 0;i < 512; i++)
buffer[i]=temp[i];
if(!Check_NoRequest())
return 0;
if (status & ERRBIT)
{
error = ERRORREG;
errcount++;
}
else
error = 0;
if (errcount > 10)
break;
}
if(error)
return 0;
else
return 1;
}
//write Hard disk quickly
unsigned char atadev_put_block_quick(unsigned int lba, unsigned char sector_count, unsigned char* buffer)
{
unsigned char error = 1;
unsigned int i = 0;
errcount = 0;
//translate buffer[512] to buffer[256]
for (i = 0; i < 512; i++)
{
temp[i/2] = buffer[i] | buffer[i+1] << 8;
i++;
}
for (i = 0;i < 256; i++)
buffer[i]=temp[i];
while (error)
{
if(!Check_NoRequest())
return 0;
DEV_HEAD = DEV_HEAD & 0xEF;
for(i=0;i<10;i++);
if(!Check_NoRequest())
return 0;
SECTOR_COUNT = sector_count;
SECTOR_NUMBER = (unsigned char) (lba & 0xFF);
CYLINDER_LOW = (unsigned char) ((lba >> 8) & 0xFF);
CYLINDER_HIGH = (unsigned char) ((lba >> 16) & 0xFF);
DEV_HEAD = ((unsigned char) ((lba >> 24) & 0xF)) | LBAMODE;
for(i=0;i<10;i++);
if(!Check_DateReady())
return 0;
COMMAND = WRITE_MULTIPLE;
for(i=0;i<10;i++);
if(!Check_HaveRequest())
return 0;
for (i = 0; i < 256; i++)
DATA = ((unsigned short *)buffer)[i];
for(i=0;i<10;i++);
if(!Check_NoRequest())
return 0;
if (status & ERRBIT)
{
error = ERRORREG;
errcount++;
}
else
error = 0;
if (errcount > 10)
break;
}
if(error)
return 0;
else
return 1;
}
/************** read and write Hard disk card program end *************/
/**************************** FAT32 start ****************************/
//read MBR table
unsigned char InitMBR()
{
atadev_get_block(0, 1, uRcvBuffer);//read MBR boot sector(0 sector)
if(!((uRcvBuffer[510] == 0x55) && (uRcvBuffer[511] == 0xAA))) return 0;
MBRTable.BootId = uRcvBuffer[0x1be];
MBRTable.PartitionType = uRcvBuffer[0x1c2];
MBRTable.PartitionFirstSector = uRcvBuffer[0x1c6] | (uRcvBuffer[0x1c7]<<8) |
(uRcvBuffer[0x1c8]<<16) | (uRcvBuffer[0x1c9] <<24);
MBRTable.PartitionSectorNum = uRcvBuffer[0x1ca] | (uRcvBuffer[0x1cb]<<8) |
(uRcvBuffer[0x1cc]<<16) | (uRcvBuffer[0x1cd] <<24);
return 1;
}
//read FAT32 logic hard disk configuration
unsigned char InitCPartition()
{
unsigned int i = 0,k=0;
atadev_get_block(MBRTable.PartitionFirstSector, 1, uRcvBuffer);//read BPB
if(!((uRcvBuffer[510] == 0x55) && (uRcvBuffer[511] == 0xAA))) return 0;
//count of bytes per sector
CPartition.bpb.BytePerSector = uRcvBuffer[0xb] | (uRcvBuffer[0xc]<<8);
if(CPartition.bpb.BytePerSector != 512)
{
printf("\n ERROR: Byte per sector is not 512!");
return 0;
}
//number of sectors per cluster
CPartition.bpb.SectorPerGroup = uRcvBuffer[0xd];
//number of reserved sectors in the reserved region of the volume starting at the first sector of the volume
CPartition.bpb.SectorReserved = uRcvBuffer[0xe] | (uRcvBuffer[0xf]<<8);
//count of FAT data structures on the volume
CPartition.bpb.FATNum = uRcvBuffer[0x10];
if(CPartition.bpb.FATNum != 2)
{
printf("\n ERROR: FATNum is not 2!");
return 0;
}
//sectors per track
CPartition.bpb.SectorPerHead = uRcvBuffer[0x18] | (uRcvBuffer[0x19]<<8);
if(CPartition.bpb.SectorPerHead != 63)
{
printf("\n ERROR: SectorPerHead is not 63!");
return 0;
}
//number of heads
CPartition.bpb.HeadNum = uRcvBuffer[0x1a] | (uRcvBuffer[0x1b]<<8);
if(CPartition.bpb.HeadNum != 255)
{
printf("\n ERROR: HeadNum is not 255!");
return 0;
}
//count of hidden sectors prededing the partition that contains this FAT volume
CPartition.bpb.SectorHide = uRcvBuffer[0x1c] | (uRcvBuffer[0x1d]<<8) |
(uRcvBuffer[0x1e]<<16) | (uRcvBuffer[0x1f] <<24);
if(CPartition.bpb.SectorHide != 63)
{
printf("\n ERROR: SectorHide is not 63!");
return 0;
}
//total count of sectors on the volume
CPartition.bpb.LogicTotalSector = uRcvBuffer[0x20] | (uRcvBuffer[0x21]<<8) |
(uRcvBuffer[0x22]<<16) | (uRcvBuffer[0x23] <<24);
//count of sectors occupied by one FAT
CPartition.bpb.SectorPerFAT = uRcvBuffer[0x24] | (uRcvBuffer[0x25]<<8) |
(uRcvBuffer[0x26]<<16) | (uRcvBuffer[0x27] <<24);
//first cluster number of the root directory
CPartition.bpb.BeginGroup = uRcvBuffer[0x2c] | (uRcvBuffer[0x2d]<<8) |
(uRcvBuffer[0x2e]<<16) | (uRcvBuffer[0x2f] <<24);
//the cluster number at which the drive should start looking for free cluster
CPartition.bpb.FSInfo = uRcvBuffer[0x30] | (uRcvBuffer[0x31]<<8);
atadev_get_block(MBRTable.PartitionFirstSector + CPartition.bpb.FSInfo, 1, uRcvBuffer1);//read BPB
if(!((uRcvBuffer1[0] == 0x52) & (uRcvBuffer1[1] == 0x52) & (uRcvBuffer1[2] == 0x61) & (uRcvBuffer1[3] == 0x41)))
{
printf("Load FSInfo error!");
return 0;
}
NxtFreeGrp = uRcvBuffer1[0x1ec] | (uRcvBuffer1[0x1ed]<<8) |
(uRcvBuffer1[0x1ee]<<16) |(uRcvBuffer1[0x1ef]<<24);
//count of sectors per boot record
CPartition.bpb.SectorPerBOOT = uRcvBuffer[0x32];
if(CPartition.bpb.SectorPerBOOT != 6)
{
printf("\n ERROR: SectorPerBOOT is not 6!");
return 0;
}
printf("\n\r SectorPerGroup = %d", CPartition.bpb.SectorPerGroup);
printf("\n\r SectorReserved = %d", CPartition.bpb.SectorReserved);
printf("\n\r SectorPerFAT = %d", CPartition.bpb.SectorPerFAT);
printf("\n\r LogicTotalSector = %d", CPartition.bpb.LogicTotalSector);
printf("\n\r BeginGroup = %d", CPartition.bpb.BeginGroup);
CPartition.FAT1BeginSector = MBRTable.PartitionFirstSector +
CPartition.bpb.SectorReserved;
CPartition.DATABeginSector = CPartition.FAT1BeginSector +
CPartition.bpb.FATNum * CPartition.bpb.SectorPerFAT;
atadev_get_block(CPartition.FAT1BeginSector, 1, uRcvBuffer);
if(!((uRcvBuffer[0] == 0xf8) && (uRcvBuffer[1] == 0xff)))
{
printf("\n\r Read FAT1 error");
return 0;
}
atadev_get_block(CPartition.FAT1BeginSector+CPartition.bpb.SectorPerFAT,
1, uRcvBuffer);
if(!((uRcvBuffer[0] == 0xf8) && (uRcvBuffer[1] == 0xff)))
{
printf("\n\r Read FAT2 error");
return 0;
}
return 1;
}
/**************************** FAT32 end ****************************/
/******************* user-defined functions start ******************/
//initialize file
void InitFile(unsigned char fileindex)
{
unsigned char j=0;
unsigned char i=fileindex;
for(j=0; j<8; j++)
OperatorFile.FileName[j] = uRcvBuffer[32*i+j];
for(j=0; j<3; j++)
OperatorFile.FileExt[j] = uRcvBuffer[32*i+j+8];
OperatorFile.Attrib = uRcvBuffer[32*i+0x0b];
OperatorFile.LastTime = uRcvBuffer[32*i+0x16] |
(uRcvBuffer[32*i+0x17]<<8);
OperatorFile.LastDate = uRcvBuffer[32*i+0x18] |
(uRcvBuffer[32*i+0x19]<<8);
OperatorFile.BeginGroup = uRcvBuffer[32*i+0x1a] |
(uRcvBuffer[32*i+0x1b]<<8);
OperatorFile.FileLength = uRcvBuffer[32*i+0x1c] |
(uRcvBuffer[32*i+0x1d]<<8) |
(uRcvBuffer[32*i+0x1e]<<16) |
(uRcvBuffer[32*i+0x1f]<<24);
}
//view DFB of the file,not the data(in the data section) of the file
void ViewFile()
{
unsigned char j=0;
unsigned int YEAR,MONTH,DAY,HOUR,MINUTE,SECOND;
printf("\n\r Filename: ");
for(j=0; j<8; j++)
printf("%c", OperatorFile.FileName[j]);
printf("\r Extname: ");
for(j=0; j<3; j++)
printf("%c", OperatorFile.FileExt[j]);
printf("\r Attrib: %d", OperatorFile.Attrib);
HOUR = (OperatorFile.LastTime & 0XF800) >> 11;
MINUTE = (OperatorFile.LastTime &0X07E0) >> 5;
SECOND = (OperatorFile.LastTime & 0X001F) * 2;
printf("\r LastTime: %d"" : ""%d"" : ""%d", HOUR,MINUTE,SECOND);
YEAR = ((OperatorFile.LastDate & 0XFE00) >> 9) + 1980;
MONTH = (OperatorFile.LastDate & 0X01E0) >> 5;
DAY = OperatorFile.LastDate & 0X001F;
printf("\r LastDate: %d"" / ""%d"" / ""%d", MONTH,DAY,YEAR);
printf("\r BeginGroup: %d", OperatorFile.BeginGroup);
printf("\r FileLength: %d", OperatorFile.FileLength);
}
//list all files which in the Hard disk
unsigned char ListFile()
{
unsigned int i=0, j=0,k=0;
printf("\n\r Listing the files in the Hard disk:");
//read the foremost 2 clusters of the DATA section which used for DFT
for(i=0; i<2 * CPartition.bpb.SectorPerGroup; i++)
{
//read 16 DFBs
atadev_get_block_quick(CPartition.DATABeginSector + i, 1, uRcvBuffer);
//every block has 512 bytes,every DFB of file occupies 32 bytes,so 512/32=16
for(j=0; j<16; j++)
{
InitFile(j);
if(OperatorFile.Attrib == 32)//file is archive
if(OperatorFile.FileLength > 0)
{
ViewFile();
//printf("\ri=%x,\rj=%x",i,j);
}
if(OperatorFile.BeginGroup == COPYFILE)
myfile = OperatorFile;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -