?? storage.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); //不可去除此條語句,否則會導(dǎo)致SD卡成寫保護(hù)模式,只能讀不能寫也不能刪除文件
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -