📄 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
{
//PRINT_L2(" L2_FlashMode: Enter L2_FlashMode(Active Flash Type=%x,Inactive Flash Type= %x, PageSize=%x)\n",(USHORT)ActFlash,(USHORT)InactFlash, (USHORT)PageSize);
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;
case 7: XBYTE[0x2401] |= 0x04; XBYTE[0x2405] |= 0x04; break;
case 8: XBYTE[0x2401] |= 0x08; XBYTE[0x2405] |= 0x08; break;
default : return 0x01; break;
}
switch(ActFlash)
{
//patch4.5.2@ada@Fix bug when set none storage interface begin
case 0: XBYTE[0x2400] = 0x00; break;
//case 0: XBYTE[0x2400] = 0x00;
//patch4.5.2@ada@Fix bug when set none storage interface end
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;
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)
{
case 0: XBYTE[0x24A3] = 0x00; XBYTE[0x2455] = 0x00; XBYTE[0x2456] = 0x01; break;
case 1: XBYTE[0x24A3] = 0x01; XBYTE[0x2455] = 0x00; XBYTE[0x2456] = 0x02; break;
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;
}
//-----------------------------------------------------------------------------
//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
{
//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");
}
//-----------------------------------------------------------------------------
//L2_FMGPIOOe
//-----------------------------------------------------------------------------
/*
routine description:
Set FMGPIO output enable
arguments:
GPIONo : 0 : set output enable of FMGPIO[0] ~ FMGPIO[7] group
1 : set output enable of FMGPIO[8] ~ FMGPIO[15] group
2 : set output enable of FMGPIO[16]~ FMGPIO[23] group
3 : set output enable of FMGPIO[24]~ FMGPIO[29] group
GPIOOe : bit[0] : set the 0th bit output enable of GPIONo group
bit[1] : set the 1th bit output enable of GPIONo group
:
bit[7] : set the 7th bit output enable of GPIONo group
return value:
None
*/
void L2_FMGPIOOe(UCHAR GPIONo, UCHAR GPIOOe) USING_0
{
//PRINT_L2(" L2_FMGPIOOe: Enter L2_FMGPIOOe\n");
switch(GPIONo)
{
case 0: XBYTE[0x2405] = GPIOOe; break;
case 1: XBYTE[0x2406] = GPIOOe; break;
case 2: XBYTE[0x2407] = GPIOOe; break;
case 3: XBYTE[0x2408] = GPIOOe; break;
default : break;
}
//PRINT_L2(" L2_FMGPIOOe: Exit L2_FMGPIOOe\n");
}
//-----------------------------------------------------------------------------
//L2_FMGPIOOutput
//-----------------------------------------------------------------------------
/*
routine description:
Set FMGPIO output value
arguments:
GPIONo : 0 : set output value of FMGPIO[0] ~ FMGPIO[7] group
1 : set output value of FMGPIO[8] ~ FMGPIO[15] group
2 : set output value of FMGPIO[16]~ FMGPIO[23] group
3 : set output value of FMGPIO[24]~ FMGPIO[29] group
GPIOO : bit[0] : set the 0th bit output value of GPIONo group
bit[1] : set the 1th bit output value of GPIONo group
:
bit[7] : set the 7th bit output value of GPIONo group
return value:
None
*/
void L2_FMGPIOOutput(UCHAR GPIONo, UCHAR GPIOO) USING_0
{
//PRINT_L2(" L2_FMGPIOOutput: Enter L2_FMGPIOOutput\n");
switch(GPIONo)
{
case 0: XBYTE[0x2401] = GPIOO; break;
case 1: XBYTE[0x2402] = GPIOO; break;
case 2: XBYTE[0x2403] = GPIOO; break;
case 3: XBYTE[0x2404] = GPIOO; break;
default : break;
}
//PRINT_L2(" L2_FMGPIOOutput: Exit L2_FMGPIOOutput\n");
}
//-----------------------------------------------------------------------------
//L2_FMGPIOInput
//-----------------------------------------------------------------------------
/*
routine description:
Set FMGPIO output value
arguments:
GPIONo : 0 : set output value of FMGPIO[0] ~ FMGPIO[7] group
1 : set output value of FMGPIO[8] ~ FMGPIO[15] group
2 : set output value of FMGPIO[16]~ FMGPIO[23] group
3 : set output value of FMGPIO[24]~ FMGPIO[29] group
GPIOO : bit[0] : set the 0th bit output value of GPIONo group
bit[1] : set the 1th bit output value of GPIONo group
:
bit[7] : set the 7th bit output value of GPIONo group
return value:
None
*/
void L2_FMGPIOInput(UCHAR GPIONo, UCHAR* GPIOI) USING_0
{
//PRINT_L2(" L2_FMGPIOInput: Enter L2_FMGPIOInput\n");
switch(GPIONo)
{
case 0: *GPIOI = XBYTE[0x2409]; break;
case 1: *GPIOI = XBYTE[0x240A]; break;
case 2: *GPIOI = XBYTE[0x240B]; break;
case 3: *GPIOI = XBYTE[0x240C]; break;
default : *GPIOI = XBYTE[0x2409]; break;
}
//PRINT_L2(" L2_FMGPIOInput: Exit L2_FMGPIOInput\n");
}
#ifdef TestModeEn
//-----------------------------------------------------------------------------
//L2_TestFlash
//-----------------------------------------------------------------------------
/*
routine description:
Flash module test.
arguments:
TestLevel: the level of test
return value:
0x00 - success
others - error
*/
UCHAR L2_TestFlash(UCHAR TestLevel) USING_0
{
UCHAR error,Detect,Ready,Status;
USHORT pagesize;
ULONG block,blocksize;
UCHAR ByteData;
ULONG Addr;
// NAND
UCHAR MarkerID;
UCHAR DeviceID;
// NAND
// CF
UCHAR HS;
UCHAR CylHigh;
UCHAR CylLow;
UCHAR SecNum;
// CF
// USHORT WordData;
USHORT tmp;
UCHAR tmp0,tmp1,tmp2,tmp3,tmp4,tmp5;
// Register R/W
if(TestLevel == 0 || TestLevel==2)
{
//0x2400
tmp0 = XBYTE[0x2400];
XBYTE[0x2400] = 0xFF;
if(XBYTE[0x2400]!=0x07) error = 1; //test 0 to 1 toggle
XBYTE[0x2400] = 0x00;
if(XBYTE[0x2400]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2400] = tmp0;
//0x2401
tmp0 = XBYTE[0x2401];
XBYTE[0x2401] = 0xFF;
if(XBYTE[0x2401]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2401] = 0x00;
if(XBYTE[0x2401]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2401] = tmp0;
//0x2402
tmp0 = XBYTE[0x2402];
XBYTE[0x2402] = 0xFF;
if(XBYTE[0x2402]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2402] = 0x00;
if(XBYTE[0x2402]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2402] = tmp0;
//0x2403
tmp0 = XBYTE[0x2403];
XBYTE[0x2403] = 0xFF;
if(XBYTE[0x2403]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2403] = 0x00;
if(XBYTE[0x2403]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2403] = tmp0;
//0x2404
tmp0 = XBYTE[0x2404];
XBYTE[0x2404] = 0xFF;
if(XBYTE[0x2404]!=0x3F) error = 1; //test 0 to 1 toggle
XBYTE[0x2404] = 0x00;
if(XBYTE[0x2404]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2404] = tmp0;
//0x2405
tmp0 = XBYTE[0x2405];
XBYTE[0x2405] = 0xFF;
if(XBYTE[0x2405]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2405] = 0x00;
if(XBYTE[0x2405]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2405] = tmp0;
//0x2406
tmp0 = XBYTE[0x2406];
XBYTE[0x2406] = 0xFF;
if(XBYTE[0x2406]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2406] = 0x00;
if(XBYTE[0x2406]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2406] = tmp0;
//0x2407
tmp0 = XBYTE[0x2407];
XBYTE[0x2407] = 0xFF;
if(XBYTE[0x2407]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2407] = 0x00;
if(XBYTE[0x2407]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2407] = tmp0;
//0x2408
tmp0 = XBYTE[0x2408];
XBYTE[0x2408] = 0xFF;
if(XBYTE[0x2408]!=0x3F) error = 1; //test 0 to 1 toggle
XBYTE[0x2408] = 0x00;
if(XBYTE[0x2408]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2408] = tmp0;
//0x2410
tmp0 = XBYTE[0x2410];
XBYTE[0x2410] = 0xFF;
if(XBYTE[0x2410]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2410] = 0x00;
if(XBYTE[0x2410]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2410] = tmp0;
//0x2411
tmp0 = XBYTE[0x2411];
XBYTE[0x2411] = 0xFF;
if(XBYTE[0x2411]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2411] = 0x00;
if(XBYTE[0x2411]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2411] = tmp0;
//0x2412
tmp0 = XBYTE[0x2412];
XBYTE[0x2412] = 0xFF;
if(XBYTE[0x2412]!=0xFF) error = 1; //test 0 to 1 toggle
XBYTE[0x2412] = 0x00;
if(XBYTE[0x2412]!=0x00) error = 1; //test 1 to 0 toggle
XBYTE[0x2412] = tmp0;
//0x2413
tmp0 = XBYTE[0x2413];
XBYTE[0x2413] = 0xFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -