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

📄 api32.c

📁 ISP1362 Fat32 coldfire523x
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Api32.h"
/*OpenFile32()、GetDirInfo32()、DownDir32()改长文件名寻址,List32()从UNICODE编码中单提取字符*/												   
/**************************************定义全局变量*************************************/

extern struct FILEINFO FileInfo;
extern uint32 DirStartCluster32, NowCluster32, NowSector;
extern uint8  DBUF[512];
extern SFATBPBINFO DeviceInfo;
extern SFILEINFO   ThisFile;
extern SUDEV  uDev;
extern SFLAGS bFlags;

uint8 str2Name(uint8 * nam, uint8 * str)
{
  uint8 * cp;
  uint32 i, space;
		
  space = 8;
  cp = str;
  while (*cp != 0)
  {   
    if (*cp >= 'a' && *cp <= 'z' )
    {
      *cp -=  'a' - 'A'; 
    }
    cp++;	
  }

  cp = str;
  for(i = 0; i < 9; i++)
  {
    /*if(*cp == 0)
    {
      return 1;
    }*/
    nam[i] = *cp++;
    if(*cp == '.')
    {
      i++;
      break;
    }
    space --;
  }

  do
  {
    nam[i++] = 0x20;
    space --;

  }while(space != 0);

  i = 8;
  while(*++cp != 0)
  {
    nam[i++] = *cp;	
  }

  return 1;
}

/****************************************************************************************/

uint8 CreateDir32(uint8 *pName, uint8 * RiliShizhong)
{
  uint8 pLongEntName[256];/* 记录长文件名目录项 */
  uint8 pBuffer[32];		/* 记录短文件名目录项 */
  uint8 * CreatTime;
  uint32 sector, cnum;
  uint32 i, j, len, bwrite;
  uint32 bstop = 0, InByte = 0, DirEntCount, sum;
  uint32 ClusterPointer;
  CreatTime = RiliShizhong;

  MakeShortEntry(pName, pBuffer, 1, CreatTime);
  sum = ChkSum(pBuffer);
  len = MakeLongEntry(pLongEntName, pName, sum);

  if((len % 32) != 0)
    return FALSE;
  if((len + 32) > DeviceInfo.BPB_BytesPerSec)
    return FALSE;

  ThisFile.bFileOpen = 0;
  ThisFile.FatSectorPointer = 0;

  cnum = GetFreeClusterNum32();/* 获取空簇、即目录首簇 */
  if(cnum < 0x02)
    return FALSE;	

  ClrACluster(cnum);


  pBuffer[11] = 0x10;
  pBuffer[21] = (uint8)(cnum >> 24);
  pBuffer[20] = (uint8)(cnum >> 16);
  pBuffer[27] = (uint8)(cnum >> 8);
  pBuffer[26] = (uint8)(cnum);
  pBuffer[28] = 0;pBuffer[29] = 0;pBuffer[30] = 0;pBuffer[31] = 0;
  bstop = 0;
			
  do
  {	
    NowCluster32 = DirStartCluster32;
    NowSector = FirstSectorofCluster32(NowCluster32);
    ClusterPointer = NowCluster32;
    for(sector = 0; sector < DeviceInfo.BPB_SecPerClus; sector++)
    {   
      if(! ReadSector(DBUF, NowSector + sector, 1))
      {
        return FALSE;
      }
      DirEntCount = 0;
      bwrite = 0;
      for(i=0; i < DeviceInfo.BPB_BytesPerSec; i += 32)
      {
        if(DirEntCount == 0)
        {
          InByte = i;
        }
        if(DBUF[i] == 0xE5)				
        {
          DirEntCount++;				
        }
        else if(DBUF[i] == 0x00)
        {	
          DirEntCount++;	
          DBUF[i] = 0xE5;
          bwrite = 1;	
        }
        else
        {
          DirEntCount = 0;
        }

        if((DirEntCount * 32) >= (len + 32))
        {
          for(j = 0; j < len; j++)
          {
            DBUF[InByte + j] = *((uint8 *)pLongEntName + j);
          }
          for(j = 0; j < 32; j++)
          {
            DBUF[InByte + len + j] = *(pBuffer + j);
          }
          if(! WriteSector(DBUF, (NowSector + sector), 1))
          {
            return FALSE;		  	 		
          }	
          bstop = 1;
          break;
        }
      }
      if(bstop == 1)
        break;
      if(/*(len != 0) && */(bwrite == 1))
      {
        if(! WriteSector(DBUF, NowSector + sector, 1))
          return FALSE;
      }
    }
    if(bstop == 1)
      break;
		
    NowCluster32 = GetNextClusterNum32(NowCluster32);
    if(NowCluster32 > DeviceInfo.TotCluster)
    {
      NowCluster32 = CreateClusterLink32(ClusterPointer);
      if(NowCluster32 == 0x00)
        return FALSE;
      NowSector = FirstSectorofCluster32(NowCluster32);
      for(i = 0; i < DeviceInfo.BPB_BytesPerSec; i++)
      {	
        DBUF[i] = 0x00;
      }
      for(sector = 0; sector < DeviceInfo.BPB_SecPerClus; sector++)
      {
        if(!WriteSector(DBUF, NowSector + sector, 1))
        {
          return FALSE;
        }
      }
    }
    DirStartCluster32 = NowCluster32;

  }while(NowCluster32 <= DeviceInfo.TotCluster);
	
  if(NowCluster32 > DeviceInfo.TotCluster)
    return FALSE;

  for(i = 64; i < DeviceInfo.BPB_BytesPerSec; i++)
  {
    DBUF[i] = 0x00;
  }
  for(i = 0; i < 43; i++)
  {
    DBUF[i] = 0x20;
  }
  DBUF[0] = 0x2e;/*.目录*/		    
  for(i =11; i < 32; i++)
  {
    DBUF[i] = pBuffer[i];
  }
  DBUF[32] = 0x2e;
  DBUF[33] = 0x2e;/*..目录*/
  for(i = 43; i < 64; i++)
  {
    DBUF[i] = pBuffer[i-32];
  }
  if(DirStartCluster32 == DeviceInfo.RootStartCluster)	/*Root Dir*/
  {
    DBUF[53] = 0; DBUF[52] = 0; DBUF[59] = 0; DBUF[58] = 0;
  }
  else
  {
    DBUF[53] = (uint8)(DirStartCluster32 >> 24);
    DBUF[52] = (uint8)(DirStartCluster32 >> 16);
    DBUF[59] = (uint8)(DirStartCluster32 >> 8);
    DBUF[58] = (uint8)(DirStartCluster32);
  }

  NowSector = FirstSectorofCluster32(cnum);
  if(! WriteSector(DBUF, NowSector, 1))
    return FALSE;	

  DirStartCluster32 = cnum;/*置该子目录为当前目录*/
  ThisFile.ClusterPointer = 0;		
  return TRUE;	
}

uint8 CreateFile32(uint8 *pName, uint8 Mode, uint8 *RiliShizhong)
{
  uint8 pLongEntName[256];/* 记录长文件名目录项 */
  uint8 pBuffer[32];		/* 记录短文件名目录项 */
  uint8 * CreatTime;
  uint32 sector, cnum;
  uint32 i = 0, j, len, bwrite;
  uint32 bstop, InByte = 0, DirEntCount, sum;/* InByte记录目录项开始,不能定义为8位 */
  uint32 ClusterPointer;

  switch(Mode)
  {
    case 'c' :
    {
      RemoveFile32(pName);
      break;
    }
    case 'a' :
    {
      len = OpenFile32(pName);
      if(len > 0 ) 
      {
        if(SetFilePointer32(len))
        {
          return TRUE;
        }
      }
      break;
    }
    default:
    {
      break;
    }
  }  
  CreatTime = RiliShizhong;
	
  MakeShortEntry(pName, pBuffer, 0, CreatTime);
  sum = ChkSum(pBuffer);
  len = MakeLongEntry(pLongEntName, pName, sum);

  if((len % 32) != 0)
    return FALSE;
  if((len + 32) > DeviceInfo.BPB_BytesPerSec)
    return FALSE;

  ThisFile.bFileOpen=0;	
  /*到第32个文件,先给该文件分配起始簇1F4(1F4为空),建立文件是要再新建簇链,为1F5(填FFFFFFFF)*/
  cnum = GetFreeClusterNum32();
  if(cnum < 0x02)
    return FALSE;

  ClrACluster(cnum);

  pBuffer[21] = (uint8)(cnum >> 24);
  pBuffer[20] = (uint8)(cnum >> 16);
  pBuffer[27] = (uint8)(cnum >> 8);
  pBuffer[26] = (uint8)(cnum);
  pBuffer[28] = 0; pBuffer[29] = 0; pBuffer[30] = 0; pBuffer[31] = 0;
	
  bstop = 0;
	/*再次建文件又要新建簇链(基于上次文件的16个簇的基础上)。DirStartCluster32不在循环体内为当前子目录指针3。
	所以要把DirStartCluster32的更改放入循环体内,要不每次都会去更该子目录首簇,造成后面部分文件的丢失。2008.3.14*/
		
  do
  {	
    NowCluster32 = DirStartCluster32;
    NowSector = FirstSectorofCluster32(NowCluster32);
    ClusterPointer = NowCluster32;

    for(sector = 0; sector < DeviceInfo.BPB_SecPerClus; sector++)
    {
      if(! ReadSector(DBUF, NowSector + sector, 1))
        return FALSE;
			
      DirEntCount = 0;
      bwrite = 0;
      for(i=0; i < DeviceInfo.BPB_BytesPerSec; i += 32)
      {
        if(DirEntCount == 0)
        {
          InByte = i;
        }
        if(DBUF[i] == 0xE5)				
        {
          DirEntCount++;				
        }
        else if(DBUF[i] == 0x00)
        {	
          DirEntCount++;	
          DBUF[i] = 0xE5;
          bwrite = 1;	
        }
        else
        {
          DirEntCount = 0;
        }

        if((DirEntCount * 32) >= (len + 32))
        {
          for(j = 0; j < len; j++)
          {
            DBUF[InByte + j] = pLongEntName[j]/**((uint8 *)pLongEntName + j)*/;
          }
          for(j = 0; j < 32; j++)
          {
            DBUF[InByte + len + j] = pBuffer[j]/* *(pBuffer + j)*/;
          }
						
          if(! WriteSector(DBUF, (NowSector + sector), 1))
            return FALSE;		  	 		
						
          bstop = 1;
          break;
        }
      }

      if(bstop == 1)
      {
        break;
      }
      if(/*(len != 0) && */(bwrite == 1))
      {
        if(! WriteSector(DBUF, NowSector + sector, 1))
          return FALSE;
      }
    }
    if(bstop == 1)
    break;
	
    /*NowCluster32 = GetNextClusterNum32(NowCluster32);
    if(NowCluster32 > DeviceInfo.TotCluster)
    {
    } */
    NowCluster32 = CreateClusterLink32(ClusterPointer);
    if(NowCluster32 == 0x00)
    {
      return FALSE;
    }
    ClrACluster(NowCluster32);

    DirStartCluster32 = NowCluster32;

  }while(NowCluster32 <= DeviceInfo.TotCluster);	
	
  ThisFile.StartCluster = cnum;
  ThisFile.LengthInByte = 0;
  ThisFile.ClusterPointer = ThisFile.StartCluster;
  ThisFile.SectorPointer = FirstSectorofCluster32(ThisFile.StartCluster);
  ThisFile.OffsetofSector = 0;
  ThisFile.SectorofCluster = 0;
  ThisFile.bFileOpen = 1;
  ThisFile.pointer = 0;
  ThisFile.FatSectorPointer = 0;
  ThisFile.FDTClusterPointer = NowCluster32;
  ThisFile.FDTSectorPointer  = NowSector + sector;
  ThisFile.FDTOffsetOfSector = (InByte + len);
		
  return TRUE;	    
}

