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

📄 flash.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
//==========================================================================////        flash.c////        ARM INTEGRATOR A/P FLASH program tool////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):     gthomas// Contributors:  Philippe Robin// Date:          November 7, 2000// Description:   Tool used to program onboard FLASH image//####DESCRIPTIONEND####//// This program will program the FLASH on INTEGRATOR A/P board//#include <pkgconf/libc.h>   // Configuration header#include <cyg/kernel/kapi.h>#include <stdlib.h>#include <ctype.h>#include <cyg/infra/testcase.h>#include <sys/cstartup.h>#ifndef FALSE#define FALSE 0#define TRUE  1#endif#define PROGRAM_COMMAND    0x00100010#define PROGRAM_VERIFY     0x00D000D0#define READ_STATUS        0x70707070#define SR_MASK            0x00800080#define READ_ARRAY         0x00FF00FF#define BLOCK_ERASE        0x00200020#define BLOCK_WRITE_MODE   0x00E800E8#define BLOCK_LOCK_BITS    0x00600060#define CFI_QUERY_OFFS     0x00000055#define CFI_QUERY_COMMAND  0x00980098#define CFI_DATA_OFFS      0x00000020#define SYS_INFO_SIZE_OFF  0x00000027#define SYS_INFO_WB_OFF    0x0000002A#define SYS_ERASE_SIZE_OFF 0x0000002F#define STATUS_READY_MASK  0x00800080#define BANK_BOUNDARY      0x0001FFFF#define STATUS_ERROR       0x00100010#define MAX_WRITE_BUFF     0xF// Integrator EBI register definitions#define INTEGRATOR_EBI_BASE 0x12000000#define INTEGRATOR_EBI_CSR0_OFFSET      0x00#define INTEGRATOR_EBI_CSR1_OFFSET      0x04#define INTEGRATOR_EBI_CSR2_OFFSET      0x08#define INTEGRATOR_EBI_CSR3_OFFSET      0x0C#define INTEGRATOR_EBI_LOCK_OFFSET      0x20#define INTEGRATOR_EBI_CSR0 (INTEGRATOR_EBI_BASE + INTEGRATOR_EBI_CSR0_OFFSET)#define INTEGRATOR_EBI_CSR1 (INTEGRATOR_EBI_BASE + INTEGRATOR_EBI_CSR1_OFFSET)#define INTEGRATOR_EBI_CSR2 (INTEGRATOR_EBI_BASE + INTEGRATOR_EBI_CSR2_OFFSET)#define INTEGRATOR_EBI_CSR3 (INTEGRATOR_EBI_BASE + INTEGRATOR_EBI_CSR3_OFFSET)#define INTEGRATOR_EBI_LOCK (INTEGRATOR_EBI_BASE + INTEGRATOR_EBI_LOCK_OFFSET)#define INTEGRATOR_EBI_8_BIT            0x00#define INTEGRATOR_EBI_16_BIT           0x01#define INTEGRATOR_EBI_32_BIT           0x02#define INTEGRATOR_EBI_WRITE_ENABLE     0x04#define INTEGRATOR_EBI_SYNC             0x08#define INTEGRATOR_EBI_WS_2             0x00#define INTEGRATOR_EBI_WS_3             0x10#define INTEGRATOR_EBI_WS_4             0x20#define INTEGRATOR_EBI_WS_5             0x30#define INTEGRATOR_EBI_WS_6             0x40#define INTEGRATOR_EBI_WS_7             0x50#define INTEGRATOR_EBI_WS_8             0x60#define INTEGRATOR_EBI_WS_9             0x70#define INTEGRATOR_EBI_WS_10            0x80#define INTEGRATOR_EBI_WS_11            0x90#define INTEGRATOR_EBI_WS_12            0xA0#define INTEGRATOR_EBI_WS_13            0xB0#define INTEGRATOR_EBI_WS_14            0xC0#define INTEGRATOR_EBI_WS_15            0xD0#define INTEGRATOR_EBI_WS_16            0xE0#define INTEGRATOR_EBI_WS_17            0xF0#define FL_SC_CONTROL			0x06	// Enable Flash Write and Vpp#define INVALID_FTYPE		0x00000000#define UNKNOWN_FTYPE		0xFFFFFFFF#define ATMEL_FTYPE		0x00000001#define INTEL_FTYPE		0x00000002#define FLASH_TYPE_MASK		(ATMEL_FTYPE | INTEL_FTYPE)// On Some platforms Boot and program flash may be part of the same device#define INTEGRATED_FTYPE	0x80000000#define BOOT_FTYPE		0x40000000#define APP_FTYPE		0x20000000#define FLASH_USAGE_MASK	(BOOT_FTYPE | APP_FTYPE)#define DEFAULT_FLASH_MASK 0xFFFFFFF8#define FLASH_BLOCK_SIZE	0x00020000	// 128Kb#define EPROM_BASE		0x20000000#define EPROM_SIZE		0x00080000	// 512Kb#define FLASH_BASE		0x24000000#define FLASH_SIZE		0x02000000	// 32Mbtypedef int flashWrite(char *address, unsignedint  data, char *flash);typedef int flashWriteBlock(char *address, unsigned int *data, unsigned int size, char *flash);typedef int flashRead(char *address, unsigned int *value);typedef int flashReadBlock(char *address, unsigned int *data, unsigned int size);typedef int flashErase(char *address, unsigned size, char *flash);typedef int flashInit(char *address, char *flash);typedef int flashClose(char *address, char *flash);typedef struct flashType {    char *base;			// Base Address of flash    char *physicalBase;		// before mem initialisation    unsigned int size;		// Size of flash, in bytes    unsigned int type;		// Atmel / Intel (CFI) / Unknown    unsigned int writeSize;	// Size of physical block    unsigned int eraseSize;	// Size of block erase    unsigned int logicalSize;	// Size of logical block    flashWrite *write;   	// Write one word    flashWriteBlock *writeBlock;// Write a block of writeSize bytes    flashRead *read;     	// Read one word    flashReadBlock *readBlock;  // Read a block of writeSize bytes    flashErase *erase;   	// Erase a block of eraseSize bytes    flashInit *init;     	// Lock a flash device    flashClose *close;		// Unlock a flash device    char *ident;		// identification string    struct flashType *next;     // Pointer to next flash device} tFlash;tFlash Integrator_Flash[2] = {    {	(char *)EPROM_BASE,	// Base Address of flash	(char *)EPROM_BASE,	// Physical Address of flash	EPROM_SIZE,	        // Size of flash, in bytes (512K)	BOOT_FTYPE | ATMEL_FTYPE,// Flash type	FLASH_BLOCK_SIZE,	// Size of physical block	FLASH_BLOCK_SIZE,	// Size of block erase	FLASH_BLOCK_SIZE,	// Size of logical block	ATMEL_Write_Word,	// Write one word	ATMEL_Write_Block,	// Write a block of WriteSize	ATMEL_Read_Word,	ATMEL_Read_Block,	ATMEL_Erase_Block,	0,			// Lock a flash device	0,			// Unlock a flash device	"Atmel",		// Null terminated Info string	(tFlash *)&Integrator_Flash[1] // Pointer to next tFlash struct    },    {	(char *)FLASH_BASE,	// Base Address of flash	(char *)FLASH_BASE,	// Physical Address of flash	FLASH_SIZE,		// Size of flash, in bytes	APP_FTYPE | INTEL_FTYPE,// Flash type	FLASH_BLOCK_SIZE,	// Size of physical block	FLASH_BLOCK_SIZE,	// Size of block erase	FLASH_BLOCK_SIZE,	// Size of logical block	CFI_Write_Word,         // Write one word        CFI_Write_Block,        // Write a block of writeSize bytes        CFI_Read_Word,          // Read one word        CFI_Read_Block,         // Read a block of writeSize bytes        CFI_Erase_Block,        // Erase a block of eraseSize bytes	0,			// Lock a flash device	0,			// Unlock a flash device	"Intel 28F320S3",       // Null terminated Info string	0			// Pointer to next tFlash struct   }};#define SYNC_COUNT 63extern void diag_printf(const char *, ...);int identify_FLASH(void);void write_sector(int, char *);bool load_srecords(char (*readc)(), CYG_ADDRESS *start, int *size);char dbuf[256];char *raw = (char *)0x10000;char *flash_buffer = (char *)0x30000;int pos, len;// FUNCTIONSexternC voidcyg_package_start( void ){#ifdef CYGPKG_LIBC    cyg_iso_c_start();#else    (void)main(0, NULL);#endif} // cyg_package_start()char nextch(void){    return (raw[pos++]);}intmain( int argc, char *argv[] ){    int i, j, size;    CYG_ADDRESS entry;    char c;    diag_printf("FLASH here!\n");    CFI_Identify_Flash(Integrator_Flash[1]);    while (identify_FLASH() == 0) {        diag_printf("... Please change FLASH jumper - hit C/R to continue:");        do {            hal_diag_read_char(&c);        } while ((c != '\r') && (c != '\n'));        diag_printf("\n");    } restart:    diag_printf("Ready file - hit C/R to continue:");    while (TRUE) {        hal_diag_read_char(&c);        if (c == '>') break;    }    i = 0;  j = 0;    while (1) {        hal_diag_read_char(&c);        if (c == '!') {            diag_printf("... Reset\n");            goto restart;        }        raw[i++] = c;        if (++j == SYNC_COUNT) {            hal_diag_write_char(c);            j = 0;        }        if (c == ':') break;    }    diag_printf("\n");    pos = 0;  len = i;    if (load_srecords(nextch, &entry, &size)) {        diag_printf("Read %x bytes, entry: %x\n", size, entry);        dump_buf(flash_buffer, 128);        diag_printf("\nData loaded - hit '!' to continue:");        while (TRUE) {            hal_diag_read_char(&c);            if (c == '!') break;        }        diag_printf("\n");        diag_printf("...Programming FLASH\n");        pos = 0;  i = 0;        while (pos < size) {            write_sector(i++, flash_buffer+pos);            pos += 256;        }    } else {        // Display buffer around failure                dump_buf(&raw[pos-32], 64);    }    diag_printf("All done!\n");    while (1) ;}intCFI_Identify_Flash(tFlash * flash){                                         int offset = CFI_DATA_OFFS;        // CFI query to check for CFI string "QRY"     // Write 0x98 to address flash + 55    *(unsigned int *)(flash->base + CFI_QUERY_OFFS) = CFI_QUERY_COMMAND;       if ( *(flash->base + offset) == 'Q') {         int temp = 0;         offset += 2;         if ( *(flash->base+ offset) == 'R') {	     temp =  *(flash->base+ SYS_INFO_SIZE_OFF); // read block size	     flash->size = 2 ^ temp;	     temp = *(flash->base+ SYS_ERASE_SIZE_OFF);	// Read Erase Regions	     temp += ( *(flash->base+ SYS_ERASE_SIZE_OFF + 1) << 4);           	     flash->eraseSize = temp * 256;	     // Read Max write Buffer (logical Block size)         } else	   return FALSE;    }         // Reset for Read operation   *(unsigned int *)(flash->base)  = READ_ARRAY;    return TRUE;}// Adapted from ARM sample code#define SEQ_ADD1                0x5555#define SEQ_ADD2                0xAAAA#define START_CMD1              0xAA#define START_CMD2              0x55

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -