|
/********************************************************************************/ /* flashcode.c */ /* Written by: Kyle Castille */ /* Updated by: Michael Haag (6/27/01) */ /* This program will create a dummy data buffer with an incrementing count */ /* in internal memory, and then program this data to the AM29LV800-90 Flash */ /* which is a 1M x 8/512k x 16, 90 ns Flash memory. */ /* */ /* This program assumes that the ARDY interface is used, so no software */ /* checking is done to detect end of operation for erase or program */ /* */ /********************************************************************************/ #define CHIP_6416 1
#define CE1_ADDRS 0x64000000 #define INT_MEM 0x00000000 #define FLASH_ADDRS CE1_ADDRS #define SRC_ADDRS INT_MEM #define LENGTH 0x400 #define TRUE 1 #define FALSE 0 #include <stdlib.h> #include <stdio.h> #include <csl.h> #include <csl_emifb.h> #include <csl_emifbhal.h> extern EMIFB_Config config; void load_source (short * source, int num_words); void erase_flash(int * flash_addrs); void program_flash(short * source, int * flash_addrs, int num_words);
/****************************************************************************/ /* emif_config :Routine to configure the Emif for operation with */ /* AM29LV800-90 at CE1. This routine sets the CE1 control register */ /* for a 32 bit asynchronous memory interface with the following */ /* parameters: */ /* Mtype = 010 (32-bit async memory) */ /* Read Setup/Strobe/Hold = 1/21/3 */ /* Write Setup/Strobe/Hold = 2/13/3 */ /* */ /****************************************************************************/
void main(){ int * flash_ptr = (int *)FLASH_ADDRS; short * src_ptr = (short *)SRC_ADDRS;
/* initialize the CSL library */ CSL_init();
EMIFB_config(&config); load_source(src_ptr, LENGTH); erase_flash(flash_ptr); program_flash(src_ptr, flash_ptr, LENGTH); printf("Successful erase and program!!!"); }
/****************************************************************************/ /* load_source : Routine to load the source memory with data. This routine */ /* loads an incrementing count into the source memory for */ /* demonstration purposes. */ /* Inputs: */ /* source_ptr : Address to be used as the source buffer */ /* length : Length to be programmed */ /* */ /****************************************************************************/
EMIFB_Config config = { /* Create Global Control Register field */ 0x00002060, 0x02a08a00, 0x02a08a00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
void load_source(short * source_ptr, int length) { int i;
for (i = 0; i < length; i ++){ * source_ptr++ = i; } }
/****************************************************************************/ /* erase_flash : Routine to erase entire FLASH memory AM29LV800 (1M x 8bit/ */ /* 512k x 16bit) */ /* Inputs: */ /* flash_ptr: Address of the FLASH PEROM */ /* */ /****************************************************************************/ void erase_flash(int * flash_ptr) { /* Control addresses are left shifted so that */ /* they appear correctly on the EMIF's EA[19:2] */ /* Byte address << 2 == Word Address */
int * ctrl_addr1 = (int *) ((int)flash_ptr + (0x555 << 2)); int * ctrl_addr2 = (int *) ((int)flash_ptr + (0x2aa << 2));;
* ctrl_addr1 = 0x00aa; /* Erase sequence writes to addr1 and addr2 */ * ctrl_addr2 = 0x0055; /* with this data */ * ctrl_addr1 = 0x0080; * ctrl_addr1 = 0x00aa; * ctrl_addr2 = 0x0055; * ctrl_addr1 = 0x0010; }
/****************************************************************************/ /* program_flash: Routine to program FLASH AM29LV800 */ /* Inputs: */ /* flash_ptr : Address of the FLASH */ /* source_ptr : Address of the array containing the code to program */ /* length : Length to be programmed */ /* */ /****************************************************************************/
void program_flash(short * source_ptr, int * flash_ptr, int length) { int i;
/* Control addresses are left shifted so that */ /* they appear correctly on the EMIF's EA[19:2] */ /* Byte address << 2 == Word Address */ int * ctrl_addr1 = (int *) ((int)flash_ptr + (0x555 << 2)); int * ctrl_addr2 = (int *) ((int)flash_ptr + (0x2aa << 2));; for (i = 0; i < length; i++){
* ctrl_addr1 = 0x00aa; * ctrl_addr2 = 0x0055; * ctrl_addr1 = 0x00a0;
* flash_ptr++ = * source_ptr++; } }
|