📄 l2_flash.c
字号:
/*++
Copyright (c) 2001 Sunplus Technology Co., Ltd.
Module Name:
L2_flash.c
Abstract:
Module related to L2 flash functions
Environment:
Keil C51 Compiler
Revision History:
11/12/2001 WZH created
--*/
//=============================================================================
//Header file
//=============================================================================
#include "general.h"
//=============================================================================
//Symbol
//=============================================================================
//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Variable
//-----------------------------------------------------------------------------
//=============================================================================
//Program
//=============================================================================
//-----------------------------------------------------------------------------
//L2_FlashMode
//-----------------------------------------------------------------------------
/*
routine description:
Flash type selection
arguments:
ActFlash : active flash type
0: None (fmgpio[29:0] is used as GPIO's)
1: NAND gate flash
2: SMC
3: CF (True IDE mode)
4: CF (Memory mode)
5: SD
6: MMC
7: SPI interface
8: NX interface
InactFlash : inactive flash type
0: None (only one storage media type use in SPCA533)
1: NAND gate flash
2: SMC
3: CF (True IDE mode)
4: CF (Memory mode)
5: SD
6: MMC
7: SPI interface
8: NX interface
PageSize : page size of active flash
0: 256 bytes/page
1: 512 bytes/page
2: 1024 bytes/page
return value:
0x00 - success
others - error
*/
UCHAR L2_FlashMode(UCHAR ActFlash, UCHAR InactFlash, UCHAR PageSize) USING_0
{
BYTE inActieFlag;
//printf("L2_FlashMode: (Active Flash Type=%bx,Inactive Flash Type= %bx)\n",ActFlash,InactFlash);
#if 0
switch(InactFlash)
{
case 0: break;
case 1: XBYTE[0x2401] |= 0x01; XBYTE[0x2405] |= 0x01; break;
case 2: XBYTE[0x2401] |= 0x04; XBYTE[0x2405] |= 0x04; break;
case 3: XBYTE[0x2401] |= 0x0C; XBYTE[0x2405] |= 0x0C; break;
case 4: XBYTE[0x2401] |= 0x04; XBYTE[0x2405] |= 0x04; break;
case 5: XBYTE[0x2401] |= 0x08; XBYTE[0x2405] |= 0x08; break;
case 6: XBYTE[0x2401] |= 0x0C; XBYTE[0x2405] |= 0x0C; break;
//Chamber@1223
// case 7: XBYTE[0x2401] |= 0x04; XBYTE[0x2405] |= 0x04; break;
// case 8: XBYTE[0x2401] |= 0x08; XBYTE[0x2405] |= 0x08; break;
default : return 0x01; break;
}
#endif
#if 1
switch(InactFlash)
{
case 0: break;
case 1: inActieFlag = 0x01; break;
case 2: inActieFlag = 0x04; break;
case 3: inActieFlag = 0x0C; break;
case 4: inActieFlag = 0x04; break;
case 5: inActieFlag = 0x0C; break;
case 6: inActieFlag = 0x0C; break;
//Chamber@1223
// case 7: inActieFlag = 0x04 break;
// case 8: inActieFlag = 0x08 break;
default : return 0x01; break;
}
XBYTE[0x2401] &= 0xF0;
XBYTE[0x2401] |= inActieFlag;
XBYTE[0x2405] &= 0xF0;
XBYTE[0x2405] |= inActieFlag;
#endif
switch(ActFlash)
{
case 0: XBYTE[0x2400] = 0x00;
case 1: XBYTE[0x2400] = 0x11; XBYTE[0x2422] = 0x00; break;
case 2: XBYTE[0x2400] = 0x11; XBYTE[0x2422] = 0x01; break;
case 3: XBYTE[0x2400] = 0x43; XBYTE[0x2434] &= 0xfb; break;
case 4: XBYTE[0x2400] = 0x43; XBYTE[0x2434] |= 0x04; break;
case 5: XBYTE[0x2400] = 0x06; XBYTE[0x2450] = 0x03; break;
case 6: XBYTE[0x2400] = 0x06; XBYTE[0x2450] = 0x03; break;
//Chamber@1223
// case 7: XBYTE[0x2400] = 0x04; XBYTE[0x2446] = 0x00; XBYTE[0x2447] = 0x0d; XBYTE[0x2448] = 0x00; break;
// case 8: XBYTE[0x2400] = 0x05; XBYTE[0x2446] = 0x00; XBYTE[0x2447] = 0x02; break;
default : return 0x01; break;
}
switch(PageSize)
{
//Chamber@1223
// case 0: XBYTE[0x24A3] = 0x00; XBYTE[0x2455] = 0x00; XBYTE[0x2456] = 0x01; break;
case 1: XBYTE[0x24A3] = 0x01; XBYTE[0x2455] = 0x00; XBYTE[0x2456] = 0x02; break;
//Chamber@1223
// case 2: XBYTE[0x24A3] = 0x02; XBYTE[0x2455] = 0x00; XBYTE[0x2456] = 0x04; break;
default : return 0x01; break;
}
//PRINT_L2(" L2_FlashMode: Exit L2_FlashMode\n");
return L2K_SUCCESS;
}
#if (SMC || NAND) // 110102@wyeo
//-----------------------------------------------------------------------------
//L2_ReadECC
//-----------------------------------------------------------------------------
/*
routine description:
Read ECC code
arguments:
ECCCount: the number of ECC code (3/6/12 is valid), otherwise invalid
ECCData : the ECC data
return value:
0x00 - success
others - error
*/
UCHAR L2_ReadECC(UCHAR ECCCount, UCHAR* ECCData) USING_0
{
//PRINT_L2(" L2_ReadECC: Enter L2_ReadECC(ECC count=8'h%x)\n",(USHORT)ECCCount);
if(ECCCount == 12) {
ECCData[11]=XBYTE[0x24AF]; ECCData[10]=XBYTE[0x24AD]; ECCData[9]=XBYTE[0x24AE];
ECCData[8]=XBYTE[0x24AC]; ECCData[7]=XBYTE[0x24AA]; ECCData[6]=XBYTE[0x24AB];
}
if((ECCCount == 6)||(ECCCount == 12))
{ECCData[5]=XBYTE[0x24A9]; ECCData[4]=XBYTE[0x24A7]; ECCData[3]=XBYTE[0x24A8];}
if((ECCCount == 6)||(ECCCount == 12)||(ECCCount == 3))
{ECCData[2]=XBYTE[0x24A6]; ECCData[1]=XBYTE[0x24A4]; ECCData[0]=XBYTE[0x24A5];}
//PRINT_L2(" L2_ReadECC: Exit L2_ReadECC\n");
return L2K_SUCCESS;
}
//-----------------------------------------------------------------------------
//L2_ClearECC
//-----------------------------------------------------------------------------
/*
routine description:
Restart ECC code calculation
arguments:
None
return value:
None
*/
void L2_ClearECC(void) USING_0
{
//PRINT_L2(" L2_ClearECC: Enter L2_ClearECC\n");
XBYTE[0x24A0] = 0x01;
//PRINT_L2(" L2_ClearECC: Exit L2_ClearECC\n");
}
//-----------------------------------------------------------------------------
//L2_ECCMode
//-----------------------------------------------------------------------------
/*
routine description:
Enable or disable ECC generator
arguments:
Mode : 0 enable ECC generator
1 disable ECC generator
return value:
None
*/
void L2_ECCMode(UCHAR Mode) USING_0
{
XBYTE[0x24A2] = 0x00; //WWTEST
return; //WWTEST
//PRINT_L2(" L2_ECCMode: Enter L2_ECCMode(Mode=8'h%x)\n",(USHORT)Mode);
if(Mode) XBYTE[0x24A2] = 0x01;
else XBYTE[0x24A2] = 0x00;
//PRINT_L2(" L2_ECCMode: Exit L2_ECCMode\n");
}
#endif // 110102@wyeo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -