annotate packages/hal/arm/integrator/current/src/prog_flash.c @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
1 //==========================================================================
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
2 //
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
3 // prog_flash.c
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
4 //
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
5 // ARM INTEGRATOR eval board FLASH program tool
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
6 //
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 195
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 195
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 195
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 195
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 195
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
39 //==========================================================================
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
41 //
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
42 // Author(s): gthomas
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
43 // Contributors: Philippe Robin
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
44 // Date: November 7, 2000
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
45 // Description: Tool used to program onboard FLASH image
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
46 //####DESCRIPTIONEND####
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
47
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
48 //
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
49 // This program will program the FLASH on the PID board
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
50 // It is similar to 'flash' (which also downloads S records) but it always
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
51 // programs from a fixed buffer. This is sufficient to load/update the GDB
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
52 // stubs on the board.
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
53 //
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
54
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
55 #include <pkgconf/libc.h> // Configuration header
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
56
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
57 #include <cyg/kernel/kapi.h>
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
58 #include <stdlib.h>
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
59 #include <ctype.h>
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
60 #include <cyg/infra/testcase.h>
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
61 #include <sys/cstartup.h>
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
62 #include <cyg/hal/hal_integrator.h>
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
63
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
64 #ifndef FALSE
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
65 #define FALSE 0
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
66 #define TRUE 1
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
67 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
68
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
69
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
70 #define INVALID_FTYPE 0x00000000
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
71 #define UNKNOWN_FTYPE 0xFFFFFFFF
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
72 #define ATMEL_FTYPE 0x00000001
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
73 #define INTEL_FTYPE 0x00000002
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
74
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
75 #define FLASH_TYPE_MASK (ATMEL_FTYPE | INTEL_FTYPE)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
76
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
77 // On Some platforms Boot and program flash may be part of the same device
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
78 #define INTEGRATED_FTYPE 0x80000000
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
79 #define BOOT_FTYPE 0x40000000
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
80 #define APP_FTYPE 0x20000000
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
81
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
82 #define FLASH_USAGE_MASK (BOOT_FTYPE | APP_FTYPE)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
83
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
84 #define DEFAULT_FLASH_MASK 0xFFFFFFF8
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
85 #define FLASH_BLOCK_SIZE 0x00020000 // 128Kb
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
86 #define EPROM_BASE 0x20000000
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
87 #define EPROM_SIZE 0x00080000 // 512Kb
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
88 #define FLASH_BASE 0x24000000
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
89 #define FLASH_SIZE 0x02000000 // 32Mb
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
90
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
91 typedef struct flashType {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
92 char *base; // Base Address of flash
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
93 char *physicalBase; // before mem initialisation
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
94 unsigned int size; // Size of flash, in bytes
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
95 unsigned int type; // Atmel / Intel (CFI) / Unknown
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
96 unsigned int writeSize; // Size of physical block
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
97 unsigned int eraseSize; // Size of block erase
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
98 unsigned int logicalSize; // Size of logical block
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
99 char *ident; // identification string
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
100 } tFlash;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
101
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
102 tFlash Integrator_Flash[2] =
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
103 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
104 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
105 (char *)EPROM_BASE, // Base Address of flash
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
106 (char *)EPROM_BASE, // Physical Address of flash
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
107 EPROM_SIZE, // Size of flash, in bytes (512K)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
108 BOOT_FTYPE | ATMEL_FTYPE, // Flash type
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
109 FLASH_BLOCK_SIZE, // Size of physical block
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
110 FLASH_BLOCK_SIZE, // Size of block erase
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
111 FLASH_BLOCK_SIZE, // Size of logical block
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
112 "Atmel", // Null terminated Info string
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
113 },
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
114 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
115 (char *)FLASH_BASE, // Base Address of flash
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
116 (char *)FLASH_BASE, // Physical Address of flash
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
117 FLASH_SIZE, // Size of flash, in bytes
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
118 APP_FTYPE | INTEL_FTYPE, // Flash type
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
119 FLASH_BLOCK_SIZE, // Size of physical block
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
120 FLASH_BLOCK_SIZE, // Size of block erase
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
121 FLASH_BLOCK_SIZE, // Size of logical block
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
122 "Intel 28F320S3", // Null terminated Info string
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
123 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
124 };
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
125
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
126
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
127 extern void diag_printf(const char *, ...);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
128 int identify_FLASH(void);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
129 void write_sector(int, char *);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
130
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
131 char *flash_buffer = (char *)0x60000;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
132 char *flash_buffer_end = (char *)0x80000;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
133
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
134 #ifdef BE_IMAGE
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
135 #define BUF(x) buf[x^3]
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
136 #else
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
137 #define BUF(x) buf[x]
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
138 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
139
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
140 // FUNCTIONS
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
141
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
142 externC void
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
143 cyg_package_start( void )
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
144 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
145 #ifdef CYGPKG_LIBC
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
146 cyg_iso_c_start();
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
147 #else
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
148 (void)main(0, NULL);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
149 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
150 } // cyg_package_start()
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
151
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
152 int
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
153 main( int argc, char *argv[] )
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
154 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
155 int i;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
156
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
157 diag_printf("FLASH here!\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
158 while (identify_FLASH() == 0) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
159 diag_printf("... Please change FLASH jumper\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
160 cyg_thread_delay(5*100);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
161 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
162 diag_printf("About to program FLASH using data at %x..%x\n", flash_buffer, flash_buffer_end);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
163 diag_printf("*** Press RESET now to abort!\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
164 cyg_thread_delay(5*100);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
165 diag_printf("\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
166 diag_printf("...Programming FLASH\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
167
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
168 i = 0;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
169 while (flash_buffer < flash_buffer_end) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
170 write_sector(i++, flash_buffer);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
171 flash_buffer += 256;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
172 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
173 diag_printf("All done!\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
174 while (1) ;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
175 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
176
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
177 // Adapted from ARM sample code
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
178 #define SEQ_ADD1 0x5555
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
179 #define SEQ_ADD2 0x2aaa
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
180 #define START_CMD1 0xaaaaaaaa
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
181 #define START_CMD2 0x55555555
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
182 #define ID_CMD 0x90909090
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
183 #define PROG_CMD 0xA0
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
184 #define STOP_CMD 0xf0f0f0f0
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
185
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
186 #define MAN_ATMEL 0x1F
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
187 #define ATMEL_AT29C040_ID 0X5B
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
188 #define ATMEL_AT29C040A_ID 0XA4
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
189 #define ATMEL_AT29C1024_ID 0X25
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
190 #define ATMEL_SECTOR_SIZE 256
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
191 #define ATMEL_MAX_SECTORS 2048
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
192
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
193 #define MAN_INTEL 0xB0
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
194 #define INTEL_28F320S3_ID 0xD4
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
196 int manuf_code, device_code;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
197 int sector_size, max_no_of_sectors, word_mode;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
198 volatile unsigned int *FLASH = (volatile unsigned int *)0x24000000;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
199
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
200 int
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
201 identify_FLASH(void )
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
202 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
203 unsigned int *ptr = (unsigned int *)FLASH;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
204
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
205 HAL_FLASH_WRITE_ENABLE();
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
206
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
207 // Enter Software Product Identification Mode
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
208 FLASH[SEQ_ADD1] = START_CMD1;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
209 FLASH[SEQ_ADD2] = START_CMD2;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
210 FLASH[SEQ_ADD1] = ID_CMD;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
211
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
212 // Wait at least 10ms
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
213 cyg_thread_delay(4);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
214
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
215 // Read Manufacturer and device code from the device
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
216 manuf_code = *ptr++ & 0xff;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
217 device_code = *ptr & 0xff;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
218
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
219 diag_printf("manuf: 0x%x, device: 0x%x\n", manuf_code, device_code);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
220
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
221 // Exit Software Product Identification Mode
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
222 FLASH[SEQ_ADD1] = START_CMD1;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
223 FLASH[SEQ_ADD2] = START_CMD2;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
224 FLASH[SEQ_ADD1] = STOP_CMD;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
225
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
226 // Wait at least 10ms
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
227 cyg_thread_delay(5);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
228
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
229 HAL_FLASH_WRITE_DISABLE();
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
230
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
231 if (manuf_code != MAN_ATMEL || manuf_code != MAN_INTEL) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
232 diag_printf ( "Error: Wrong Manufaturer: %02x\n", manuf_code );
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
233 return (0);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
234 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
235
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
236 switch (device_code) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
237 case ATMEL_AT29C040A_ID:
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
238 diag_printf ("AT29C040A recognised\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
239 sector_size = ATMEL_SECTOR_SIZE;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
240 max_no_of_sectors = ATMEL_MAX_SECTORS;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
241 word_mode = FALSE;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
242 break;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
243
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
244 case ATMEL_AT29C1024_ID:
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
245 diag_printf ("AT29C1024 recognised\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
246 sector_size = ATMEL_SECTOR_SIZE;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
247 max_no_of_sectors = ATMEL_MAX_SECTORS;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
248 word_mode = TRUE;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
249 break;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
250
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
251 case INTEL_28F320S3_ID:
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
252 diag_printf ("INTEL_28F320S3 recognised\n");
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
253 sector_size = FLASH_BLOCK_SIZE;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
254 // max_no_of_sectors = ATMEL_MAX_SECTORS;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
255 word_mode = TRUE;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
256 break;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
257
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
258 default :
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
259 diag_printf ( "Error: Unsupported device: %02x\n", device_code);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
260 return (0);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
261 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
262 return (1);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
263 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
264
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
265 void
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
266 write_sector(int num, char *buf)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
267 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
268 int i, cnt;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
269 volatile char *wrt = (volatile char *)&FLASH[num*sector_size];
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
270
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
271 // diag_printf("Writing to %08x\n", wrt);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
272 // Enter Program Mode
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
273 FLASH[SEQ_ADD1] = START_CMD1;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
274 FLASH[SEQ_ADD2] = START_CMD2;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
275 FLASH[SEQ_ADD1] = PROG_CMD;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
276
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
277 // Note: write bytes as longs regardless of bus width
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
278 for (i = 0; i < sector_size; i++) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
279 wrt[i] = BUF(i);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
280 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
281
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
282 // Wait for sector to program
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
283 cnt = 0;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
284 i = sector_size - 1;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
285 while (wrt[i] != BUF(i)) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
286 if (cnt++ > 0x01000000) break;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
287 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
288 // diag_printf("Out - i: %d, wrt[i] = %08X.%08X, BUF(i) = %08X, count = %x\n", i, &wrt[i], wrt[i], BUF(i), cnt);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
289
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
290 // Verify
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
291 for (i = 0; i < sector_size; i++) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
292 for (cnt = 0; cnt < 10; cnt++) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
293 if (wrt[i] == BUF(i)) break;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
294 cyg_thread_delay(1);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
295 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
296 if (cnt == 10) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
297 diag_printf("Can't program at 0x%08X: %02X not %02X\n", wrt, *wrt, BUF(0));
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
298 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
299 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
diff changeset
300 }