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

📄 i28f320_b3b.c

📁 武汉创维特ARM7实验箱的全部源代码
💻 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 + -