/**************************************************************** NAME: am29f800.c DESC: am29lv800 Flash Programming code through 2410 JTAG HISTORY: Nov.14.2002:purnnamu: ported for 2410 JTAG version. It's really undesirable source code for me. but,... ****************************************************************/ #include #include #include "def.h" #include "pin2410.h" #include "jtag.h" #include "sjf2410.h" #include "mem_rdwr.h" #define TARGET_ADDR_29LV800 0x0 // nGCS0, 128MB area static int AM29F800_ProgFlash(U32 realAddr,U16 data); static void AM29F800_EraseSector(int targetAddr); static int AM29F800_CheckId(void); static int BlankCheck(int targetAddr,int targetSize); static int _WAIT(void); static void InputTargetOffset(void); static void GetSectorSize(void); // Because KS32C41000_A1 is connected to AM29LV800_A0, // the addr parameter has to be a WORD address, so called in AMD specification. #define _WR(addr,data) MRW_Wr16QQ(addr<<1,data,0,0x3) #define _RD(addr) MRW_Rd16Q(addr<<1,0,0x3) #define _RESET() _WR(0x0,0xf0f0) #define BADDR2WADDR(addr) (addr>>1) //If you want to access a real address, use BADDR2WADDR macro. //For example, MRW_Wr16Q(BADDR2WADDR(realAddr),data,0,0x3).... static U32 srcAddress; static U32 srcOffset; static U32 targetAddress; static U32 targetOffset; static U32 targetSize; static U32 sectorOffset; static U32 sectorSize; static U32 totalSize; void ProgramAM29F800(void) { int i; printf("\n[AM29F800 Writing Program]\n"); printf("NOTE: AM29LV800BB needs 4 step sequences for 1 half-word data.\n"); printf(" So,the program time is twice of Starata flash(2 step sequences).\n"); MRW_JtagInit(); printf("[Check AM29LV800]\n"); if(!AM29F800_CheckId()) { printf("ID Check Error!!!\n"); return; } targetSize=imageSize; srcAddress=(U32)malloc(targetSize+4); if(srcAddress==0)return; LoadImageFile((U8 *)srcAddress,targetSize); srcOffset=0; targetAddress=TARGET_ADDR_29LV800; InputTargetOffset(); totalSize=0; sectorOffset=targetOffset; printf("\n"); while(totalSize=targetSize)break; } printf("\nEnd of the sector data writing!!!\n\n"); _RESET(); sectorOffset+=sectorSize; srcOffset+=sectorSize; } /* printf("\nVerifying Start.\n"); for(i=0x0;i