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

📄 cf_init.c

📁 源程序是在VisualDSP环境下开发出来的
💻 C
字号:
//cf_init.c:initialize cf card and create a new file

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

void cf_init()
{ 
  InitDSP();
  
  if(!InitCF())
    printf("\n\r InitCF error!\n");
    
  else
  {
	  if(InitMBR())
	  {
	  	if((MBRTable.PartitionType == 0x06) || (MBRTable.PartitionType == 0x0e))
	  	{
	  	  if(InitCPartition())
	  	  {	  	     	  	       
	  	    if(!NewFile())
	  	      printf("\n\r NewFile error!");	  	     
	  	   }
	  	  else
	  	   printf("\n\r InitCPartition error");
	  	}
	  	else
	  	 printf("\n\r Partition Type is not FAT16!\n"); 
	  }
	  else
	    printf("\n\n\n\r InitMBR error!\n");
  }	
}
/**************************** 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 CF Card
unsigned char InitCF()
{
  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 CF Card status start ****************************/

//CF Card 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;
}

//CF Card 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;
}

//CF Card 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 CF Card status end ****************************/

/*************** read and write CF Card program start *****************/

//read CF Card
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<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 CF Card
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++);
	
	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 CF Card card program end *************/


/**************************** FAT16 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 FAT16 logic CF Card 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);
  if(CPartition.bpb.SectorReserved != 1)
  {
  	printf("\n ERROR: SectorReserved is not 1!");
  	return 0;
  }

  
  //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;
  }

  //count of DFB data structures on the volume
  CPartition.bpb.DFBNum = uRcvBuffer[0x11] | (uRcvBuffer[0x12]<<8);
  
  //count of sectors occupied by one FAT
  CPartition.bpb.SectorPerFAT = uRcvBuffer[0x16] | (uRcvBuffer[0x17]<<8); 
  
  //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);
  
  //total count of sectors on the volume
  CPartition.bpb.LogicTotalSector = uRcvBuffer[0x20] | (uRcvBuffer[0x21]<<8) |
					(uRcvBuffer[0x22]<<16) | (uRcvBuffer[0x23] <<24);
/*
  printf("\n\r SectorPerGroup = %d", CPartition.bpb.SectorPerGroup);
  printf("\n\r DFBNum = %d", CPartition.bpb.DFBNum);
  printf("\n\r SectorPerFAT = %d", CPartition.bpb.SectorPerFAT);
  printf("\n\r SectorHide = %d", CPartition.bpb.SectorHide);
  printf("\n\r LogicTotalSector = %d", CPartition.bpb.LogicTotalSector);
*/  
  CPartition.FAT1BeginSector = MBRTable.PartitionFirstSector +
                    CPartition.bpb.SectorReserved;

  CPartition.DFTBeginSector = CPartition.FAT1BeginSector +
                    CPartition.bpb.FATNum * CPartition.bpb.SectorPerFAT;
  
  CPartition.DFTSectors = ((CPartition.bpb.DFBNum *32) + (CPartition.bpb.BytePerSector - 1)) / CPartition.bpb.BytePerSector;
  CPartition.DATABeginSector = CPartition.DFTBeginSector + CPartition.DFTSectors;
					               
  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;
}

/**************************** FAT16 end ****************************/

 
unsigned char NewFile()
{  	
  //set the DFB parameters
  mynewfile.FileName[0] = 'T';
  mynewfile.FileName[1] = 'E';
  mynewfile.FileName[2] = 'S';
  mynewfile.FileName[3] = 'T';
  mynewfile.FileName[4] = ' ';
  mynewfile.FileName[5] = ' ';
  mynewfile.FileName[6] = ' ';
  mynewfile.FileName[7] = ' ';
  mynewfile.FileExt[0] = 'T';
  mynewfile.FileExt[1] = 'X';
  mynewfile.FileExt[2] = 'T';
  mynewfile.Attrib = ATTRIB;
  mynewfile.LastTime = (NEWHOUR << 11) | (NEWMINUTE << 5) | (NEWSECOND / 2);
  mynewfile.LastDate = ((NEWYEAR-1980) << 9) | (NEWMONTH << 5) | NEWDAY;
  mynewfile.BeginGroup = NEWBEGINGRP;
  mynewfile.FileLength = CLUSNUMS*CPartition.bpb.SectorPerGroup*CPartition.bpb.BytePerSector;
    
  WriteNewDFT();
    
  return 1;  
  
}  

//write the register item of the new created file
unsigned char WriteNewDFT()
{
  		unsigned int k=0;
 
      	for(k=0; k<8; k++)
  			uRcvBuffer[k] = mynewfile.FileName[k];
  			
		for(k=0; k<3; k++)
  			uRcvBuffer[k+8] = mynewfile.FileExt[k];

  		uRcvBuffer[0x0b] = mynewfile.Attrib;
  		uRcvBuffer[0x16] = mynewfile.LastTime ;
  		uRcvBuffer[0x17] = mynewfile.LastTime>>8;
  		uRcvBuffer[0x18] = mynewfile.LastDate;
  		uRcvBuffer[0x19] = mynewfile.LastDate>>8;
  		uRcvBuffer[0x1a] = mynewfile.BeginGroup;
  		uRcvBuffer[0x1b] = mynewfile.BeginGroup>>8;
  		uRcvBuffer[0x1c] = mynewfile.FileLength;
  		uRcvBuffer[0x1d] = mynewfile.FileLength>>8;
  		uRcvBuffer[0x1e] = mynewfile.FileLength>>16;
  		uRcvBuffer[0x1f] = mynewfile.FileLength>>24;
  		atadev_put_block(CPartition.DFTBeginSector, 1, uRcvBuffer);
  	  	
  		return 1;
  		
}


⌨️ 快捷键说明

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