?? flashrom.c
字號:
#include "flashrom.h"
#include "def.h"
/*** Am29LV800D 檢查是否為空 ***
扇區的值若為oxFFFF則判斷為空 ****/
int Am29LV800D_CheckBlank(U32 addr,U32 wordsize) //addr=0xf0000;wordsize=32Kword
{
U32 i,temp;
for (i=addr;i<(addr+wordsize*2);i+=2) //word=16bit
{
temp=*((volatile U16 *)(i));
if(temp!=0xffff)
return 0;
}
return 1;
}
/****** Am29LV800D 的檢測 ******/
int Waitfor_endofprg(void)
{
volatile U16 flashStatus,old;
old=*((volatile U16 *)0x0);
while(1)
{
flashStatus=*((volatile U16 *)0x0);
if( (old&0x40) == (flashStatus&0x40) ) break;
if( flashStatus&0x20 ) //DQ5
{
old=*((volatile U16 *)0x0);
flashStatus=*((volatile U16 *)0x0);
if( (old&0x40) == (flashStatus&0x40) )
return 0;
else return 1;
}
old=flashStatus;
}
return 1;
}
/*** Am29LV800D 的寫入操作,是一個word(16bit)寫入的 ***/
int Am29LV800D_WordProg (U32 addr,U16 dat)//addr=0xf0000;data=0xaa55
{
CMD_ADDR0 = 0xAA;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xA0;
*((volatile U16 *)(addr)) = dat;
return(Waitfor_endofprg());
}
/*** Am29LV800D 扇區擦除 ***/
void Am29LV800D_SectorErase(U32 section_addr)//section_addr=0xf0000
{
CMD_ADDR0 = 0xAA;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x80;
CMD_ADDR0 = 0xAA;
CMD_ADDR1 = 0x55;
*((volatile U16 *)(section_addr)) = 0x30;
Waitfor_endofprg();
}
/*** Am29LV800D讀數據 ***/
U16 Am29LV800D_WordRead(U32 addr)//addr=0xf0000
{
U16 data;
data = *((volatile U16 *)(addr));
return data;
}
/*** 讀取 Am29LV800D 的ID ***/
U32 Get_Am29LV800D_ID(void)
{
U32 i=0;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x90;
i = (*(U16 *)(0+flash_base))<<16;//Manufacturer ID = 01
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x90;
i |= *(U16 *)(2+flash_base);//device ID = 225B
return i;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -