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

📄 storage.c

📁 增强型51单片机fs7821sd卡、mmc卡读写程序
💻 C
字号:
/*
**********************************************************************************************
* Project:	TK7821
* File:		Storage.c
* Contents: 
*          The storage access wrapper 
*
* $Date: 02/25/05    Jason    v0.1
*        05/12/05    Mingo    v0.2   www.fameg.com
*
* Copyright (c) 2005 Fameg, Inc. All rights reserved
***********************************************************************************************
*/

#include <reg51.h>
#include <string.h>
#include "Device.h"
#include "UsbDisk.h"
#include "Storage.h"
#include "ScsiCmd.h"
#include "FlashDisk.h"

bit AccessStatus;          // ??? what for ??? 
bit AccessWritable = false;// ??? what for ??? 
BYTE AccessDevice;         // ??? what for ??? 
BYTE CmdTimer;

BYTE LastDevice;
idata BYTE DeviceType[MAX_DEVICE_NUM];

UINT16 CopyBuffer = DMA_BUFFER2; // Address of temporary block copy buffer
UINT16 CurrentBuffer;
bit Authenticated = false;
xdata TDeviceInfo DeviceInfo;
xdata TConfigData ConfigData;
idata STATUS SdMediaStatus = STATUS_NO_MEDIA;

//----------------------------------------------------------------------------
// Description:
//   Initiate the storage interfaces
//----------------------------------------------------------------------------
void StorageInit()
{
  LastDevice = 0;
  CurrentBuffer = DMA_BUFFER0;

  // Init Parameters.
  memset((BYTE xdata *)ConfigData.ReadOnly, 0, MAX_DEVICE_NUM);	//不可去除此条语句,否则会导致SD卡成写保护模式,只能读不能写也不能删除文件

  SdInit();
  DeviceType[LastDevice] = DEVICE_SD;
}

//--------------------------------------------------------------------
// Make the storage devices into suspend mode
//--------------------------------------------------------------------
void StorageSuspend()
{
    SdSuspend();
}

//--------------------------------------------------------------------
// Make the storage devices resume
//--------------------------------------------------------------------
void StorageResume()
{
    SdResume(); // Resume SD first or CF will fail
}

//----------------------------------------------------------------------------
// Description:
//   Get the next buffer address
//----------------------------------------------------------------------------
UINT16 GetNextBuffer(UINT16 Buffer)
{
  if (((TDataCast *)&Buffer)->ucByte[0] == (DMA_BUFFER0 >> 8))
    return DMA_BUFFER1;
  else
    return DMA_BUFFER0;
}

//---------------------------------------------------------------------------
// Used to change device STATUS when StartStopUint "Start" cmd issued 
//---------------------------------------------------------------------------
void StorageStart()
{   
	SdStart(); 
}

//---------------------------------------------------------------------------
// Used to change device STATUS when StartStopUint "Stop" cmd issued
//---------------------------------------------------------------------------
void StorageEject()
{ 
	SdEject();	 
}

//----------------------------------------------------------------------------
//   Query one storage device for status
//----------------------------------------------------------------------------
STATUS QueryDevice()
{
    xdata BYTE Status;

    switch (DeviceType[ScsiLun])
    {
        case DEVICE_SD: Status = SdQueryDevice(); break;
        default:
            return STATUS_PARAM_ERROR;
    }

    if(ConfigData.ReadOnly[ScsiLun])
        DeviceInfo.WriteProtect = true;

    return Status;
}

//----------------------------------------------------------------------------
//   Storage sector read routine
//----------------------------------------------------------------------------
STATUS ReadSector()
{
    BYTE Status;

    AccessStatus = true; 
    AccessDevice = ScsiLun;
    CurrentBuffer = GetNextBuffer(CurrentBuffer);

    switch (DeviceType[ScsiLun])
    {
        case DEVICE_SD: Status = SdReadSector(); break;
        default:
            return STATUS_PARAM_ERROR;
    }
    return Status;
}

//----------------------------------------------------------------------------
//   Storage next sector read routine
//----------------------------------------------------------------------------
STATUS ReadNextSector()
{
    BYTE Status;
  
    CurrentBuffer = GetNextBuffer(CurrentBuffer);

    switch (DeviceType[ScsiLun])
    {
        case DEVICE_SD: Status = SdReadNextSector(); break;
        default:
            return STATUS_PARAM_ERROR;
    }
    return Status;
}

//----------------------------------------------------------------------------
//   Storage sector write routine
//----------------------------------------------------------------------------
STATUS WriteSector()
{
    BYTE Status;

    AccessStatus = true;
    AccessDevice = ScsiLun;

    switch (DeviceType[ScsiLun])
    {
        case DEVICE_SD: Status = SdWriteSector(); break;
        default:
            Status = STATUS_PARAM_ERROR;
    }
    return Status;
}

//----------------------------------------------------------------------------
//   Storage next sector write routine
//----------------------------------------------------------------------------
STATUS WriteNextSector()
{
    BYTE Status;

    switch (DeviceType[ScsiLun])
    {
        case DEVICE_SD: Status = SdWriteNextSector(); break;
        default:
            Status = STATUS_PARAM_ERROR;
    }
    return Status;
}


UINT32 ConvertEndian32(UINT32 Src)
{
  UINT32 Des;
  PBYTE pSrc = (PBYTE)(&Src);
  PBYTE pDesc = (PBYTE)(&Des);
	
  pDesc[0] = pSrc[3];	
  pDesc[1] = pSrc[2];	
  pDesc[2] = pSrc[1];
  pDesc[3] = pSrc[0];	
  
  return Des; 
}

//----------------------------------------------------------------------------
// Convert Big/Little endian to Little/Big endian, UINT16 applyed. 
//  (Due to Keil simulation result,system was Big Endian)
//----------------------------------------------------------------------------
UINT16 ConvertEndian16(UINT16 Src)
{
  UINT16 Des;
  PBYTE pSrc = (PBYTE)(&Src);
  PBYTE pDesc = (PBYTE)(&Des);
	
  pDesc[0] = pSrc[1];	
  pDesc[1] = pSrc[0];	

  return Des; 
}    

⌨️ 快捷键说明

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