annotate packages/redboot/current/src/flash.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

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