📄 flash_nor_amd.c
字号:
/******************************************************************************\
* Copyright (C) 2005 COMMIT Incorporated.
* All Rights Reserved
*------------------------------------------------------------------------------
* Project................NEPTUNE Test
* MODULE NAME............NEPTUNE Memory Test interface on Poseidon
* Confidential Level.....Test
* FILENAME...............flash_nor_amd.c
*
* Department.............HW Circuit
*------------------------------------------------------------------------------
* HISTORY:
* Oct 14st, 2005, created by Zhenghongying for Poseidon Memory Intel BR28F128L18T85 test module
\******************************************************************************/
#include "led_bootled.h"
#include "flash_nor_intel.H"
#define SIZE16 192
extern const UWORD16 DATA16[SIZE16] = { 0x2345, 0x12AB, 0x1300, 0x1412, 0x1617, 0x1817, 0x1410, 0x1910,
0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888,
0x2645, 0x17AB, 0x1200, 0x1512, 0x1917, 0x1117, 0x1310, 0x1510,
0x1131, 0x2232, 0x2333, 0x0000, 0x5555, 0x8765, 0x7777, 0x8888,
0x1345, 0x125B, 0x1330, 0x1432, 0x1687, 0x1827, 0x1480, 0x1990,
0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888,
0x1323, 0x1234, 0x1345, 0x1486, 0x1696, 0x1834, 0x1476, 0x1974,
0x1011, 0x2202, 0x3330, 0x0444, 0x5055, 0x6606, 0x7770, 0x8ff8,
0x2ff5, 0x1fA0, 0xf300, 0x1f12, 0x16f7, 0x181f, 0xf410, 0x0910,
0x1311, 0x2242, 0x3335, 0x2444, 0x1555, 0x6646, 0x0377, 0x88f8,
0x2045, 0x12A0, 0x130f, 0x141f, 0x161f, 0x1810, 0x141f, 0xf910,
0x1011, 0x2202, 0x3330, 0x0444, 0xb055, 0x6606, 0x7270, 0x8058,
0x23f5, 0x1fAB, 0x130f, 0xf412, 0x1f17, 0x181f, 0x14f0, 0x191f,
0x1131, 0x2222, 0x3333, 0x4404, 0x555b, 0x6006, 0x7277, 0x8858,
0x2355, 0x12AB, 0x1300, 0x1412, 0x1617, 0x1847, 0x1410, 0x1910,
0x1101, 0x2222, 0x3333, 0xd444, 0x55b5, 0x0666, 0x7377, 0x8868,
0x2945, 0x12AB, 0x1300, 0x1412, 0x1617, 0x1417, 0x1410, 0x1910,
0x2311, 0x2222, 0x3333, 0x4d44, 0x5b55, 0x6660, 0x7477, 0x8588,
0x2045, 0x12AB, 0x1300, 0x1412, 0x1617, 0x4817, 0x1410, 0x1910,
0xffff, 0x2222, 0x3333, 0x44d4, 0x5550, 0x6606, 0x7577, 0x4888,
0x0000, 0x12AB, 0x1300, 0x1412, 0x1617, 0x1814, 0x1410, 0x1910,
0x3453, 0x2222, 0x3333, 0x444d, 0x5505, 0x6066, 0x7677, 0x3888,
0x2234, 0x12AB, 0x1300, 0x1412, 0x1617, 0x1844, 0x1410, 0x1910,
0x1456, 0x2222, 0x3333, 0x4d44, 0x5055, 0x0666, 0x7877, 0x2888 };
extern const UWORD16 DATA16[];
extern const UWORD16 DATA16[];
extern const UWORD16 DATA1[SIZE16] = { 0xaaaa, 0xbbbb, 0xcccc, 0xdddd, 0xeeee, 0xffff, 0xaaaa, 0xaaaa,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xcccc, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xdddd, 0xeeee,
0xeeee, 0xeeee, 0xffff, 0xffff, 0xffff, 0xaaaa, 0x1480, 0x1990,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0xbbbb, 0xbbbb, 0xcccc, 0xcccc, 0xdddd, 0xdddd, 0xeeee, 0xeeee,
0xffff, 0xffff, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xbbbb, 0xbbbb,
0x1456, 0x2222, 0x3333, 0x4d44, 0x5055, 0x0666, 0x7877, 0x2888 };
#define SIZE32 (SIZE16/2)
#define STEP 1
#define AMD_FLASH_BLOCK_SIZE_64KW 0xffff /* in Bytes */
int Test_non_array_access()
{
UWORD16 * inCS3_ptr;
UWORD16 * lv_ptr16_cmd0;
UWORD16 * lv_ptr16_cmd1;
UWORD16 * lv_ptr16_cmd2;
// int CS3_BASE_ADDR_ARM;
int temp;
// CS3_BASE_ADDR_ARM = 0x0c000000;
inCS3_ptr = (UWORD16 *)(0x0c000000 );
lv_ptr16_cmd0 = inCS3_ptr + 0x555;
lv_ptr16_cmd1 = inCS3_ptr + 0x2AA;
/*Manufacture ID*/
*lv_ptr16_cmd0 = 0x00AA;
*lv_ptr16_cmd1 = 0x0055;
*lv_ptr16_cmd0 = 0x0090;
/*read Manufacture ID*/
//if(*(inCS3_ptr+2)==0x0001)
if(*(inCS3_ptr)==0x0001)
{ temp = *(inCS3_ptr);
UART_Printf(UART2,"AMD Flash(S29PL127JBW000)Manufacture ID is OK!,0X%x\n\r",temp );
}
else
UART_Printf(UART2,"AMD Flash(S29PL127JBW000)Manufacture ID is %x read ERROR!\n\r",temp);
inCS3_ptr = (UWORD16*)(0x0C000000);
lv_ptr16_cmd0 = inCS3_ptr + 0x555;
lv_ptr16_cmd1 = inCS3_ptr + 0x2AA;
lv_ptr16_cmd2 = inCS3_ptr + 0x07;
/*Manufacture ID*/
*lv_ptr16_cmd0 = 0x00AA;
*lv_ptr16_cmd1 = 0x0055;
*lv_ptr16_cmd0 = 0x0090;
temp = *(lv_ptr16_cmd2);
UART_Printf(UART2,"Sector Block Lock/Unlock Indicator is %x\n\r",temp);
inCS3_ptr = (UWORD16*)(0x0C000000);
lv_ptr16_cmd0 = inCS3_ptr + 0x555;
lv_ptr16_cmd1 = inCS3_ptr + 0x2AA;
lv_ptr16_cmd2 = inCS3_ptr + 0x02;
/*Manufacture ID*/
*lv_ptr16_cmd0 = 0x00AA;
*lv_ptr16_cmd1 = 0x0055;
*lv_ptr16_cmd0 = 0x0090;
temp = *(lv_ptr16_cmd2);
UART_Printf(UART2," Indicator Bit is %x\n\r",temp);
///*Reset command */
//*inCS3_ptr = 0x00F0;
UART_Printf(UART2,"Please push anykey to return the top menu.\n\r");
return;
}
int Test_DYB_access()
{
UWORD16 * inCS3_ptr;
UWORD16 * inCS3_ptr1;
UWORD16 * lv_ptr16_cmd0;
UWORD16 * lv_ptr16_cmd1;
UWORD16 * lv_ptr16_cmd2;
// int CS3_BASE_ADDR_ARM;
int temp;
long int i;
// CS3_BASE_ADDR_ARM = 0x0c000000;
inCS3_ptr = (UWORD16 *)(0x0c000000 );
inCS3_ptr1 = (UWORD16 *)(0x0c000000 );
for (i=0;i<0x80000;i++)
{
lv_ptr16_cmd0 = inCS3_ptr + 0x555;
lv_ptr16_cmd1 = inCS3_ptr + 0x2AA;
/*Volatile Sector Protection Command Set Entry*/
*lv_ptr16_cmd0 = 0x00AA;
*lv_ptr16_cmd1 = 0x0055;
*lv_ptr16_cmd0 = 0x00E0;
/*DYB Status Read*/
// temp = * inCS3_ptr;
// UART_Printf(UART2," DYB Status Read is %x\n\r",temp);
/*DYB clear*/
* (inCS3_ptr) = 0xA0;
* (inCS3_ptr+i) = 0x01;
/*DYB Status Read*/
temp = * (inCS3_ptr+i);
// UART_Printf(UART2,"After Clear, DYB Status Read is %x\n\r",temp);
/* Volatile Sector Protection Command Set Exit*/
* inCS3_ptr = 0x90;
* inCS3_ptr = 0x00;
}
// /*Reset command */
// *inCS3_ptr = 0x00F0;
UART_Printf(UART2,"Please push anykey to return the top menu.\n\r");
return;
}
int Test_erase_access()
{
UWORD16 eraseNum;
UWORD16 * inErasePtr;
UWORD16 * lv_ptr16_cmd0;
UWORD16 * lv_ptr16_cmd1;
UWORD16 i;
inErasePtr = (UWORD16 *)(0x0c000000 );
lv_ptr16_cmd0 = inErasePtr + 0x555;
lv_ptr16_cmd1 = inErasePtr + 0x2AA;
/* Erase all blocks */
for(eraseNum=0;eraseNum<256;eraseNum++)
{
* lv_ptr16_cmd0 = 0XAA;
* lv_ptr16_cmd1 = 0X55;
* lv_ptr16_cmd0 = 0X80;
* lv_ptr16_cmd0 = 0XAA;
* lv_ptr16_cmd1 = 0X55;
* inErasePtr = 0x30;
inErasePtr += AMD_FLASH_BLOCK_SIZE_64KW;
for(i=0;i<1000;i++);
}
// /*Reset command */
*inErasePtr = 0x00F0;
UART_Printf(UART2,"Erase finish.\n\r");
UART_Printf(UART2,"Please push anykey to return the top menu.\n\r");
return;
}
int Test_write_access()
{
UWORD16 * lvptr16_cmd0;
UWORD16 * lvptr16_cmd1;
UWORD16 * lvAddr;
UWORD8 lvStatusReg;
UWORD16 lvDatum;
UWORD16 lvCounter;
UWORD16 temp;
UWORD16 Counter=0;
int i;
UWORD16 * inWritePtr;
UWORD16 * inCS3_ptr;
inWritePtr = (UWORD16 *)(0x0c020000 );
/*Program command sequence */
lvptr16_cmd0 = inWritePtr + 0x555;
lvptr16_cmd1 = inWritePtr + 0x2AA;
for (lvCounter = 0;lvCounter<SIZE16;lvCounter++)
{
/*Data to write*/
// lvDatum = DATA16[lvCounter];
lvDatum = DATA1[lvCounter];
/* Address to write to*/
lvAddr = inWritePtr + lvCounter;
/*Program command sequence */
*lvptr16_cmd0 = 0x00AA;
*lvptr16_cmd1 = 0x0055;
*lvptr16_cmd0 = 0x00A0;
/* Write data*/
*lvAddr = lvDatum;
temp = *lvAddr;
for(i=0;i<1000;i++);
}
for(i=0;i<100;i++);
for (lvCounter = 0;lvCounter<SIZE16;lvCounter++)
{
lvDatum = DATA1[lvCounter];
lvAddr = inWritePtr + lvCounter;
temp = *lvAddr;
if (temp != lvDatum)
{
Counter++;
}
}
if(Counter==0)
{
UART_Printf(UART2,"Flash_Write - OK!\n\r");
UART_Printf(UART2,"You write at %x is %x.\n\r",inWritePtr,DATA16[0]);
}
else
UART_Printf(UART2,"Flash_Write - ERROR!\n\r");
// /*Reset command */
*inWritePtr = 0x00F0;
UART_Printf(UART2,"Please push anykey to return the top menu.\n\r");
return;
}
void Copy_code()
{
long i,j,tmp;
UWORD16 * lvptr16_cmd0;
UWORD16 * lvptr16_cmd1;
UWORD16 * inWritePtr;
inWritePtr = (UWORD16 *)(0x0c000000 );
/*Program command sequence */
lvptr16_cmd0 = inWritePtr + 0x555;
lvptr16_cmd1 = inWritePtr + 0x2AA;
for(i=0;i<0x10000;i++)
{
*lvptr16_cmd0 = 0x00AA;
*lvptr16_cmd1 = 0x0055;
*lvptr16_cmd0 = 0x00A0;
/* Write data*/
*(unsigned long int * )(0x0c000000 + i) = *(unsigned long int *)(0x00000000 + i);
for(j=0;j<1000;j++);
}
// /*Reset command */
// *inWritePtr = 0x00F0;
UART_Printf(UART2,"Please push anykey to return the top menu.\n\r");
return;
}
void AMD_FLASH_TEST()
{
UWORD16 Restult_Test = 0;
int option;
*(unsigned int*)0xfffecc1c = 0x7fc044f8;
*(unsigned int*)0xfffecc5c = 0x00000018;
UART_Printf(UART2,"==================================================\n");
UART_Printf(UART2,"= AMD NOR Flash TEST =\n");
UART_Printf(UART2,"==================================================\n");
UART_Printf(UART2,"S29NS128 is DYB protect after power on ,\n\r");
UART_Printf(UART2,"User must unprotect DYB firstly.\n\r");
UART_Printf(UART2," 0:DYB Configuration\n\r");
UART_Printf(UART2," 1: Read ID\n\r");
UART_Printf(UART2," 2: ERASE TEST.\n\r");
UART_Printf(UART2," 3: Program A BLOCK.\n\r ");
UART_Printf(UART2," 4: WRITE A PARTITION.\n\r ");
UART_Printf(UART2," 5: Copy DDR to flash\n\r");
UART_Printf(UART2," Your choice : \n\r");
option=UART_GetNum(UART2);
switch(option)
{
case 0:
Test_DYB_access();
break;
case 1:
UART_Printf(UART2,"Read ID:\n\r");
Test_non_array_access();
break;
case 2:
Test_erase_access();
break;
case 3:
Test_write_access();
break;
case 4:
break;
case 5:
Copy_code();
break;
default:
break;
}
// UART_Printf(UART2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -