annotate packages/redboot/current/src/flash.c @ 1740:699be933fd5e

Fix flash boundary calculation
author bartv
date Sat, 20 Nov 2004 18:24:15 +0000
parents dcf02dfe567d
children 172edf8a96d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
3 // flash.c
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
4 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
5 // RedBoot - FLASH memory support
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
6 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
849
23fd347aba65 support multiple net drivers in RedBoot
msalter
parents: 791
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
12 // Copyright (C) 2003, 2004 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
41 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
43 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
44 // Author(s): gthomas
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
45 // Contributors: gthomas, tkoeller
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
46 // Date: 2000-07-28
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
47 // Purpose:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
48 // Description:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
49 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
50 // This code is part of RedBoot (tm).
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
51 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
53 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
54 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
55
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
56 #include <redboot.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
57 #include <cyg/io/flash.h>
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
58 #include <fis.h>
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
59 #include <sib.h>
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
60 #include <cyg/infra/cyg_ass.h> // assertion macros
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
61
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
62 #ifdef CYGSEM_REDBOOT_FLASH_COMBINED_FIS_AND_CONFIG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
63 // Note horrid intertwining of functions, to save precious FLASH
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
64 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
65
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
66 // Round a quantity up
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
67 #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
68
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
69 #ifdef CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
70 // Image management functions
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
71 local_cmd_entry("init",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
72 "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
73 "[-f]",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
74 fis_init,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
75 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
76 );
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
77 #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
78 # 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
79 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
80 # define FIS_LIST_OPTS "[-d]"
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
81 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
82 local_cmd_entry("list",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
83 "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
84 FIS_LIST_OPTS,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
85 fis_list,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
86 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
87 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
88 local_cmd_entry("free",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
89 "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
90 "",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
91 fis_free,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
92 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
93 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
94 local_cmd_entry("delete",
388
38dad94e75ce Min BOOTP/vendor size. Fix typo in FIS/DELETE.
gthomas
parents: 310
diff changeset
95 "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
96 "name",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
97 fis_delete,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
98 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
99 );
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
100
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
101 static char fis_load_usage[] =
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
102 #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
103 "[-d] "
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
104 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
105 "[-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
106
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
107 local_cmd_entry("load",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
108 "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
109 fis_load_usage,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
110 fis_load,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
111 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
112 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
113 local_cmd_entry("create",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
114 "Create an image",
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
115 "-b <mem_base> -l <image_length> [-s <data_length>]\n"
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
116 " [-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
117 fis_create,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
118 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
119 );
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
120 #endif
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
121
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
122 // Raw flash access functions
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
123 local_cmd_entry("erase",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
124 "Erase FLASH contents",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
125 "-f <flash_addr> -l <length>",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
126 fis_erase,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
127 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
128 );
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
129 #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
130 local_cmd_entry("lock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
131 "LOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
132 "[-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
133 fis_lock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
134 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
135 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
136 local_cmd_entry("unlock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
137 "UNLOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
138 "[-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
139 fis_unlock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
140 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
141 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
142 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
143 local_cmd_entry("write",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
144 "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
145 "-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
146 fis_write,
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
147 FIS_cmds
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
148 );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
149
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
150 // Define table boundaries
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
151 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
152 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
153
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
154 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
155
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
156 // CLI function
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
157 static cmd_fun do_fis;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
158 RedBoot_nested_cmd("fis",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
159 "Manage FLASH images",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
160 "{cmds}",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
161 do_fis,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
162 __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
163 );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
164
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
165 // Local data used by these routines
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
166 cyg_flashaddr_t flash_start, flash_end;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
167 size_t flash_block_size;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
168 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
169 #ifdef CYGOPT_REDBOOT_FIS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
170 void *fis_work_block;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
171 cyg_flashaddr_t fis_addr;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
172 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
173 #endif
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
174 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
175 extern cyg_flashaddr_t cfg_base; // Location in Flash of config data
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
176 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
177 extern struct _config *config;
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
178 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
179
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
180 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
181 fis_usage(char *why)
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
182 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
183 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
184 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
185 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
186
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
187 static void
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
188 _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
189 {
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
190 cyg_uint32 i=0;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
191 cyg_flash_info_t info;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
192 int ret;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
193
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
194 diag_printf("Invalid FLASH address %p: %s\n", (void *)flash_addr,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
195 cyg_flash_errmsg(stat));
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
196 do {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
197 ret = cyg_flash_get_info(i, &info);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
198 if (ret == CYG_FLASH_ERR_OK) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
199 diag_printf(" valid range is %p - %p\n", info.start, info.end);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
200 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
201 i++;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
202 } while (ret != CYG_FLASH_ERR_INVALID);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
203 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
204
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
205 #ifdef CYGOPT_REDBOOT_FIS
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
206 struct fis_image_desc *
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
207 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
208 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
209 int i;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
210 struct fis_image_desc *img;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
211 cyg_flashaddr_t err_addr;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
212
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
213 cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
214 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
215 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
216 if ((img->name[0] != (unsigned char)0xFF) &&
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
217 (strcasecmp(name, img->name) == 0)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
218 if (num) *num = i;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
219 return img;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
220 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
221 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
222 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
223 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
224
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
225 void
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
226 fis_update_directory(void)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
227 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
228 int stat;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
229 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
230
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
231 #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
232 memcpy((char *)fis_work_block+fisdir_size, config, cfg_size);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
233 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
234 #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
235 // Ensure [quietly] that the directory is unlocked before trying to update
1717
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
236 cyg_flash_unlock(fis_addr, flash_block_size, &err_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
237 #endif
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
238 if ((stat = cyg_flash_erase(fis_addr, flash_block_size, &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
239 diag_printf("Error erasing FIS directory at %p: %s\n", 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
240 } else {
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
241 if ((stat = cyg_flash_program(fis_addr, fis_work_block, flash_block_size,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
242 &err_addr)) != 0) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
243 diag_printf("Error writing FIS directory at %p: %s\n",
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
244 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
245 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
246 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
247 #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
248 // Ensure [quietly] that the directory is locked after the update
1717
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
249 cyg_flash_lock(fis_addr, flash_block_size, &err_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
250 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
251 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
252
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
253 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
254 fis_init(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
255 {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
256 int stat;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
257 struct fis_image_desc *img;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
258 cyg_flashaddr_t err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
259 bool full_init = false;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
260 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
261 CYG_ADDRESS redboot_flash_start;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
262 unsigned long redboot_image_size;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
263
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
264 init_opts(&opts[0], 'f', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
265 (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
266 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
267 {
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
268 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
269 }
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
270
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
271 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
272 diag_printf("** Aborted\n");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
273 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
274 }
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
275 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
276
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
277 #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
278 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
279 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
280
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
281 // Create a pseudo image for RedBoot
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
282 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
283 memset(img, 0xFF, fisdir_size); // Start with erased data
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
284 #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
285 memset(img, 0, sizeof(*img));
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
286 strcpy(img->name, "(reserved)");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
287 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
288 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
289 img->size = CYGNUM_REDBOOT_FLASH_RESERVED_BASE;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
290 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
291 #endif
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
292 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
293 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
294 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
295 strcpy(img->name, "RedBoot");
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
296 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
297 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
298 img->size = redboot_image_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
299 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
300 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
301 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
302 #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
303 #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
304 // 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
305 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
306 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
307 memset(img, 0, sizeof(*img));
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
308 strcpy(img->name, "RedBoot[post]");
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
309 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
310 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
311 img->size = redboot_image_size;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
312 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
313 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
314 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
315 #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
316 // And a backup image
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
317 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
318 strcpy(img->name, "RedBoot[backup]");
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
319 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
320 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
321 img->size = redboot_image_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
322 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
323 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
324 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
325 #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
326 // 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
327 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
328 strcpy(img->name, "RedBoot config");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
329 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
330 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
331 img->size = cfg_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
332 img++;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
333 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
334 // 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
335 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
336 strcpy(img->name, "FIS directory");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
337 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
338 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
339 img->size = fisdir_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
340 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
341
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
342 #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
343 // 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
344 // 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
345 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
346 // 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
347 // Monitor as a reserved area.
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
348 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
349 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
350 cyg_uint32 check = 0;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
351 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
352 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
353
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
354 // 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
355 // 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
356 // 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
357 // 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
358 #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
359 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
360 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
361 #else
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
362 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
363 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
364 footer_p->infoBase = NULL;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
365 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
366 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
367
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
368 // and compute its checksum
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
369 for ( ; count > 0; count--) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
370 if (*check_ptr > ~check)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
371 check++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
372 check += *check_ptr++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
373 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
374 footer_p->checksum = ~check;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
375 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
376 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
377
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
378 // 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
379 // 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
380
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
381 if (full_init) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
382 unsigned long erase_size;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
383 CYG_ADDRESS erase_start;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
384 // 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
385 // and config block.
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
386 // 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
387 #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
388 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
389 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
390 if ( erase_size > erase_start ) {
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
391 erase_size -= erase_start;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
392 if ((stat = cyg_flash_erase((void *)erase_start, erase_size,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
393 &err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
394 diag_printf(" initialization failed at %p: %s\n",
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
395 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
396 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
397 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
398 #endif
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
399 // 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
400 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
401 // 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
402 // blocks.
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
403 #if defined(CYGSEM_REDBOOT_FLASH_CONFIG) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
404 defined(CYGHWR_REDBOOT_FLASH_CONFIG_MEDIA_FLASH) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
405 !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
406 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
407 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
408 } else {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
409 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
410 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
411 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
412 diag_printf(" initialization failed %p: %s\n",
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
413 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
414 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
415 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
416 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
417 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
418 } else {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
419 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
420 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
421 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
422 diag_printf(" initialization failed %p: %s\n",
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
423 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
424 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
425 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
426 #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
427 erase_size = (CYG_ADDRESS)fis_addr - erase_start; // the gap between HWM and fis data
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
428 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
429 diag_printf(" initialization failed %p: %s\n",
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
430 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
431 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
432 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
433 #endif
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
434 // Lastly, anything at the end
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
435 erase_size = ((CYG_ADDRESS)flash_end - erase_start) + 1;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
436 if ((stat = cyg_flash_erase(erase_start, erase_size,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
437 &err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
438 diag_printf(" initialization failed at %p: %s\n",
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
439 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
440 }
1354
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
441 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
442 // In this case, 'fis free' works by scanning for erased blocks. Since the
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
443 // "-f" option was not supplied, there may be areas which are not used but
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
444 // 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
445 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
446 diag_printf(" Warning: device contents not erased, some blocks may not be usable\n");
1354
c8903ba86828 Remove misleading "warning"
gthomas
parents: 1349
diff changeset
447 #endif
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
448 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
449 fis_update_directory();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
450 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
451
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
452 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
453 fis_list(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
454 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
455 struct fis_image_desc *img;
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
456 int i, image_indx;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
457 bool show_cksums = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
458 bool show_datalen = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
459 struct option_info opts[2];
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
460 cyg_flashaddr_t err_addr;
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
461 unsigned long last_addr, lowest_addr;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
462 bool image_found;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
463
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
464 #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
465 // 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
466 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
467 arm_fis_list();
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
468 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
469 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
470
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
471 init_opts(&opts[0], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
472 (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
473 #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
474 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
475 (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
476 i = 2;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
477 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
478 i = 1;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
479 #endif
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
480 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
481 return;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
482 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
483 cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
484 // 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
485 // cols by hand....
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
486 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
487 "Name","FLASH addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
488 show_cksums ? "Checksum" : "Mem addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
489 show_datalen ? "Datalen" : "Length",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
490 "Entry point" );
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
491 last_addr = 0;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
492 image_indx = 0;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
493 do {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
494 image_found = false;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
495 lowest_addr = 0xFFFFFFFF;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
496 img = (struct fis_image_desc *) fis_work_block;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
497 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
498 if (img->name[0] != (unsigned char)0xFF) {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
499 if ((img->flash_base > last_addr) && (img->flash_base < lowest_addr)) {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
500 lowest_addr = img->flash_base;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
501 image_found = true;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
502 image_indx = i;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
503 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
504 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
505 }
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
506 if (image_found) {
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
507 img = (struct fis_image_desc *) fis_work_block;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
508 img += image_indx;
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
509 diag_printf("%-16s 0x%08lX 0x%08lX 0x%08lX 0x%08lX\n", img->name,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
510 img->flash_base,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
511 #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
512 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
513 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
514 #else
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
515 img->mem_base,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
516 img->size,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
517 #endif
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
518 img->entry_point);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
519 }
1278
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
520 last_addr = lowest_addr;
eaf1a693566b Print FIS directory in sorted order
gthomas
parents: 1268
diff changeset
521 } while (image_found == true);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
522 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
523
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
524 #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
525 struct free_chunk {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
526 CYG_ADDRESS start, end;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
527 };
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
528
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
529 static int
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
530 find_free(struct free_chunk *chunks)
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
531 {
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
532 cyg_flashaddr_t err_addr;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
533 cyg_flash_info_t info;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
534 struct fis_image_desc *img;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
535 int i=0, idx;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
536 int num_chunks = 0;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
537 int ret;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
538
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
539 do {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
540 ret = cyg_flash_get_info(i, &info);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
541 if (ret == CYG_FLASH_ERR_OK) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
542 if (i == 0 ) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
543 // Do not search the area reserved for pre-RedBoot systems:
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
544 chunks[num_chunks].start = (info.start +
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
545 CYGNUM_REDBOOT_FLASH_RESERVED_BASE +
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
546 CYGBLD_REDBOOT_MIN_IMAGE_SIZE);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
547 chunks[num_chunks].end = info.end;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
548 num_chunks++;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
549 } else { // Contiguous flash? If so collapse the chunks together.
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
550 if (chunks[num_chunks-1].end == (info.start -1)) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
551 chunks[num_chunks-1].end = info.end;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
552 } else {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
553 chunks[num_chunks].start = info.start;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
554 chunks[num_chunks].end = info.end;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
555 num_chunks++;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
556 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
557 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
558 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
559 i++;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
560 } while (ret != CYG_FLASH_ERR_INVALID);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
561
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
562 cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
563 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
564 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
565 if (img->name[0] != (unsigned char)0xFF) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
566 // 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
567 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
568 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
569 (img->flash_base <= chunks[idx].end)) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
570 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
571 chunks[idx].start += img->size;
1349
4444f5b3be7b Fix 'fis free' list handling - from Chris Garry
gthomas
parents: 1312
diff changeset
572 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
573 // This free chunk has collapsed
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
574 while (idx < (num_chunks-1)) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
575 chunks[idx] = chunks[idx+1];
1679
b548ac5af76c * src/flash.c (find_free): fix endless loop when removing a
asl
parents: 1627
diff changeset
576 idx++;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
577 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
578 num_chunks--;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
579 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
580 } else if ((img->flash_base+img->size) == chunks[idx].end) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
581 chunks[idx].end = img->flash_base;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
582 } else {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
583 // Split chunk into two parts
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
584 chunks[idx+1].start = img->flash_base + img->size;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
585 chunks[idx+1].end = chunks[idx].end;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
586 if (++num_chunks == CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
587 diag_printf("Warning: too many free chunks\n");
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
588 return num_chunks;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
589 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
590 chunks[idx].end = img->flash_base;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
591 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
592 break;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
593 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
594 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
595 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
596 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
597 return num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
598 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
599 #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
600
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
601 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
602 fis_free(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
603 {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
604 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
605 unsigned long *fis_ptr, *fis_end, flash_data;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
606 unsigned long *area_start;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
607 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
608
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
609 // Do not search the area reserved for pre-RedBoot systems:
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
610 fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
1136
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
611 CYGNUM_REDBOOT_FLASH_RESERVED_BASE +
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
612 CYGBLD_REDBOOT_MIN_IMAGE_SIZE);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
613 fis_end = (unsigned long *)(CYG_ADDRESS)flash_end;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
614 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
615 while (fis_ptr < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
616 flash_read(fis_ptr, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
617 if (flash_data != (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
618 if (area_start != fis_ptr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
619 // Assume that this is something
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
620 diag_printf(" 0x%08lX .. 0x%08lX\n",
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
621 (CYG_ADDRESS)area_start, (CYG_ADDRESS)fis_ptr);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
622 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
623 // Find next blank block
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
624 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
625 while (area_start < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
626 flash_read(area_start, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
627 if (flash_data == (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
628 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
629 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
630 area_start += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
631 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
632 fis_ptr = area_start;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
633 } else {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
634 fis_ptr += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
635 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
636 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
637 if (area_start != fis_ptr) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
638 diag_printf(" 0x%08lX .. 0x%08lX\n",
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
639 (CYG_ADDRESS)area_start, (CYG_ADDRESS)fis_ptr);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
640 }
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
641 #else
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
642 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
643 int idx, num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
644
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
645 num_chunks = find_free(chunks);
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
646 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
647 diag_printf(" 0x%08lX .. 0x%08lX\n", chunks[idx].start, chunks[idx].end);
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
648 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
649 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
650 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
651
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
652 // 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
653 static bool
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
654 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
655 {
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
656 #ifndef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
657 unsigned long *fis_ptr, *fis_end, flash_data;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
658 unsigned long *area_start;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
659 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
660
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
661 // Do not search the area reserved for pre-RedBoot systems:
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
662 fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
1136
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
663 CYGNUM_REDBOOT_FLASH_RESERVED_BASE +
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
664 CYGBLD_REDBOOT_MIN_IMAGE_SIZE);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
665 fis_end = (unsigned long *)(CYG_ADDRESS)flash_end;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
666 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
667 while (fis_ptr < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
668 flash_read(fis_ptr, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
669 if (flash_data != (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
670 if (area_start != fis_ptr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
671 // Assume that this is something
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
672 if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
673 *addr = (CYG_ADDRESS)area_start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
674 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
675 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
676 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
677 // Find next blank block
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
678 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
679 while (area_start < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
680 flash_read(area_start, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
681 if (flash_data == (unsigned long)0xFFFFFFFF) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
682 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
683 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
684 area_start += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
685 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
686 fis_ptr = area_start;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
687 } else {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
688 fis_ptr += flash_block_size / sizeof(CYG_ADDRESS);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
689 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
690 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
691 if (area_start != fis_ptr) {
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
692 if ((fis_ptr-area_start) >= (length/sizeof(unsigned))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
693 *addr = (CYG_ADDRESS)area_start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
694 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
695 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
696 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
697 return false;
1297
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
698 #else
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
699 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
700 int idx, num_chunks;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
701
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
702 num_chunks = find_free(chunks);
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
703 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
704 if ((chunks[idx].end - chunks[idx].start) >= length) {
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
705 *addr = (CYG_ADDRESS)chunks[idx].start;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
706 return true;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
707 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
708 }
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
709 return false;
4212c82ebff6 Make 'fis free' use the FIS directory to determine what's free
gthomas
parents: 1295
diff changeset
710 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
711 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
712
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
713 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
714 fis_create(int argc, char *argv[])
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 int i, stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
717 unsigned long length, img_size;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
718 CYG_ADDRESS mem_addr, exec_addr, flash_addr, entry_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
719 char *name;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
720 bool mem_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
721 bool exec_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
722 bool entry_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
723 bool flash_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
724 bool length_set = false;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
725 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
726 bool no_copy = false;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
727 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
728 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
729 bool defaults_assumed;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
730 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
731 bool prog_ok = true;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
732 size_t block_size;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
733
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
734 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
735 (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
736 init_opts(&opts[1], 'r', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
737 (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
738 init_opts(&opts[2], 'e', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
739 (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
740 init_opts(&opts[3], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
741 (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
742 init_opts(&opts[4], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
743 (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
744 init_opts(&opts[5], 's', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
745 (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
746 init_opts(&opts[6], 'n', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
747 (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
748 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
749 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
750 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
751 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
752 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
753
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
754 cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
755 defaults_assumed = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
756 if (name) {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
757 // 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
758 img = fis_lookup(name, NULL);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
759 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
760 // 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
761 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
762 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
763 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
764 defaults_assumed = true;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
765 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
766 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
767 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
768 if (!mem_addr_set && (load_address >= (CYG_ADDRESS)ram_start) &&
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
769 (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
770 mem_addr = load_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
771 mem_addr_set = true;
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
772 defaults_assumed = true;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
773 // Get entry address from loader, unless overridden
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
774 if (!entry_addr_set)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
775 entry_addr = entry_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
776 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
777 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
778 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
779 } 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
780 /* 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
781 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
782 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
783 img_size_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
784 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
785 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
786 // 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
787 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
788 if (!exec_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
789 // Preserve "normal" behaviour
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
790 exec_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
791 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
792 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
793 if (!flash_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
794 flash_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
795 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
796 defaults_assumed = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
797 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
798 }
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
799
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
800 if ((!no_copy && !mem_addr_set) || (no_copy && !flash_addr_set) ||
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
801 !length_set || !name) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
802 fis_usage("required parameter missing");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
803 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
804 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
805 if (!img_size_set) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
806 img_size = length;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
807 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
808 // 'length' is size of FLASH image, 'img_size' is actual data size
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
809 if (strlen(name) >= sizeof(img->name)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
810 diag_printf("Name is too long, must be less than %d chars\n", (int)sizeof(img->name));
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
811 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
812 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
813 if (!no_copy) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
814 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
815 ((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
816 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
817 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
818 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
819 if (!flash_addr_set && !fis_find_free(&flash_addr, length)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
820 diag_printf("Can't locate %lx(%ld) bytes free in FLASH\n", length, length);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
821 return;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
822 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
823 flash_addr_set = true;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
824 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
825 if (flash_addr_set) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
826 block_size = cyg_flash_block_size(flash_addr + length);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
827 #ifndef CYGPKG_HAL_MIPS // FIXME: compiler is b0rken
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
828 length = ((length + block_size - 1) / block_size) * block_size;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
829 if (length < img_size) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
830 diag_printf("Invalid FLASH image size/length combination\n");
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
831 return;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
832 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
833 #endif
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
834 if ((stat = cyg_flash_verify_addr(flash_addr)) ||
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
835 (stat = cyg_flash_verify_addr((flash_addr+length-1)))) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
836 _show_invalid_flash_address(flash_addr, stat);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
837 return;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
838 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
839 block_size = cyg_flash_block_size(flash_addr);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
840 if ((flash_addr & (flash_block_size-1)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
841 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
842 diag_printf(" must be 0x%x aligned\n", flash_block_size);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
843 return;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
844 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
845 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
846
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
847 // 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
848 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
849 if (flash_addr_set && (img->flash_base != flash_addr)) {
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
850 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
851 " is incorrect (present image location %p)\n",
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
852 flash_addr, img->flash_base);
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
853
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
854 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
855 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
856 if (img->size != length) {
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
857 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
858 " 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
859 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
860 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
861 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
862 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
863 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
864 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
865 if (defaults_assumed) {
310
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
866 if (no_copy &&
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
867 !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
868 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
869 (void *)mem_addr)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
870 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
871 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
872 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
873 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
874 } else {
1301
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
875 #ifdef CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
876 // Make sure that any FLASH address specified directly is truly free
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
877 if (flash_addr_set && !no_copy) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
878 struct free_chunk chunks[CYGDAT_REDBOOT_FIS_MAX_FREE_CHUNKS];
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
879 int idx, num_chunks;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
880 bool is_free = false;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
881
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
882 num_chunks = find_free(chunks);
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
883 for (idx = 0; idx < num_chunks; idx++) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
884 if ((flash_addr >= chunks[idx].start) &&
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
885 ((flash_addr+length-1) <= chunks[idx].end)) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
886 is_free = true;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
887 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
888 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
889 if (!is_free) {
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
890 diag_printf("Invalid FLASH address - not free!\n");
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
891 return;
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
892 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
893 }
25b536d4b2bc Verify FLASH addresses to be free during create
gthomas
parents: 1297
diff changeset
894 #endif
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
895 // 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
896 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
897 for (i = 0; i < fisdir_size/sizeof(*img); i++, img++) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
898 if (img->name[0] == (unsigned char)0xFF) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
899 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
900 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
901 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
902 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
903 if (!no_copy) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
904 // Safety check - make sure the address range is not within the code we're running
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
905 if (cyg_flash_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
906 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
907 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
908 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
909 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
910 // Erase area to be programmed
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
911 if ((stat = cyg_flash_erase(flash_addr, length, &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
912 diag_printf("Can't erase region at %p: %s\n", 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
913 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
914 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
915 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
916 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
917 // Now program it
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
918 if ((stat = cyg_flash_program(flash_addr, (void *)mem_addr, img_size,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
919 &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
920 diag_printf("Can't program region at %p: %s\n", err_addr,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
921 cyg_flash_errmsg(stat));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
922 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
923 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
924 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
925 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
926 if (prog_ok) {
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
927 // Update directory
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
928 memset(img, 0, sizeof(*img));
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
929 strcpy(img->name, name);
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
930 img->flash_base = flash_addr;
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
931 img->mem_base = exec_addr_set ? exec_addr : (flash_addr_set ? flash_addr : mem_addr);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
932 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
933 img->size = length;
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
934 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
935 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
936 if (!no_copy) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
937 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
938 } else {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
939 // No way to compute this, sorry
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
940 img->file_cksum = 0;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
941 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
942 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
943 fis_update_directory();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
944 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
945 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
946
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
947 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
948 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
949 fis_delete(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
950 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
951 char *name;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
952 int num_reserved, i, stat;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
953 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
954 struct fis_image_desc *img;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
955
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
956 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
957 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
958 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
959 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
960 }
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
961 #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
962 // 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
963 arm_fis_delete(name);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
964 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
965 #endif
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
966 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
967 num_reserved = 0;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
968 #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
969 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
970 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
971 #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
972 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
973 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
974 #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
975 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
976 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
977 #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
978 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
979 #endif
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
980 #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
981 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
982 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
983 #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
984 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
985 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
986
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
987 img = fis_lookup(name, &i);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
988 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
989 if (i < num_reserved) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
990 diag_printf("Sorry, '%s' is a reserved image and cannot be deleted\n", img->name);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
991 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
992 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
993 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
994 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
995 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
996 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
997 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
998 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
999 }
119
77cec8369160 Merge from eCos master repository on 2000-09-01-07:47:03-BST
jlarmour
parents: 117
diff changeset
1000 // Erase Data blocks (free space)
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1001 if ((stat = cyg_flash_erase(img->flash_base, img->size, &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1002 diag_printf("Error erasing at %p: %s\n", 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
1003 } else {
280
96e3418e1f5b From Jani Monoses: fix HTTP loading, FIS delete
gthomas
parents: 210
diff changeset
1004 img->name[0] = (unsigned char)0xFF;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1005 fis_update_directory();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1006 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1007 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1008
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1009 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1010 fis_load(int argc, char *argv[])
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 char *name;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
1013 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
1014 CYG_ADDRESS mem_addr;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1015 bool mem_addr_set = false;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1016 bool show_cksum = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1017 struct option_info opts[3];
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1018 #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
1019 unsigned long cksum;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 157
diff changeset
1020 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1021 int num_options;
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1022 #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
1023 bool decompress = false;
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
1024 #endif
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1025 cyg_flashaddr_t err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1026
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1027 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1028 (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
1029 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1030 (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
1031 num_options = 2;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
1032 #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
1033 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1034 (void *)&decompress, 0, "decompress");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1035 num_options++;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1036 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1037
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1513
diff changeset
1038 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
1039
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1040 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
1041 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1042 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1043 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1044 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1045 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
1046 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
1047 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1048 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1049 if (!mem_addr_set) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1050 mem_addr = img->mem_base;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1051 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1052 // 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
1053 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1054 if (!valid_address((void *)mem_addr)) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1055 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
1056 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1057 }
962
0138b3d6b8a0 * src/flash.c: Only perform RAM check in fis load command when
jlarmour
parents: 849
diff changeset
1058 #endif
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1393
diff changeset
1059 #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
1060 if (decompress) {
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1061 int err;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1062 _pipe_t fis_load_pipe;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1063 _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
1064 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
1065 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
1066 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
1067 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
1068
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1069 err = (*_dc_init)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1070
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1071 if (0 == err)
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1072 err = (*_dc_inflate)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1073
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1074 // 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
1075 // error value.
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1076 err = (*_dc_close)(p, err);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1077
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 160
diff changeset
1078 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
1079 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
1080 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1081 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
1082 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1083
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1084 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1085 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1086 load_address_end = (unsigned long)p->out_buf;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1087
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1088 // Reload fis directory
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1089 cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1090 } else // dangling block
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1091 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1092 {
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1093 cyg_flash_read(img->flash_base, (void *)mem_addr, img->data_length,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1094 &err_addr);
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1095
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1096 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1097 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1098 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
1099 }
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
1100 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
1101
1627
1bf3513602bc Fix CRC checking on load
gthomas
parents: 1605
diff changeset
1102 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
284
3e80ecaaa3f8 * src/crc.c: Removed. Replaced with the CRC package.
asl
parents: 280
diff changeset
1103 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
1104 if (show_cksum) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1105 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
1106 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1107 // 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
1108 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
1109 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
1110 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
1111 img->file_cksum, cksum);
1679
b548ac5af76c * src/flash.c (find_free): fix endless loop when removing a
asl
parents: 1627
diff changeset
1112 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
1113 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
1114 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
1115 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1116 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1117 #endif // CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1118
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1119 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1120 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
1121 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1122 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1123 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1124 CYG_ADDRESS mem_addr, flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1125 bool mem_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1126 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1127 bool length_set = false;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1128 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
1129 struct option_info opts[3];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1130 bool prog_ok;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1131 size_t block_size;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1132
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1133 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1134 (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
1135 init_opts(&opts[1], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1136 (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
1137 init_opts(&opts[2], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1138 (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
1139 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
1140 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1141 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1142 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1143 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1144
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1145 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
1146 fis_usage("required parameter missing");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1147 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1148 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1149
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1150 // Round up length to FLASH block size
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1151 block_size = cyg_flash_block_size(flash_addr + length);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1152 #ifndef CYGPKG_HAL_MIPS // FIXME: compiler is b0rken
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1153 length = ((length + block_size - 1) / block_size) * block_size;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1154 #endif
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1155 if ((stat = cyg_flash_verify_addr(flash_addr)) ||
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1156 (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
1157 _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
1158 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1159 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1160
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1161 block_size = cyg_flash_block_size(flash_addr);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1162 if (flash_addr & (block_size-1)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1163 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1164 diag_printf(" must be 0x%x aligned\n", block_size);
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1165 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1166 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1167 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
1168 ((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
1169 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
1170 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
1171 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1172 // Safety check - make sure the address range is not within the code we're running
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1173 if (cyg_flash_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
1174 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
1175 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1176 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1177 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
1178 (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
1179 (void *)mem_addr)) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1180 return; // The guy gave up
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1181 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1182 prog_ok = true;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1183 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1184 // Erase area to be programmed
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1185 if ((stat = cyg_flash_erase(flash_addr, length, &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1186 diag_printf("Can't erase region at %p: %s\n", err_addr,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1187 cyg_flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1188 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1189 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1190 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1191 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1192 // Now program it
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1193 if ((stat = cyg_flash_program(flash_addr, (void *)mem_addr, length,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1194 &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1195 diag_printf("Can't program region at %p: %s\n", err_addr,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1196 cyg_flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1197 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1198 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1199 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1200 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1201
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1202 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1203 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
1204 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1205 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1206 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1207 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1208 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1209 bool length_set = false;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1210 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
1211 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1212
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1213 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1214 (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
1215 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1216 (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
1217 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
1218 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1219 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1220 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1221 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1222
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1223 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
1224 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1225 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1226 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1227 if (flash_addr_set &&
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1228 ((stat = cyg_flash_verify_addr(flash_addr)) ||
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1229 (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
1230 _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
1231 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1232 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1233 if (flash_addr_set && flash_addr & (cyg_flash_block_size(flash_addr)-1)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1234 diag_printf("Invalid FLASH address: %p\n", (void *)flash_addr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1235 diag_printf(" must be 0x%x aligned\n", flash_block_size);
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1236 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1237 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1238 // Safety check - make sure the address range is not within the code we're running
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1239 if (cyg_flash_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
1240 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
1241 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1242 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1243 if ((stat = cyg_flash_erase(flash_addr, length, &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1244 diag_printf("Error erasing at %p: %s\n", 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
1245 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1246 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1247
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
1248 #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
1249
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1250 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1251 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
1252 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1253 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1254 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1255 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1256 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1257 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1258 bool length_set = false;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1259 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
1260 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1261
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1262 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1263 (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
1264 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1265 (void *)&length, (bool *)&length_set, "length");
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1266 if (!scan_opts(argc, argv, 2, opts, 2, (void **)&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
1267 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1268 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1269 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1270 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1271
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1272 /* 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
1273 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1274 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1275 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
1276 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
1277 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1278 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1279
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1280 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1281 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1282 } else 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
1283 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1284 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1285 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1286 if (flash_addr_set &&
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1287 ((stat = cyg_flash_verify_addr(flash_addr)) ||
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1288 (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
1289 _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
1290 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1291 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1292 if ((stat = cyg_flash_lock(flash_addr, length, &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1293 diag_printf("Error locking at %p: %s\n", 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
1294 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1295 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1296
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1297 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1298 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
1299 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1300 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1301 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1302 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1303 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1304 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1305 bool length_set = false;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1306 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
1307 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1308
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1309 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1310 (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
1311 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
1312 (void *)&length, (bool *)&length_set, "length");
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1313 if (!scan_opts(argc, argv, 2, opts, 2, (void **)&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
1314 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1315 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1316 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1317 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1318
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1319 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1320 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1321 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
1322 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
1323 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1324 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1325
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1326 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1327 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1328 } else 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
1329 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1330 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1331 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1332 if (flash_addr_set &&
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1333 ((stat = cyg_flash_verify_addr(flash_addr)) ||
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1334 (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
1335 _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
1336 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1337 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1338
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1339 if ((stat = cyg_flash_unlock(flash_addr, length, &err_addr)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1340 diag_printf("Error unlocking at %p: %s\n", 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
1341 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1342 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1343 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1344
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1345 // This is set non-zero if the FLASH subsystem has successfully been initialized
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1346 int __flash_init = 0;
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1347
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1348 void
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1349 _flash_info(void)
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1350 {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1351 cyg_uint32 i=0,j;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1352 cyg_flash_info_t info;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1353 int ret;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1354
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1355 if (!__flash_init) return;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1356
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1357 do {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1358 ret = cyg_flash_get_info(i, &info);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1359 if (ret == CYG_FLASH_ERR_OK) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1360 diag_printf("FLASH: %p - %p ", info.start, info.end);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1361 for (j=0;j < info.num_block_infos; j++) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1362 diag_printf("%d x 0x%x blocks ",
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1363 info.block_info[j].blocks,
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1364 info.block_info[j].block_size);
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1365 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1366 diag_printf("\n");
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1367 }
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1368 i++;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1369 } 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
1370 }
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1371
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1372 bool
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1373 do_flash_init(void)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1374 {
1721
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1375 int stat, i;
1737
dcf02dfe567d * src/flash.c (do_flash_init): Fix compiler warning about an
asl
parents: 1734
diff changeset
1376 cyg_flash_info_t info;
dcf02dfe567d * src/flash.c (do_flash_init): Fix compiler warning about an
asl
parents: 1734
diff changeset
1377 #ifdef CYGOPT_REDBOOT_FIS
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1378 cyg_flashaddr_t err_addr;
1737
dcf02dfe567d * src/flash.c (do_flash_init): Fix compiler warning about an
asl
parents: 1734
diff changeset
1379 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1380
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1381 if (!__flash_init) {
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1382 __flash_init = 1;
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1383
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1384 if ((stat = cyg_flash_init(diag_printf)) != 0) {
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1385 diag_printf("FLASH: driver init failed: %s\n", cyg_flash_errmsg(stat));
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1386 return false;
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1387 }
1717
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1388
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1389 #ifdef CYGNUM_REDBOOT_FLASH_BASE
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1390 stat = cyg_flash_get_info_addr(CYGNUM_REDBOOT_FLASH_BASE, &info);
1721
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1391 #else
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1392 stat = cyg_flash_get_info(0, &info);
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1393 #endif
1717
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1394 if (stat != CYG_FLASH_ERR_OK) {
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1395 diag_printf("FLASH: driver init failed: %s\n",
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1396 cyg_flash_errmsg(stat));
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1397 return false;
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1398 }
faaea4243d52 * cdl/redboot.cdl: Fixed the type of CYGNUM_REDBOOT_FLASH_BASE
asl
parents: 1700
diff changeset
1399 flash_start = info.start;
1740
699be933fd5e Fix flash boundary calculation
bartv
parents: 1737
diff changeset
1400 flash_end = info.end;
1721
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1401
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1402 // No bootblock support yet, so we merge any bootblocks we might
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1403 // find into full size blocks
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1404 for (i=0; i < info.num_block_infos; i++) {
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1405 if (info.block_info[i].block_size > flash_block_size) {
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1406 flash_block_size = info.block_info[i].block_size;
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1407 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1408 }
1721
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1409 flash_num_blocks = 0;
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1410 for (i=0; i < info.num_block_infos; i++) {
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1411 flash_num_blocks += (info.block_info[i].block_size *
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1412 info.block_info[i].blocks) /
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1413 flash_block_size;
16115b7a4b8c * src/flash.c (do_flash_init): cyg_flash_get_limits has been removed.
asl
parents: 1717
diff changeset
1414 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1415
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1416 #ifdef CYGOPT_REDBOOT_FIS
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1417 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
1418 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
1419 # 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
1420 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
1421 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
1422 diag_printf("FLASH: common buffer too small\n");
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1423 return false;
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1424 }
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1425 # else
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1426 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
1427 fis_work_block = workspace_end;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1428 # endif
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1429
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1430 if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) {
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1431 fis_addr = ((CYG_ADDRESS)flash_end + 1 +
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1432 (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
1433 } else {
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1434 fis_addr = ((CYG_ADDRESS)flash_start +
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1435 (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
1436 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1437
1312
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1438 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
1439 diag_printf("FIS directory doesn't fit\n");
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1440 return false;
08edfb52f9cd Improve FIS directory handling - should work with small block size devices
gthomas
parents: 1301
diff changeset
1441 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1442
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1443 cyg_flash_read(fis_addr, fis_work_block, fisdir_size, &err_addr);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1444 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1445 }
1700
bbdd4a302a64 * src/flash.c:
asl
parents: 1679
diff changeset
1446
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1447 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1448 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1449
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1450 // Wrapper to avoid compiler warnings
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1451 static void
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1452 _do_flash_init(void)
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1453 {
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1454 static int init_done = 0;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1455 if (init_done) return;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1456 init_done = 1;
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1457 do_flash_init();
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1458 }
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1459
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1460 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
1461
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
1462 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1463 do_fis(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1464 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1465 struct cmd *cmd;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1466
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1467 if (argc < 2) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1468 fis_usage("too few arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1469 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1470 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1471 if (!do_flash_init()) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1472 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
1473 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1474 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1475 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
1476 argv[1])) != (struct cmd *)0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1477 (cmd->fun)(argc, argv);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1478 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1479 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1480 fis_usage("unrecognized command");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1481 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1482
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1483 // EOF flash.c