ide_test.c.bak

来自「源程序是在VisualDSP环境下开发出来的」· BAK 代码 · 共 1,201 行 · 第 1/3 页

BAK
1,201
字号
	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 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(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;
  	}
  }
  printf("\n\n");
  
  return 1;
}

//copy file (include the DFB and the data of the file)
unsigned char CopyFile()
{
  unsigned int i=0, j=0;
  unsigned int srcgroup = 0, dstgroup = 0;
  groupnum = 0;
 
  OperatorFile = myfile;
  ViewFile();
  
  //copy the DFB of the file
  mycopyfile = myfile;
  mycopyfile.FileName[0] = 'C';
  mycopyfile.FileName[1] = 'O';
  mycopyfile.FileName[2] = 'P';
  mycopyfile.FileName[3] = 'Y';
  mycopyfile.FileName[4] = 'F';
  mycopyfile.FileName[5] = 'I';
  mycopyfile.FileName[6] = 'L';
  mycopyfile.FileName[7] = 'E';
  mycopyfile.LastTime = (COPYHOUR << 11) | (COPYMINUTE << 5) | (COPYSECOND / 2);
  mycopyfile.LastDate = ((COPYYEAR-1980) << 9) | (COPYMONTH << 5) | COPYDAY;
  
  OperatorFile = mycopyfile;
  ViewFile();
  
  //copy the data of the file  
  srcgroup = myfile.BeginGroup;
  dstgroup = newgrp()/*NxtFreeGrp*/;//find the first new unused cluster
  mycopyfile.BeginGroup = dstgroup;
  if(dstgroup == 0)
  {
  	printf("\n\r Can not find free space!");
  	return 0;  	
  }
  
  while(1)
  {
  	  printf("\n\r srcgroup=%d,  dstgroup=%d",srcgroup,dstgroup);
	  //copy cluster
	  CopyGroup(srcgroup, dstgroup);
	  
	  //wait for the next source cluster
	  i = srcgroup / 128;
	  j = srcgroup - 128 * i;
	  
	  atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
	  srcgroup = uRcvBuffer[4*j+0] | (uRcvBuffer[4*j+1]<<8) |  
		        (uRcvBuffer[4*j+2]<<16) | (uRcvBuffer[4*j+3]<<24);
	  
	  //source cluster to the end
	  if(srcgroup == 0x0fffffff)
	  {
	  	//modify destination cluster
	  	i = dstgroup / 128;
		j = dstgroup - 128 * i;
	  	atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
	    uRcvBuffer[4*j+0] = 0xFF;
	    uRcvBuffer[4*j+1] = 0xFF;
	    uRcvBuffer[4*j+2] = 0xFF;
	    uRcvBuffer[4*j+3] = 0x0F;
	    atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
/*	     //translate uRcvBuffer[256] to uRcvBuffer[512]
    		for (i = 0; i < 256; i++)
    		{
    			temp[2*i] = uRcvBuffer[i] & 0x000000FF;
    			temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
    		}
   			for (i = 0;i < 512; i++)
    			uRcvBuffer[i]=temp[i];*/
    			
	  	//write file register item
	  	if(!WriteDFT())
	  	{
	  		printf("\n\r ERROR: Write DFT failed!");
	  		return 0;
	  	}
	  	return 1;
	  }
	  
	  //modify destination cluster to the previous destination cluster
	  i = dstgroup / 128;
	  j = dstgroup - 128 * i;
	  
	  //first write something,prevent find new cluster is this cluster again
	  atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
	  uRcvBuffer[4*j+0] = 0x55;
	  atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
/*	   //translate uRcvBuffer[256] to uRcvBuffer[512]
    		for (i = 0; i < 256; i++)
    		{
    			temp[2*i] = uRcvBuffer[i] & 0x000000FF;
    			temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
    		}
   			for (i = 0;i < 512; i++)
    			uRcvBuffer[i]=temp[i];*/
    			
	  //next new cluster,content is the content of the next object cluster
	  dstgroup = newgrp();
	  if(dstgroup == 0)
	  {
	  	printf("\n\r Can not find free space!");
	  	return 0;  	
	  }
	  
	  atadev_get_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
	  uRcvBuffer[4*j+0] = dstgroup;
	  uRcvBuffer[4*j+1] = dstgroup >> 8;
	  uRcvBuffer[4*j+2] = dstgroup >> 16;
	  uRcvBuffer[4*j+3] = dstgroup >> 24;
	  atadev_put_block(CPartition.FAT1BeginSector + i, 1, uRcvBuffer);
/*	   //translate uRcvBuffer[256] to uRcvBuffer[512]
    		for (i = 0; i < 256; i++)
    		{
    			temp[2*i] = uRcvBuffer[i] & 0x000000FF;
    			temp[2*i+1] = (uRcvBuffer[i] & 0x0000FF00) >> 8;
    		}
   			for (i = 0;i < 512; i++)
    			uRcvBuffer[i]=temp[i];*/
  }
}

//copy cluster
unsigned char CopyGroup(unsigned int srcgroup, unsigned int dstgroup)
{
  unsigned int i=0,j=0, srcsector=0, dstsector=0;
  unsigned char flag=0;

  for(i=0; i<CPartition.bpb.SectorPerGroup; i++)
  {
  	srcsector = i + (srcgroup-2)*CPartition.bpb.SectorPerGroup + 

⌨️ 快捷键说明

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