annotate packages/redboot/current/src/flash.c @ 2211:acfe2ec52590

Fix build problems on systems without FLASH locking
author gthomas
date Tue, 23 May 2006 11:56:45 +0000
parents eee88a59c155
children 19ce76dd5f64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
3 // flash.c
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
4 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
5 // RedBoot - FLASH memory support
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
6 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
12 // Copyright (C) 2003, 2004 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
41 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
43 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
44 // Author(s): gthomas
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
45 // Contributors: gthomas, tkoeller
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
46 // Date: 2000-07-28
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
47 // Purpose:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
48 // Description:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
49 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
50 // This code is part of RedBoot (tm).
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
51 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
53 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
54 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
55
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
56 #include <redboot.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
57 #include <cyg/io/flash.h>
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
58 #include <fis.h>
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
59 #include <sib.h>
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
60 #include <cyg/infra/cyg_ass.h> // assertion macros
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
61
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
62 #ifdef CYGSEM_REDBOOT_FLASH_COMBINED_FIS_AND_CONFIG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
63 // Note horrid intertwining of functions, to save precious FLASH
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
64 extern void conf_endian_fixup(void *p);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
65 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
66
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
67 // Round a quantity up
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
68 #define _rup(n,s) ((((n)+(s-1))/s)*s)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
69
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
70 #ifdef CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
71 // Image management functions
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
72 local_cmd_entry("init",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
73 "Initialize FLASH Image System [FIS]",
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
74 "[-f]",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
75 fis_init,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
76 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
77 );
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
78 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
79 # define FIS_LIST_OPTS "[-c] [-d]"
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
80 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
81 # define FIS_LIST_OPTS "[-d]"
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
82 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
83 local_cmd_entry("list",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
84 "Display contents of FLASH Image System [FIS]",
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
85 FIS_LIST_OPTS,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
86 fis_list,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
87 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
88 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
89 local_cmd_entry("free",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
90 "Display free [available] locations within FLASH Image System [FIS]",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
91 "",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
92 fis_free,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
93 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
94 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
95 local_cmd_entry("delete",
388
38dad94e75ce Min BOOTP/vendor size. Fix typo in FIS/DELETE.
gthomas
parents: 310
diff changeset
96 "Delete an image from FLASH Image System [FIS]",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
97 "name",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
98 fis_delete,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
99 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
100 );
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
101
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
102 static char fis_load_usage[] =
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
103 #ifdef CYGPRI_REDBOOT_ZLIB_FLASH
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
104 "[-d] "
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
105 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
106 "[-b <memory_load_address>] [-c] name";
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
107
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
108 local_cmd_entry("load",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
109 "Load image from FLASH Image System [FIS] into RAM",
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
110 fis_load_usage,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
111 fis_load,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
112 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
113 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
114 local_cmd_entry("create",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
115 "Create an image",
2066
5d5572c64422 FIS fix from Stefan Sommerfeld, ANSI cursor keys from Gary Thomas
gthomas
parents: 2064
diff changeset
116 "[-b <mem_base>] [-l <image_length>] [-s <data_length>]\n"
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
117 " [-f <flash_addr>] [-e <entry_point>] [-r <ram_addr>] [-n] <name>",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
118 fis_create,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
119 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
120 );
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
121 #endif
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
122
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
123 // Raw flash access functions
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
124 local_cmd_entry("erase",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
125 "Erase FLASH contents",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
126 "-f <flash_addr> -l <length>",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
127 fis_erase,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
128 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
129 );
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
130 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
131 local_cmd_entry("lock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
132 "LOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
133 "[-f <flash_addr> -l <length>] [name]",
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
134 fis_lock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
135 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
136 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
137 local_cmd_entry("unlock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
138 "UNLOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
139 "[-f <flash_addr> -l <length>] [name]",
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
140 fis_unlock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
141 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
142 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
143 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
144 local_cmd_entry("write",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
145 "Write raw data directly to FLASH",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
146 "-f <flash_addr> -b <mem_base> -l <image_length>",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
147 fis_write,
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
148 FIS_cmds
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
149 );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
150
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
151 // Define table boundaries
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
152 CYG_HAL_TABLE_BEGIN( __FIS_cmds_TAB__, FIS_cmds);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
153 CYG_HAL_TABLE_END( __FIS_cmds_TAB_END__, FIS_cmds);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
154
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
155 extern struct cmd __FIS_cmds_TAB__[], __FIS_cmds_TAB_END__;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
156
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
157 // CLI function
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
158 static cmd_fun do_fis;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
159 RedBoot_nested_cmd("fis",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
160 "Manage FLASH images",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
161 "{cmds}",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
162 do_fis,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
163 __FIS_cmds_TAB__, &__FIS_cmds_TAB_END__
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
164 );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
165
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
166 // Local data used by these routines
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
167 void *flash_start, *flash_end;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
168 int flash_block_size, flash_num_blocks;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
169 #ifdef CYGOPT_REDBOOT_FIS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
170 void *fis_work_block;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
171 void *fis_addr;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
172 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
173 void *redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
174 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
175 int fisdir_size; // Size of FIS directory.
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
176 #endif
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
177 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
178 extern void *cfg_base; // Location in Flash of config data
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
179 extern int cfg_size; // Length of config data - rounded to Flash block size
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
180 extern struct _config *config;
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
181 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
182
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
183 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
184 fis_usage(char *why)
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
185 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
186 diag_printf("*** invalid 'fis' command: %s\n", why);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
187 cmd_usage(__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__, "fis ");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
188 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
189
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
190 static void
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
191 _show_invalid_flash_address(CYG_ADDRESS flash_addr, int stat)
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
192 {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
193 diag_printf("Invalid FLASH address %p: %s\n", (void *)flash_addr, flash_errmsg(stat));
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
194 diag_printf(" valid range is %p-%p\n", (void *)flash_start, (void *)flash_end);
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
195 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
196
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
197 #ifdef CYGOPT_REDBOOT_FIS
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
198
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
199 // fis_endian_fixup() is used to swap endianess if required.
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
200 //
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
201 static inline void fis_endian_fixup(void *addr)
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
202 {
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
203 #ifdef REDBOOT_FLASH_REVERSE_BYTEORDER
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
204 struct fis_image_desc *p = addr;
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
205 int cnt = fisdir_size / sizeof(struct fis_image_desc);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
206
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
207 while (cnt-- > 0) {
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
208 p->flash_base = CYG_SWAP32(p->flash_base);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
209 p->mem_base = CYG_SWAP32(p->mem_base);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
210 p->size = CYG_SWAP32(p->size);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
211 p->entry_point = CYG_SWAP32(p->entry_point);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
212 p->data_length = CYG_SWAP32(p->data_length);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
213 p->desc_cksum = CYG_SWAP32(p->desc_cksum);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
214 p->file_cksum = CYG_SWAP32(p->file_cksum);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
215 p++;
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
216 }
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
217 #endif
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
218 }
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
219
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
220 void
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
221 fis_read_directory(void)
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
222 {
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
223 void *err_addr;
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
224
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
225 FLASH_READ(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
226 fis_endian_fixup(fis_work_block);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
227 }
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
228
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
229 struct fis_image_desc *
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
230 fis_lookup(char *name, int *num)
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
231 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
232 int i;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
233 struct fis_image_desc *img;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
234
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
235 fis_read_directory();
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
236
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
237 img = (struct fis_image_desc *)fis_work_block;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
238 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
239 if ((img->u.name[0] != (unsigned char)0xFF) &&
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
240 (strcasecmp(name, img->u.name) == 0)) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
241 if (num) *num = i;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
242 return img;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
243 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
244 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
245 return (struct fis_image_desc *)0;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
246 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
247
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
248 int fis_start_update_directory(int autolock)
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
249 {
2202
eee88a59c155 Fix typo & warning from last checkin - from Sergei Gavrikov
gthomas
parents: 2195
diff changeset
250 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
251 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
252 // Ensure [quietly] that the directory is unlocked before trying to update and locked again afterwards
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
253 int do_autolock=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
254 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
255 int do_autolock=autolock;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
256 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
257
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
258 struct fis_image_desc* img=NULL;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
259 void* err_addr=NULL;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
260 void* tmp_fis_addr=NULL;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
261
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
262 /*exchange old and new valid fis tables*/
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
263 tmp_fis_addr=fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
264 fis_addr=redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
265 redundant_fis_addr=tmp_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
266
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
267 //adjust the contents of the new fis table
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
268 img=(struct fis_image_desc*)fis_work_block;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
269
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
270 memcpy(img->u.valid_info.magic_name, CYG_REDBOOT_RFIS_VALID_MAGIC, CYG_REDBOOT_RFIS_VALID_MAGIC_LENGTH);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
271 img->u.valid_info.valid_flag[0]=CYG_REDBOOT_RFIS_IN_PROGRESS;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
272 img->u.valid_info.valid_flag[1]=CYG_REDBOOT_RFIS_IN_PROGRESS;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
273 img->u.valid_info.version_count=img->u.valid_info.version_count+1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
274
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
275 //ready to go....
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
276 if (do_autolock)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
277 flash_unlock((void *)fis_addr, fisdir_size, (void **)&err_addr);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
278
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
279 flash_erase(fis_addr, fisdir_size, (void **)&err_addr);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
280 //now magic is 0xffffffff
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
281 fis_endian_fixup(fis_work_block);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
282 flash_program(fis_addr, fis_work_block, flash_block_size, (void **)&err_addr);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
283 fis_endian_fixup(fis_work_block);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
284 //now magic is 0xff1234ff, valid is IN_PROGRESS, version_count is the old one +1
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
285
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
286 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
287 /* nothing to do here without redundant fis */
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
288 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
289 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
290
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
291 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
292
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
293 int
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
294 fis_update_directory(int autolock, int error)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
295 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
296 void* err_addr=0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
297
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
298 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
299 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
300 // Ensure [quietly] that the directory is unlocked before trying to update and locked again afterwards
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
301 int do_autolock=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
302 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
303 int do_autolock=autolock;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
304 #endif
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
305 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
306
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
307 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
308
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
309 struct fis_image_desc* img=(struct fis_image_desc*)fis_work_block;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
310
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
311 // called from invalid state
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
312 if (img->u.valid_info.valid_flag[0]!=CYG_REDBOOT_RFIS_IN_PROGRESS)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
313 return -1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
314
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
315 //if it failed, reset is0Valid to the state before startUpdateDirectory()
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
316 //g_data.fisTable hasn't been changed yet, so it doesn't have to be reset now
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
317 //then reread the contents from flash
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
318 //setting the valid flag of the failed table to "INVALID" might also be not too bad
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
319 //but IN_PROGRESS is also good enough I think
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
320 if (error!=0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
321 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
322 void* swap_fis_addr=fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
323 fis_addr=redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
324 redundant_fis_addr=swap_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
325 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
326 else //success
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
327 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
328 void* tmp_fis_addr=(void *)((CYG_ADDRESS)fis_addr+CYG_REDBOOT_RFIS_VALID_MAGIC_LENGTH);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
329
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
330 img->u.valid_info.valid_flag[0]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
331 img->u.valid_info.valid_flag[1]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
332
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
333 flash_program(tmp_fis_addr, img->u.valid_info.valid_flag, sizeof(img->u.valid_info.valid_flag), (void **)&err_addr);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
334 }
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
335 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
336 if (do_autolock)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
337 flash_lock((void *)fis_addr, fisdir_size, (void **)&err_addr);
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
338 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
339
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
340 #else // CYGOPT_REDBOOT_REDUNDANT_FIS
2202
eee88a59c155 Fix typo & warning from last checkin - from Sergei Gavrikov
gthomas
parents: 2195
diff changeset
341 int blk_size = fisdir_size;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
342 int stat;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
343
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
344 fis_endian_fixup(fis_work_block);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
345 #ifdef CYGSEM_REDBOOT_FLASH_COMBINED_FIS_AND_CONFIG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
346 memcpy((char *)fis_work_block+fisdir_size, config, cfg_size);
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
347 conf_endian_fixup((char *)fis_work_block+fisdir_size);
2175
55e180a14a91 * src/flash.c (fis_update_directory): Fixed flash region size when
asl
parents: 2130
diff changeset
348 blk_size += cfg_size;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
349 #endif
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
350 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
351 if (do_autolock)
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
352 flash_unlock((void *)fis_addr, blk_size, (void **)&err_addr);
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
353 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
354
2175
55e180a14a91 * src/flash.c (fis_update_directory): Fixed flash region size when
asl
parents: 2130
diff changeset
355 if ((stat = flash_erase(fis_addr, blk_size, (void **)&err_addr)) != 0) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
356 diag_printf("Error erasing FIS directory at %p: %s\n", err_addr, flash_errmsg(stat));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
357 } else {
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
358 if ((stat = FLASH_PROGRAM(fis_addr, fis_work_block,
2175
55e180a14a91 * src/flash.c (fis_update_directory): Fixed flash region size when
asl
parents: 2130
diff changeset
359 blk_size, (void **)&err_addr)) != 0) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
360 diag_printf("Error writing FIS directory at %p: %s\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
361 err_addr, flash_errmsg(stat));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
362 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
363 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
364 fis_endian_fixup(fis_work_block);
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
365 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
366 if (do_autolock)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
367 flash_lock((void *)fis_addr, blk_size, (void **)&err_addr);
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
368 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
369
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
370 #endif // CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
371
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
372 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
373 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
374
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
375 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
376
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
377 int
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
378 fis_get_valid_buf(struct fis_image_desc* img0, struct fis_image_desc* img1, int* update_was_interrupted)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
379 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
380 *update_was_interrupted=0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
381 if (strncmp(img1->u.valid_info.magic_name, CYG_REDBOOT_RFIS_VALID_MAGIC, CYG_REDBOOT_RFIS_VALID_MAGIC_LENGTH)!=0) //buf0 must be valid
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
382 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
383 if (img0->u.valid_info.version_count>0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
384 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
385 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
386 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
387 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
388 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
389 else if (strncmp(img0->u.valid_info.magic_name, CYG_REDBOOT_RFIS_VALID_MAGIC, CYG_REDBOOT_RFIS_VALID_MAGIC_LENGTH)!=0) //buf1 must be valid
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
390 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
391 if (img1->u.valid_info.version_count>0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
392 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
393 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
394 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
395 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
396 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
397 //magic is ok for both, now check the valid flag
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
398 if ((img1->u.valid_info.valid_flag[0]!=CYG_REDBOOT_RFIS_VALID)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
399 || (img1->u.valid_info.valid_flag[1]!=CYG_REDBOOT_RFIS_VALID)) //buf0 must be valid
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
400 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
401 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
402 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
403 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
404 else if ((img0->u.valid_info.valid_flag[0]!=CYG_REDBOOT_RFIS_VALID)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
405 || (img0->u.valid_info.valid_flag[1]!=CYG_REDBOOT_RFIS_VALID)) //buf1 must be valid
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
406 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
407 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
408 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
409 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
410
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
411 //now check the version
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
412 if (img1->u.valid_info.version_count == (img0->u.valid_info.version_count+1)) //buf1 must be valid
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
413 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
414
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
415 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
416 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
417
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
418 void
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
419 fis_erase_redundant_directory(void)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
420 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
421 int stat;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
422 void *err_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
423
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
424 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
425 // Ensure [quietly] that the directory is unlocked before trying
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
426 // to update
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
427 flash_unlock((void *)redundant_fis_addr, fisdir_size,
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
428 (void **)&err_addr);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
429 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
430 if ((stat = flash_erase(redundant_fis_addr, fisdir_size,
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
431 (void **)&err_addr)) != 0) {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
432 diag_printf("Error erasing FIS directory at %p: %s\n",
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
433 err_addr, flash_errmsg(stat));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
434 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
435 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
436 // Ensure [quietly] that the directory is locked after the update
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
437 flash_lock((void *)redundant_fis_addr, fisdir_size, (void **)&err_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
438 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
439 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
440 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
441
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
442 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
443 fis_init(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
444 {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
445 int stat;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
446 struct fis_image_desc *img;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
447 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
448 bool full_init = false;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
449 struct option_info opts[1];
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
450 CYG_ADDRESS redboot_flash_start;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
451 unsigned long redboot_image_size;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
452
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
453 init_opts(&opts[0], 'f', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
454 (void *)&full_init, (bool *)0, "full initialization, erases all of flash");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
455 if (!scan_opts(argc, argv, 2, opts, 1, 0, 0, ""))
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
456 {
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
457 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
458 }
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
459
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
460 if (!verify_action("About to initialize [format] FLASH image system")) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
461 diag_printf("** Aborted\n");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
462 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
463 }
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
464 diag_printf("*** Initialize FLASH Image System\n");
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
465
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
466 #define MIN_REDBOOT_IMAGE_SIZE CYGBLD_REDBOOT_MIN_IMAGE_SIZE
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
467 redboot_image_size = flash_block_size > MIN_REDBOOT_IMAGE_SIZE ?
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
468 flash_block_size : MIN_REDBOOT_IMAGE_SIZE;
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
469
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
470 img = (struct fis_image_desc *)fis_work_block;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
471 memset(img, 0xFF, fisdir_size); // Start with erased data
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
472
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
473 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
474 //create the valid flag entry
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
475 memset(img, 0, sizeof(struct fis_image_desc));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
476 strcpy(img->u.valid_info.magic_name, CYG_REDBOOT_RFIS_VALID_MAGIC);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
477 img->u.valid_info.valid_flag[0]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
478 img->u.valid_info.valid_flag[1]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
479 img->u.valid_info.version_count=0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
480 img++;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
481 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
482
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
483 // Create a pseudo image for RedBoot
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
484 #ifdef CYGOPT_REDBOOT_FIS_RESERVED_BASE
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
485 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
486 strcpy(img->u.name, "(reserved)");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
487 img->flash_base = (CYG_ADDRESS)flash_start;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
488 img->mem_base = (CYG_ADDRESS)flash_start;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
489 img->size = CYGNUM_REDBOOT_FLASH_RESERVED_BASE;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
490 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
491 #endif
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
492 redboot_flash_start = (CYG_ADDRESS)flash_start + CYGBLD_REDBOOT_FLASH_BOOT_OFFSET;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
493 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
494 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
495 strcpy(img->u.name, "RedBoot");
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
496 img->flash_base = redboot_flash_start;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
497 img->mem_base = redboot_flash_start;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
498 img->size = redboot_image_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
499 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
500 redboot_flash_start += redboot_image_size;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
501 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
502 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT_POST
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
503 #ifdef CYGNUM_REDBOOT_FIS_REDBOOT_POST_OFFSET
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
504 // Take care to place the POST entry at the right offset:
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
505 redboot_flash_start = (CYG_ADDRESS)flash_start + CYGNUM_REDBOOT_FIS_REDBOOT_POST_OFFSET;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
506 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
507 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
508 strcpy(img->u.name, "RedBoot[post]");
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
509 img->flash_base = redboot_flash_start;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
510 img->mem_base = redboot_flash_start;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
511 img->size = redboot_image_size;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
512 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
513 redboot_flash_start += redboot_image_size;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
514 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
515 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT_BACKUP
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
516 // And a backup image
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
517 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
518 strcpy(img->u.name, "RedBoot[backup]");
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
519 img->flash_base = redboot_flash_start;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
520 img->mem_base = redboot_flash_start;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
521 img->size = redboot_image_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
522 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
523 redboot_flash_start += redboot_image_size;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
524 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
525 #if defined(CYGSEM_REDBOOT_FLASH_CONFIG) && defined(CYGHWR_REDBOOT_FLASH_CONFIG_MEDIA_FLASH)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
526 // And a descriptor for the configuration data
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
527 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
528 strcpy(img->u.name, "RedBoot config");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
529 img->flash_base = (CYG_ADDRESS)cfg_base;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
530 img->mem_base = (CYG_ADDRESS)cfg_base;
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
531 img->size = cfg_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
532 img++;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
533 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
534 // And a descriptor for the descriptor table itself
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
535 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
536 strcpy(img->u.name, "FIS directory");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
537 img->flash_base = (CYG_ADDRESS)fis_addr;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
538 img->mem_base = (CYG_ADDRESS)fis_addr;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
539 img->size = fisdir_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
540 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
541
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
542 //create the entry for the redundant fis table
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
543 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
544 memset(img, 0, sizeof(*img));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
545 strcpy(img->u.name, "Redundant FIS");
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
546 img->flash_base = (CYG_ADDRESS)redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
547 img->mem_base = (CYG_ADDRESS)redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
548 img->size = fisdir_size;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
549 img++;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
550 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
551
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
552 #ifdef CYGOPT_REDBOOT_FIS_DIRECTORY_ARM_SIB_ID
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
553 // FIS gets the size of a full block - note, this should be changed
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
554 // if support is added for multi-block FIS structures.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
555 img = (struct fis_image_desc *)((CYG_ADDRESS)fis_work_block + fisdir_size);
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
556 // Add a footer so the FIS will be recognized by the ARM Boot
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
557 // Monitor as a reserved area.
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
558 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
559 tFooter* footer_p = (tFooter*)((CYG_ADDRESS)img - sizeof(tFooter));
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
560 cyg_uint32 check = 0;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
561 cyg_uint32 *check_ptr = (cyg_uint32 *)footer_p;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
562 cyg_int32 count = (sizeof(tFooter) - 4) >> 2;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
563
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
564 // Prepare footer. Try to protect all but the reserved space
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
565 // and the first RedBoot image (which is expected to be
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
566 // bootable), but fall back to just protecting the FIS if it's
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
567 // not at the default position in the flash.
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
568 #if defined(CYGOPT_REDBOOT_FIS_RESERVED_BASE) && (-1 == CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
569 footer_p->blockBase = (char*)_ADDR_REDBOOT_TO_ARM(flash_start);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
570 footer_p->blockBase += CYGNUM_REDBOOT_FLASH_RESERVED_BASE + redboot_image_size;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
571 #else
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
572 footer_p->blockBase = (char*)_ADDR_REDBOOT_TO_ARM(fis_work_block);
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
573 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
574 footer_p->infoBase = NULL;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
575 footer_p->signature = FLASH_FOOTER_SIGNATURE;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
576 footer_p->type = TYPE_REDHAT_REDBOOT;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
577
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
578 // and compute its checksum
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
579 for ( ; count > 0; count--) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
580 if (*check_ptr > ~check)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
581 check++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
582 check += *check_ptr++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
583 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
584 footer_p->checksum = ~check;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
585 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
586 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
587
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
588 // Do this after creating the initialized table because that inherently
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
589 // calculates where the high water mark of default RedBoot images is.
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
590
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
591 if (full_init) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
592 unsigned long erase_size;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
593 CYG_ADDRESS erase_start;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
594 // Erase everything except default RedBoot images, fis block,
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
595 // and config block.
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
596 // First deal with the possible first part, before RedBoot images:
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
597 #if (CYGBLD_REDBOOT_FLASH_BOOT_OFFSET > CYGNUM_REDBOOT_FLASH_RESERVED_BASE)
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
598 erase_start = (CYG_ADDRESS)flash_start + CYGNUM_REDBOOT_FLASH_RESERVED_BASE;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
599 erase_size = (CYG_ADDRESS)flash_start + CYGBLD_REDBOOT_FLASH_BOOT_OFFSET;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
600 if ( erase_size > erase_start ) {
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
601 erase_size -= erase_start;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
602 if ((stat = flash_erase((void *)erase_start, erase_size,
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
603 (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
604 diag_printf(" initialization failed at %p: %s\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
605 err_addr, flash_errmsg(stat));
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
606 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
607 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
608 #endif
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
609 // second deal with the larger part in the main:
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
610 erase_start = redboot_flash_start; // high water of created images
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
611 // Now the empty bits between the end of Redboot and the cfg and dir
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
612 // blocks.
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
613 #if defined(CYGSEM_REDBOOT_FLASH_CONFIG) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
614 defined(CYGHWR_REDBOOT_FLASH_CONFIG_MEDIA_FLASH) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
615 !defined(CYGSEM_REDBOOT_FLASH_COMBINED_FIS_AND_CONFIG)
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
616 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
617 erase_size = (CYG_ADDRESS)cfg_base - erase_start; // the gap between HWM and config data
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
618 } else {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
619 erase_size = (CYG_ADDRESS)fis_addr - erase_start; // the gap between HWM and fis data
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
620 }
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
621 if ((stat = flash_erase((void *)erase_start, erase_size,
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
622 (void **)&err_addr)) != 0) {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
623 diag_printf(" initialization failed %p: %s\n",
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
624 err_addr, flash_errmsg(stat));
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
625 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
626 erase_start += (erase_size + flash_block_size);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
627 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
628 erase_size = (CYG_ADDRESS)fis_addr - erase_start; // the gap between config and fis data
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
629 } else {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
630 erase_size = (CYG_ADDRESS)cfg_base - erase_start; // the gap between fis and config data
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
631 }
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
632 if ((stat = flash_erase((void *)erase_start, erase_size,
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
633 (void **)&err_addr)) != 0) {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
634 diag_printf(" initialization failed %p: %s\n",
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
635 err_addr, flash_errmsg(stat));
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
636 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
637 erase_start += (erase_size + flash_block_size);
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
638 #else // !CYGSEM_REDBOOT_FLASH_CONFIG
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
639 erase_size = (CYG_ADDRESS)fis_addr - erase_start; // the gap between HWM and fis data
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
640 if ((stat = flash_erase((void *)erase_start, erase_size,
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
641 (void **)&err_addr)) != 0) {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
642 diag_printf(" initialization failed %p: %s\n",
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
643 err_addr, flash_errmsg(stat));
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
644 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
645 erase_start += (erase_size + flash_block_size);
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
646 #endif
1738
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
647 // Lastly, anything at the end, if there is any
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
648 if ( erase_start < (((CYG_ADDRESS)flash_end)+1) ) {
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
649 erase_size = ((CYG_ADDRESS)flash_end - erase_start) + 1;
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
650 if ((stat = flash_erase((void *)erase_start, erase_size,
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
651 (void **)&err_addr)) != 0) {
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
652 diag_printf(" initialization failed at %p: %s\n",
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
653 err_addr, flash_errmsg(stat));
9091309eb665 * src/flash.c (fis_init): Avoid potentially unnecessary erase
jlarmour
parents: 1679
diff changeset
654 }
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
655 }
1354
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
656 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
657 // In this case, 'fis free' works by scanning for erased blocks. Since the
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
658 // "-f" option was not supplied, there may be areas which are not used but
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
659 // don't appear to be free since they are not erased - thus the warning
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
660 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
661 diag_printf(" Warning: device contents not erased, some blocks may not be usable\n");
1354
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
662 #endif
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
663 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
664 fis_start_update_directory(0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
665 fis_update_directory(0, 0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
666 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
667 fis_erase_redundant_directory();
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
668 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
669 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
670
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
671 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
672 fis_list(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
673 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
674 struct fis_image_desc *img;
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
675 int i, image_indx;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
676 bool show_cksums = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
677 bool show_datalen = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
678 struct option_info opts[2];
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
679 unsigned long last_addr, lowest_addr;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
680 bool image_found;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
681
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
682 #ifdef CYGHWR_REDBOOT_ARM_FLASH_SIB
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
683 // FIXME: this is somewhat half-baked
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
684 extern void arm_fis_list(void);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
685 arm_fis_list();
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
686 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
687 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
688
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
689 init_opts(&opts[0], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
690 (void *)&show_datalen, (bool *)0, "display data length");
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
691 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
692 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
693 (void *)&show_cksums, (bool *)0, "display checksums");
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
694 i = 2;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
695 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
696 i = 1;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
697 #endif
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
698 if (!scan_opts(argc, argv, 2, opts, i, 0, 0, "")) {
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
699 return;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
700 }
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
701 fis_read_directory();
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
702
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
703 // Let diag_printf do the formatting in both cases, rather than counting
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
704 // cols by hand....
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
705 diag_printf("%-16s %-10s %-10s %-10s %-s\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
706 "Name","FLASH addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
707 show_cksums ? "Checksum" : "Mem addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
708 show_datalen ? "Datalen" : "Length",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
709 "Entry point" );
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
710 last_addr = 0;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
711 image_indx = 0;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
712 do {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
713 image_found = false;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
714 lowest_addr = 0xFFFFFFFF;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
715 img = (struct fis_image_desc *) fis_work_block;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
716 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
717 if (img->u.name[0] != (unsigned char)0xFF) {
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
718 if ((img->flash_base > last_addr) && (img->flash_base < lowest_addr)) {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
719 lowest_addr = img->flash_base;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
720 image_found = true;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
721 image_indx = i;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
722 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
723 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
724 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
725 if (image_found) {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
726 img = (struct fis_image_desc *) fis_work_block;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
727 img += image_indx;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
728 diag_printf("%-16s 0x%08lX 0x%08lX 0x%08lX 0x%08lX\n", img->u.name,
2002
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
729 (unsigned long)img->flash_base,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
730 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
731 show_cksums ? img->file_cksum : img->mem_base,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
732 show_datalen ? img->data_length : img->size,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
733 #else
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
734 img->mem_base,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
735 img->size,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
736 #endif
2002
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
737 (unsigned long)img->entry_point);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
738 }
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
739 last_addr = lowest_addr;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
740 } while (image_found == true);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
741 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
742
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
743 #ifdef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
744 struct free_chunk {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
745 CYG_ADDRESS start, end;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
746 };
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
747
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
748 static int
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
749 find_free(struct free_chunk *chunks)
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
750 {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
751 CYG_ADDRESS *fis_ptr, *fis_end;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
752 struct fis_image_desc *img;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
753 int i, idx;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
754 int num_chunks = 1;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
755
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
756 // Do not search the area reserved for pre-RedBoot systems:
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
757 fis_ptr = (CYG_ADDRESS *)((CYG_ADDRESS)flash_start +
1823
ecd76f498508 * cdl/redboot.cdl (CYGBLD_REDBOOT_MIN_IMAGE_SIZE): Correct the
asl
parents: 1740
diff changeset
758 CYGNUM_REDBOOT_FLASH_RESERVED_BASE);
1349
4444f5b3be7b Fix 'fis free' list handling - from Chris Garry
gthomas
parents: 1312
diff changeset
759 fis_end = (CYG_ADDRESS *)flash_end;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
760 chunks[num_chunks-1].start = (CYG_ADDRESS)fis_ptr;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
761 chunks[num_chunks-1].end = (CYG_ADDRESS)fis_end;
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
762 fis_read_directory();
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
763 img = (struct fis_image_desc *) fis_work_block;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
764 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
765 if (img->u.name[0] != (unsigned char)0xFF) {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
766 // Figure out which chunk this is in and split it
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
767 for (idx = 0; idx < num_chunks; idx++) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
768 if ((img->flash_base >= chunks[idx].start) &&
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
769 (img->flash_base <= chunks[idx].end)) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
770 if (img->flash_base == chunks[idx].start) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
771 chunks[idx].start += img->size;
1349
4444f5b3be7b Fix 'fis free' list handling - from Chris Garry
gthomas
parents: 1312
diff changeset
772 if (chunks[idx].start >= chunks[idx].end) {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
773 // This free chunk has collapsed
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
774 while (idx < (num_chunks-1)) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
775 chunks[idx] = chunks[idx+1];
1679
b548ac5af76c * src/flash.c (find_free): fix endless loop when removing a
asl
parents: 1627
diff changeset
776 idx++;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
777 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
778 num_chunks--;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
779 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
780 } else if ((img->flash_base+img->size) == chunks[idx].end) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
781 chunks[idx].end = img->flash_base;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
782 } else {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
783 // Split chunk into two parts
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
784 if ((img->flash_base+img->size) < (CYG_ADDRESS)fis_end) {
2007
adbedd54ee7b * src/flash.c (find_free): Maintain sort order when splitting
asl
parents: 2002
diff changeset
785 int j;
adbedd54ee7b * src/flash.c (find_free): Maintain sort order when splitting
asl
parents: 2002
diff changeset
786 // make room for new chunk
adbedd54ee7b * src/flash.c (find_free): Maintain sort order when splitting
asl
parents: 2002
diff changeset
787 for (j = num_chunks; j > (idx+1); j--)
adbedd54ee7b * src/flash.c (find_free): Maintain sort order when splitting
asl
parents: 2002
diff changeset
788 chunks[j] = chunks[j-1];
adbedd54ee7b * src/flash.c (find_free): Maintain sort order when splitting
asl
parents: 2002
diff changeset
789 chunks[idx+1].start = img->flash_base + img->size;
adbedd54ee7b * src/flash.c (find_free): Maintain sort order when splitting
asl
parents: 2002
diff changeset
790 chunks[idx+1].end = chunks[idx].end;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
791 if (++num_chunks == CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
792 diag_printf("Warning: too many free chunks\n");
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
793 return num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
794 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
795 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
796 chunks[idx].end = img->flash_base;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
797 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
798 break;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
799 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
800 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
801 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
802 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
803 return num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
804 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
805 #endif // CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
806
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
807 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
808 fis_free(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
809 {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
810 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
811 unsigned long *fis_ptr, *fis_end, flash_data;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
812 unsigned long *area_start;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
813 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
814
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
815 // Do not search the area reserved for pre-RedBoot systems:
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
816 fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
1823
ecd76f498508 * cdl/redboot.cdl (CYGBLD_REDBOOT_MIN_IMAGE_SIZE): Correct the
asl
parents: 1740
diff changeset
817 CYGNUM_REDBOOT_FLASH_RESERVED_BASE);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
818 fis_end = (unsigned long *)(CYG_ADDRESS)flash_end;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
819 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
820 while (fis_ptr < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
821 flash_read(fis_ptr, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
822 if (flash_data != (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
823 if (area_start != fis_ptr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
824 // Assume that this is something
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
825 diag_printf(" 0x%08lX .. 0x%08lX\n",
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
826 (CYG_ADDRESS)area_start, (CYG_ADDRESS)fis_ptr);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
827 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
828 // Find next blank block
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
829 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
830 while (area_start < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
831 flash_read(area_start, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
832 if (flash_data == (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
833 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
834 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
835 area_start += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
836 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
837 fis_ptr = area_start;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
838 } else {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
839 fis_ptr += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
840 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
841 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
842 if (area_start != fis_ptr) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
843 diag_printf(" 0x%08lX .. 0x%08lX\n",
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
844 (CYG_ADDRESS)area_start, (CYG_ADDRESS)fis_ptr);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
845 }
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
846 #else
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
847 struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
848 int idx, num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
849
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
850 num_chunks = find_free(chunks);
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
851 for (idx = 0; idx < num_chunks; idx++) {
2002
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
852 diag_printf(" 0x%08lX .. 0x%08lX\n",
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
853 (unsigned long)chunks[idx].start,
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
854 (unsigned long)chunks[idx].end);
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
855 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
856 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
857 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
858
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
859 // Find the first unused area of flash which is long enough
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
860 static bool
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
861 fis_find_free(CYG_ADDRESS *addr, unsigned long length)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
862 {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
863 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
864 unsigned long *fis_ptr, *fis_end, flash_data;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
865 unsigned long *area_start;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
866 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
867
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
868 // Do not search the area reserved for pre-RedBoot systems:
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
869 fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
1823
ecd76f498508 * cdl/redboot.cdl (CYGBLD_REDBOOT_MIN_IMAGE_SIZE): Correct the
asl
parents: 1740
diff changeset
870 CYGNUM_REDBOOT_FLASH_RESERVED_BASE);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
871 fis_end = (unsigned long *)(CYG_ADDRESS)flash_end;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
872 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
873 while (fis_ptr < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
874 flash_read(fis_ptr, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
875 if (flash_data != (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
876 if (area_start != fis_ptr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
877 // Assume that this is something
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
878 if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
879 *addr = (CYG_ADDRESS)area_start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
880 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
881 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
882 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
883 // Find next blank block
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
884 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
885 while (area_start < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
886 flash_read(area_start, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
887 if (flash_data == (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
888 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
889 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
890 area_start += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
891 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
892 fis_ptr = area_start;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
893 } else {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
894 fis_ptr += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
895 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
896 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
897 if (area_start != fis_ptr) {
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
898 if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
899 *addr = (CYG_ADDRESS)area_start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
900 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
901 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
902 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
903 return false;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
904 #else
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
905 struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
906 int idx, num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
907
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
908 num_chunks = find_free(chunks);
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
909 for (idx = 0; idx < num_chunks; idx++) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
910 if ((chunks[idx].end - chunks[idx].start) >= length) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
911 *addr = (CYG_ADDRESS)chunks[idx].start;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
912 return true;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
913 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
914 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
915 return false;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
916 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
917 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
918
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
919 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
920 fis_create(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
921 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
922 int i, stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
923 unsigned long length, img_size;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
924 CYG_ADDRESS mem_addr, exec_addr, flash_addr, entry_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
925 char *name;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
926 bool mem_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
927 bool exec_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
928 bool entry_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
929 bool flash_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
930 bool length_set = false;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
931 bool img_size_set = false;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
932 bool no_copy = false;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
933 void *err_addr;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
934 struct fis_image_desc *img = NULL;
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
935 bool defaults_assumed;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
936 struct option_info opts[7];
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
937 bool prog_ok = true;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
938
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
939 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
940 (void *)&mem_addr, (bool *)&mem_addr_set, "memory base address");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
941 init_opts(&opts[1], 'r', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
942 (void *)&exec_addr, (bool *)&exec_addr_set, "ram base address");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
943 init_opts(&opts[2], 'e', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
944 (void *)&entry_addr, (bool *)&entry_addr_set, "entry point address");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
945 init_opts(&opts[3], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
946 (void *)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
947 init_opts(&opts[4], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
948 (void *)&length, (bool *)&length_set, "image length [in FLASH]");
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
949 init_opts(&opts[5], 's', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
950 (void *)&img_size, (bool *)&img_size_set, "image size [actual data]");
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
951 init_opts(&opts[6], 'n', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
952 (void *)&no_copy, (bool *)0, "don't copy from RAM to FLASH, just update directory");
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
953 if (!scan_opts(argc, argv, 2, opts, 7, (void *)&name, OPTION_ARG_TYPE_STR, "file name"))
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
954 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
955 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
956 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
957 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
958
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
959 fis_read_directory();
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
960 defaults_assumed = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
961 if (name) {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
962 // Search existing files to acquire defaults for params not specified:
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
963 img = fis_lookup(name, NULL);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
964 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
965 // Found it, so get image size from there
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
966 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
967 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
968 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
969 defaults_assumed = true;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
970 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
971 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
972 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
973 if (!mem_addr_set && (load_address >= (CYG_ADDRESS)ram_start) &&
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
974 (load_address_end) < (CYG_ADDRESS)ram_end) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
975 mem_addr = load_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
976 mem_addr_set = true;
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
977 defaults_assumed = true;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
978 // Get entry address from loader, unless overridden
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
979 if (!entry_addr_set)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
980 entry_addr = entry_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
981 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
982 length = load_address_end - load_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
983 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
984 } else if (defaults_assumed && !img_size_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
985 /* We got length from the FIS table, so the size of the
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
986 actual loaded image becomes img_size */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
987 img_size = load_address_end - load_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
988 img_size_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
989 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
990 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
991 // Get the remaining fall-back values from the fis
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
992 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
993 if (!exec_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
994 // Preserve "normal" behaviour
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
995 exec_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
996 exec_addr = flash_addr_set ? flash_addr : mem_addr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
997 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
998 if (!flash_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
999 flash_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1000 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1001 defaults_assumed = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1002 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1003 }
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1004
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1005 if ((!no_copy && !mem_addr_set) || (no_copy && !flash_addr_set) ||
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1006 !length_set || !name) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1007 fis_usage("required parameter missing");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1008 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1009 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1010 if (!img_size_set) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1011 img_size = length;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1012 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1013 // 'length' is size of FLASH image, 'img_size' is actual data size
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1014 // Round up length to FLASH block size
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1015 #ifndef CYGPKG_HAL_MIPS // FIXME: compiler is b0rken
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1016 length = ((length + flash_block_size - 1) / flash_block_size) * flash_block_size;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1017 if (length < img_size) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1018 diag_printf("Invalid FLASH image size/length combination\n");
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1019 return;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1020 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1021 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1022 if (flash_addr_set &&
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1023 ((stat = flash_verify_addr((void *)flash_addr)) ||
1295
5e8ec925adf2 Improve image size/length check
gthomas
parents: 1278
diff changeset
1024 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1025 _show_invalid_flash_address(flash_addr, stat);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1026 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1027 }
1301
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1028 if (flash_addr_set && ((flash_addr & (flash_block_size-1)) != 0)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1029 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1030 diag_printf(" must be 0x%x aligned\n", flash_block_size);
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1031 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1032 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1033 if (strlen(name) >= sizeof(img->u.name)) {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1034 diag_printf("Name is too long, must be less than %d chars\n", (int)sizeof(img->u.name));
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1035 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1036 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1037 if (!no_copy) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1038 if ((mem_addr < (CYG_ADDRESS)ram_start) ||
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1039 ((mem_addr+img_size) >= (CYG_ADDRESS)ram_end)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1040 diag_printf("** WARNING: RAM address: %p may be invalid\n", (void *)mem_addr);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1041 diag_printf(" valid range is %p-%p\n", (void *)ram_start, (void *)ram_end);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1042 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1043 if (!flash_addr_set && !fis_find_free(&flash_addr, length)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1044 diag_printf("Can't locate %lx(%ld) bytes free in FLASH\n", length, length);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1045 return;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1046 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1047 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1048 // First, see if the image by this name has agreable properties
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1049 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1050 if (flash_addr_set && (img->flash_base != flash_addr)) {
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1051 diag_printf("Image found, but flash address (%p)\n"
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1052 " is incorrect (present image location %p)\n",
2002
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
1053 (void*)flash_addr, (void*)img->flash_base);
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1054
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1055 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1056 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1057 if (img->size != length) {
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1058 diag_printf("Image found, but length (0x%lx, necessitating image size 0x%lx)\n"
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1059 " is incorrect (present image size 0x%lx)\n",
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1060 img_size, length, img->size);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1061 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1062 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1063 if (!verify_action("An image named '%s' exists", name)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1064 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1065 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1066 if (defaults_assumed) {
310
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
1067 if (no_copy &&
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
1068 !verify_action("* CAUTION * about to program '%s'\n at %p..%p from %p",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1069 name, (void *)flash_addr, (void *)(flash_addr+img_size-1),
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1070 (void *)mem_addr)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1071 return; // The guy gave up
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1072 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1073 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1074 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1075 } else {
1301
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1076 #ifdef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1077 // Make sure that any FLASH address specified directly is truly free
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1078 if (flash_addr_set && !no_copy) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1079 struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1080 int idx, num_chunks;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1081 bool is_free = false;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1082
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1083 num_chunks = find_free(chunks);
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1084 for (idx = 0; idx < num_chunks; idx++) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1085 if ((flash_addr >= chunks[idx].start) &&
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1086 ((flash_addr+length-1) <= chunks[idx].end)) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1087 is_free = true;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1088 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1089 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1090 if (!is_free) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1091 diag_printf("Invalid FLASH address - not free!\n");
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1092 return;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1093 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1094 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1095 #endif
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1096 // If not image by that name, try and find an empty slot
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1097 img = (struct fis_image_desc *)fis_work_block;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1098 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1099 if (img->u.name[0] == (unsigned char)0xFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1100 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1101 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1102 }
2064
ef1d669d4888 * src/flash.c (fis_create): Print an error if the FIS directory is
asl
parents: 2007
diff changeset
1103 if (i >= fisdir_size/sizeof(*img)) {
ef1d669d4888 * src/flash.c (fis_create): Print an error if the FIS directory is
asl
parents: 2007
diff changeset
1104 diag_printf("Can't find an empty slot in FIS directory!\n");
ef1d669d4888 * src/flash.c (fis_create): Print an error if the FIS directory is
asl
parents: 2007
diff changeset
1105 return;
ef1d669d4888 * src/flash.c (fis_create): Print an error if the FIS directory is
asl
parents: 2007
diff changeset
1106 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1107 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1108 if (!no_copy) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1109 // Safety check - make sure the address range is not within the code we're running
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1110 if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+img_size-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1111 diag_printf("Can't program this region - contains code in use!\n");
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1112 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1113 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1114 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1115 // Erase area to be programmed
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1116 if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1117 diag_printf("Can't erase region at %p: %s\n", err_addr, flash_errmsg(stat));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1118 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1119 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1120 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1121 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1122 // Now program it
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1123 if ((stat = FLASH_PROGRAM((void *)flash_addr, (void *)mem_addr, img_size, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1124 diag_printf("Can't program region at %p: %s\n", err_addr, flash_errmsg(stat));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1125 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1126 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1127 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1128 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1129 if (prog_ok) {
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1130 // Update directory
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1131 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1132 strcpy(img->u.name, name);
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1133 img->flash_base = flash_addr;
2066
5d5572c64422 FIS fix from Stefan Sommerfeld, ANSI cursor keys from Gary Thomas
gthomas
parents: 2064
diff changeset
1134 img->mem_base = exec_addr_set ? exec_addr : (mem_addr_set ? mem_addr : flash_addr);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1135 img->entry_point = entry_addr_set ? entry_addr : (CYG_ADDRESS)entry_address; // Hope it's been set
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1136 img->size = length;
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1137 img->data_length = img_size;
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
1138 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1139 if (!no_copy) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1140 img->file_cksum = cyg_crc32((unsigned char *)mem_addr, img_size);
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1141 } else {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1142 // No way to compute this, sorry
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1143 img->file_cksum = 0;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1144 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
1145 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1146 fis_start_update_directory(0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1147 fis_update_directory(0, 0);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1148 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1149 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1150
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1151 extern void arm_fis_delete(char *);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1152 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1153 fis_delete(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1154 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1155 char *name;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1156 int num_reserved, i, stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1157 void *err_addr;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1158 struct fis_image_desc *img;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1159
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1160 if (!scan_opts(argc, argv, 2, 0, 0, (void *)&name, OPTION_ARG_TYPE_STR, "image name"))
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1161 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1162 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1163 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1164 }
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1165 #ifdef CYGHWR_REDBOOT_ARM_FLASH_SIB
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1166 // FIXME: this is somewhat half-baked
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1167 arm_fis_delete(name);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1168 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1169 #endif
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1170 img = (struct fis_image_desc *)fis_work_block;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1171 num_reserved = 0;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1172 #ifdef CYGOPT_REDBOOT_FIS_RESERVED_BASE
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1173 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1174 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1175 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1176 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1177 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1178 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT_BACKUP
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1179 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1180 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1181 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT_POST
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1182 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1183 #endif
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1184 #if defined(CYGSEM_REDBOOT_FLASH_CONFIG) && defined(CYGHWR_REDBOOT_FLASH_CONFIG_MEDIA_FLASH)
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1185 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1186 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1187 #if 1 // And the descriptor for the descriptor table itself
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1188 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1189 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1190
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1191 img = fis_lookup(name, &i);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1192 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1193 if (i < num_reserved) {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1194 diag_printf("Sorry, '%s' is a reserved image and cannot be deleted\n", img->u.name);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1195 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1196 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1197 if (!verify_action("Delete image '%s'", name)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1198 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1199 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1200 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1201 diag_printf("No image '%s' found\n", name);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1202 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1203 }
119
77cec8369160 Merge from eCos master repository on 2000-09-01-07:47:03-BST
jlarmour
parents: 117
diff changeset
1204 // Erase Data blocks (free space)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1205 if ((stat = flash_erase((void *)img->flash_base, img->size, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1206 diag_printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat));
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1207 } else {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1208 img->u.name[0] = (unsigned char)0xFF;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1209 fis_start_update_directory(0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1210 fis_update_directory(0, 0);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1211 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1212 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1213
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1214 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1215 fis_load(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1216 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1217 char *name;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1218 struct fis_image_desc *img;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1219 CYG_ADDRESS mem_addr;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1220 bool mem_addr_set = false;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1221 bool show_cksum = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1222 struct option_info opts[3];
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1223 #if defined(CYGSEM_REDBOOT_FIS_CRC_CHECK)
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1224 unsigned long cksum;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 157
diff changeset
1225 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1226 int num_options;
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1227 #if defined(CYGPRI_REDBOOT_ZLIB_FLASH) || defined(CYGSEM_REDBOOT_FIS_CRC_CHECK)
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1228 bool decompress = false;
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
1229 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1230 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1231
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1232 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1233 (void *)&mem_addr, (bool *)&mem_addr_set, "memory [load] base address");
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1234 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1235 (void *)&show_cksum, (bool *)0, "display checksum");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1236 num_options = 2;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
1237 #ifdef CYGPRI_REDBOOT_ZLIB_FLASH
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1238 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1239 (void *)&decompress, 0, "decompress");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1240 num_options++;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1241 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1242
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
1243 CYG_ASSERT(num_options <= NUM_ELEMS(opts), "Too many options");
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
1244
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1245 if (!scan_opts(argc, argv, 2, opts, num_options, (void *)&name, OPTION_ARG_TYPE_STR, "image name"))
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1246 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1247 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1248 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1249 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1250 if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1251 diag_printf("No image '%s' found\n", name);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1252 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1253 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1254 if (!mem_addr_set) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1255 mem_addr = img->mem_base;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1256 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1257 // Load image from FLASH into RAM
962
0138b3d6b8a0 * src/flash.c: Only perform RAM check in fis load command when
jlarmour
parents: 849
diff changeset
1258 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1259 if (!valid_address((void *)mem_addr)) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1260 diag_printf("Not a loadable image - try using -b ADDRESS option\n");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1261 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1262 }
962
0138b3d6b8a0 * src/flash.c: Only perform RAM check in fis load command when
jlarmour
parents: 849
diff changeset
1263 #endif
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
1264 #ifdef CYGPRI_REDBOOT_ZLIB_FLASH
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1265 if (decompress) {
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1266 int err;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1267 _pipe_t fis_load_pipe;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1268 _pipe_t* p = &fis_load_pipe;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1269 p->out_buf = (unsigned char*) mem_addr;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1270 p->out_max = p->out_size = -1;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1271 p->in_buf = (unsigned char*) img->flash_base;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1272 p->in_avail = img->data_length;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1273
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1274 err = (*_dc_init)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1275
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1276 if (0 == err)
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1277 err = (*_dc_inflate)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1278
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1279 // Free used resources, do final translation of
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1280 // error value.
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1281 err = (*_dc_close)(p, err);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1282
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 160
diff changeset
1283 if (0 != err && p->msg) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1284 diag_printf("decompression error: %s\n", p->msg);
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 160
diff changeset
1285 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1286 diag_printf("Image loaded from %p-%p\n", (unsigned char *)mem_addr, p->out_buf);
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 160
diff changeset
1287 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1288
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1289 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1290 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1291 load_address_end = (unsigned long)p->out_buf;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1292
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1293 // Reload fis directory
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1294 fis_read_directory();
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1295 } else // dangling block
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1296 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1297 {
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1298 flash_read((void *)img->flash_base, (void *)mem_addr, img->data_length, (void **)&err_addr);
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1299
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1300 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1301 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1302 load_address_end = mem_addr + img->data_length;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1303 }
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1304 entry_address = (unsigned long)img->entry_point;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1305
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1306 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
284
3e80ecaaa3f8 * src/crc.c: Removed. Replaced with the CRC package.
asl
parents: 280
diff changeset
1307 cksum = cyg_crc32((unsigned char *)mem_addr, img->data_length);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1308 if (show_cksum) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1309 diag_printf("Checksum: 0x%08lx\n", cksum);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1310 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1311 // When decompressing, leave CRC checking to decompressor
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1312 if (!decompress && img->file_cksum) {
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1313 if (cksum != img->file_cksum) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1314 diag_printf("** Warning - checksum failure. stored: 0x%08lx, computed: 0x%08lx\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1315 img->file_cksum, cksum);
1679
b548ac5af76c * src/flash.c (find_free): fix endless loop when removing a
asl
parents: 1627
diff changeset
1316 entry_address = (unsigned long)NO_MEMORY;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1317 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1318 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
1319 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1320 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1321 #endif // CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1322
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1323 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1324 fis_write(int argc, char *argv[])
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1325 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1326 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1327 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1328 CYG_ADDRESS mem_addr, flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1329 bool mem_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1330 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1331 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1332 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1333 struct option_info opts[3];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1334 bool prog_ok;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1335
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1336 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1337 (void *)&mem_addr, (bool *)&mem_addr_set, "memory base address");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1338 init_opts(&opts[1], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1339 (void *)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1340 init_opts(&opts[2], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1341 (void *)&length, (bool *)&length_set, "image length [in FLASH]");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1342 if (!scan_opts(argc, argv, 2, opts, 3, 0, 0, 0))
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1343 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1344 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1345 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1346 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1347
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1348 if (!mem_addr_set || !flash_addr_set || !length_set) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1349 fis_usage("required parameter missing");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1350 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1351 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1352
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1353 // Round up length to FLASH block size
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1354 #ifndef CYGPKG_HAL_MIPS // FIXME: compiler is b0rken
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1355 length = ((length + flash_block_size - 1) / flash_block_size) * flash_block_size;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1356 #endif
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1357 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1358 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1359 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1360 _show_invalid_flash_address(flash_addr, stat);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1361 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1362 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1363 if (flash_addr_set && flash_addr & (flash_block_size-1)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1364 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1365 diag_printf(" must be 0x%x aligned\n", flash_block_size);
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1366 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1367 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1368 if ((mem_addr < (CYG_ADDRESS)ram_start) ||
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1369 ((mem_addr+length) >= (CYG_ADDRESS)ram_end)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1370 diag_printf("** WARNING: RAM address: %p may be invalid\n", (void *)mem_addr);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1371 diag_printf(" valid range is %p-%p\n", (void *)ram_start, (void *)ram_end);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1372 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1373 // Safety check - make sure the address range is not within the code we're running
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1374 if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+length-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1375 diag_printf("Can't program this region - contains code in use!\n");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1376 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1377 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1378 if (!verify_action("* CAUTION * about to program FLASH\n at %p..%p from %p",
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1379 (void *)flash_addr, (void *)(flash_addr+length-1),
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1380 (void *)mem_addr)) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1381 return; // The guy gave up
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1382 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1383 prog_ok = true;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1384 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1385 // Erase area to be programmed
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1386 if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1387 diag_printf("Can't erase region at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1388 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1389 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1390 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1391 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1392 // Now program it
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1393 if ((stat = FLASH_PROGRAM((void *)flash_addr, (void *)mem_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1394 diag_printf("Can't program region at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1395 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1396 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1397 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1398 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1399
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1400 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1401 fis_erase(int argc, char *argv[])
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1402 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1403 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1404 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1405 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1406 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1407 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1408 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1409 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1410
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1411 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1412 (void *)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1413 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1414 (void *)&length, (bool *)&length_set, "length");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1415 if (!scan_opts(argc, argv, 2, opts, 2, (void **)0, 0, ""))
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1416 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1417 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1418 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1419 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1420
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1421 if (!flash_addr_set || !length_set) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1422 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1423 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1424 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1425 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1426 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1427 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1428 _show_invalid_flash_address(flash_addr, stat);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1429 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1430 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1431 if (flash_addr_set && flash_addr & (flash_block_size-1)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1432 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1433 diag_printf(" must be 0x%x aligned\n", flash_block_size);
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1434 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1435 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1436 // Safety check - make sure the address range is not within the code we're running
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1437 if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+length-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1438 diag_printf("Can't erase this region - contains code in use!\n");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1439 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1440 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1441 if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1442 diag_printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1443 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1444 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1445
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
1446 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1447
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1448 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1449 fis_lock(int argc, char *argv[])
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1450 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1451 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1452 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1453 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1454 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1455 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1456 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1457 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1458 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1459
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1460 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1461 (void *)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1462 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1463 (void *)&length, (bool *)&length_set, "length");
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1464 if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name"))
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1465 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1466 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1467 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1468 }
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1469 #ifdef CYGOPT_REDBOOT_FIS
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1470 /* Get parameters from image if specified */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1471 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1472 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1473 if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1474 diag_printf("No image '%s' found\n", name);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1475 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1476 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1477
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1478 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1479 length = img->size;
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1480 } else
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1481 #endif
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1482 if (!flash_addr_set || !length_set) {
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1483 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1484 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1485 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1486 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1487 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1488 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1489 _show_invalid_flash_address(flash_addr, stat);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1490 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1491 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1492 if ((stat = flash_lock((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1493 diag_printf("Error locking at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1494 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1495 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1496
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1497 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1498 fis_unlock(int argc, char *argv[])
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1499 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1500 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1501 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1502 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1503 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1504 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1505 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1506 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1507 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1508
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1509 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1510 (void *)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1511 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1512 (void *)&length, (bool *)&length_set, "length");
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1513 if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name"))
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1514 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1515 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1516 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1517 }
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1518 #ifdef CYGOPT_REDBOOT_FIS
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1519 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1520 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1521 if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1522 diag_printf("No image '%s' found\n", name);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1523 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1524 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1525
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1526 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1527 length = img->size;
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1528 } else
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1529 #endif
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1530 if (!flash_addr_set || !length_set) {
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1531 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1532 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1533 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1534 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1535 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1536 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1537 _show_invalid_flash_address(flash_addr, stat);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1538 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1539 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1540
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1541 if ((stat = flash_unlock((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1542 diag_printf("Error unlocking at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1543 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1544 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1545 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1546
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1547 // This is set non-zero if the FLASH subsystem has successfully been initialized
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1548 int __flash_init = 0;
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1549
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1550 void
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1551 _flash_info(void)
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1552 {
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1553 if (!__flash_init) return;
1984
f199806a09e0 * src/flash.c (_flash_info): Fixed a warning about a diag_printf
asl
parents: 1943
diff changeset
1554 diag_printf("FLASH: %p - 0x%x, %d blocks of %p bytes each.\n",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1555 flash_start, (CYG_ADDRWORD)flash_end + 1, flash_num_blocks, (void *)flash_block_size);
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1556 }
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1557
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1558 /* Returns -1 on failure, 0 on success, 1 if it was successfull
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1559 but a failed fis update was detected */
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1560 int
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1561 do_flash_init(void)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1562 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1563 int stat;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1564
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1565 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1566 struct fis_image_desc img0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1567 struct fis_image_desc img1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1568 int fis_update_was_interrupted=0;
2202
eee88a59c155 Fix typo & warning from last checkin - from Sergei Gavrikov
gthomas
parents: 2195
diff changeset
1569 void *err_addr;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1570
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1571 //check the size of fis_valid_info
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1572 CYG_ASSERT((sizeof(struct fis_valid_info)<=sizeof(img0.u.name)), "fis_valid_info size mismatch");
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1573 //try to check the alignment of version_count
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1574 CYG_ASSERT((((unsigned long)&img0.u.valid_info.version_count - (unsigned long)&img0) % sizeof(unsigned long) == 0), "alignment problem");
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1575 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1576
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1577
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1578
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1579 if (!__flash_init) {
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1580 __flash_init = 1;
1390
5503490aa292 * src/flash.c: flash_init() no longer takes three args.
asl
parents: 1354
diff changeset
1581 if ((stat = flash_init(diag_printf)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1582 diag_printf("FLASH: driver init failed: %s\n", flash_errmsg(stat));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1583 return -1;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1584 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1585 flash_get_limits((void *)0, (void **)&flash_start, (void **)&flash_end);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1586 // Keep 'end' address as last valid location, to avoid wrap around problems
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1587 flash_end = (void *)((CYG_ADDRESS)flash_end - 1);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1588 flash_get_block_info(&flash_block_size, &flash_num_blocks);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1589 #ifdef CYGOPT_REDBOOT_FIS
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1590 fisdir_size = CYGNUM_REDBOOT_FIS_DIRECTORY_ENTRY_COUNT * CYGNUM_REDBOOT_FIS_DIRECTORY_ENTRY_SIZE;
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1591 fisdir_size = ((fisdir_size + flash_block_size - 1) / flash_block_size) * flash_block_size;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
1592 # if defined(CYGPRI_REDBOOT_ZLIB_FLASH) && defined(CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER)
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1593 fis_work_block = fis_zlib_common_buffer;
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1594 if(CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE < fisdir_size) {
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1595 diag_printf("FLASH: common buffer too small\n");
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1596 return -1;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1597 }
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1598 # else
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1599 workspace_end = (unsigned char *)(workspace_end_init-fisdir_size);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1600 fis_work_block = workspace_end;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1601 # endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1602 if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1603 fis_addr = (void *)((CYG_ADDRESS)flash_end + 1 +
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1604 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1605 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1606 fis_addr = (void *)((CYG_ADDRESS)flash_start +
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1607 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1608 }
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1609
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1610 if (((CYG_ADDRESS)fis_addr + fisdir_size - 1) > (CYG_ADDRESS)flash_end) {
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1611 diag_printf("FIS directory doesn't fit\n");
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1612 return -1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1613 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1614 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1615
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1616 if (CYGNUM_REDBOOT_FIS_REDUNDANT_DIRECTORY_BLOCK < 0) {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1617 redundant_fis_addr = (void *)((CYG_ADDRESS)flash_end + 1 +
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1618 (CYGNUM_REDBOOT_FIS_REDUNDANT_DIRECTORY_BLOCK*flash_block_size));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1619 } else {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1620 redundant_fis_addr = (void *)((CYG_ADDRESS)flash_start +
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1621 (CYGNUM_REDBOOT_FIS_REDUNDANT_DIRECTORY_BLOCK*flash_block_size));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1622 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1623
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1624 if (((CYG_ADDRESS)redundant_fis_addr + fisdir_size - 1) > (CYG_ADDRESS)flash_end) {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1625 diag_printf("Redundant FIS directory doesn't fit\n");
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1626 return -1;
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1627 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1628 FLASH_READ(fis_addr, &img0, sizeof(img0), (void **)&err_addr);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1629 FLASH_READ(redundant_fis_addr, &img1, sizeof(img1), (void **)&err_addr);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1630
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1631 if (strncmp(img0.u.valid_info.magic_name, CYG_REDBOOT_RFIS_VALID_MAGIC, CYG_REDBOOT_RFIS_VALID_MAGIC_LENGTH)!=0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1632 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1633 memset(&img0, 0, sizeof(img0));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1634 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1635
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1636 if (strncmp(img1.u.valid_info.magic_name, CYG_REDBOOT_RFIS_VALID_MAGIC, CYG_REDBOOT_RFIS_VALID_MAGIC_LENGTH)!=0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1637 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1638 memset(&img1, 0, sizeof(img0));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1639 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1640
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1641 #ifdef REDBOOT_FLASH_REVERSE_BYTEORDER
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1642 img0.u.valid_info.version_count = CYG_SWAP32(img0.u.valid_info.version_count);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1643 img1.u.valid_info.version_count = CYG_SWAP32(img1.u.valid_info.version_count);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1644 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1645
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1646 if (fis_get_valid_buf(&img0, &img1, &fis_update_was_interrupted)==1)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1647 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1648 // Valid, so swap primary and secondary
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1649 void * tmp;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1650 tmp = fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1651 fis_addr = redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1652 redundant_fis_addr = tmp;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1653 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1654 #endif
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1655 fis_read_directory();
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1656 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1657 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1658 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1659 if (fis_update_was_interrupted)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1660 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1661 else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1662 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1663 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1664 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1665 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1666 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1667
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1668 // Wrapper to avoid compiler warnings
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1669 static void
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1670 _do_flash_init(void)
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1671 {
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1672 static int init_done = 0;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1673 if (init_done) return;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1674 init_done = 1;
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1675 do_flash_init();
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1676 }
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1677
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1678 RedBoot_init(_do_flash_init, RedBoot_INIT_FIRST);
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
1679
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
1680 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1681 do_fis(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1682 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1683 struct cmd *cmd;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1684
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1685 if (argc < 2) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1686 fis_usage("too few arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1687 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1688 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1689 if (do_flash_init()<0) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1690 diag_printf("Sorry, no FLASH memory is available\n");
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1691 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1692 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1693 if ((cmd = cmd_search(__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1694 argv[1])) != (struct cmd *)0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1695 (cmd->fun)(argc, argv);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1696 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1697 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1698 fis_usage("unrecognized command");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1699 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1700
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1701 // EOF flash.c