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

📄 l2_flash.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*++

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