📄 func.c
字号:
#include "Func.h"
#include "Types.h"
/*
* func_toggle() -
* Used to check the toggle bit (Q6). This can be used
* to detect if the write/erase operation is completed.
*
* Return:
* 0 - Successful.
* 1 - Time out.
*/
int func_toggle(U32 sysbase, U32 addr)
{
U16 old_data;
U16 new_data;
old_data = *SysAddr16(sysbase, addr);
old_data = old_data & 0x0040; // read DQ6
while(1)
{
new_data = *SysAddr16(sysbase, addr);
new_data = new_data & 0x0040; // read DQ6
if (new_data == old_data)
{
return 0;
}
old_data = new_data;
}
return 1;
}
/*
* func_readid() -
* Used to read the flash id.
*/
U32 func_readid(U32 sysbase)
{
U32 id;
U16 mid;
U16 did;
*SysAddr16(sysbase, 0x5555) = 0x00AA;
*SysAddr16(sysbase, 0x2AAA) = 0x0055;
*SysAddr16(sysbase, 0x5555) = 0x0090;
mid = *SysAddr16(sysbase, 0x0);
did = *SysAddr16(sysbase, 0x1);
id = mid | (did << 16);
*SysAddr16(sysbase, 0x5555) = 0x00F0;
return id;
}
/*
* func_erase_sector() -
* Used to erase a sector.
*
* Input:
* addr - Address
* size8 - Size of target sector in terms of bytes.
*
* Return:
* 0 - Successful
* 1 - Error
*/
int func_erase_sector(U32 sysbase, U32 addr, U32 size8)
{
int i;
int ret;
//Erase
*SysAddr16(sysbase, 0x5555) = 0x00AA;
*SysAddr16(sysbase, 0x2AAA) = 0x0055;
*SysAddr16(sysbase, 0x5555) = 0x0080;
*SysAddr16(sysbase, 0x5555) = 0x00AA;
*SysAddr16(sysbase, 0x2AAA) = 0x0055;
*SysAddr16(sysbase, addr>>1) = 0x0030;
//Wait
ret = func_toggle(sysbase, addr>>1);
if(ret != 0)
return 1;
//Verify
for(i = 0; i < size8; i += 4){
if( *((volatile U32*)(sysbase + addr + i)) != 0xFFFFFFFF )
return 1;
}
return 0;
}
/*
* func_erase_chip() -
* Used to erase the entire chip.
*
* Input:
* size8 - Size of target flash in terms of bytes.
*
* Return:
* 0 - Successful
* 1 - Error
*/
int func_erase_chip(U32 sysbase, U32 size8)
{
int i;
int ret;
//Erase Chip
*SysAddr16(sysbase, 0x5555) = 0x00AA;
*SysAddr16(sysbase, 0x2AAA) = 0x0055;
*SysAddr16(sysbase, 0x5555) = 0x0080;
*SysAddr16(sysbase, 0x5555) = 0x00AA;
*SysAddr16(sysbase, 0x2AAA) = 0x0055;
*SysAddr16(sysbase, 0x5555) = 0x0010;
//Wait
ret = func_toggle(sysbase, 0);
if(ret != 0)
return 1;
//Verify
for(i = 0; i < size8; i += 4){
if( *((volatile U32*)(sysbase + i)) != 0xFFFFFFFF )
return 1;
}
return 0;
}
/*
* func_program32() -
* Used to program a 32-bit word into the flash chip.
*
* Input:
* addr - Destination address.
* data - Data to be programmed.
*
* Return:
* 0 - Successful
* 1 - Error
*/
int func_program32(U32 sysbase, U32 addr, U32 data)
{
int ret;
U16 *p16;
addr &= 0xFFFFFFFC;
p16 = (U16*)(&data);
//Program
*SysAddr16(sysbase, 0x5555) = 0x00AA;
*SysAddr16(sysbase, 0x2AAA) = 0x0055;
*SysAddr16(sysbase, 0x5555) = 0x00A0;
*SysAddr16(sysbase, addr>>1) = *p16;
//Check
ret = func_toggle(sysbase, addr>>1);
if(ret != 0)
return 1;
//Program
*SysAddr16(sysbase, 0x5555) = 0x00AA;
*SysAddr16(sysbase, 0x2AAA) = 0x0055;
*SysAddr16(sysbase, 0x5555) = 0x00A0;
*SysAddr16(sysbase, (addr+2)>>1) = *(p16+1);
//Check
ret = func_toggle(sysbase, (addr+2)>>1);
if(ret != 0)
return 1;
//Verify
if( *((volatile U32*)(sysbase + addr)) != data )
return 1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -