1 //==========================================================================
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Red Hat, Inc.
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //==========================================================================
41 //#####DESCRIPTIONBEGIN####
43 // Author(s): gthomas, hmt
44 // Contributors: gthomas
49 //####DESCRIPTIONEND####
51 //==========================================================================
55 #include <pkgconf/hal.h>
56 #include <cyg/hal/hal_arch.h>
58 // Platforms may define this for special handling when accessing the write buffer.
59 #ifndef CYGHWR_FLASH_WRITE_BUF
60 #define CYGHWR_FLASH_WRITE_BUF(a,b) (*(a) = *(b))
64 flash_program_buf(volatile flash_t *addr, flash_t *data, int len,
65 unsigned long block_mask, int buffer_size)
66 __attribute__ ((section (".2ram.flash_program_buf")));
68 flash_program_buf(volatile flash_t *addr, flash_t *data, int len,
69 unsigned long block_mask, int buffer_size)
71 volatile flash_t *ROM;
75 #ifdef FLASH_Write_Buffer
79 // Get base address and map addresses to virtual addresses
80 ROM = FLASH_P2V( CYGNUM_FLASH_BASE_MASK & (unsigned int)addr );
81 BA = addr = FLASH_P2V(addr);
83 // Clear any error conditions
84 ROM[0] = FLASH_Clear_Status;
86 #ifdef FLASH_Write_Buffer
87 // Write any big chunks first
88 while (len >= buffer_size) {
90 if (wc > len) wc = len;
92 // convert 'wc' in bytes to 'wc' in 'flash_t'
93 wc = wc / sizeof(flash_t); // Word count
94 *BA = FLASH_Write_Buffer;
96 while(((stat = ROM[0]) & FLASH_Status_Ready) != FLASH_Status_Ready) {
100 *BA = FLASH_Write_Buffer;
102 *BA = FLASHWORD(wc-1); // Count is 0..N-1
103 for (i = 0; i < wc; i++) {
104 #ifdef CYGHWR_FLASH_WRITE_ELEM
105 CYGHWR_FLASH_WRITE_ELEM(addr+i, data+i);
107 CYGHWR_FLASH_WRITE_BUF(addr+i, data+i);
112 ROM[0] = FLASH_Read_Status;
114 while(((stat = ROM[0]) & FLASH_Status_Ready) != FLASH_Status_Ready) {
115 if (--timeout == 0) {
119 // Jump out if there was an error
120 if (stat & FLASH_ErrorMask) {
123 // And verify the data - also increments the pointers.
125 for (i = 0; i < wc; i++) {
126 if ( *addr++ != *data++ ) {
127 stat = FLASH_ErrorNotVerified;
135 BA[0] = FLASH_Program;
136 #ifdef CYGHWR_FLASH_WRITE_ELEM
137 CYGHWR_FLASH_WRITE_ELEM(addr, data);
142 while(((stat = BA[0]) & FLASH_Status_Ready) != FLASH_Status_Ready) {
143 if (--timeout == 0) {
147 if (stat & FLASH_ErrorMask) {
151 if (*addr++ != *data++) {
152 stat = FLASH_ErrorNotVerified;
155 len -= sizeof( flash_t );
158 // Restore ROM to "normal" mode