This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3359: NOR Flash Writer

Guru 15520 points

Part Number: AM3359

Hi,

I have a question about NOR Flash Writer which are included in ISDK v1.

In "norflash.c", there are following code which are accessing to NOR Flash.
*************************************************************
  /* Walk through each sector, erase any sectors within range */
    /* Start sector erase sequence */
    *(volatile UINT16 *)(FLASH_BASE + (0x555 <<1) ) = 0xAA;
    *(volatile UINT16 *)(FLASH_BASE + (0x2AA <<1) ) = 0x55 ;
    *(volatile UINT16 *)(FLASH_BASE + (0x555 <<1) ) = 0x80;
    *(volatile UINT16 *)(FLASH_BASE + (0x555 <<1) ) = 0xAA;
    *(volatile UINT16 *)(FLASH_BASE + (0x2AA <<1) ) = 0x55 ;
*************************************************************

It's shifting the address 1 bit(example : 0x555 << 1).
Do you know why it is shifiting the address?
We want to know the reason.
I will attach the "norflash.c".

best regards,
g.f.

/* 
 * Copyright (c) 2012 Texas Instruments Incorporated ALL RIGHTS RESERVED
 *
*/

/**
 *  @Component: NOR flash driver.  
 *
 *  @Filename: norFlash.c   
 *
 ============================================================================ */

#include <stdio.h>
#include "hw_types.h"
#include "norFlash.h"
#include "hw_gpmc.h"
#include "hw_cm_per.h"
#include "hw_control_polar.h"
#include "delay.h"
#include "gpio.h"
#include "uart.h"

extern UINT8 boardType;
//static UINT32 sectorEnd[FLASH_SECTORS];

void NORDelay
(
	UINT32 u32Delay
)
{
    volatile UINT32 u32LoopCntr;
    for ( u32LoopCntr = 0 ; u32LoopCntr < (u32Delay); u32LoopCntr++ ){ };
}

void NORDelay1
(
	UINT32 u32usec
)
{
	NORDelay( u32usec * 2 );
}




void SetNORAddrGPIOPin(UINT32 address)
{
	UINT16 gpioPinVal = 0;
	
	//*addrVariable = (UINT16)address;
	
	gpioPinVal = (UINT16)(address >> 20);
	

	GPIOEnableDisableOut(2,26, gpioPinVal & 0x01);
	GPIOEnableDisableOut(2,27,(gpioPinVal >> 1) & 0x01);
	GPIOEnableDisableOut(2,28,(gpioPinVal >> 2) & 0x01);
	GPIOEnableDisableOut(2,29,(gpioPinVal >> 3) & 0x01);
}

void SetNORAddrGPIOPinForICE2(UINT32 address)
{
    UINT16 gpioPinVal = 0;

    gpioPinVal = 3& (((UINT16)(address >> 19)));

    //printf("Change NOR sector to %i\n", gpioPinVal);

    GPIOEnableDisableOut(2,12, gpioPinVal & 0x01);
    GPIOEnableDisableOut(2,13,(gpioPinVal >> 1) & 0x01);
}
void ResetSetNORAddrGPIOPin()
{

	GPIOEnableDisableOut(2,26,0);
	GPIOEnableDisableOut(2,27,0);
	GPIOEnableDisableOut(2,28,0);
	GPIOEnableDisableOut(2,29,0);

}

void ResetSetNORAddrGPIOPinICE2()
{
    SetNORAddrGPIOPinForICE2(0);
}


/** **************************************************************************
 * gpmcPinMuxConf 
 *
 * This routine configure GPMC pin multiplexer.
 *  
 * Return
 * return SUCCESS   
 * 
 * 
 ***************************************************************************/

INT16 GPMCPinMuxConfNor()
{
	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(0)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD0_CONF_GPMC_AD0_RXACTIVE |
					 CONTROL_CONF_GPMC_AD0_CONF_GPMC_AD0_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(1)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD1_CONF_GPMC_AD1_RXACTIVE |
					 CONTROL_CONF_GPMC_AD1_CONF_GPMC_AD1_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(2)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD2_CONF_GPMC_AD2_RXACTIVE |
					 CONTROL_CONF_GPMC_AD2_CONF_GPMC_AD2_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(3)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD3_CONF_GPMC_AD3_RXACTIVE |
					 CONTROL_CONF_GPMC_AD3_CONF_GPMC_AD3_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(4)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD4_CONF_GPMC_AD4_RXACTIVE |
					 CONTROL_CONF_GPMC_AD4_CONF_GPMC_AD4_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(5)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD5_CONF_GPMC_AD5_RXACTIVE |
					 CONTROL_CONF_GPMC_AD5_CONF_GPMC_AD5_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(6)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD6_CONF_GPMC_AD6_RXACTIVE |
					 CONTROL_CONF_GPMC_AD6_CONF_GPMC_AD6_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(7)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD7_CONF_GPMC_AD7_RXACTIVE |
					 CONTROL_CONF_GPMC_AD7_CONF_GPMC_AD7_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(8)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD8_CONF_GPMC_AD8_RXACTIVE |
					 CONTROL_CONF_GPMC_AD8_CONF_GPMC_AD8_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(9)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD9_CONF_GPMC_AD9_RXACTIVE |
					 CONTROL_CONF_GPMC_AD9_CONF_GPMC_AD9_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(10)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD10_CONF_GPMC_AD10_RXACTIVE |
					 CONTROL_CONF_GPMC_AD10_CONF_GPMC_AD10_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(11)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD11_CONF_GPMC_AD11_RXACTIVE |
					 CONTROL_CONF_GPMC_AD11_CONF_GPMC_AD11_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(12)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD12_CONF_GPMC_AD12_RXACTIVE |
					 CONTROL_CONF_GPMC_AD12_CONF_GPMC_AD12_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(13)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD13_CONF_GPMC_AD13_RXACTIVE |
					 CONTROL_CONF_GPMC_AD13_CONF_GPMC_AD13_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(14)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD14_CONF_GPMC_AD14_RXACTIVE |
					 CONTROL_CONF_GPMC_AD14_CONF_GPMC_AD14_PUDEN;

	HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_AD(15)) =
				  PINMUXMODE_1 |
					 CONTROL_CONF_GPMC_AD15_CONF_GPMC_AD15_RXACTIVE |
					 CONTROL_CONF_GPMC_AD15_CONF_GPMC_AD15_PUDEN;


	if(boardType == AM335X_BOARD_TYPE_ICE_V2)
	{
		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_LCD_VSYNC) =           //A16
						PINMUXMODE_3 |
						  CONTROL_CONF_LCD_VSYNC_CONF_LCD_VSYNC_RXACTIVE |
						  CONTROL_CONF_LCD_VSYNC_CONF_LCD_VSYNC_PUDEN;

		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_LCD_HSYNC) =          //A17
						PINMUXMODE_3 |
							  CONTROL_CONF_LCD_HSYNC_CONF_LCD_HSYNC_RXACTIVE |
								 CONTROL_CONF_LCD_HSYNC_CONF_LCD_HSYNC_PUDEN;

		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_LCD_DATA(6)) =			//A18
						PINMUXMODE_8 |
							  CONTROL_CONF_LCD_DATA6_CONF_LCD_DATA6_RXACTIVE |
								 CONTROL_CONF_LCD_DATA6_CONF_LCD_DATA6_PUDEN;

		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_LCD_DATA(7)) =         //A19
						PINMUXMODE_8 |
							  CONTROL_CONF_LCD_DATA7_CONF_LCD_DATA7_RXACTIVE |
								 CONTROL_CONF_LCD_DATA7_CONF_LCD_DATA7_PUDEN;
		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_MII1_RXDV) =         //GPIO3_4 to disable SYSBOOT buffers
								PINMUXMODE_8 |
									  CONTROL_CONF_LCD_DATA7_CONF_LCD_DATA7_RXACTIVE |
										 CONTROL_CONF_LCD_DATA7_CONF_LCD_DATA7_PUDEN;
	}
	else
	{
		//MUXed mode - access higer address using GPIO .

		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_MMC0_DAT3) =
			   PINMUXMODE_8 |
				 CONTROL_CONF_MMC0_DAT3_CONF_MMC0_DAT3_RXACTIVE |
				 CONTROL_CONF_MMC0_DAT3_CONF_MMC0_DAT3_PUDEN;

		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_MMC0_DAT2) =
			   PINMUXMODE_8 |
				 CONTROL_CONF_MMC0_DAT2_CONF_MMC0_DAT2_RXACTIVE |
				 CONTROL_CONF_MMC0_DAT2_CONF_MMC0_DAT2_PUDEN;

		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_MMC0_DAT1) =
			   PINMUXMODE_8 |
				 CONTROL_CONF_MMC0_DAT1_CONF_MMC0_DAT1_RXACTIVE |
				 CONTROL_CONF_MMC0_DAT1_CONF_MMC0_DAT1_PUDEN;

		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_MMC0_DAT0) =
				   PINMUXMODE_8 |
					 CONTROL_CONF_MMC0_DAT0_CONF_MMC0_DAT0_RXACTIVE |
					 CONTROL_CONF_MMC0_DAT0_CONF_MMC0_DAT0_PUDEN;

	}

   /* control pins */
    HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_WEN ) =
   	      PINMUXMODE_1 |
   	       CONTROL_CONF_GPMC_OEN_REN_CONF_GPMC_OEN_REN_RXACTIVE |
           CONTROL_CONF_GPMC_OEN_REN_CONF_GPMC_OEN_REN_PUDEN;

    HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_CSN(0) ) =
   	      PINMUXMODE_1 |
          CONTROL_CONF_GPMC_OEN_REN_CONF_GPMC_OEN_REN_RXACTIVE |
          CONTROL_CONF_GPMC_OEN_REN_CONF_GPMC_OEN_REN_PUDEN;

    HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_OEN_REN) =
     	      PINMUXMODE_1 |
              CONTROL_CONF_GPMC_OEN_REN_CONF_GPMC_OEN_REN_RXACTIVE |
              CONTROL_CONF_GPMC_OEN_REN_CONF_GPMC_OEN_REN_PUDEN;



	if(boardType == AM335X_BOARD_TYPE_ICE)
	{
		HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_WAIT0) =
			  PINMUXMODE_1 |
				 CONTROL_CONF_GPMC_WAIT0_CONF_GPMC_WAIT0_RXACTIVE &
				 ~CONTROL_CONF_GPMC_WAIT0_CONF_GPMC_WAIT0_PUDEN &
				 ~CONTROL_CONF_GPMC_WAIT0_CONF_GPMC_WAIT0_SLEWCTRL;
	}

    HWREG(CTRL_MODULE_BASE_ADDR + CONTROL_CONF_GPMC_ADVN_ALE ) =
    	( PINMUXMODE_1 |
    	CONTROL_CONF_GPMC_ADVN_ALE_CONF_GPMC_ADVN_ALE_RXACTIVE |
    	CONTROL_CONF_GPMC_ADVN_ALE_CONF_GPMC_ADVN_ALE_PUDEN );

    return SUCCESS;
}



/****************************************************************************
 * NORInit 
 *
 * This routine initializes the NOR flash by configuring GPMC.
 * 
 * Param 
 * None  
 *
 * Return
 * return SUCCESS for success  
 * return FAIL for error   
 * 
 */

INT16 NORInit(void)
{
    UINT16 csNum = 0;
    UINT32 temp = 0;

	NORDelay(100000);

    /* Initialize the GPIO driver */
   // GPIOInitialization(SA_PORT2);

	NORDelay(100000);


    //enable clock to GPMC module
    HWREG(PRCM_BASE_ADDR + CM_PER_GPMC_CLKCTRL ) |=
        		CM_PER_GPMC_CLKCTRL_MODULEMODE_ENABLE;
    //check to see if enabled
    while( (HWREG(PRCM_BASE_ADDR + CM_PER_GPMC_CLKCTRL) & CM_PER_GPMC_CLKCTRL_IDLEST) !=
        		(CM_PER_GPMC_CLKCTRL_IDLEST_FUNC << CM_PER_GPMC_CLKCTRL_IDLEST_SHIFT));

    //reset the GPMC module
    HWREG(GPMC_BASE + GPMC_SYSCONFIG ) |= GPMC_SYSCONFIG_SOFTRESET;
    while((HWREG(GPMC_BASE + GPMC_SYSSTATUS) & GPMC_SYSSTATUS_RESETDONE) ==
        		GPMC_SYSSTATUS_RESETDONE_RSTONGOING);


        //Configure to no idle
    temp = HWREG(GPMC_BASE + GPMC_SYSCONFIG);
    temp &= ~GPMC_SYSCONFIG_IDLEMODE;
    temp |= GPMC_SYSCONFIG_IDLEMODE_NOIDLE << GPMC_SYSCONFIG_IDLEMODE_SHIFT;
    HWREG(GPMC_BASE + GPMC_SYSCONFIG) = temp;

    HWREG(GPMC_BASE + GPMC_IRQENABLE) = 0x0;
    HWREG(GPMC_BASE + GPMC_TIMEOUT_CONTROL) = 0x0;

    //configure for NOR and granularity x2
    HWREG(GPMC_BASE + GPMC_CONFIG1(csNum)) = (0x0 |
    	//(GPMC_CONFIG1_0_DEVICESIZE_EIGHTBITS <<
    	(GPMC_CONFIG1_0_DEVICESIZE_SIXTEENBITS <<
    			     GPMC_CONFIG1_0_DEVICESIZE_SHIFT ) |
	     (GPMC_CONFIG1_ATTACHEDDEVICEPAGELENGTH_FOUR <<
	      GPMC_CONFIG1_ATTACHEDDEVICEPAGELENGTH_SHIFT ) |
	      (0x2 << 8 )	//Address/Data Multiplex enable
	     );

    HWREG(GPMC_BASE + GPMC_CONFIG2(csNum)) = (0x0 |
    		  (CS_ON_TIME ) |
              (CS_DEASSERT_RD << GPMC_CONFIG2_0_CSRDOFFTIME_SHIFT) |
              (CS_DEASSERT_WR << GPMC_CONFIG2_0_CSWROFFTIME_SHIFT));

    HWREG(GPMC_BASE + GPMC_CONFIG3(csNum)) = (0x0 |
             (ADV_ASSERT << GPMC_CONFIG3_0_ADVONTIME_SHIFT) |
	     (ADV_DEASSERT_RD << GPMC_CONFIG3_0_ADVRDOFFTIME_SHIFT) |
	     (ADV_DEASSERT_WR << GPMC_CONFIG3_0_ADVWROFFTIME_SHIFT));

    HWREG(GPMC_BASE + GPMC_CONFIG4(csNum)) = (0x0 |
             (OE_ASSERT << GPMC_CONFIG4_0_OEONTIME_SHIFT) |
	     (OE_DEASSERT << GPMC_CONFIG4_0_OEOFFTIME_SHIFT) | 
	     (WE_ASSERT << GPMC_CONFIG4_0_WEONTIME_SHIFT)|
	     (WE_DEASSERT << GPMC_CONFIG4_0_WEOFFTIME_SHIFT));

    HWREG(GPMC_BASE + GPMC_CONFIG5(csNum)) = (0x0 |
	     (CFG_5_RD_CYCLE_TIM << GPMC_CONFIG5_0_RDCYCLETIME_SHIFT)|
	     (CFG_5_WR_CYCLE_TIM << GPMC_CONFIG5_0_WRCYCLETIME_SHIFT)|
	     (CFG_5_RD_ACCESS_TIM << GPMC_CONFIG5_0_RDACCESSTIME_SHIFT)
	     );

    HWREG(GPMC_BASE + GPMC_CONFIG6(csNum)) = (0x0 |
		   (GPMC_CONFIG6_0_CYCLE2CYCLESAMECSEN_C2CDELAY <<
		   	     GPMC_CONFIG6_0_CYCLE2CYCLESAMECSEN_SHIFT) |
		   (CYC2CYC_DELAY << GPMC_CONFIG6_0_CYCLE2CYCLEDELAY_SHIFT) |
	     (WR_DATA_ON_ADMUX << GPMC_CONFIG6_0_WRDATAONADMUXBUS_SHIFT)|
	     (CFG_6_WR_ACCESS_TIM << GPMC_CONFIG6_0_WRACCESSTIME_SHIFT));

    HWREG(GPMC_BASE + GPMC_CONFIG7(0)) =
        (CFG_7_BASE_ADDR << GPMC_CONFIG7_0_BASEADDRESS_SHIFT) |
        (0x1 << GPMC_CONFIG7_0_CSVALID_SHIFT) |
        (CFG_7_MASK << GPMC_CONFIG7_0_MASKADDRESS_SHIFT);
#if 0
	if(boardType == AM335X_BOARD_TYPE_ICE)
	{
		/* Populate sector table */
		for (i = 0; i < FLASH_SECTORS; i++)
		{
			sectorEnd[i] = FLASH_BASE +(((i + 1) * FLASH_SECTORSIZE) - 1);
		}
	}
#endif
	NORDelay(200000);

#if 0
	status = GPIOSetOutputPin(SA_PORT2,	SA_PORT2_PIN25);

	if(SUCCESS != status)
	{
	    UARTDebugSendString("\n\n\t\t GPIO INITIALIZED FAILED");
	    return (status);
	}

    status = GPIOEnableDisableOut(SA_PORT2, SA_PORT2_PIN25, 0);
	if(SUCCESS != status)
	{
		return (status);
	}
	NORDelay(2000);


    status = GPIOEnableDisableOut(SA_PORT2, SA_PORT2_PIN25, 1);
	if(SUCCESS != status)
	{
		return (status);
	}
#endif
	//NORDelay(200000);
	NORDelay(2000);
    return SUCCESS;
}


/** **************************************************************************
 * norFlashGetId
 *
 * This routine will get the NOR device's manufacture ID and device IDs
 * 
 * Param	id [IN]		Buffer pionter to copy IDs. 
 *
 * Return
 * return SUCCESS 
 * 
 */

INT16 NORFlashGetId( UINT16* id)
{
	volatile UINT16* pmfgid  = ( UINT16* )FLASH_BASE;

	NORDelay(20000);

	//printf("Error Type1 : %X \n", HWREG(GPMC_BASE + GPMC_ERR_TYPE) );

    HWREGB(FLASH_BASE + (0x555 << 1 ) ) = 0xAA;
    HWREGB(FLASH_BASE + (0x2AA << 1 ) ) = 0x55;
    HWREGB(FLASH_BASE + (0x555 << 1 ) ) = 0x90;

	/* Insert small delay for device to respond */
	*id++ = *pmfgid;             // Read MFG_ID
	NORDelay(10);
    *id++ = *(pmfgid + 0x01);    // Read DEV_ID1
    NORDelay(10);

    *id++ = * ( volatile UINT16* ) ( ( (unsigned long) pmfgid ) + (0x08002 << 1));    // Read DEV_ID2

    NORDelay(10);

    *((UINT8 *)FLASH_BASE) = FLASH_RESET;

    NORDelay(20000);
    return SUCCESS;
}



/** **************************************************************************
 * norFlashErase
 * This routine will erase the NOR flash sectors.
 *
 * Param	sectorAddr [IN]	  Starting address of the sector to be erased.
 * 		length 	   [IN]   Size to be erased.
 * 
 *  
 *
 * Return
 * return SUCCESS for success  
 * 
 */

INT16 NORFlashErase( UINT32 sectorAddr, UINT32 length )
{
    volatile UINT16 *pData;
    volatile int i=0;

    UARTPrint1("Erasing sectorBase: ", sectorAddr);

	if(boardType == AM335X_BOARD_TYPE_ICE)
	{
		//NOR_ACCESS_USING_GPIO
		SetNORAddrGPIOPin(sectorAddr);
	}
	else if(boardType == AM335X_BOARD_TYPE_ICE_V2)
	{
	    SetNORAddrGPIOPinForICE2(sectorAddr);
	}

  /* Walk through each sector, erase any sectors within range */
    /* Start sector erase sequence */
    *(volatile UINT16 *)(FLASH_BASE + (0x555 <<1) ) = 0xAA;
    *(volatile UINT16 *)(FLASH_BASE + (0x2AA <<1) ) = 0x55 ;
    *(volatile UINT16 *)(FLASH_BASE + (0x555 <<1) ) = 0x80;
    *(volatile UINT16 *)(FLASH_BASE + (0x555 <<1) ) = 0xAA;
    *(volatile UINT16 *)(FLASH_BASE + (0x2AA <<1) ) = 0x55 ;

    /* Start erase at sector address */
    pData = (UINT16 *)sectorAddr;
    *pData = FLASH_ERASE_SECTOR;

    /* Wait for erase to complete */
    while(1)
		if(*pData & NOR_ERASE_COMPLETE)
              break;

    printf("Erasing sectorBase %x \n", sectorAddr);
    /* Put back in read mode */
    *((volatile UINT16 *)FLASH_BASE) = FLASH_RESET;

    for(i=0; i<100; i++)
    	DELAYMicroSeconds(10000);

    return SUCCESS;
}



