📄 usbmlun.c
字号:
/*++
Copyright (c) 2001 Sunplus Technology Co., Ltd.
Module Name:
usbMLUN.c
Abstract:
Module related to Multi-LUN Procedures of USB Mass Storage Device Class
Environment:
Keil C51 Compiler
Revision History:
04/22/2003 Chamber ling created
--*/
//=============================================================================
//Header file
//=============================================================================
#include "general.h"
#if (USBMSDC_OPTION == 2)
#include "usbmsdc2.h"
#include "ctlsetup.h"
#include "bulkout.h"
#include "main.h"
#include "setmode.h"
#include "scsi.h"
#include "cardlink.h"
//#include "device.h"
//richie@0114
#include "smccon.h"
#include "smcfunc.h"
#include "smcvar.h"
// WWW1
#include "dosvar.h"
//richie@0315
#include "msdc_dma.h"
//=============================================================================
//Symbol
//=============================================================================
//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Variable
//-----------------------------------------------------------------------------
//patch4.5@richie@mlun begin
/////#if (MLUN_OPTION)
//patch4.5@richie@mlun begin
xdata UCHAR G_ucMSDC_MLUN;
//patch4.5@richie@mlun end
xdata BYTE G_MLUN_Card_Present;
xdata BYTE G_MLUN_Buildin_Present;
xdata UCHAR G_MLUN_Card_ucCardLock;
xdata UCHAR G_MLUN_Buildin_ucCardLock;
xdata WORD G_MLUN_Card_SizeMB;
xdata WORD G_MLUN_Buildin_SizeMB;
xdata WORD G_MLUN_Card_BlockSize;
xdata WORD G_MLUN_Buildin_BlockSize;
xdata BYTE G_MLUN_Card_BlockSizeShift;
xdata BYTE G_MLUN_Buildin_BlockSizeShift;
xdata UCHAR G_MLUN_CurrentLUN;
xdata UCHAR G_MLUN_NextLUN;
xdata UCHAR G_MLUN_CardSelected;
xdata ULONG G_MLUN_SMC_DramAddr;
xdata ULONG G_MLUN_NAND_DramAddr;
typedef struct _MLUN_SAVED_XDATA
{
WORD mediaBehavior; //G_Media_Behavior;
#if (NANDF_OPTION == 1 && SMC_OPTION ==1)
//WORD cardToatalSizeMB; //G_Card_TotalSizeMB;
//WORD cardBlockSize; //G_Card_BlockSize;
//BYTE cardBlockSizeShift; //G_Card_BlockSizeShift;
BYTE smcCardTotalBank; //G_Card_TotalBank;
BYTE smcCardCurrBank; //G_Card_CurrBank;
WORD smcCardBlackExtSize; //G_Card_BlockExtSize;
WORD smcCardBlockWholeSize; //G_Card_BlockWholeSize;
WORD smcCardpageperBlock; //G_Card_PagePerBlock; // @012403@wyeo@support 256M nand
ULONG smcPhysicalbanlSize; //G_Card_PhysicalBankSize;
WORD smcAllocateTableSize; // G_SMC_AllocatTableSize;
BYTE smcEntryTAbleSize; //G_SMC_EntryTableSize;
ULONG smcCisBlockAddr; //G_SMC_CisBlockAddress;
BYTE smcFirstCISFound; //G_SMC_FirstCISFound; // K_Check_Nand_Bad_Block_Infomation
BYTE nandReserveBlockTotal; //G_NAND_ReservBlockTotal;
BYTE nandReserveBlockMax; //G_NAND_ReservBlockMax;
BYTE smcCisBlockFound; //G_SMC_CisBlockFound;
ULONG smcNewCisBlockAddr; //G_SMC_NewCisBlockAddress;
#if (K_HAVE_L2)
UCHAR smcAddrMode; //G_SMC_AddrMode;
#endif
BYTE smcBuildBankMap[K_SMC_BUILD_BANK_MAP_SIZE]; //G_SMC_BuildBankMap[K_SMC_BUILD_BANK_MAP_SIZE];
// @012403@wyeo@support 256M nand, begin
ULONG smcGoodSectorPerCard; // G_SMC_GoodSectorPerCard
BYTE nandMakerByte; // G_NANDF_Maker_Byte
BYTE nand3RD_Byte; // G_NANDF_3RD_Byte
BYTE nand4TH_Byte; // G_NANDF_4TH_Byte
BYTE nand5TH_Byte; // G_NANDF_5TH_Byte
BYTE nandCategory; // G_NANDF_Category // 0 is old, 1 is new and SMC2_
WORD nandPageSize; // G_NANDF_PageSize
WORD nandPageExtSize; // G_NANDF_PageExtSize
ULONG nandBlockSize; // G_NANDF_BlockSize
BYTE nandBlockSizeShift; // G_NANDF_BlockSizeShift
// @012403@wyeo@support 256M nand, end
#endif
} MLUN_SAVED_XDATA, *PMLUN_SAVED_XDATA;
MLUN_SAVED_XDATA smc_MLUN_SAVED_XDATA;
MLUN_SAVED_XDATA nand_MLUN_SAVED_XDATA;
extern xdata BYTE G_SMC_Table_Dirty ; // 102502@wyeo
#if (NANDF_OPTION == 1 && SMC_OPTION ==1)
extern void MLUN_SaveSMCData(UCHAR cardType);
extern void MLUN_LoadSMCData(UCHAR cardType);
//data bit G_SMC_Table_Dirty = FALSE;
#endif
////#endif
//patch4.5@richie@mlun end
//=============================================================================
//Program
//=============================================================================
//patch4.5@richie@mlun begin
#if (MLUN_OPTION)
//patch5.1@richie@mlun begin
//-----------------------------------------------------------------------------
//MLUN_Initialize
//-----------------------------------------------------------------------------
void MLUN_Initialize(void) USING_0
{
//##
///*
//////////////////// initial Build In
G_Card_Type = G_ucMSDC_BUILT_IN;
#if ( SMC_OPTION == 1 || NANDF_OPTION == 1 )
if ((G_Card_Type == K_MEDIA_SMC) || (G_Card_Type == K_MEDIA_NANDF))
{
G_MLUN_Buildin_Present = SMC_Initialize(FALSE);
}
else
#endif
G_MLUN_Buildin_Present = M_Card_Detect();
G_MLUN_Buildin_SizeMB = G_Card_TotalSizeMB;
G_MLUN_Buildin_BlockSize = G_Card_BlockSize;
G_MLUN_Buildin_BlockSizeShift = G_Card_BlockSizeShift;
//check if card is lock
//detect card WP
if (G_Card_Type == K_MEDIA_SDF)
{
UCHAR tmp;
XBYTE[0x2405] &= 0xef;
tmp = XBYTE[0x2409];
tmp &= 0x80;
if (tmp)
{
//DbgPrint("WP!!!\n");
G_MLUN_Buildin_ucCardLock = 1;
}
else
{
//DbgPrint("NOT WP\n");
G_MLUN_Buildin_ucCardLock = 0;
}
}
else if (G_Card_Type == K_MEDIA_SMC)
{
UCHAR tmp;
XBYTE[0x2406] &= 0xfd;
tmp = XBYTE[0x240A];
tmp &= 0x02;
if (tmp)
{
// DbgPrint("bNOT WP\n");
G_MLUN_Buildin_ucCardLock = 0;
}
else
{
// DbgPrint("bWP!!!\n");
G_MLUN_Buildin_ucCardLock = 1;
}
}
else
{
G_MLUN_Buildin_ucCardLock = 0;
}
// DbgPrint("G_Card_Type = %bx\n",G_Card_Type);
DbgPrint("G_MLUN_Buildin_SizeMB=%d,BlockSize=%x,BlockSizeShift=%bx\n",G_MLUN_Buildin_SizeMB,G_MLUN_Buildin_BlockSize,G_Card_BlockSizeShift);
//???
if (G_MLUN_Buildin_Present)
{
G_ucStorageType = G_Card_Type;
}
else
{
G_ucStorageType = K_MEDIA_NONE;
}
#if (NANDF_OPTION == 1 && SMC_OPTION ==1)
if ((G_ucMSDC_BUILT_IN == K_MEDIA_NANDF) && (G_ucMSDC_CARD == K_MEDIA_SMC))
{
MLUN_SaveSMCData(K_MEDIA_NANDF);
}
#endif
//////////////////// initial Card
G_Card_Type = G_ucMSDC_CARD;
#if ( SMC_OPTION == 1 || NANDF_OPTION == 1 )
if ((G_Card_Type == K_MEDIA_SMC) || (G_Card_Type == K_MEDIA_NANDF))
{
G_MLUN_Card_Present = SMC_Initialize(TRUE);
}
else
#endif
G_MLUN_Card_Present = M_Card_Detect();
G_MLUN_Card_SizeMB = G_Card_TotalSizeMB;
G_MLUN_Card_BlockSize = G_Card_BlockSize;
G_MLUN_Card_BlockSizeShift = G_Card_BlockSizeShift;
//check if card is lock
//detect card WP
if (G_Card_Type == K_MEDIA_SDF)
{
UCHAR tmp;
XBYTE[0x2405] &= 0xef;
tmp = XBYTE[0x2409];
tmp &= 0x80;
if (tmp)
{
//DbgPrint("WP!!!\n");
G_MLUN_Card_ucCardLock = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -