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

📄 ide_test.c.bak

📁 源程序是在VisualDSP环境下开发出来的
💻 BAK
📖 第 1 页 / 共 3 页
字号:
//ide_test.c

//include files 
#include <stdio.h>
#include <sysreg.h>
#include <builtins.h>
#include <defTS101.h>
#include <signal.h>
#include "ide_test.h"

/*********************** may be changed by user *******************/
//define BeginGroup of the file to be created(better larger than 3)
#define NEWBEGINGRP 4

//define the length of the file to be created
#define LENGTH 32*512+4

//define source cluster of file needed to copy
#define COPYFILE 4

//define source cluster of the file to be deleted
#define DELFILE 5

//define parameters of the file to be created
#define NEWYEAR 2005
#define NEWMONTH 2
#define NEWDAY 7
#define NEWHOUR 15
#define NEWMINUTE 2
#define NEWSECOND 48    //only be even

//define parameters of the file to be copied
#define COPYYEAR 2005
#define COPYMONTH 2
#define COPYDAY 8
#define COPYHOUR 16
#define COPYMINUTE 15
#define COPYSECOND 30   //only be even
/******************************************************************/

//define global variables 
unsigned char uRcvBuffer[512],uRcvBuffer1[512];//used for data transfer
unsigned char FileBuffer[LENGTH];//used for the content of the file to be created
unsigned short atadevinfo[256];
static unsigned short errcount = 0;
static unsigned char status = 0;
static unsigned int groupnum = 0;
static struct PartitionTable MBRTable;
static struct FAT32LogicPartition CPartition;
static struct FileReg OperatorFile, myfile, mycopyfile,mynewfile;
unsigned int uError = 0;
unsigned char temp[512];
unsigned int NxtFreeGrp;

//define functions 
void InitDSP();
unsigned char InitIDE();
unsigned char InitMBR();
unsigned char InitCPartition();
unsigned char ListFile();
unsigned char atadev_get_block(unsigned int lba, unsigned char sector_count, unsigned char* buffer);
unsigned char atadev_put_block(unsigned int lba, unsigned char sector_count, unsigned char* buffer);
unsigned char Check_NoRequest();
unsigned char Check_HaveRequest();
unsigned char Check_DateReady();
unsigned char CopyGroup(unsigned int srcgroup, unsigned int dstgroup);
unsigned int newgrp();
unsigned char WriteDFT();
unsigned char CopyFile();
unsigned char DelFile(unsigned int srcgroup);
unsigned char NewFile();
unsigned char WriteNewDFT();
unsigned char WriteFile();
unsigned char WriteGroup(unsigned int dstgroup);
unsigned char WriteWholeGroup(unsigned int dstgroup);

/**************************** main program start *******************************/
// Hard disk test main program 
void main()
{
  int i;
  printf("\n\r ****************** Hard disk test begin ******************\n");
  
  InitDSP();
  
  if(!InitIDE())
    printf("\n\r InitIDE error!\n");
    
  else
  {
	  if(InitMBR())
	  {
	  	if((MBRTable.PartitionType == 0x0b) || (MBRTable.PartitionType == 0x0c))
	  	{
	  	  if(InitCPartition())
	  	  {	/*  	    
	  	    if(ListFile())
	  	      printf("\n\r ListFile end!");
	  	    else 
	  	      printf("\n\r ListFile error!"); 
	  	    */  
	  	    if(NewFile())
	  	      printf("\n\r NewFile end!");
	  	    else 
	  	      printf("\n\r NewFile error!");
	  	     
	  	    if(ListFile())
	  	      printf("\n\r ListFile end!");
	  	    else 
	  	      printf("\n\r ListFile error!"); 
	  	    /*
	  	    //NOTICE:before CopyFile,you should ListFile to look for the file which to be copied
	  	    if(CopyFile())
	  	      printf("\n\r CopyFile end!");
	  	    else
	  	      printf("\n\r CopyFile error!"); 
	  	    
	  	    if(ListFile())
	  	      printf("\n\r ListFile end!");
	  	    else 
	  	      printf("\n\r ListFile error!"); 
	  	      
	  	    if(DelFile(DELFILE))
	  	      printf("\n\r DeleteFile end!"); 
	  	    else
	  	      printf("\n\r DeleteFile error!"); 
	        
	  	    if(ListFile())
	  	      printf("\n\r ListFile end!");
	  	    else 
	  	      printf("\n\r ListFile error!");
	  	    */ 
	  	   }
	  	  else
	  	   printf("\n\r InitCPartition error");
	  	}
	  	else
	  	 printf("\n\r Partition Type is not FAT32!\n"); 
	  }
	  else
	    printf("\n\n\n\r InitMBR error!\n");
  }	
  
  printf("\n\n\r ******************  Hard disk test end  ******************");

}
/**************************** main program end *******************************/


/*************************** initialization start ****************************/
// initialize DSP
void InitDSP( void )
{
//------------------------- Init SYSCON and SDRCON ----------------------

    __builtin_sysreg_write(__SYSCON, SYSCON_MSH_SLOW | 
                                     SYSCON_MSH_WT3 | 
                                     SYSCON_MSH_IDLE |
		                             SYSCON_MS1_SLOW | 
                                     SYSCON_MS1_WT3 | 
                                     SYSCON_MS1_IDLE |
		                             SYSCON_MS0_SLOW | 
                                     SYSCON_MS0_WT3 | 
                                     SYSCON_MS0_IDLE);

	                                 
    __builtin_sysreg_write(__SDRCON, SDRCON_INIT | 
                                     SDRCON_RAS2PC4 | 
                                     SDRCON_PC2RAS3 | 
	                                 SDRCON_REF600 | 
                                     SDRCON_PG256 | 
                                     SDRCON_CLAT2 | 
                                     SDRCON_ENBL);
}

//initialize ide
unsigned char InitIDE()
{
  unsigned int i=0;
  unsigned char error=0;

  if(!Check_NoRequest())
  {
    printf("\n\r Check_NoRequest : 001");
    return 0;
  }
  DEV_HEAD = DEV_HEAD & 0xEF;
  for(i=0;i<10;i++);

  if(!Check_NoRequest())
  {
    printf("\n\r Check_NoRequest : 002 ");
    return 0;
  }
  COMMAND = IDENTIFY_DEVICE;
  for (i=0;i<10;i++);
  
  if(!Check_HaveRequest())
  {
    printf("\n\r Check_HaveRequest : 003 ");
    return 0;
  }
  for(i=0;i<256;i++) 
    atadevinfo[i] = DATA;
  for (i=0;i<10;i++);
    
  if(!Check_NoRequest())
  {
    printf("\n\r Check_NoRequest : 004 ");
    return 0;
  }

  if (status & ERRBIT) 
	  error = ERRORREG;

  if (error)
  {
	printf("\n\r atadevinfo read error : 005 "); 
	return 0;
  }

  
  if(!Check_NoRequest())
  {
    printf("\n\r Check_NoRequest : 006 ");
    return 0;
  }
  DEV_HEAD = DEV_HEAD & 0xEF;
  for(i=0;i<10;i++);
  
  if(!Check_NoRequest())
  {
    printf("\n\r Check_NoRequest : 007 ");
    return 0;
  }
  SECTOR_COUNT = (atadevinfo[47] & 0xFF);
  for(i=0;i<10;i++);
  
  if(!Check_DateReady())
  {
    printf("\n\r Check_DateReady : 008 ");
    return 0;
  }
  COMMAND = SET_MULTIPLE;
  for(i=0;i<10;i++);
  
  if(!Check_NoRequest())
  {
    printf("\n\r Check_NoRequest : 009 ");
    return 0;
  }
  error = 0;
  if (status & ERRBIT) 
	  error = ERRORREG;
  
  if (error)
  {
	printf("\n\r SECTOR_COUNT set error : 010 "); 
	return 0;
  }
  return 1;
}
/*************************** initialization end ****************************/


/************************* check Hard disk status start ****************************/

//Hard disk free and have no data request,then return 1 (BSYBIT=0, DRQBIT=0) 
unsigned char Check_NoRequest()
{
  unsigned int iNumLoops = 0;
  while((iNumLoops++ < LOOPTIME) &&
  (((status = ATASTATUS) & BSYBIT) || (status & DRQBIT)))
    { }
  if(iNumLoops >= LOOPTIME)
    return 0;
  else
    return 1;
}

//Hard disk free and data ready,then return 1 (BSYBIT=0, DRDYBIT=1)
unsigned char Check_DateReady()
{
  unsigned int iNumLoops = 0;
  while((iNumLoops++ < LOOPTIME)&&
  (!((status = ATASTATUS) & DRDYBIT)||(status & BSYBIT)))
    { }
  if(iNumLoops >= LOOPTIME)
    return 0;
  else
    return 1;
}

//Hard disk free and have data request,then return 1 (BSYBIT=0, DRQBIT=1)
unsigned char Check_HaveRequest()
{
  unsigned int iNumLoops = 0;
  while((iNumLoops++ < LOOPTIME)&&
  (((status = ATASTATUS) & BSYBIT) || !(status & DRQBIT)))
    { }
  if(iNumLoops>=LOOPTIME)
    return 0;
  else
    return 1;
}
/************************* check Hard disk status end ****************************/

/*************** read and write Hard disk program start *****************/

//read Hard disk
unsigned char atadev_get_block(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<10000000;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
unsigned char atadev_put_block(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++);
	

⌨️ 快捷键说明

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