📄 flash.c
字号:
//==========================================================================//// 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 + -