📄 l1_isp.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 + -