annotate packages/redboot/current/src/flash.c @ 2864:6fb62c01642a

* src/flash.c: Fix compilation warnings when redundant FIS is selected.
author jld
date Fri, 03 Apr 2009 09:32:24 +0000
parents 16bd2526e63f
children
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 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
2817
6e1e5c6da98e * src/flash.c (do_flash_init): Update for minor flash API
jlarmour
parents: 2729
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2631
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
39 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
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 // Author(s): gthomas
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
43 // Contributors: gthomas, tkoeller
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
44 // Date: 2000-07-28
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
45 // Purpose:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
46 // Description:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
47 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
48 // 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
49 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
50 //####DESCRIPTIONEND####
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 //==========================================================================
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 #include <redboot.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
55 #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
56 #include <fis.h>
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
57 #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
58 #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
59
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
60 #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
61 // 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
62 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
63 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
64
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
65 // Round a quantity up
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
66 #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
67
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
68 #ifdef CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
69 // Image management functions
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
70 local_cmd_entry("init",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
71 "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
72 "[-f]",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
73 fis_init,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
74 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
75 );
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
76 #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
77 # 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
78 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
79 # define FIS_LIST_OPTS "[-d]"
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
80 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
81 local_cmd_entry("list",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
82 "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
83 FIS_LIST_OPTS,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
84 fis_list,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
85 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
86 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
87 local_cmd_entry("free",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
88 "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
89 "",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
90 fis_free,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
91 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
92 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
93 local_cmd_entry("delete",
388
38dad94e75ce Min BOOTP/vendor size. Fix typo in FIS/DELETE.
gthomas
parents: 310
diff changeset
94 "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
95 "name",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
96 fis_delete,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
97 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
98 );
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
99
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
100 static char fis_load_usage[] =
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
101 #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
102 "[-d] "
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
103 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
104 "[-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
105
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
106 local_cmd_entry("load",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
107 "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
108 fis_load_usage,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
109 fis_load,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
110 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
111 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
112 local_cmd_entry("create",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
113 "Create an image",
2066
5d5572c64422 FIS fix from Stefan Sommerfeld, ANSI cursor keys from Gary Thomas
gthomas
parents: 2064
diff changeset
114 "[-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
115 " [-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
116 fis_create,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
117 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
118 );
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
119 #endif
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
120
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
121 // Raw flash access functions
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
122 local_cmd_entry("erase",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
123 "Erase FLASH contents",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
124 "-f <flash_addr> -l <length>",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
125 fis_erase,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
126 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
127 );
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
128 #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
129 local_cmd_entry("lock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
130 "LOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
131 "[-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
132 fis_lock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
133 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
134 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
135 local_cmd_entry("unlock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
136 "UNLOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
137 "[-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
138 fis_unlock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
139 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
140 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
141 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
142 local_cmd_entry("write",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
143 "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
144 "-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
145 fis_write,
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
146 FIS_cmds
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
147 );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
148
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
149 // Define table boundaries
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
150 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
151 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
152
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
153 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
154
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
155 // CLI function
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
156 static cmd_fun do_fis;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
157 RedBoot_nested_cmd("fis",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
158 "Manage FLASH images",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
159 "{cmds}",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
160 do_fis,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
161 __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
162 );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
163
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
164 // Local data used by these routines
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
165 cyg_flashaddr_t flash_start, flash_end;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
166 size_t flash_block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
167 cyg_uint32 flash_num_blocks;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
168 #ifdef CYGOPT_REDBOOT_FIS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
169 void *fis_work_block;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
170 cyg_flashaddr_t fis_addr;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
171 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
172 cyg_flashaddr_t redundant_fis_addr;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
173 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
174 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
175 #endif
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
176 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
177 extern cyg_flashaddr_t cfg_base; // Location in Flash of config data
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
178 extern size_t cfg_size; // Length of config data - rounded to Flash block size
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
179 extern struct _config *config;
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
180 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
181
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
182 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
183 fis_usage(char *why)
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
184 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
185 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
186 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
187 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
188
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
189 static void
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
190 _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
191 {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
192 cyg_uint32 i=0;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
193 cyg_flash_info_t info;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
194 int ret;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
195
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
196 diag_printf("Invalid FLASH address %p: %s\n", (void *)flash_addr,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
197 cyg_flash_errmsg(stat));
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
198 do {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
199 ret = cyg_flash_get_info(i, &info);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
200 if (ret == CYG_FLASH_ERR_OK) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
201 diag_printf(" valid range is %p - %p\n", (void*)info.start, (void*)info.end);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
202 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
203 i++;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
204 } while (ret != CYG_FLASH_ERR_INVALID);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
205 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
206
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
207 // Avoid overwriting the current executable. This is not a complete
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
208 // implementation, there may be code outside the text region, but it
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
209 // is generally good enough. If either the start of the text region or
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
210 // the end of the text region is within the specified range then at
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
211 // least some of the code is in the area of flash about to be erased
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
212 // or programmed.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
213 static cyg_bool
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
214 check_code_overlaps(cyg_flashaddr_t start, cyg_flashaddr_t end)
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
215 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
216 extern char _stext[], _etext[];
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
217
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
218 return ((((unsigned long)&_stext >= (unsigned long)start) &&
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
219 ((unsigned long)&_stext < (unsigned long)end))
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
220 ||
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
221 (((unsigned long)&_etext >= (unsigned long)start) &&
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
222 ((unsigned long)&_etext < (unsigned long)end)));
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
223 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
224
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
225 #ifdef CYGOPT_REDBOOT_FIS
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
226
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
227 // 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
228 //
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
229 static inline void fis_endian_fixup(void *addr)
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
230 {
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
231 #ifdef REDBOOT_FLASH_REVERSE_BYTEORDER
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
232 struct fis_image_desc *p = addr;
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
233 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
234
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
235 while (cnt-- > 0) {
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
236 p->flash_base = CYG_SWAP32(p->flash_base);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
237 p->mem_base = CYG_SWAP32(p->mem_base);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
238 p->size = CYG_SWAP32(p->size);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
239 p->entry_point = CYG_SWAP32(p->entry_point);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
240 p->data_length = CYG_SWAP32(p->data_length);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
241 p->desc_cksum = CYG_SWAP32(p->desc_cksum);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
242 p->file_cksum = CYG_SWAP32(p->file_cksum);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
243 p++;
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
244 }
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
245 #endif
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
246 }
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
247
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
248 void
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
249 fis_read_directory(void)
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
250 {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
251 cyg_flashaddr_t err_addr;
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
252
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
253 cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
254 fis_endian_fixup(fis_work_block);
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
255 }
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
256
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
257 struct fis_image_desc *
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
258 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
259 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
260 int i;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
261 struct fis_image_desc *img;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
262
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
263 fis_read_directory();
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
264
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
265 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
266 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
267 if ((img->u.name[0] != '\xFF') &&
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
268 (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
269 if (num) *num = i;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
270 return img;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
271 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
272 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
273 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
274 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
275
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
276 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
277 {
2202
eee88a59c155 Fix typo & warning from last checkin - from Sergei Gavrikov
gthomas
parents: 2195
diff changeset
278 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
2258
19ce76dd5f64 Fix compile error - from David Ho
gthomas
parents: 2211
diff changeset
279 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
280 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
281 // 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
282 int do_autolock=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
283 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
284 int do_autolock=autolock;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
285 #endif
2258
19ce76dd5f64 Fix compile error - from David Ho
gthomas
parents: 2211
diff changeset
286 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
287
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
288 struct fis_image_desc* img=NULL;
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
289 cyg_flashaddr_t err_addr;
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
290 cyg_flashaddr_t tmp_fis_addr;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
291 int stat;
2195
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 /*exchange old and new valid fis tables*/
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
294 tmp_fis_addr=fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
295 fis_addr=redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
296 redundant_fis_addr=tmp_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
297
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
298 //adjust the contents of the new fis table
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
299 img=(struct fis_image_desc*)fis_work_block;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
300
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
301 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
302 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
303 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
304 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
305
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
306 //ready to go....
2258
19ce76dd5f64 Fix compile error - from David Ho
gthomas
parents: 2211
diff changeset
307 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
308 if (do_autolock)
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
309 cyg_flash_unlock(fis_addr, fisdir_size, &err_addr);
2258
19ce76dd5f64 Fix compile error - from David Ho
gthomas
parents: 2211
diff changeset
310 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
311
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
312 if ((stat = cyg_flash_erase(fis_addr, fisdir_size, &err_addr)) != 0) {
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
313 diag_printf("Error erasing FIS directory at %p: %s\n",
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
314 (void*)err_addr, cyg_flash_errmsg(stat));
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
315 return 1;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
316 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
317 //now magic is 0xffffffff
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
318 fis_endian_fixup(fis_work_block);
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
319 if ((stat = cyg_flash_program(fis_addr, fis_work_block, flash_block_size, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
320 diag_printf("Error writing FIS directory at %p: %s\n",
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
321 (void*)err_addr, cyg_flash_errmsg(stat));
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
322 return 1;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
323 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
324 fis_endian_fixup(fis_work_block);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
325 //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
326
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
327 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
328 /* nothing to do here without redundant fis */
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
329 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
330 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
331
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
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
334 int
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
335 fis_update_directory(int autolock, int error)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
336 {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
337 cyg_flashaddr_t err_addr;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
338 int stat;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
339
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
340 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
341 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
342 // 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
343 int do_autolock=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
344 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
345 int do_autolock=autolock;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
346 #endif
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
347 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
348
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
349 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
350
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
351 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
352
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
353 // called from invalid state
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
354 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
355 return -1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
356
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
357 //if it failed, reset is0Valid to the state before startUpdateDirectory()
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
358 //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
359 //then reread the contents from flash
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
360 //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
361 //but IN_PROGRESS is also good enough I think
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
362 if (error!=0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
363 {
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
364 cyg_flashaddr_t swap_fis_addr=fis_addr;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
365 fis_addr=redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
366 redundant_fis_addr=swap_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
367 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
368 else //success
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
369 {
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
370 cyg_flashaddr_t tmp_fis_addr=((CYG_ADDRESS)fis_addr+CYG_REDBOOT_RFIS_VALID_MAGIC_LENGTH);
2195
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 img->u.valid_info.valid_flag[0]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
373 img->u.valid_info.valid_flag[1]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
374
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
375 if ((stat = cyg_flash_program(tmp_fis_addr, img->u.valid_info.valid_flag,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
376 sizeof(img->u.valid_info.valid_flag), &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
377 diag_printf("Error writing FIS directory at %p: %s\n",
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
378 (void*)err_addr, cyg_flash_errmsg(stat));
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
379 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
380 }
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
381 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
382 if (do_autolock)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
383 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
384 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
385
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
386 #else // CYGOPT_REDBOOT_REDUNDANT_FIS
2202
eee88a59c155 Fix typo & warning from last checkin - from Sergei Gavrikov
gthomas
parents: 2195
diff changeset
387 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
388
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
389 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
390 #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
391 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
392 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
393 blk_size += cfg_size;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
394 #endif
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
395 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
396 if (do_autolock)
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
397 cyg_flash_unlock(fis_addr, blk_size, &err_addr);
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
398 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
399
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
400 if ((stat = cyg_flash_erase(fis_addr, blk_size, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
401 diag_printf("Error erasing FIS directory at %p: %s\n", (void*)err_addr, cyg_flash_errmsg(stat));
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
402 } else {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
403 if ((stat = cyg_flash_program(fis_addr, fis_work_block, blk_size,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
404 &err_addr)) != 0) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
405 diag_printf("Error writing FIS directory at %p: %s\n",
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
406 (void*)err_addr, cyg_flash_errmsg(stat));
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
407 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
408 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
409 fis_endian_fixup(fis_work_block);
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
410 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
411 if (do_autolock)
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
412 cyg_flash_lock(fis_addr, blk_size, &err_addr);
2211
acfe2ec52590 Fix build problems on systems without FLASH locking
gthomas
parents: 2202
diff changeset
413 #endif
2195
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 #endif // CYGOPT_REDBOOT_REDUNDANT_FIS
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 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
418 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
419
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
420 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
421
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
422 int
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
423 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
424 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
425 *update_was_interrupted=0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
426 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
427 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
428 if (img0->u.valid_info.version_count>0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
429 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
430 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
431 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
432 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
433 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
434 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
435 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
436 if (img1->u.valid_info.version_count>0)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
437 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
438 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
439 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
440 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
441 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
442 //magic is ok for both, now check the valid flag
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
443 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
444 || (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
445 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
446 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
447 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
448 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
449 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
450 || (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
451 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
452 *update_was_interrupted=1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
453 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
454 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
455
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
456 //now check the version
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
457 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
458 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
459
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
460 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
461 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
462
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
463 void
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
464 fis_erase_redundant_directory(void)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
465 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
466 int stat;
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
467 cyg_flashaddr_t err_addr;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
468
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
469 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
470 // Ensure [quietly] that the directory is unlocked before trying
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
471 // to update
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
472 cyg_flash_unlock(redundant_fis_addr, fisdir_size,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
473 &err_addr);
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
474 #endif
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
475 if ((stat = cyg_flash_erase(redundant_fis_addr, fisdir_size,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
476 &err_addr)) != 0) {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
477 diag_printf("Error erasing FIS directory at %p: %s\n",
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
478 (void*)err_addr, cyg_flash_errmsg(stat));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
479 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
480 #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
481 // Ensure [quietly] that the directory is locked after the update
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
482 cyg_flash_lock(redundant_fis_addr, fisdir_size, &err_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
483 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
484 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
485 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
486
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
487 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
488 fis_init(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
489 {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
490 int stat;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
491 struct fis_image_desc *img;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
492 cyg_flashaddr_t err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
493 bool full_init = false;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
494 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
495 CYG_ADDRESS redboot_flash_start;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
496 unsigned long redboot_image_size;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
497
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
498 init_opts(&opts[0], 'f', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
499 (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
500 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
501 {
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
502 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
503 }
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
504
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
505 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
506 diag_printf("** Aborted\n");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
507 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
508 }
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
509 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
510
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
511 #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
512 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
513 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
514
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
515 img = (struct fis_image_desc *)fis_work_block;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
516 memset(img, '\xFF', fisdir_size); // Start with erased data
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
517
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
518 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
519 //create the valid flag entry
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
520 memset(img, 0, sizeof(struct fis_image_desc));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
521 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
522 img->u.valid_info.valid_flag[0]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
523 img->u.valid_info.valid_flag[1]=CYG_REDBOOT_RFIS_VALID;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
524 img->u.valid_info.version_count=0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
525 img++;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
526 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
527
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
528 // 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
529 #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
530 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
531 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
532 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
533 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
534 img->size = CYGNUM_REDBOOT_FLASH_RESERVED_BASE;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
535 img->data_length = img->size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
536 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
537 #endif
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
538 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
539 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
540 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
541 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
542 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
543 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
544 img->size = redboot_image_size;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
545 img->data_length = img->size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
546 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
547 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
548 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
549 #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
550 #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
551 // 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
552 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
553 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
554 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
555 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
556 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
557 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
558 img->size = redboot_image_size;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
559 img->data_length = img->size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
560 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
561 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
562 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
563 #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
564 // And a backup image
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
565 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
566 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
567 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
568 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
569 img->size = redboot_image_size;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
570 img->data_length = img->size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
571 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
572 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
573 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
574 #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
575 // 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
576 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
577 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
578 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
579 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
580 img->size = cfg_size;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
581 img->data_length = img->size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
582 img++;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
583 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
584 // 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
585 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
586 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
587 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
588 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
589 img->size = fisdir_size;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
590 img->data_length = img->size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
591 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
592
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
593 //create the entry for the redundant fis table
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
594 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
595 memset(img, 0, sizeof(*img));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
596 strcpy(img->u.name, "Redundant FIS");
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
597 img->flash_base = (CYG_ADDRESS)redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
598 img->mem_base = (CYG_ADDRESS)redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
599 img->size = fisdir_size;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
600 img++;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
601 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
602
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
603 #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
604 // 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
605 // 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
606 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
607 // 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
608 // Monitor as a reserved area.
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
609 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
610 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
611 cyg_uint32 check = 0;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
612 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
613 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
614
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
615 // 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
616 // 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
617 // 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
618 // 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
619 #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
620 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
621 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
622 #else
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
623 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
624 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
625 footer_p->infoBase = NULL;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
626 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
627 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
628
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
629 // and compute its checksum
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
630 for ( ; count > 0; count--) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
631 if (*check_ptr > ~check)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
632 check++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
633 check += *check_ptr++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
634 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
635 footer_p->checksum = ~check;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
636 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
637 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
638
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
639 // 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
640 // 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
641
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
642 if (full_init) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
643 unsigned long erase_size;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
644 CYG_ADDRESS erase_start;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
645 // 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
646 // and config block.
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
647 // 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
648 #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
649 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
650 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
651 if ( erase_size > erase_start ) {
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
652 erase_size -= erase_start;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
653 if ((stat = cyg_flash_erase((void *)erase_start, erase_size,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
654 &err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
655 diag_printf(" initialization failed at %p: %s\n",
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
656 err_addr, cyg_flash_errmsg(stat));
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
657 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
658 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
659 #endif
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
660 // 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
661 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
662 // 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
663 // blocks.
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
664 #if defined(CYGSEM_REDBOOT_FLASH_CONFIG) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
665 defined(CYGHWR_REDBOOT_FLASH_CONFIG_MEDIA_FLASH) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
666 !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
667 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
668 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
669 } else {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
670 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
671 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
672 if ((stat = cyg_flash_erase(erase_start, erase_size,&err_addr)) != 0) {
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
673 diag_printf(" initialization failed %p: %s\n",
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
674 (void*)err_addr, cyg_flash_errmsg(stat));
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
675 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
676 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
677 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
678 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
679 } else {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
680 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
681 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
682 if ((stat = cyg_flash_erase(erase_start, erase_size,&err_addr)) != 0) {
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
683 diag_printf(" initialization failed %p: %s\n",
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
684 (void*)err_addr, cyg_flash_errmsg(stat));
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
685 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
686 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
687 #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
688 erase_size = (CYG_ADDRESS)fis_addr - erase_start; // the gap between HWM and fis data
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
689 if ((stat = cyg_flash_erase(erase_start, erase_size,&err_addr)) != 0) {
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
690 diag_printf(" initialization failed %p: %s\n",
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
691 (void*)err_addr, cyg_flash_errmsg(stat));
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
692 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
693 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
694 #endif
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
695 // Lastly, anything at the end
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
696 erase_size = ((CYG_ADDRESS)flash_end - erase_start) + 1;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
697 if ((erase_size > 0) &&
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
698 ((stat = cyg_flash_erase(erase_start, erase_size,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
699 &err_addr))) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
700 diag_printf(" initialization failed at %p: %s\n",
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
701 (void*)err_addr, cyg_flash_errmsg(stat));
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
702 }
1354
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
703 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
704 // In this case, 'fis free' works by scanning for erased blocks. Since the
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
705 // "-f" option was not supplied, there may be areas which are not used but
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
706 // 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
707 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
708 diag_printf(" Warning: device contents not erased, some blocks may not be usable\n");
1354
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
709 #endif
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
710 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
711 fis_start_update_directory(0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
712 fis_update_directory(0, 0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
713 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
714 fis_erase_redundant_directory();
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
715 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
716 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
717
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
718 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
719 fis_list(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
720 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
721 struct fis_image_desc *img;
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
722 int i, image_indx;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
723 bool show_cksums = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
724 bool show_datalen = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
725 struct option_info opts[2];
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
726 unsigned long last_addr, lowest_addr;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
727 bool image_found;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
728
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
729 #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
730 // 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
731 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
732 arm_fis_list();
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
733 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
734 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
735
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
736 init_opts(&opts[0], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
737 (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
738 #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
739 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
740 (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
741 i = 2;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
742 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
743 i = 1;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
744 #endif
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
745 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
746 return;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
747 }
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
748 fis_read_directory();
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
749
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
750 // 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
751 // cols by hand....
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
752 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
753 "Name","FLASH addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
754 show_cksums ? "Checksum" : "Mem addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
755 show_datalen ? "Datalen" : "Length",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
756 "Entry point" );
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
757 last_addr = 0;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
758 image_indx = 0;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
759 do {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
760 image_found = false;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
761 lowest_addr = 0xFFFFFFFF;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
762 img = (struct fis_image_desc *) fis_work_block;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
763 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
764 if (img->u.name[0] != '\xFF') {
2394
a21e68455afd * src/flash.c: (fis_list): fis list will now list an image
asl
parents: 2258
diff changeset
765 if ((img->flash_base >= last_addr) && (img->flash_base < lowest_addr)) {
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
766 lowest_addr = img->flash_base;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
767 image_found = true;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
768 image_indx = i;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
769 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
770 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
771 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
772 if (image_found) {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
773 img = (struct fis_image_desc *) fis_work_block;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
774 img += image_indx;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
775 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
776 (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
777 #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
778 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
779 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
780 #else
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
781 img->mem_base,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
782 img->size,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
783 #endif
2002
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
784 (unsigned long)img->entry_point);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
785 }
2394
a21e68455afd * src/flash.c: (fis_list): fis list will now list an image
asl
parents: 2258
diff changeset
786 last_addr = lowest_addr + 1;
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
787 } while (image_found == true);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
788 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
789
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
790 #ifdef CYGNUM_REDBOOT_FLASH_RESERVED_DEVICES
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
791 static CYG_ADDRESS flash_reserved_devices[] = { CYGNUM_REDBOOT_FLASH_RESERVED_DEVICES, 0xFFFFFFFF };
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
792
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
793 static cyg_bool flash_reserved( CYG_ADDRESS start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
794 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
795 int i;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
796 for( i = 0; flash_reserved_devices[i] != 0xFFFFFFFF; i++ )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
797 if( start == flash_reserved_devices[i] )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
798 return true;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
799 return false;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
800 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
801 #else
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
802 #define flash_reserved(__start) false
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
803 #endif
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
804
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
805 #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
806 struct free_chunk {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
807 CYG_ADDRESS start, end;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
808 };
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
809
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
810 static int
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
811 find_free(struct free_chunk *chunks)
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
812 {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
813 cyg_flash_info_t info;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
814 struct fis_image_desc *img;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
815 int i=0, idx;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
816 int num_chunks = 0;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
817 int ret;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
818
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
819 do {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
820 // get info for each flash device
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
821 ret = cyg_flash_get_info(i, &info);
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
822
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
823 if (ret == CYG_FLASH_ERR_OK && !flash_reserved( info.start )) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
824
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
825 #ifdef CYGNUM_REDBOOT_FLASH_BASE
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
826 if ( CYGNUM_REDBOOT_FLASH_BASE == info.start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
827 #else
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
828 if (i == 0 )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
829 #endif
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
830 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
831 // Do not search the area reserved for pre-RedBoot systems:
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
832 chunks[num_chunks].start = (info.start +
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
833 CYGNUM_REDBOOT_FLASH_RESERVED_BASE);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
834 chunks[num_chunks].end = info.end;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
835 num_chunks++;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
836 } else { // Contiguous flash? If so collapse the chunks together.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
837 if (chunks[num_chunks-1].end == (info.start -1)) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
838 chunks[num_chunks-1].end = info.end;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
839 } else {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
840 chunks[num_chunks].start = info.start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
841 chunks[num_chunks].end = info.end;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
842 num_chunks++;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
843 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
844 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
845 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
846 i++;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
847 } while (ret != CYG_FLASH_ERR_INVALID);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
848
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
849 fis_read_directory();
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
850 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
851 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
852 if (img->u.name[0] != '\xFF') {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
853 // 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
854 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
855 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
856 (img->flash_base <= chunks[idx].end)) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
857 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
858 chunks[idx].start += img->size;
1349
4444f5b3be7b Fix 'fis free' list handling - from Chris Garry
gthomas
parents: 1312
diff changeset
859 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
860 // This free chunk has collapsed
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
861 num_chunks--;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
862 while (idx < num_chunks) {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
863 chunks[idx] = chunks[idx+1];
1679
b548ac5af76c * src/flash.c (find_free): fix endless loop when removing a
asl
parents: 1627
diff changeset
864 idx++;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
865 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
866 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
867 } else if ((img->flash_base+img->size-1) >= chunks[idx].end) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
868 chunks[idx].end = img->flash_base - 1;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
869 } else {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
870 // Split chunk into two parts
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
871 int idxtmp;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
872
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
873 // shift chunks along one so we insert the new one
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
874 for (idxtmp=num_chunks; idxtmp > (idx+1); idxtmp--)
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
875 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
876 chunks[idxtmp] = chunks[idxtmp-1];
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
877 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
878
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
879 chunks[idx+1].start = img->flash_base + img->size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
880 chunks[idx+1].end = chunks[idx].end;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
881 chunks[idx].end = img->flash_base - 1;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
882 if (++num_chunks == CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
883 diag_printf("Warning: too many free chunks\n");
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
884 return num_chunks;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
885 }
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
886 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
887 break;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
888 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
889 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
890 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
891 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
892 return num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
893 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
894 #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
895
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
896 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
897 fis_free(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
898 {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
899 #if !defined(CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS)
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
900 cyg_uint32 flash_data;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
901 cyg_flashaddr_t area_start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
902 cyg_flashaddr_t err_addr;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
903 cyg_uint32 flash_dev_no;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
904 int flash_err;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
905 cyg_flash_info_t flash_info;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
906 cyg_uint32 curr_block, curr_block_info;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
907 cyg_flashaddr_t curr_flash_addr, next_flash_addr;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
908
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
909 // For each flash device
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
910 for (flash_dev_no=0;; flash_dev_no++)
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
911 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
912 flash_err = cyg_flash_get_info( flash_dev_no, &flash_info );
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
913 if ( CYG_FLASH_ERR_OK != flash_err ) // assume all done
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
914 break;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
915
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
916 if( flash_reserved( flash_info.start ) ) // Ignore reserved devices
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
917 continue;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
918
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
919 // Once more, from the top...
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
920 curr_flash_addr = area_start = flash_info.start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
921
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
922 // We must not search the area reserved for pre-RedBoot systems,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
923 // but this is only the case for the first flash device, or
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
924 // the one corresponding to CYGNUM_REDBOOT_FLASH_BASE.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
925 // FIXME: this is insufficiently generic by design - can only
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
926 // reserve on one flash.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
927 #ifdef CYGNUM_REDBOOT_FLASH_BASE
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
928 if ( CYGNUM_REDBOOT_FLASH_BASE == area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
929 #else
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
930 if ( 0 == flash_dev_no )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
931 #endif
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
932 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
933 //cyg_flashaddr_t asold = area_start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
934 area_start += CYGNUM_REDBOOT_FLASH_RESERVED_BASE;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
935 //diag_printf("area_start was %08x now %08x\n", asold, area_start );
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
936 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
937 // For each region of blocks
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
938 for ( curr_block_info = 0;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
939 curr_block_info < flash_info.num_block_infos;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
940 curr_block_info++ )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
941 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
942 // For each individual block
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
943 for ( curr_block = 0;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
944 curr_block < flash_info.block_info[curr_block_info].blocks;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
945 curr_flash_addr = next_flash_addr, curr_block++ )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
946 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
947 cyg_ucount32 i;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
948 cyg_bool is_blank = true; // until proved otherwise
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
949 size_t amount_to_check;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
950
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
951 // determine this now to avoid recalculating it later in this block, so we know the
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
952 // end of this block
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
953 next_flash_addr = curr_flash_addr + flash_info.block_info[curr_block_info].block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
954
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
955 // If area_start got adjusted further up, skip until we reach it
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
956 if ( curr_flash_addr < area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
957 continue;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
958
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
959 //diag_printf("block region %d, block %d, flashaddr %08x\n",curr_block_info,curr_block,curr_flash_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
960
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
961 // check 32 bytes at most. Reading it all will take too long on many devices.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
962 // Perhaps this should be a config option.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
963 amount_to_check = 32;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
964 if ( amount_to_check > flash_info.block_info[curr_block_info].block_size ) // paranoia
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
965 amount_to_check = flash_info.block_info[curr_block_info].block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
966
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
967 for ( i=0; i<amount_to_check; i += sizeof(cyg_uint32) )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
968 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
969 flash_err = cyg_flash_read(curr_flash_addr+i, &flash_data, sizeof(cyg_uint32), &err_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
970 if ( (CYG_FLASH_ERR_OK != flash_err) || (flash_data != 0xffffffff) )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
971 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
972 is_blank = false;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
973 break; // no point continuing
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
974 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
975 } // for
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
976
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
977 if (!is_blank)
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
978 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
979 /* If not blank, output the preceding region if any */
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
980 if ( curr_flash_addr != area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
981 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
982 diag_printf(" 0x%08lX .. 0x%08lX\n",
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
983 area_start,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
984 next_flash_addr-1 );
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
985 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
986 area_start = next_flash_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
987 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
988 } // for block
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
989 } // for block region
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
990
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
991 /* If the blank region extended to the very end of the device, we need to do one
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
992 * final check at the end of the device.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
993 */
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
994 if ( curr_flash_addr != area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
995 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
996 diag_printf(" 0x%08lX .. 0x%08lX\n",
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
997 area_start,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
998 next_flash_addr-1 );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
999 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1000 } // for flash device
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1001 #else
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1002 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
1003 int idx, num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1004
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1005 num_chunks = find_free(chunks);
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1006 for (idx = 0; idx < num_chunks; idx++) {
2002
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
1007 diag_printf(" 0x%08lX .. 0x%08lX\n",
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
1008 (unsigned long)chunks[idx].start,
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
1009 (unsigned long)chunks[idx].end);
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1010 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1011 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1012 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1013
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1014 // 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
1015 static bool
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1016 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
1017 {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1018 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1019 cyg_uint32 flash_data;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1020 cyg_flashaddr_t area_start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1021 cyg_flashaddr_t err_addr;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1022 cyg_uint32 flash_dev_no;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1023 int flash_err;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1024 cyg_flash_info_t flash_info;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1025 cyg_uint32 curr_block, curr_block_info;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1026 cyg_flashaddr_t curr_flash_addr, next_flash_addr;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1027
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1028 // For each flash device
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1029 for (flash_dev_no=0;; flash_dev_no++)
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1030 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1031 flash_err = cyg_flash_get_info( flash_dev_no, &flash_info );
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1032 if ( CYG_FLASH_ERR_OK != flash_err ) // assume all done
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1033 break;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1034
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1035 if( flash_reserved( flash_info.start ) ) // Ignore reserved devices
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1036 continue;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1037
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1038 // Once more, from the top...
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1039 curr_flash_addr = area_start = flash_info.start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1040
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1041 // We must not search the area reserved for pre-RedBoot systems,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1042 // but this is only the case for the first flash device, or
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1043 // the one corresponding to CYGNUM_REDBOOT_FLASH_BASE.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1044 // FIXME: this is insufficiently generic by design - can only
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1045 // reserve on one flash.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1046 #ifdef CYGNUM_REDBOOT_FLASH_BASE
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1047 if ( CYGNUM_REDBOOT_FLASH_BASE == area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1048 #else
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1049 if ( 0 == flash_dev_no )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1050 #endif
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1051 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1052 //cyg_flashaddr_t asold = area_start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1053 area_start += CYGNUM_REDBOOT_FLASH_RESERVED_BASE;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1054 //diag_printf("area_start was %08x now %08x\n", asold, area_start );
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1055 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1056 // For each region of blocks
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1057 for ( curr_block_info = 0;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1058 curr_block_info < flash_info.num_block_infos;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1059 curr_block_info++ )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1060 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1061 // For each individual block
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1062 for ( curr_block = 0;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1063 curr_block < flash_info.block_info[curr_block_info].blocks;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1064 curr_flash_addr = next_flash_addr, curr_block++ )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1065 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1066 cyg_ucount32 i;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1067 cyg_bool is_blank = true; // until proved otherwise
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1068 size_t amount_to_check;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1069
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1070 // determine this now to avoid recalculating it later in this block, so we know the
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1071 // end of this block
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1072 next_flash_addr = curr_flash_addr + flash_info.block_info[curr_block_info].block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1073
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1074 // If area_start got adjusted further up, skip until we reach it
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1075 if ( curr_flash_addr < area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1076 continue;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1077
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1078 //diag_printf("block region %d, block %d, flashaddr %08x\n",curr_block_info,curr_block,curr_flash_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1079
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1080 // check 32 bytes at most. Reading it all will take too long on many devices.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1081 // Perhaps this should be a config option.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1082 amount_to_check = 32;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1083 if ( amount_to_check > flash_info.block_info[curr_block_info].block_size ) // paranoia
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1084 amount_to_check = flash_info.block_info[curr_block_info].block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1085
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1086 for ( i=0; i<amount_to_check; i += sizeof(cyg_uint32) )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1087 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1088 flash_err = cyg_flash_read(curr_flash_addr+i, &flash_data, sizeof(cyg_uint32), &err_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1089 if ( (CYG_FLASH_ERR_OK != flash_err) || (flash_data != 0xffffffff) )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1090 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1091 is_blank = false;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1092 break; // no point continuing
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1093 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1094 } // for
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1095
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1096 if (!is_blank)
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1097 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1098 /* If not blank, output the preceding region if any */
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1099 if ( curr_flash_addr != area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1100 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1101 if ( length <= (next_flash_addr - area_start) )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1102 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1103 *addr = (CYG_ADDRESS)area_start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1104 return true;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1105 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1106 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1107 area_start = next_flash_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1108 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1109 } // for block
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1110 } // for block region
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1111
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1112 /* If the blank region extended to the very end of the device, we need to do one
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1113 * final check at the end of the device.
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1114 */
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1115 if ( curr_flash_addr != area_start )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1116 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1117 if ( length <= (next_flash_addr - area_start) )
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1118 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1119 *addr = (CYG_ADDRESS)area_start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1120 return true;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1121 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1122 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1123 } // for flash device
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1124 #else
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1125 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
1126 int idx, num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1127
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1128 num_chunks = find_free(chunks);
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1129 for (idx = 0; idx < num_chunks; idx++) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1130 if ((chunks[idx].end - chunks[idx].start + 1) >= length) {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1131 *addr = (CYG_ADDRESS)chunks[idx].start;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1132 return true;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1133 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1134 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1135 #endif
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
1136 return false;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1137 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1138
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1139 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1140 fis_create(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1141 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1142 int i, stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1143 unsigned long length, img_size;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1144 CYG_ADDRESS mem_addr, exec_addr, flash_addr, entry_addr, flash_offset;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1145 char *name;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1146 bool mem_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1147 bool exec_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1148 bool entry_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1149 bool flash_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1150 bool length_set = false;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1151 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
1152 bool no_copy = false;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1153 cyg_flashaddr_t err_addr;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1154 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
1155 bool defaults_assumed;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1156 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
1157 bool prog_ok = true;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1158 size_t block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1159
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1160 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1161 (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
1162 init_opts(&opts[1], 'r', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1163 (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
1164 init_opts(&opts[2], 'e', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1165 (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
1166 init_opts(&opts[3], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1167 (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
1168 init_opts(&opts[4], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1169 (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
1170 init_opts(&opts[5], 's', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1171 (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
1172 init_opts(&opts[6], 'n', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1173 (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
1174 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
1175 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1176 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1177 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1178 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1179
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1180 fis_read_directory();
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1181 defaults_assumed = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1182 if (name) {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1183 // 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
1184 img = fis_lookup(name, NULL);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1185 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1186 // 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
1187 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1188 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1189 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1190 defaults_assumed = true;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1191 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1192 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1193 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1194 if ((!mem_addr_set || mem_addr == load_address) && !no_copy && (load_address >= (CYG_ADDRESS)ram_start) &&
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1195 (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
1196 mem_addr = load_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1197 mem_addr_set = true;
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1198 defaults_assumed = true;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1199 // Get entry address from loader, unless overridden
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1200 if (!entry_addr_set) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1201 entry_addr = entry_address;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1202 entry_addr_set = true;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1203 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1204 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1205 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
1206 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1207 } 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
1208 /* 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
1209 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
1210 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
1211 img_size_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1212 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1213 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1214 // 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
1215 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1216 if (!exec_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1217 // Preserve "normal" behaviour
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1218 exec_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1219 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
1220 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1221 if (!flash_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1222 flash_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1223 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1224 defaults_assumed = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1225 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1226 }
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1227
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1228 if ((!no_copy && !mem_addr_set) ||
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1229 !length_set || !name) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1230 fis_usage("required parameter missing");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1231 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1232 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1233 if (!img_size_set) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1234 img_size = length;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1235 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1236 if (length < img_size) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1237 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
1238 return;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1239 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1240
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1241 if (strlen(name) >= sizeof(img->u.name)) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1242 diag_printf("Name is too long, must be less than %d chars\n", (int)sizeof(img->u.name));
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1243 return;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1244 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1245
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1246 if (flash_addr_set &&
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1247 ((stat = flash_verify_addr((void *)flash_addr)) ||
1295
5e8ec925adf2 Improve image size/length check
gthomas
parents: 1278
diff changeset
1248 (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
1249 _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
1250 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1251 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1252 if (!no_copy) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1253 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
1254 ((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
1255 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
1256 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
1257 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1258 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1259 if (!flash_addr_set && !fis_find_free(&flash_addr, length)) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1260 diag_printf("Can't locate %lx(%ld) bytes free in FLASH\n", length, length);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1261 return;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1262 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1263 flash_addr_set = true;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1264
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1265 block_size = cyg_flash_block_size(flash_addr + length);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1266 length = ((length + block_size - 1) / block_size) * block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1267 if (length < img_size) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1268 diag_printf("Invalid FLASH image size/length combination\n");
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1269 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1270 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1271 if ((stat = cyg_flash_verify_addr(flash_addr)) ||
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1272 (stat = cyg_flash_verify_addr((flash_addr+length-1)))) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1273 _show_invalid_flash_address(flash_addr, stat);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1274 return;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1275 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1276 block_size = cyg_flash_block_size(flash_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1277 flash_offset = (flash_addr-flash_start)/block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1278 if( flash_start + (flash_offset * block_size) != flash_addr ) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1279 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1280 diag_printf(" must be 0x%x aligned\n", (unsigned int)flash_block_size);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1281 return;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1282 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1283
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1284 // 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
1285 if (img) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1286 if (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
1287 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
1288 " is incorrect (present image location %p)\n",
2002
20fee0cef763 * src/net/enet.c (ntohs): Return type is a short.
asl
parents: 1984
diff changeset
1289 (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
1290
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1291 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1292 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1293 if (img->size != length) {
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1294 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
1295 " 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
1296 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
1297 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1298 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1299 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
1300 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1301 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1302 if (defaults_assumed) {
310
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
1303 if (no_copy &&
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
1304 !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
1305 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
1306 (void *)mem_addr)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1307 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
1308 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1309 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1310 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
1311 } else {
1301
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1312 #ifdef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1313 // Make sure that any FLASH address specified directly is truly free
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1314 if (!no_copy) {
1301
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1315 struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1316 int idx, num_chunks;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1317 bool is_free = false;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1318
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1319 num_chunks = find_free(chunks);
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1320 for (idx = 0; idx < num_chunks; idx++) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1321 //diag_printf("addr %08x, length %d chunk start %08x, end %08x\n",flash_addr, length, chunks[idx].start, chunks[idx].end);
1301
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1322 if ((flash_addr >= chunks[idx].start) &&
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1323 ((flash_addr+length-1) <= chunks[idx].end)) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1324 is_free = true;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1325 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1326 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1327 if (!is_free) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1328 diag_printf("Invalid FLASH address - not free!\n");
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1329 return;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1330 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1331 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
1332 #endif
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1333 // If no 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
1334 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
1335 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1336 if (img->u.name[0] == '\xFF') {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1337 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1338 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1339 }
2064
ef1d669d4888 * src/flash.c (fis_create): Print an error if the FIS directory is
asl
parents: 2007
diff changeset
1340 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
1341 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
1342 return;
ef1d669d4888 * src/flash.c (fis_create): Print an error if the FIS directory is
asl
parents: 2007
diff changeset
1343 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1344 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1345 if (!no_copy) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1346 // Safety check - make sure the address range is not within the code we're running
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1347 if (check_code_overlaps(flash_addr, (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
1348 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
1349 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1350 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1351 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1352 if (prog_ok) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1353 // Unlock area to be programmed
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1354 if ((stat = cyg_flash_unlock((cyg_flashaddr_t)flash_addr, length, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1355 diag_printf("Can't unlock region at %p: %s\n", (void*)err_addr, flash_errmsg(stat));
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1356 prog_ok = false;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1357 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1358 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1359 #endif
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1360 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1361 // Erase area to be programmed
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1362 if ((stat = cyg_flash_erase(flash_addr, length, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1363 diag_printf("Can't erase region at %p: %s\n", (void*)err_addr, cyg_flash_errmsg(stat));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1364 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1365 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1366 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1367 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1368 // Now program it
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1369 if ((stat = cyg_flash_program(flash_addr, (void *)mem_addr, img_size,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1370 &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1371 diag_printf("Can't program region at %p: %s\n", (void*)err_addr,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1372 cyg_flash_errmsg(stat));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1373 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1374 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1375 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1376 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1377 if (prog_ok) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1378 // Lock area programmed
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1379 if ((stat = cyg_flash_lock((cyg_flashaddr_t)flash_addr, length, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1380 diag_printf("Can't lock region at %p: %s\n", (void*)err_addr, flash_errmsg(stat));
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1381 prog_ok = false;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1382 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1383 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1384 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1385 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1386 if (prog_ok) {
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1387 // Update directory
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1388 memset(img, 0, sizeof(*img));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1389 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
1390 img->flash_base = flash_addr;
2066
5d5572c64422 FIS fix from Stefan Sommerfeld, ANSI cursor keys from Gary Thomas
gthomas
parents: 2064
diff changeset
1391 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
1392 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
1393 img->size = length;
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1394 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
1395 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1396 if (!no_copy) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1397 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
1398 } else {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1399 // No way to compute this, sorry
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1400 img->file_cksum = 0;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1401 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
1402 #endif
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1403 fis_start_update_directory(0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1404 fis_update_directory(0, 0);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1405 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1406 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1407
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1408 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
1409 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1410 fis_delete(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1411 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1412 char *name;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
1413 int num_reserved, i, stat;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1414 cyg_flashaddr_t err_addr;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1415 struct fis_image_desc *img;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1416
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1417 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
1418 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1419 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1420 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1421 }
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1422 #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
1423 // 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
1424 arm_fis_delete(name);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1425 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
1426 #endif
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1427 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
1428 num_reserved = 0;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1429 #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
1430 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1431 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1432 #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
1433 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1434 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1435 #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
1436 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1437 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1438 #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
1439 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1440 #endif
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1441 #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
1442 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1443 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1444 #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
1445 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1446 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1447
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1448 img = fis_lookup(name, &i);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1449 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1450 if (i < num_reserved) {
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1451 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
1452 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1453 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1454 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
1455 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1456 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1457 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1458 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
1459 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1460 }
119
77cec8369160 Merge from eCos master repository on 2000-09-01-07:47:03-BST
jlarmour
parents: 117
diff changeset
1461 // Erase Data blocks (free space)
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1462 if ((stat = cyg_flash_erase(img->flash_base, img->size, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1463 diag_printf("Error erasing at %p: %s\n", (void*)err_addr, cyg_flash_errmsg(stat));
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1464 } else {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1465 img->u.name[0] = '\xFF';
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1466 fis_start_update_directory(0);
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1467 fis_update_directory(0, 0);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1468 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1469 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1470
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1471 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1472 fis_load(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1473 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1474 char *name;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1475 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
1476 CYG_ADDRESS mem_addr;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1477 bool mem_addr_set = false;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1478 bool show_cksum = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1479 struct option_info opts[3];
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1480 #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
1481 unsigned long cksum;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 157
diff changeset
1482 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1483 int num_options;
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1484 #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
1485 bool decompress = false;
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
1486 #endif
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1487 cyg_flashaddr_t err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1488
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1489 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1490 (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
1491 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1492 (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
1493 num_options = 2;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
1494 #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
1495 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1496 (void *)&decompress, 0, "decompress");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1497 num_options++;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1498 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1499
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
1500 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
1501
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1502 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
1503 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1504 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1505 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1506 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1507 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
1508 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
1509 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1510 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1511 if (!mem_addr_set) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1512 mem_addr = img->mem_base;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1513 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1514 // 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
1515 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1516 if (!valid_address((void *)mem_addr)) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1517 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
1518 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1519 }
962
0138b3d6b8a0 * src/flash.c: Only perform RAM check in fis load command when
jlarmour
parents: 849
diff changeset
1520 #endif
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
1521 #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
1522 if (decompress) {
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1523 int err;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1524 _pipe_t fis_load_pipe;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1525 _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
1526 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
1527 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
1528 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
1529 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
1530
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1531 err = (*_dc_init)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1532
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1533 if (0 == err)
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1534 err = (*_dc_inflate)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1535
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1536 // 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
1537 // error value.
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1538 err = (*_dc_close)(p, err);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1539
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 160
diff changeset
1540 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
1541 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
1542 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1543 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
1544 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1545
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1546 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1547 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1548 load_address_end = (unsigned long)p->out_buf;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1549
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1550 // Reload fis directory
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1551 fis_read_directory();
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1552 } else // dangling block
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1553 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1554 {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1555 cyg_flash_read(img->flash_base, (void *)mem_addr, img->data_length,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1556 &err_addr);
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1557
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1558 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1559 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1560 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
1561 }
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1562 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
1563
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1564 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
284
3e80ecaaa3f8 * src/crc.c: Removed. Replaced with the CRC package.
asl
parents: 280
diff changeset
1565 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
1566 if (show_cksum) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1567 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
1568 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1569 // 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
1570 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
1571 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
1572 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
1573 img->file_cksum, cksum);
1679
b548ac5af76c * src/flash.c (find_free): fix endless loop when removing a
asl
parents: 1627
diff changeset
1574 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
1575 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1576 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
1577 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1578 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1579 #endif // CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1580
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1581 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1582 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
1583 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1584 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1585 unsigned long length;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1586 CYG_ADDRESS mem_addr, flash_addr, flash_offset;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1587 bool mem_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1588 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1589 bool length_set = false;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1590 cyg_flashaddr_t err_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1591 struct option_info opts[3];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1592 bool prog_ok;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1593 size_t block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1594
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1595 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1596 (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
1597 init_opts(&opts[1], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1598 (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
1599 init_opts(&opts[2], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1600 (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
1601 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
1602 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1603 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1604 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1605 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1606
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1607 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
1608 fis_usage("required parameter missing");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1609 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1610 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1611
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1612 // Round up length to FLASH block size
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1613 block_size = cyg_flash_block_size(flash_addr + length);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1614 length = ((length + block_size - 1) / block_size) * block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1615 if ((stat = cyg_flash_verify_addr(flash_addr)) ||
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1616 (stat = cyg_flash_verify_addr((flash_addr+length-1)))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1617 _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
1618 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1619 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1620
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1621 block_size = cyg_flash_block_size(flash_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1622 flash_offset = (flash_addr-flash_start)/block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1623 if( flash_start + (flash_offset * block_size) != flash_addr ) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1624 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1625 diag_printf(" must be 0x%x aligned\n", (unsigned int)block_size);
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1626 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1627 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1628 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
1629 ((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
1630 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
1631 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
1632 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1633 // Safety check - make sure the address range is not within the code we're running
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1634 if (check_code_overlaps(flash_addr, (flash_addr+length-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1635 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
1636 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1637 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1638 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
1639 (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
1640 (void *)mem_addr)) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1641 return; // The guy gave up
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1642 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1643 prog_ok = true;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1644 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1645 // Erase area to be programmed
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1646 if ((stat = cyg_flash_erase(flash_addr, length, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1647 diag_printf("Can't erase region at %p: %s\n", (void*)err_addr,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1648 cyg_flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1649 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1650 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1651 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1652 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1653 // Now program it
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1654 if ((stat = cyg_flash_program(flash_addr, (void *)mem_addr, length,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1655 &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1656 diag_printf("Can't program region at %p: %s\n", (void*)err_addr,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1657 cyg_flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1658 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1659 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1660 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1661 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1662
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1663 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1664 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
1665 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1666 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1667 unsigned long length;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1668 CYG_ADDRESS flash_addr, flash_offset;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1669 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1670 bool length_set = false;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1671 cyg_flashaddr_t err_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1672 struct option_info opts[2];
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1673 size_t block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1674
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1675
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1676 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1677 (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
1678 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1679 (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
1680 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
1681 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1682 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1683 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1684 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1685
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1686 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
1687 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1688 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1689 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1690 if (flash_addr_set &&
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1691 ((stat = cyg_flash_verify_addr(flash_addr)) ||
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1692 (stat = cyg_flash_verify_addr((flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1693 _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
1694 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1695 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1696 block_size = cyg_flash_block_size(flash_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1697 flash_offset = (flash_addr-flash_start)/block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1698 if( flash_addr_set && (flash_start + (flash_offset * block_size) != flash_addr) ) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1699 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1700 diag_printf(" must be 0x%x aligned\n", (unsigned int)flash_block_size);
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1701 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1702 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1703 // Safety check - make sure the address range is not within the code we're running
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1704 if (check_code_overlaps(flash_addr, (flash_addr+length-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1705 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
1706 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1707 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1708 if ((stat = cyg_flash_erase(flash_addr, length, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1709 diag_printf("Error erasing at %p: %s\n", (void*)err_addr, cyg_flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1710 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1711 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1712
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
1713 #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
1714
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1715 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1716 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
1717 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1718 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1719 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1720 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1721 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1722 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1723 bool length_set = false;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1724 cyg_flashaddr_t err_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1725 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1726
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1727 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1728 (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
1729 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1730 (void *)&length, (bool *)&length_set, "length");
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1731 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
1732 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1733 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1734 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1735 }
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1736 #ifdef CYGOPT_REDBOOT_FIS
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1737 /* 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
1738 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1739 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1740 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
1741 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
1742 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1743 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1744
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1745 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1746 length = img->size;
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1747 } else
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1748 #endif
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1749 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
1750 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1751 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1752 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1753 if (flash_addr_set &&
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1754 ((stat = cyg_flash_verify_addr(flash_addr)) ||
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1755 (stat = cyg_flash_verify_addr((flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1756 _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
1757 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1758 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1759 if ((stat = cyg_flash_lock(flash_addr, length, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1760 diag_printf("Error locking at %p: %s\n", (void*)err_addr, cyg_flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1761 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1762 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1763
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1764 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1765 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
1766 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1767 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1768 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1769 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1770 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1771 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1772 bool length_set = false;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1773 cyg_flashaddr_t err_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1774 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1775
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1776 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1777 (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
1778 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1779 (void *)&length, (bool *)&length_set, "length");
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1780 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
1781 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1782 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1783 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1784 }
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1785 #ifdef CYGOPT_REDBOOT_FIS
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1786 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1787 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1788 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
1789 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
1790 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1791 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1792
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1793 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1794 length = img->size;
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1795 } else
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1796 #endif
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1797 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
1798 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1799 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1800 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1801 if (flash_addr_set &&
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1802 ((stat = cyg_flash_verify_addr(flash_addr)) ||
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1803 (stat = cyg_flash_verify_addr((flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1804 _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
1805 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1806 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1807
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1808 if ((stat = cyg_flash_unlock(flash_addr, length, &err_addr)) != 0) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1809 diag_printf("Error unlocking at %p: %s\n", (void*)err_addr, cyg_flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1810 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1811 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1812 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1813
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1814 // This is set non-zero if the FLASH subsystem has successfully been initialized
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1815 int __flash_init;
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1816
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1817 void
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1818 _flash_info(void)
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1819 {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1820 cyg_uint32 i=0,j;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1821 cyg_flash_info_t info;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1822 int ret;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1823
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1824 if (!__flash_init) return;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1825
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1826 do {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1827 ret = cyg_flash_get_info(i, &info);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1828 if (ret == CYG_FLASH_ERR_OK) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1829 diag_printf("FLASH: %p-%p", (void*)info.start, (void*)info.end);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1830 for (j=0;j < info.num_block_infos; j++) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1831 diag_printf(", %d x 0x%x blocks",
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1832 info.block_info[j].blocks,
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1833 (unsigned int)info.block_info[j].block_size);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1834 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1835 diag_printf("\n");
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1836 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1837 i++;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1838 } while (ret != CYG_FLASH_ERR_INVALID);
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1839 }
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1840
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1841 /* 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
1842 but a failed fis update was detected */
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1843 int
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1844 do_flash_init(void)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1845 {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1846 int stat, i;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1847 cyg_flash_info_t info;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1848
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1849 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1850 struct fis_image_desc img0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1851 struct fis_image_desc img1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1852 int fis_update_was_interrupted=0;
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1853 cyg_flashaddr_t err_addr;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1854
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1855 //check the size of fis_valid_info
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1856 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
1857 //try to check the alignment of version_count
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1858 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
1859 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1860
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1861
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1862
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1863 if (!__flash_init) {
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1864 __flash_init = 1;
2817
6e1e5c6da98e * src/flash.c (do_flash_init): Update for minor flash API
jlarmour
parents: 2729
diff changeset
1865
6e1e5c6da98e * src/flash.c (do_flash_init): Update for minor flash API
jlarmour
parents: 2729
diff changeset
1866 cyg_flash_set_global_printf((cyg_flash_printf *)&diag_printf);
2827
16bd2526e63f * src/flash.c (do_flash_init): Call cyg_flash_init() with
jlarmour
parents: 2817
diff changeset
1867 if ((stat = cyg_flash_init(NULL)) != 0) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1868 diag_printf("FLASH: driver init failed: %s\n", cyg_flash_errmsg(stat));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1869 return -1;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1870 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1871
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1872 #ifdef CYGNUM_REDBOOT_FLASH_BASE
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1873 stat = cyg_flash_get_info_addr(CYGNUM_REDBOOT_FLASH_BASE, &info);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1874 #else
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1875 stat = cyg_flash_get_info(0, &info);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1876 #endif
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1877 if (stat != CYG_FLASH_ERR_OK) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1878 diag_printf("FLASH: driver init failed: %s\n",
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1879 cyg_flash_errmsg(stat));
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1880 return false;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1881 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1882 flash_start = info.start;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1883 flash_end = info.end;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1884
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1885 // No bootblock support yet, so we merge any bootblocks we might
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1886 // find into full size blocks
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1887 for (i=0; i < info.num_block_infos; i++) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1888 if (info.block_info[i].block_size > flash_block_size) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1889 flash_block_size = info.block_info[i].block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1890 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1891 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1892 flash_num_blocks = 0;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1893 for (i=0; i < info.num_block_infos; i++) {
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1894 flash_num_blocks += (info.block_info[i].block_size *
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1895 info.block_info[i].blocks) /
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1896 flash_block_size;
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1897 }
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1898
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1899 #ifdef CYGOPT_REDBOOT_FIS
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1900 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
1901 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
1902 # 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
1903 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
1904 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
1905 diag_printf("FLASH: common buffer too small\n");
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1906 return -1;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1907 }
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1908 # else
2423
82aabda670f8 Fix memory allocation for FLASH/FIS - could have been wrong if some other function allocated memory first
gthomas
parents: 2394
diff changeset
1909 workspace_end = (unsigned char *)(workspace_end-fisdir_size);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1910 fis_work_block = workspace_end;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1911 # endif
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1912
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1913 if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1914 fis_addr = ((CYG_ADDRESS)flash_end + 1 +
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1915 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1916 } else {
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1917 fis_addr = ((CYG_ADDRESS)flash_start +
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1918 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1919 }
2130
9a0cafc8b9bf * src/flash.c (fis_lock & fis_unlock): Allow compilation without
asl
parents: 2066
diff changeset
1920
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1921 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
1922 diag_printf("FIS directory doesn't fit\n");
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1923 return -1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1924 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1925 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1926
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1927 if (CYGNUM_REDBOOT_FIS_REDUNDANT_DIRECTORY_BLOCK < 0) {
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
1928 redundant_fis_addr = ((CYG_ADDRESS)flash_end + 1 +
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
1929 (CYGNUM_REDBOOT_FIS_REDUNDANT_DIRECTORY_BLOCK*flash_block_size));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1930 } else {
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
1931 redundant_fis_addr = ((CYG_ADDRESS)flash_start +
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
1932 (CYGNUM_REDBOOT_FIS_REDUNDANT_DIRECTORY_BLOCK*flash_block_size));
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1933 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1934
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1935 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
1936 diag_printf("Redundant FIS directory doesn't fit\n");
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1937 return -1;
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1938 }
2631
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1939 cyg_flash_read(fis_addr, &img0, sizeof(img0), &err_addr);
13376f3cfc60 Merge flashv2 branch to trunk, with eCosCentric additions
jlarmour
parents: 2423
diff changeset
1940 cyg_flash_read(redundant_fis_addr, &img1, sizeof(img1), &err_addr);
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1941
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1942 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
1943 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1944 memset(&img0, 0, sizeof(img0));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1945 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1946
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1947 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
1948 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1949 memset(&img1, 0, sizeof(img0));
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1950 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1951
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1952 #ifdef REDBOOT_FLASH_REVERSE_BYTEORDER
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1953 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
1954 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
1955 #endif
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1956
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1957 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
1958 {
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1959 // Valid, so swap primary and secondary
2864
6fb62c01642a * src/flash.c: Fix compilation warnings when redundant FIS is selected.
jld
parents: 2827
diff changeset
1960 cyg_flashaddr_t tmp;
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1961 tmp = fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1962 fis_addr = redundant_fis_addr;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1963 redundant_fis_addr = tmp;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1964 }
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1965 #endif
1740
0031b615f51c Add support for reverse endianess of fis and config data
msalter
parents: 1738
diff changeset
1966 fis_read_directory();
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1967 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1968 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1969 #ifdef CYGOPT_REDBOOT_REDUNDANT_FIS
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1970 if (fis_update_was_interrupted)
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1971 return 1;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1972 else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1973 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1974 #else
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1975 return 0;
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
1976 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1977 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1978
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1979 // Wrapper to avoid compiler warnings
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1980 static void
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1981 _do_flash_init(void)
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1982 {
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1983 static int init_done = 0;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1984 if (init_done) return;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1985 init_done = 1;
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1986 do_flash_init();
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1987 }
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1988
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1989 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
1990
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
1991 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1992 do_fis(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1993 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1994 struct cmd *cmd;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1995
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1996 if (argc < 2) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1997 fis_usage("too few arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1998 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1999 }
2195
5c5e93c863ac Redundant FIS table support - from Alexander Neundorf
gthomas
parents: 2175
diff changeset
2000 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
2001 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
2002 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
2003 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2004 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
2005 argv[1])) != (struct cmd *)0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2006 (cmd->fun)(argc, argv);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2007 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2008 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2009 fis_usage("unrecognized command");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2010 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2011
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
2012 // EOF flash.c