📄 i28f320_b3b.c
字号:
/*************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* I28f320_b3b.C 1.0 */
/* */
/* DESCRIPTION */
/* */
/* Flash Program Code EB44B0 (S3C44B0X) */
/* */
/* */
/* DATA STRUCTURES */
/* */
/* FUNCTIONS : */
/* */
/* DEPENDENCIES */
/* */
/* */
/* NAME: */
/* REMARKS: */
/* */
/* Copyright (C) 2003 Wuhan CVTECH CO.,LTD */
/*************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#define FLASH_BUS_WIDTH 16
#if FLASH_BUS_WIDTH == 32
// 32 bit bus
#define FLASH_BASE 0x00000000
#define FLASH_SMALL_BLK 0x4000 /* 16KB */
#define FLASH_LARGE_BLK 0x20000 /* 128KB */
#define FLASH_CHIP_SZ 0x400000 /* 4MB -- 2x28F800 */
#define FLASH_MEM_SZ 0x400000 /* 4MB */
#define FLASH_ACCESS unsigned long
#define FLASH_CMD_1 0x00800080
#define FLASH_CMD_2 0x00500050
#define FLASH_CMD_3 0x00200020
#define FLASH_CMD_4 0x00d000d0
#define FLASH_CMD_5 0x00ff00ff
#define FLASH_CMD_6 0xffffffff
#define FLASH_CMD_7 0x00600060
#define FLASH_CMD_8 0x00400040
#elif FLASH_BUS_WIDTH == 16
// 16 bit bus
#define FLASH_BASE 0x00000000
#define FLASH_SMALL_BLK 0x2000 /* 8KB */
#define FLASH_LARGE_BLK 0x10000 /* 64KB */
#define FLASH_CHIP_SZ 0x400000 /* 4MB -- 1x28F320 */
#define FLASH_MEM_SZ 0x400000 /* 4MB */
#define FLASH_ACCESS unsigned short
#define FLASH_CMD_1 0x0080
#define FLASH_CMD_2 0x0050
#define FLASH_CMD_3 0x0020
#define FLASH_CMD_4 0x00d0
#define FLASH_CMD_5 0x00ff
#define FLASH_CMD_6 0xffff
#define FLASH_CMD_7 0x0060
#define FLASH_CMD_8 0x0040
#else
#error "error FLASH_BUS_WDITH configuration\r\n"
#endif
#define DATA_START 0x0c100000
#define IMG_SELECT 0
void StartGUI(void);
extern char* defFont;
extern struct hz_header hz16;
unsigned long flash_start[3] = { 0x0, 0, 0 };
unsigned long image_len[3] = { 0x100000, 0, 0 };
static void wait_for_prog( unsigned long offset )
{
FLASH_ACCESS *p;
FLASH_ACCESS tmp;
offset &= ~(FLASH_CHIP_SZ-1);
p = (FLASH_ACCESS *)(offset+FLASH_BASE);
// Read from the FLASH memory until bit 7 is one.
while(1)
{
tmp = *p;
tmp &= FLASH_CMD_1;
if( tmp == FLASH_CMD_1 )
break;
}
*p = FLASH_CMD_2;
}
static void erase_one_block( unsigned long block_offset )
{
FLASH_ACCESS *p;
p = (FLASH_ACCESS *)( block_offset+FLASH_BASE );
// Write the erase command to the FLASH memory.
*p = FLASH_CMD_3;
*p = FLASH_CMD_4;
// Wait until the sector erase has completed.
wait_for_prog( block_offset );
// Put the FLASH into read array mode.
*p = FLASH_CMD_5;
}
static int check_blank( unsigned long block_offset )
{
int i;
FLASH_ACCESS *p;
FLASH_ACCESS s=FLASH_CMD_6;
block_offset &= ~(FLASH_LARGE_BLK-1);
p = (FLASH_ACCESS*)( block_offset+FLASH_BASE );
for( i=0;i<FLASH_LARGE_BLK/4;i++ )
s &= p[i];
if( s == FLASH_CMD_6 )
return 1;
else
return 0;
}
static void unlock_one_block( unsigned long block_offset )
{
FLASH_ACCESS *p;
p = (FLASH_ACCESS *)( block_offset+FLASH_BASE );
// Unlock the block
*p = FLASH_CMD_7;
*p = FLASH_CMD_4;
// Wait until the sector erase has completed.
wait_for_prog( block_offset );
}
static void unlock_block( unsigned long block_offset )
{
int i;
block_offset &= ~(FLASH_LARGE_BLK-1); //~(FLASH_LARGE_BLK-1)=0xe0001
if( block_offset & (FLASH_CHIP_SZ-1) ) //(FLASH_CHIP_SZ-1) = 0x7ffffe
{
unlock_one_block( block_offset );
}
else
{ /* first 8 small blocks of chip */
for( i=0;i<8;i++ )
unlock_one_block( block_offset + i * FLASH_SMALL_BLK );
}
}
static void erase_block( unsigned long block_offset )
{
int i;
block_offset &= ~(FLASH_LARGE_BLK-1);
if( check_blank( block_offset ) )
return;
if( block_offset & (FLASH_CHIP_SZ-1) )
{
Uart_Printf("erase block begin at address : 0x%08x\r\n", block_offset);
erase_one_block( block_offset );
}
else
{
/* first 8 small blocks of chip */
for( i=0;i<8;i++ )
{
Uart_Printf("erase %d small block begin at address : 0x%08x\r\n", i, block_offset + i * FLASH_SMALL_BLK);
erase_one_block( block_offset + i * FLASH_SMALL_BLK );
}
}
}
static void program_block( unsigned long flash_addr, unsigned long ram_addr, long len )
{
FLASH_ACCESS *fp;
FLASH_ACCESS *rp;
int i;
// Make sure the destination is within the range of the FLASH memory.
if( flash_addr >= FLASH_MEM_SZ || (flash_addr+len) > FLASH_MEM_SZ )
return;
#if FLASH_BUS_WIDTH == 32
flash_addr &= ~3;
ram_addr &= ~3;
#elif FLASH_BUS_WIDTH == 16
flash_addr &= ~1;
ram_addr &= ~1;
#endif
len = ( len + sizeof(FLASH_ACCESS) -1 ) / sizeof(FLASH_ACCESS);
fp = (FLASH_ACCESS*)(flash_addr+FLASH_BASE);
rp = (FLASH_ACCESS*)ram_addr;
// Program the array data, one word at a time.
Uart_Printf("0%%");
for( i=0;i<len;i++ )
{
// Write the program word command.
fp[i] = FLASH_CMD_8;
fp[i] = rp[i];
// Wait until the data word has been programmed.
wait_for_prog( flash_addr + i*sizeof(FLASH_ACCESS) );
if((i % 0x1000) == 0)
Uart_Printf("\b\b\b\b%d%%", (int)(i/((float)len)*100));
}
Uart_Printf("\b\b\b\b100%%\r\n");
// Put the FLASH into read array mode.
fp[0] = FLASH_CMD_5;
fp[i-1] = FLASH_CMD_5;
}
/*
* program data at DATA_START to FLASH_START
*/
void I28f320_Prog_Main (unsigned int prog_to, unsigned int len)
{
void *pointer;
int rtn;
unsigned long offset;
int i;
int * ptr;
short int buf[1024];
flash_start[0] = prog_to;
image_len[0] = len;
Uart_Printf("program 0x%08x bytes from 0x%08x\r\n", len, prog_to);
Uart_Printf("erase flash...\r\n");
if(image_len[IMG_SELECT] <= FLASH_LARGE_BLK)
{
for( i = 0;i < image_len[IMG_SELECT]/FLASH_SMALL_BLK; i++ )
{
unlock_one_block( flash_start[IMG_SELECT] + i * FLASH_SMALL_BLK );
erase_one_block( flash_start[IMG_SELECT] + i * FLASH_SMALL_BLK );
}
}else
{
for( i = 0;i < image_len[IMG_SELECT]/FLASH_LARGE_BLK; i++ )
{
unlock_block( flash_start[IMG_SELECT] + i * FLASH_LARGE_BLK );
erase_block( flash_start[IMG_SELECT] + i * FLASH_LARGE_BLK );
}
}
Uart_Printf("erase end\r\n");
Uart_Printf("program flash...\r\n");
program_block( flash_start[IMG_SELECT], DATA_START, image_len[IMG_SELECT] );
Uart_Printf("program end\r\n");
for(i = 0; i < image_len[IMG_SELECT]/sizeof(FLASH_ACCESS); i+=sizeof(FLASH_ACCESS))
{
if(*(FLASH_ACCESS *)(DATA_START+ i) != *(FLASH_ACCESS *)(flash_start[IMG_SELECT]+ i))
{
Uart_Printf("verify error\r\n");
return;
}
}
Uart_Printf("verify ok\r\n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -