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

📄 usbmlun.c

📁 凌阳MP3 spSPCA755yuanma
💻 C
📖 第 1 页 / 共 2 页
字号:
/*++

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 + -