uint8 WriteFile32(uint32 writeLength,uint8 *pBuffer, uint8 *RiliShizhong)
{
  /*uint32 , ClusterNum, SectorNum, OtherBytes,*/ 
  uint32 tlen, len, i, InSector;
  uint32 bSuccess;
  uint16 DirCreatTime, DirCreatDate;
	
  if(! ThisFile.bFileOpen)
  {
    return FALSE;
  }

  ThisFile.bFileOpen = 0;
  bSuccess = 0;
  tlen = 0;

  while(writeLength > 0)
  {
    //----------喂狗--------------
    MCF_GPIO_PODR_DATAL|=MCF_GPIO_PODR_DATAL_PODR_DATAL0;       //高电平.
    _ASMLINE("  NOP ");
    _ASMLINE("  NOP ");
    MCF_GPIO_PODR_DATAL&=(~MCF_GPIO_PODR_DATAL_PODR_DATAL0);    //低电平. 
    //----------喂狗--------------
    if((writeLength + ThisFile.OffsetofSector) > DeviceInfo.BPB_BytesPerSec)
    {
      len = DeviceInfo.BPB_BytesPerSec;
    }
    else
    {
      len = (writeLength + ThisFile.OffsetofSector);
    }
		   
    if(ThisFile.OffsetofSector > 0)
    {
      if(ReadSector(DBUF, ThisFile.SectorPointer, 1))
      {
        len = (len - ThisFile.OffsetofSector);
		   		
        for(i = 0; i < len; i ++)		   			
        {
          DBUF[ThisFile.OffsetofSector + i] = *(pBuffer + i);
        }
				
        if(! WriteSector(DBUF, ThisFile.SectorPointer, 1))
        {
          return FALSE;
        }
		   		
        ThisFile.OffsetofSector = (ThisFile.OffsetofSector + len);
      }
      else

⌨️ 快捷键说明

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