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

📄 l1_isp.c

📁 dz3000_51.0.0.4.rar
💻 C
字号:
/*++

Copyright (c) 2001 Sunplus Technology Co., Ltd.

Module Name:

        L1_isp.c

Abstract:

        Module related to L1 ISP functions

Environment:

        Keil C51 Compiler

Revision History:

        11/12/2001      WZH    created                 
--*/

//=============================================================================
//Header file
//=============================================================================
#include "general.h"
#include "main.h"
//patch4.4@richie@cisp begin
#include "initio.h"
#include "doslink.h"
#include "dosvar.h"
#include "cardlink.h"
#include "uiflow.h"
//patch4.4@richie@cisp end

//=============================================================================
//Symbol
//=============================================================================
//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------
//richie@0402 isp delay
//ISP byte program delay
#define	K_ISP_DELAY_350us		0xA0
#define	K_ISP_DELAY_290us		0x80
#define	K_ISP_DELAY_150us		0x40
#define	K_ISP_DELAY_90us		0x20
#define	K_ISP_DELAY_50us		0x10
#define	K_ISP_BYTE_PROGRAM_DELAY	K_ISP_DELAY_90us

//patch4.4@richie@cisp
//dram start address of storage isp function
//#define K_ISP_CARD_ISP_DRAM_ADDR	K_SDRAM_DisplayBufAAddr
//-----------------------------------------------------------------------------
//Variable
//-----------------------------------------------------------------------------
sfr     RamPage = 0x9B;
sfr     MemStretch = 0x8E;
data    USHORT G_DstIndex;

//patch5.0@richie@usbisp begin
data    ULONG  DRAMAddr	_at_	0x50;
data    ULONG  ROMAddr	_at_	0x54;
data    ULONG  SecAddr	_at_	0x58;

data    USHORT SecCount	_at_	0x5C;
//patch5.0@richie@usbisp end

//patch4.3@richie@je0603
extern	data	UCHAR	G_ucISPCheck1;
extern	data	UCHAR	G_ucISPCheck2;

//patch4.3@richie@je0603 sunplus.lin also need modify
code BYTE ISPVer[] = 
{
 'S','u','N','p'
};

//=============================================================================
//Program
//=============================================================================
/*
//patch4.4@richie@cisp begin
// add for isp from storage
//-----------------------------------------------------------------------------
//CARD_ISP
//-----------------------------------------------------------------------------
UCHAR CARD_ISP(void) USING_0
{
	BYTE fName[12] = {'S', 'U', 'N', 'P', 'L', 'U', 'S', ' ', 'B', 'I', 'N'};
	WORD fHandle;
	UCHAR tmp1,tmp2,tmp3,tmp4,sts;
	BYTE msg[7] = {' ', 'F', 'a', 'i', 'l', ' ', 0};
	BYTE msg1[15] = {'F', 'i', 'l', 'e', ' ', 'N', 'o', 't', ' ', 'F', 'o', 'u', 'n', 'd', 0};

	DOS_SetCurrDir(G_USR_Dir1Cluster);
	fHandle = File_Open(fName, K_DOS_ReadFile, 0);
	if (fHandle != 0)
	{
		sts = M_Card_File_Read(fHandle, K_DOS_DstDram, G_DOS_FileSizeKeep, K_ISP_CARD_ISP_DRAM_ADDR, 0);
		if(!sts)
		{
//			DbgPrint("Cannot read BIN file\n");
			return L1K_ERROR_GENERAL;
		}
		UI_PrintOSDULong((ULONG)G_DOS_FileSizeKeep, 5, 3, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);

		//patch4.3@richie@je0531 begin check SUNP flag in DRAM
		L2_DRAMSetStartAddr(K_ISP_CARD_ISP_DRAM_ADDR + (0xF0 >> 1),1);
	        L2_DRAMReadWord(&tmp1,&tmp2);                    
		L2_DRAMReadWord(&tmp3,&tmp4);

		if ( (tmp1 == 'S') && (tmp2 == 'u') && (tmp3 == 'N') && (tmp4 == 'p')
		&& (G_ucISPCheck1 == 0x55) && (G_ucISPCheck2 == 0xAA) )
		{
			P1 = 0x33;
//			DbgPrint("CARD_ISP: ISP begin\n");
			G_ucISPCheck2 = 0xBB;
	                L1_ISP(K_ISP_CARD_ISP_DRAM_ADDR, 0, 0, G_DOS_FileSizeKeep >> 8);
		}
		else
		{
			P1 = 0x34;
			//DbgPrint("CARD_ISP: ISP Download to DRAM fail\n");
			UI_PrintOSDString(msg, 0, 4, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
			while (1) ;
			G_ISP = 0;
			EA = 1;
		}
		//patch4.3@richie@je0531 end check SUNP flag in DRAM
	}
	else
	{
		P1 = 0x35;
		UI_PrintOSDString(msg1, 0, 4, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
		L2_Wait(5000);
		//DbgPrint("File Not Found!!\n");
	}
}
//patch4.4@richie@cisp end
*/