/** **************************************************************************
 * norFlashRead
 * This routine will read length bytes from the specified address of the flash 
 * 
 *  Param	src [IN] 	Starting address of the flash.
 *  		dst [IN] 	Read data buffer
 *  		length [IN] 	Total number of words to be read
 *
 * Return
 * return SUCCESS for success  
 * 
 */

INT16 NORFlashRead( UINT16* dst1, UINT16* src1, UINT32 length )
{
    UINT32 i;
    UINT16* psrc16 = ( UINT16* )src1;
    UINT16* pdst16 = ( UINT16* )dst1;

    UARTPrint1("Reading the Flash values", 0);

    /*
     *  Read Data to Buffer
     */
    for ( i = 0 ; i < length ; i ++ )
    {
        *pdst16++ = *psrc16++;
    }

    return SUCCESS;
}



/** **************************************************************************
 * norFlashWrite
 *  This routine will write length bytes from the source buffer
 *  to the specified address of the flash 
 * 
 *  Param	src [IN] 	Buffer to be written
 *  		dst [IN] 	Starting address of the flash where data to be 
 *  				written
 *  		length [IN] 	Total number of words to be written
 *
 * Return
 * return SUCCESS for success  
 */

INT16 NORFlashWrite( UINT16* src1, UINT16* dst1, UINT32 length )
{
    UINT32 i;
    volatile UINT16* psrc16 = ( UINT16* )src1;
    volatile UINT16* pdst16 = ( UINT16* )dst1;
    volatile UINT32 address = FLASH_BASE;

    UARTPrint1("Writing the Flash", 0);
    //printf("Writing to NOR Flash @ %x",dst1);
	
	if(boardType == AM335X_BOARD_TYPE_ICE)
	{
		//NOR_ACCESS_USING_GPIO
		SetNORAddrGPIOPin((UINT32)pdst16);
	}
    else if(boardType == AM335X_BOARD_TYPE_ICE_V2)
    {
        SetNORAddrGPIOPinForICE2((UINT32)pdst16);
    }

    for ( i = 0 ; i < length ; i ++ )
    {
    	*(UINT16*) (address + (0x555<<1) ) = 0xAA;
    	*(UINT16*) (address + (0x2AA<<1) ) = 0x55;
    	*(UINT16*) (address + (0x555<<1) ) = 0xA0;
		
    	*pdst16 = *psrc16;

         /* Wait for programming to complete */
         while(1)
             if((*pdst16 & 0x80) != (*psrc16 & 0x80))
                 break;

         *((UINT16 *)FLASH_BASE) = FLASH_RESET;

         DELAYMicroSeconds(200);

         if( ( (i%1024) == 0) & (i != 0) )
                UARTPrint("Flash Programming at %X and X 2KB", (UINT32) pdst16, i/1024, i, 0);

         pdst16++;
         psrc16++;
    }

    *((UINT16 *)FLASH_BASE) = FLASH_RESET;

    UARTPrint1("Writing the Flash is completed", 0);
    //printf("Writing the Flash is completed ");

    return SUCCESS;
}