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

📄 my_640j3.c

📁 640J3的Flash的驱动和测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************
公司:      好易通科技有限公司
产品名:    TETRA数字集群终端
CPU:       OMAP5910
功能:      28F640J3C flash测试
作者:      YuanLin
编写时间:  2004.12.31
修改时间: 2005.06.02
****************************************************/

#include "640J3.h"
#include "io.h"
#include "type.h"
//#include "Header.h"

#define BYTE_NUM          15
#define WRITE_FLASH_ADDR  BLOCK_BASE_FLASH_ADDRESS

/****************************************************************************
 * Function:
 *    This procedure is called to read,write,erase,lock and unlock operation.
 *
 * Parameters: None
 *
 * Returns: NONE
 ***************************************************************************/
/************ Flash Operate routine ************/
void TestFlash(void)
{
    UINT16    i;
    Flash_Status state;
    UINT32  ManufactureCode;
    
    BYTE *p_buffer;
    BYTE buffer[BYTE_NUM] = {0x77, 0x77, 0x77, 0x77,
                             0x77, 0x77, 0x77, 0x77,
                             0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77};   
    
    p_buffer = &buffer[0];            //why can not use p_buffer = buffer

    Flash_init();
    
    /* Read Device ID */
    ManufactureCode = ReadDeviceID( (UINT32 *)BASE_FLASH_ADDRESS );
    asm (" NOP");
    printf("\n-----the flash manufacture id is 0x%x\n", ManufactureCode);

    for( i = 0; i < 40000; i++ )               /* Delay for next operation */
    {
    }

    /* Erase all Blocks,all 64 blocks */
	for ( i=0; i < TOTAL_NUMBLOCKS; i++ )  /* 64M bits memory,64 blocks */
	{
	    state = EraseBlock( i );
	    if ( state.Result != StatCompleted )
	    {
	        break;
	    }
	    printf("The %dth block have been erased\n", i);
	}

    if( state.Result == StatCompleted )
    {
        if( !( state.SR & 0x0020 )  )         /* Status register NO.4 and NO.5 bit */
        {
            printf("\n-----All Blocks Successful Erase!\n");
        }
        else
        {
            printf("\n-----All Blocks Erase Error!\n");
        }
    }
    else
    {
        if( !( state.SR & 0x0020 )  )         /* Status register NO.4 and NO.5 bit */
        {
            printf("\n-----All Blocks Successful Erase! But Time Over\n");
        }
        else
        {
            printf("\n-----All Blocks Erase Error and Time Over!\n");
        }
    }
    
    /* Program , Write Data into Flash */
    //i = 0xaa55;    //0xaa55
    //state = ProgramFlash( BLOCK_BASE_FLASH_ADDRESS, i );
    //ManufactureCode = ReadFlash( BLOCK_BASE_FLASH_ADDRESS );
    //ManufactureCode &= 0x0000ffff;
    
    //Programming the flash with write buffer
    state = ProgramFlashBuffered(WRITE_FLASH_ADDR, p_buffer, BYTE_NUM);
    
    if(state.SR == 0x80)
    {
        printf("\n-----WriteBuffer Program Successful!\n");
    }
    else
    {
        printf("\n-----WriteBuffer Program Error!\n");
    }
    /*
    if((ManufactureCode == i) && (state.Result == StatCompleted))
    {
        printf("\n-----Program Successful!\n");
    }
    else
    {
        printf("\n-----Program Error!\n");
    } 
    */
    return;
}

/****************************************************************************
 * Function:
 *    This procedure is called to read device ID.
 *
 * Parameters: pManufactureCode ---- The manufacture code
 *             pDeviceCode ---- The device code
 *
 * Returns: NONE
 ***************************************************************************/
/************ Read Device ID ************/
UINT32 ReadDeviceID( UINT32 *pManuCode )
{
    UINT32 Deviceid;
    
    WriteFlash( BASE_FLASH_ADDRESS, READ_ID_CODES );  /* Write read ID command 0x0090 */
    Delay(1000);
    //Flash_wpoff();      //turn off the write protect
    Deviceid = ReadFlash( BASE_FLASH_ADDRESS );       /* Read Manufacture Code */
    
    /* return device to read array mode */
    WriteFlash( BASE_FLASH_ADDRESS, READ_ARRAY );           /* Enter into read array mode command 0x00ff */

    return(Deviceid);
}
    /* return device to read array mode */
//    WriteFlash( BASE_FLASH_ADDRESS, READ_ARRAY );           /* Enter into read array mode command 0x00ff */
    /* Flash_Stat.Result = StatCompleted;
    return( Flash_stat ); */

/****************************************************************************
 * Function:
 *    This procedure is called to read data(word).
 *
 * Parameters: address ---- The address which data read
 *             value ---- The data read
 *
 * Returns: NONE
 ***************************************************************************/
/************* Read Data *****************/
UINT32 ReadFlash( UINT32 address )
{
    UINT32  fptr;

    //fptr   = ( UINT32_PTR )address;
    //*pvalue = *fptr;
    fptr = GetIo32(address);
    
    return(fptr);
}

/****************************************************************************
 * Function:
 *    This procedure is called to erase a block.
 *
 * Parameters: blocknum ---- The number of block
 *
 * Returns: stat ---- The state of flash
 ***************************************************************************/
/********************** Erase a Block ********************************/
Flash_Status EraseBlock( UINT16 blocknum )
{
    Flash_Status   stat;
    UINT32 blockadd;

    stat = GetBlockAddress( blocknum, &blockadd );

    if ( stat.Result != StatCompleted )
    {
        return( stat );
    }
    WriteFlash( BASE_FLASH_ADDRESS,  CLEAR_STATUS_REGISTER );  // address 0x0000,clear status register command 0x0050 
//    stat.SR = ReadStatus(); 
  
    WriteFlash(blockadd, BLOCK_ERASE);       // block erase 1st command 0x0020 
     
    WriteFlash(blockadd, CONFIRM);           // block erase 2nd command 0x00d0 

    while((ReadStatus() != 0x0080));
    
    stat.SR = ReadStatus();

    /* return device to read array mode */
    WriteFlash(BASE_FLASH_ADDRESS, READ_ARRAY ); /*Write 00FFH after the last 
                                   operation to reset the device to array mode*/
    return( stat );
}

/****************************************************************************
 * Function:
 *    This procedure is called to program a word.
 *
 * Parameters: address ---- The program address
 *             value ---- The program value
 *
 * Returns: None
 ***************************************************************************/
/*************** Program a data ************************/
void WriteFlash( UINT32 address, UINT16 value )
{
    *(UINT16 *)address = value;
}

/****************************************************************************
 * Function:
 *    This procedure is called to wait erase complete.
 *
 * Parameters: timeout ---- Erase time
 *
 * Returns: TRUE ---- Erase time OK
 *          FALSE ---- Erase time over
 ***************************************************************************/
/***************** Wait erase complete *****************/
BYTE WaitUntilReady( UINT16 timeout )
{
    while( timeout )
    {
        if ( mIsStatusReady( ReadStatus() ) )
        {
            return( TRUE );      /* Have written finish, time doesn't be over */
        }
        timeout--;
    }

    return( FALSE );
}

/****************************************************************************
 * Function:
 *    This procedure is called to read flash status.
 *
 * Parameters: None
 *
 * Returns: status ---- Read the flash status
 ***************************************************************************/
/****************** Read Status ********************/
UINT16 ReadStatus( void )
{
    UINT16 status;
    
    *(UINT16 *)0x0c120000 = 0x0070;  //before: 0x0c000000 
                                     //Modified by wzhui, address = any address within the device
    status = *(UINT16 *)0x0c120000;
//    WriteFlash( BASE_FLASH_ADDRESS, READ_STATUS_REGISTER );  /* any address, this set 0x0000; read status command 0x0070 */
//    status = ReadFlash( BASE_FLASH_ADDRESS );            /* any address, get status register state */

    return( status );
}

/*********************** Erase Block Suspend ***********************/
Flash_Status EraseSuspend( UINT16 blocknum )
{
	Flash_Status stat;
	UINT32  blockaddr;
//	UINT16  status;

	stat = GetBlockAddress( blocknum, &blockaddr );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

    WriteFlash( BASE_FLASH_ADDRESS, CLEAR_STATUS_REGISTER );  /* Clear status register */

	WriteFlash( blockaddr, BLOCK_SUSPEND );

	if ( !WaitUntilReady( PROGRAM_TIMEOUT ) )
	{
	    stat.Result = StatTimeout;
	}
	else
	{
	    stat.Result = StatCompleted;
	}

    stat.SR = ReadStatus();

	/* return device to read array mode */
	WriteFlash( BASE_FLASH_ADDRESS, READ_ARRAY );

	return( stat );
}

/******************** Extended Query *****************/
Flash_Status ExtendedQuery( struct ExtQueryData *extquery )
{
	Flash_Status          stat;
	struct Flash_QueryData      query;
	UINT32                item;
	UINT32                addr;
	UINT32                longitem;
	UINT32                i;
	UINT32                offset;

	stat = Flash_Queryc( &query );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

	offset = query.ExtTablePtr;
	WriteFlash( BASE_FLASH_ADDRESS, READ_QUERY );

	/* read extended query string */
	for ( i=0; i < 3; i++ )
	{
	    stat = GetQueryAddress( offset, &addr );
	    if ( stat.Result != StatCompleted )
	    {
	    		return( stat );
	    }
//	    ReadFlash( addr, &item );
	    item &= 0xff;
	    extquery->ExtQueryStr[i] = (char)item;
	    offset++;
	}
	extquery->ExtQueryStr[3] = '\0'; /* null terminate string */

	/* read major version number */
	stat = GetQueryAddress( offset, &addr );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

//	ReadFlash( addr, &item );
	item &= 0xff;
	extquery->MajorVersionNum = (BYTE)item;
	offset++;

	/* read minor version number */
	stat = GetQueryAddress( offset, &addr );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

//	ReadFlash( addr, &item );
	item &= 0xff;
	extquery->MinorVersionNum = (BYTE)item;
	offset++;
	extquery->OptionalFeature = 0;
	for ( i=0; i < 4; i++ )
	{
	    stat = GetQueryAddress( offset, &addr );

	    if ( stat.Result != StatCompleted )
	    {
	        return( stat );
	    }

//	    ReadFlash( addr, &item );
	    item &= 0xff;
	    longitem = (UINT32)((UINT32)item << (8*i));
	    extquery->OptionalFeature = (UINT32)( extquery->OptionalFeature | longitem );
	    offset++;
	}

	/* read after suspend functions */
	stat = GetQueryAddress( offset, &addr );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

//	ReadFlash( addr, &item );
	item &= 0xff;
	extquery->AfterSuspendFunctions = (BYTE)item;
	offset++;

	/* read vendor id */
	extquery->BlockLockStatus = 0;
	for ( i=0; i < 2; i++ )
	{
	    stat = GetQueryAddress( offset, &addr );

	    if ( stat.Result != StatCompleted )
	    {
	        return( stat );
	    }

//	    ReadFlash( addr, &item );
	    item &= 0xff;
	    item = item << (8*i);
	    extquery->BlockLockStatus = (UINT16)( extquery->BlockLockStatus | item );
	    offset++;
	}

	/* read vcc optimum */
	stat = GetQueryAddress( offset, &addr );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

//	ReadFlash( addr, &item );
	item &= 0xff;
	extquery->VccOptimum = (BYTE)item;
	offset++;

	/* read vpp optimum */
	stat = GetQueryAddress( offset, &addr );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

//	ReadFlash( addr, &item );
	item &= 0xff;
	extquery->VppOptimum = (BYTE)item;
	offset++;
	stat.Result = StatCompleted;

	/* return device to read array mode */
	WriteFlash( BASE_FLASH_ADDRESS, READ_ARRAY );

	return( stat );
}


/************************ Get Query Address *************************/
Flash_Status GetQueryAddress ( UINT32 offset, UINT32_PTR address )
{
    Flash_Status stat;

    *address = offset << 1;
    *address += BASE_FLASH_ADDRESS;
    stat.Result = StatCompleted;

    return( stat );
}

/************************ Get Block Address *************************/
Flash_Status GetBlockAddress( UINT16 blocknum, UINT32 *address )
{
	Flash_Status stat;

	if ( blocknum < TOTAL_NUMBLOCKS )  /* 64 blocks */
	{
	    *address = BASE_FLASH_ADDRESS + ( blocknum * BLOCK_NUMBYTES );  /* 1M bits/block */
	}
	else
	{
	    stat.Result = StatBadBlock;
	    return( stat );
	}

	stat.Result = StatCompleted;

	return( stat );
}

/******************** Set Block Lock bit *************************/
Flash_Status LockBlock( UINT16 blocknum )
{
	Flash_Status   stat;
	UINT32         blockaddr;

	stat = GetBlockAddress( blocknum, &blockaddr );

	if ( stat.Result != StatCompleted )
	{
	    return( stat );
	}

    WriteFlash( BASE_FLASH_ADDRESS, CLEAR_STATUS_REGISTER );  /* Clear status register */

	WriteFlash( blockaddr, CONFIG_SETUP );
	WriteFlash( blockaddr, LOCK_BIT_SET );

	if ( !WaitUntilReady( PROGRAM_TIMEOUT ) )
	{
	    stat.Result = StatTimeout;
	}
	else
	{
	    stat.Result = StatCompleted;
	}

    stat.SR = ReadStatus();

	/* return device to read array mode */
	WriteFlash( BASE_FLASH_ADDRESS, READ_ARRAY );

	return( stat );
}

/******************** Protect lock *************************/
Flash_Status LockProtection( void )
{
	UINT32      baseadd;
	UINT32      location;
	UINT32      address;
	Flash_Status stat;

	location = PROTECTION_LOCK_LOCATION;      /* 0 */
	baseadd = BASE_FLASH_ADDRESS;             /* 0 */
	address = OTP_BASE + BASE_FLASH_ADDRESS;  /* 256 ????? */
	address += ( location * sizeof(UINT16) ); /* use word mode */

    WriteFlash( BASE_FLASH_ADDRESS, CLEAR_STATUS_REGISTER );  /* Clear status register */

	WriteFlash(baseadd, OTP_PROGRAM );  /* any address, 1st command 0x00c0 */
	WriteFlash(address, OTP_LOCK);      /* program address, 0xfffd */

	if ( !WaitUntilReady( PROGRAM_TIMEOUT ) )
	{
	    stat.Result = StatTimeout;
	}
	else
	{
        stat.Result = StatCompleted;
	}

    stat.SR = ReadStatus();

	/* return device to read array mode */
	WriteFlash(BASE_FLASH_ADDRESS, READ_ARRAY );

	return( stat );
}

/************************ Enable Page Mode ***************************/
Flash_Status PageMode( UINT16 enable )
{
	Flash_Status stat;
	UINT32      address; /* contains the address to load the Read Configuration Register with */
	if ( enable )
	{
	    address = PAGE_READ_MODE;
	}
	else
	{

⌨️ 快捷键说明

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