//-----------------------------------------------------------------------------
//ISP
//-----------------------------------------------------------------------------
void L1_ISP(ULONG SourceAddr,ULONG DstAddr,ULONG SectorAddr,USHORT Count) USING_0
/*++

Routine Description:

        update code in flash ROM by ISP function

Arguments:

        none

Return Value:

        none

--*/
{
        data USHORT addr;

//patch5.0@richie@usbisp begin
	data ULONG ispDRAMAddr;
        data UCHAR drambusy;
//patch5.0@richie@usbisp end

        DRAMAddr = SourceAddr;
        ROMAddr = DstAddr;
        SecCount = Count;
        SecAddr = SectorAddr;
        RamPage = 0x00;
	//patch4.3@richie@je0603

//patch5.0@richie@usbisp begin
/*
	//##Save the data of variables begin
	ispDRAMAddr = 0x00001000;
        L2_DRAMSetStartAddr(ispDRAMAddr,0);
		
	//!!!!!!!!!!!!!!!data    ULONG  DRAMAddr!!!!!!!!!!!!!!!!
        L2_DRAMWriteWord((UCHAR)(DRAMAddr & 0x000000ff)
			,(UCHAR)((DRAMAddr & 0x0000ff00) >> 8)
			);                    
        L2_DRAMWriteWord((UCHAR)((DRAMAddr & 0x00ff0000) >> 16)
			,(UCHAR)((DRAMAddr & 0xff000000) >> 24)
			);                    

	//!!!!!!!!!!!!!!!data    ULONG  ROMAddr!!!!!!!!!!!!!!!!
        L2_DRAMWriteWord((UCHAR)(ROMAddr & 0x000000ff)
			,(UCHAR)((ROMAddr & 0x0000ff00) >> 8)
			);                    
        L2_DRAMWriteWord((UCHAR)((ROMAddr & 0x00ff0000) >> 16)
			,(UCHAR)((ROMAddr & 0xff000000) >> 24)
			);                    

	//!!!!!!!!!!!!!!!data    ULONG  SecAddr!!!!!!!!!!!!!!!!
        L2_DRAMWriteWord((UCHAR)(SecAddr & 0x000000ff)
			,(UCHAR)((SecAddr & 0x0000ff00) >> 8)
			);                    
        L2_DRAMWriteWord((UCHAR)((SecAddr & 0x00ff0000) >> 16)
			,(UCHAR)((SecAddr & 0xff000000) >> 24)
			);                    

	//!!!!!!!!!!!!!!!data    ULONG  SecCount!!!!!!!!!!!!!!!!
        L2_DRAMWriteWord((UCHAR)(SecCount & 0x00ff)
			,(UCHAR)((SecCount & 0xff00) >> 8)
			);                    
	//##Save the data of variables end
*/


	XBYTE[0x8000] = 0x00;

	//download USBISP code to SRAM
	ispDRAMAddr = 0x00009000;
	for (addr = 0x0000; addr < 0x1000 ;addr+=2)
	{

	        //==>L2_DRAMSetStartAddr(addr,1);
        	XBYTE[0x2720]=(UCHAR)ispDRAMAddr&0xff;                //set SDRAM starting addr
        	XBYTE[0x2721]=(UCHAR)(ispDRAMAddr>>8)&0xff;
        	XBYTE[0x2722]=(UCHAR)(ispDRAMAddr>>16)&0xff;         
        	//if(Read==0x01)
        	XBYTE[0x27a0]=0x01;                              //set prefetch

		ispDRAMAddr++;

        	//==>L2_DRAMReadWord(&tmp1,&tmp2);                    
        	do
        	{
         		drambusy=XBYTE[0x27b0]&0x01;
        	}while(drambusy==0x01);

        	XBYTE[addr]     = XBYTE[0x2700];
        	XBYTE[addr + 1] = XBYTE[0x2701];
	}
/*
	// download CLIB code to SRAM
        for (addr = 0x0500; addr < 0x1000 ;addr++)
                XBYTE[addr] = XBYTE[0x8000+addr];
*/
	XBYTE[0x8000] = 0x00;


	if ( (G_ucISPCheck1 == 0x55) && (G_ucISPCheck2 == 0xBB) )
	        XBYTE[0x2C00] |= 0x04;          //rampageen
	else
		return;


        XBYTE[0x2C01] = 0x00;           //shadowmap


        MemStretch = 0x02; 
        XBYTE[0x2024] = 0x01;         //24 MHz cpu clock
        /////XBYTE[0x2C00] = 0x1f;         //shadow enable

        L1_ISPUpdateRomCode();
//patch5.0@richie@usbisp end
}

//-----------------------------------------------------------------------------
//ISP_UpdateRomCode
//-----------------------------------------------------------------------------
void L1_ISPUpdateRomCode() USING_0
/*++

Routine Description:

        L1_ISPUpdateRomCode function
Arguments:

        none

Return Value:

        none

--*/
{
//patch5.0@richie@usbisp begin
        XBYTE[0x2C00] = 0x1f;         //shadow enable
	XBYTE[0x2FFF] &= 0xEF;	//shadow disable;
//patch5.0@richie@usbisp end
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -