annotate packages/redboot/current/src/flash.c @ 1268:205922255412

Minor fconfig fixes
author gthomas
date Fri, 03 Oct 2003 23:49:20 +0000
parents dc8c964619a0
children eaf1a693566b
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.
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
12 // Copyright (C) 2003 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>
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
60
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
61 #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
62 // 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
63 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
64
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
65 // Round a quantity up
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
66 #define _rup(n,s) ((((n)+(s-1))/s)*s)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
67
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
68 #ifdef CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
69 // Image management functions
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
70 local_cmd_entry("init",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
71 "Initialize FLASH Image System [FIS]",
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
72 "[-f]",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
73 fis_init,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
74 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
75 );
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
76 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
77 # define FIS_LIST_OPTS "[-c] [-d]"
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
78 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
79 # define FIS_LIST_OPTS "[-d]"
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
80 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
81 local_cmd_entry("list",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
82 "Display contents of FLASH Image System [FIS]",
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
83 FIS_LIST_OPTS,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
84 fis_list,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
85 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
86 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
87 local_cmd_entry("free",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
88 "Display free [available] locations within FLASH Image System [FIS]",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
89 "",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
90 fis_free,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
91 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
92 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
93 local_cmd_entry("delete",
388
38dad94e75ce Min BOOTP/vendor size. Fix typo in FIS/DELETE.
gthomas
parents: 310
diff changeset
94 "Delete an image from FLASH Image System [FIS]",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
95 "name",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
96 fis_delete,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
97 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
98 );
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
99
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
100 static char fis_load_usage[] =
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
101 #ifdef CYGPKG_COMPRESS_ZLIB
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
102 "[-d] "
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
103 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
104 "[-b <memory_load_address>] [-c] name";
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
105
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
106 local_cmd_entry("load",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
107 "Load image from FLASH Image System [FIS] into RAM",
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
108 fis_load_usage,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
109 fis_load,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
110 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
111 );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
112 local_cmd_entry("create",
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
113 "Create an image",
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
114 "-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
115 " [-f <flash_addr>] [-e <entry_point>] [-r <ram_addr>] [-n] <name>",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
116 fis_create,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
117 FIS_cmds
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
118 );
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
119 #endif
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
120
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
121 // Raw flash access functions
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
122 local_cmd_entry("erase",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
123 "Erase FLASH contents",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
124 "-f <flash_addr> -l <length>",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
125 fis_erase,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
126 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
127 );
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
128 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
129 local_cmd_entry("lock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
130 "LOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
131 "[-f <flash_addr> -l <length>] [name]",
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
132 fis_lock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
133 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
134 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
135 local_cmd_entry("unlock",
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
136 "UNLOCK FLASH contents",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
137 "[-f <flash_addr> -l <length>] [name]",
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
138 fis_unlock,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
139 FIS_cmds
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
140 );
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
141 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
142 local_cmd_entry("write",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
143 "Write raw data directly to FLASH",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
144 "-f <flash_addr> -b <mem_base> -l <image_length>",
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
145 fis_write,
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
146 FIS_cmds
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
147 );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
148
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
149 // Define table boundaries
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
150 CYG_HAL_TABLE_BEGIN( __FIS_cmds_TAB__, FIS_cmds);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
151 CYG_HAL_TABLE_END( __FIS_cmds_TAB_END__, FIS_cmds);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
152
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
153 extern struct cmd __FIS_cmds_TAB__[], __FIS_cmds_TAB_END__;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
154
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
155 // CLI function
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
156 static cmd_fun do_fis;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
157 RedBoot_nested_cmd("fis",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
158 "Manage FLASH images",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
159 "{cmds}",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
160 do_fis,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
161 __FIS_cmds_TAB__, &__FIS_cmds_TAB_END__
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
162 );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
163
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
164 // Local data used by these routines
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
165 void *flash_start, *flash_end;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
166 int flash_block_size, flash_num_blocks;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
167 #ifdef CYGOPT_REDBOOT_FIS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
168 void *fis_work_block;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
169 void *fis_addr;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
170 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
171 #endif
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
172 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
173 extern void *cfg_base; // Location in Flash of config data
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
174 extern int cfg_size; // Length of config data - rounded to Flash block size
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
175 extern struct _config *config;
172
cd45958b28ff Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents: 171
diff changeset
176 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
177
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
178 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
179 fis_usage(char *why)
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
180 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
181 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
182 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
183 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
184
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
185 static void
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
186 _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
187 {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
188 diag_printf("Invalid FLASH address %p: %s\n", (void *)flash_addr, flash_errmsg(stat));
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
189 diag_printf(" valid range is %p-%p\n", (void *)flash_start, (void *)flash_end);
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
190 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
191
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
192 #ifdef CYGOPT_REDBOOT_FIS
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
193 struct fis_image_desc *
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
194 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
195 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
196 int i;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
197 struct fis_image_desc *img;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
198 void *err_addr;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
199
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
200 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
201 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
202 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
203 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
204 (strcasecmp(name, img->name) == 0)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
205 if (num) *num = i;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
206 return img;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
207 }
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 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
210 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
211
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
212 void
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
213 fis_update_directory(void)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
214 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
215 int stat;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
216 void *err_addr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
217
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
218 #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
219 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
220 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
221 #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
222 // Ensure [quietly] that the directory is unlocked before trying to update
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
223 flash_unlock((void *)fis_addr, flash_block_size, (void **)&err_addr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
224 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
225 if ((stat = flash_erase(fis_addr, flash_block_size, (void **)&err_addr)) != 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
226 diag_printf("Error erasing FIS directory at %p: %s\n", err_addr, flash_errmsg(stat));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
227 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
228 if ((stat = flash_program(fis_addr, fis_work_block, flash_block_size,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
229 (void **)&err_addr)) != 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
230 diag_printf("Error writing FIS directory at %p: %s\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
231 err_addr, flash_errmsg(stat));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
232 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
233 }
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 locked after the update
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
236 flash_lock((void *)fis_addr, flash_block_size, (void **)&err_addr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
237 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
238 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
239
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
240 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
241 fis_init(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
242 {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
243 int stat;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
244 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
245 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
246 bool full_init = false;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
247 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
248 CYG_ADDRESS redboot_flash_start;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
249 unsigned long redboot_image_size;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
250
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
251 init_opts(&opts[0], 'f', false, OPTION_ARG_TYPE_FLG,
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
252 (void **)&full_init, (bool *)0, "full initialization, erases all of flash");
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
253 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
254 {
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
255 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
256 }
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
257
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
258 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
259 diag_printf("** Aborted\n");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
260 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
261 }
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
262 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
263
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
264 #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
265 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
266 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
267
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
268 // 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
269 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
270 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
271 #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
272 memset(img, 0, sizeof(*img));
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
273 strcpy(img->name, "(reserved)");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
274 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
275 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
276 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
277 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
278 #endif
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
279 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
280 #ifdef CYGOPT_REDBOOT_FIS_REDBOOT
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
281 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
282 strcpy(img->name, "RedBoot");
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 145
diff changeset
283 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
284 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
285 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
286 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
287 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
288 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
289 #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
290 #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
291 // 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
292 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
293 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
294 memset(img, 0, sizeof(*img));
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
295 strcpy(img->name, "RedBoot[post]");
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
296 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
297 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
298 img->size = redboot_image_size;
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_BACKUP
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
303 // And a backup image
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
304 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
305 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
306 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
307 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
308 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
309 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
310 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
311 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
312 #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
313 // 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
314 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
315 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
316 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
317 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
318 img->size = cfg_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
319 img++;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
320 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
321 // 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
322 memset(img, 0, sizeof(*img));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
323 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
324 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
325 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
326 img->size = fisdir_size;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
327 img++;
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
328
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
329 #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
330 // 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
331 // 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
332 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
333 // 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
334 // Monitor as a reserved area.
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
335 {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
336 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
337 cyg_uint32 check = 0;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
338 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
339 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
340
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
341 // 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
342 // 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
343 // 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
344 // 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
345 #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
346 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
347 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
348 #else
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
349 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
350 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
351 footer_p->infoBase = NULL;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
352 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
353 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
354
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
355 // and compute its checksum
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
356 for ( ; count > 0; count--) {
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
357 if (*check_ptr > ~check)
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
358 check++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
359 check += *check_ptr++;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
360 }
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
361 footer_p->checksum = ~check;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
362 }
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
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
365 // 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
366 // 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
367
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
368 if (full_init) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
369 unsigned long erase_size;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
370 CYG_ADDRESS erase_start;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
371 // 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
372 // and config block.
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
373 // 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
374 #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
375 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
376 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
377 if ( erase_size > erase_start ) {
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
378 erase_size -= erase_start;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
379 if ((stat = flash_erase((void *)erase_start, erase_size,
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
380 (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
381 diag_printf(" initialization failed at %p: %s\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
382 err_addr, flash_errmsg(stat));
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
383 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
384 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
385 #endif
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
386 // 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
387 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
388 // 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
389 // blocks.
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
390 #if defined(CYGSEM_REDBOOT_FLASH_CONFIG) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
391 defined(CYGHWR_REDBOOT_FLASH_CONFIG_MEDIA_FLASH) && \
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
392 !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
393 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
394 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
395 } else {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
396 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
397 }
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
398 if ((stat = flash_erase((void *)erase_start, erase_size,
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
399 (void **)&err_addr)) != 0) {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
400 diag_printf(" initialization failed %p: %s\n",
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
401 err_addr, flash_errmsg(stat));
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
402 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
403 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
404 if (fis_addr > cfg_base) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
405 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
406 } else {
184
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 fis and config data
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
408 }
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
409 if ((stat = flash_erase((void *)erase_start, erase_size,
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
410 (void **)&err_addr)) != 0) {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
411 diag_printf(" initialization failed %p: %s\n",
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
412 err_addr, flash_errmsg(stat));
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
413 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
414 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
415 #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
416 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
417 if ((stat = flash_erase((void *)erase_start, erase_size,
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
418 (void **)&err_addr)) != 0) {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
419 diag_printf(" initialization failed %p: %s\n",
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
420 err_addr, flash_errmsg(stat));
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
421 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
422 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
423 #endif
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
424 // 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
425 erase_size = ((CYG_ADDRESS)flash_end - erase_start) + 1;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
426 if ((stat = flash_erase((void *)erase_start, erase_size,
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
427 (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
428 diag_printf(" initialization failed at %p: %s\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
429 err_addr, flash_errmsg(stat));
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
430 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
431 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
432 diag_printf(" Warning: device contents not erased, some blocks may not be usable\n");
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
433 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
434
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
435 fis_update_directory();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
436 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
437
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
438 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
439 fis_list(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
440 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
441 struct fis_image_desc *img;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
442 int i;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
443 bool show_cksums = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
444 bool show_datalen = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
445 struct option_info opts[2];
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
446 void *err_addr;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
447
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
448 #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
449 // 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
450 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
451 arm_fis_list();
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
452 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
453 #endif
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
454
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
455 init_opts(&opts[0], 'd', false, OPTION_ARG_TYPE_FLG,
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
456 (void **)&show_datalen, (bool *)0, "display data length");
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
457 #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
458 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
459 (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
460 i = 2;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
461 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
462 i = 1;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
463 #endif
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
464 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
465 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
466 return;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
467 }
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
468 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
469 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
470 // 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
471 // cols by hand....
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
472 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
473 "Name","FLASH addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
474 show_cksums ? "Checksum" : "Mem addr",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
475 show_datalen ? "Datalen" : "Length",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
476 "Entry point" );
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
477 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
478 if (img->name[0] != (unsigned char)0xFF) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
479 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
480 img->flash_base,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
481 #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
482 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
483 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
484 #else
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
485 img->mem_base,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
486 img->size,
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
487 #endif
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
488 img->entry_point);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
489 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
490 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
491 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
492
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
493 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
494 fis_free(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
495 {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
496 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
497 unsigned long *area_start;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
498 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
499
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
500 // Do not search the area reserved for pre-RedBoot systems:
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
501 fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
1136
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
502 CYGNUM_REDBOOT_FLASH_RESERVED_BASE +
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
503 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
504 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
505 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
506 while (fis_ptr < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
507 flash_read(fis_ptr, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
508 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
509 if (area_start != fis_ptr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
510 // 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
511 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
512 (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
513 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
514 // Find next blank block
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
515 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
516 while (area_start < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
517 flash_read(area_start, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
518 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
519 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
520 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
521 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
522 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
523 fis_ptr = area_start;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
524 } else {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
525 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
526 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
527 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
528 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
529 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
530 (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
531 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
532 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
533
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
534 // 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
535 static bool
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
536 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
537 {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
538 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
539 unsigned long *area_start;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
540 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
541
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
542 // Do not search the area reserved for pre-RedBoot systems:
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
543 fis_ptr = (unsigned long *)((CYG_ADDRESS)flash_start +
1136
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
544 CYGNUM_REDBOOT_FLASH_RESERVED_BASE +
3067974be2f3 * src/flash.c (fis_find_free)
asl
parents: 1024
diff changeset
545 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
546 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
547 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
548 while (fis_ptr < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
549 flash_read(fis_ptr, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
550 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
551 if (area_start != fis_ptr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
552 // 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
553 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
554 *addr = (CYG_ADDRESS)area_start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
555 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
556 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
557 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
558 // Find next blank block
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
559 area_start = fis_ptr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
560 while (area_start < fis_end) {
1251
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
561 flash_read(area_start, &flash_data, sizeof(unsigned long), (void **)&err_addr);
dc8c964619a0 Fix broken FIS free/create
gthomas
parents: 1223
diff changeset
562 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
563 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
564 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
565 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
566 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
567 fis_ptr = area_start;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
568 } else {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
569 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
570 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
571 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
572 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
573 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
574 *addr = (CYG_ADDRESS)area_start;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
575 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
576 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
577 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
578 return false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
579 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
580
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
581 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
582 fis_create(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
583 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
584 int i, stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
585 unsigned long length, img_size;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
586 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
587 char *name;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
588 bool mem_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
589 bool exec_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
590 bool entry_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
591 bool flash_addr_set = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
592 bool length_set = false;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
593 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
594 bool no_copy = false;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
595 void *err_addr;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
596 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
597 bool defaults_assumed;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
598 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
599 bool prog_ok = true;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
600
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
601 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
602 (void **)&mem_addr, (bool *)&mem_addr_set, "memory base address");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
603 init_opts(&opts[1], 'r', true, OPTION_ARG_TYPE_NUM,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
604 (void **)&exec_addr, (bool *)&exec_addr_set, "ram base address");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
605 init_opts(&opts[2], 'e', true, OPTION_ARG_TYPE_NUM,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
606 (void **)&entry_addr, (bool *)&entry_addr_set, "entry point address");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
607 init_opts(&opts[3], 'f', true, OPTION_ARG_TYPE_NUM,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
608 (void **)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
609 init_opts(&opts[4], 'l', true, OPTION_ARG_TYPE_NUM,
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
610 (void **)&length, (bool *)&length_set, "image length [in FLASH]");
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
611 init_opts(&opts[5], 's', true, OPTION_ARG_TYPE_NUM,
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
612 (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
613 init_opts(&opts[6], 'n', false, OPTION_ARG_TYPE_FLG,
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
614 (void **)&no_copy, (bool *)0, "don't copy from RAM to FLASH, just update directory");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
615 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
616 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
617 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
618 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
619 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
620
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
621 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
622 defaults_assumed = false;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
623 if (name) {
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
624 // 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
625 img = fis_lookup(name, NULL);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
626 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
627 // 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
628 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
629 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
630 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
631 defaults_assumed = true;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
632 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
633 }
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
634 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
635 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
636 (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
637 mem_addr = load_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
638 mem_addr_set = true;
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
639 defaults_assumed = true;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
640 // 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
641 if (!entry_addr_set)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
642 entry_addr = entry_address;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
643 if (!length_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
644 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
645 length_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
646 } 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
647 /* 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
648 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
649 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
650 img_size_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
651 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
652 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
653 // 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
654 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
655 if (!exec_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
656 // Preserve "normal" behaviour
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
657 exec_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
658 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
659 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
660 if (!flash_addr_set) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
661 flash_addr_set = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
662 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
663 defaults_assumed = true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
664 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
665 }
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
666
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
667 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
668 !length_set || !name) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
669 fis_usage("required parameter missing");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
670 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
671 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
672 if (!img_size_set) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
673 img_size = length;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
674 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
675 // 'length' is size of FLASH image, 'img_size' is actual data size
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
676 // Round up length to FLASH block size
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
677 #ifndef CYGPKG_HAL_MIPS // FIXME: compiler is b0rken
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
678 length = ((length + flash_block_size - 1) / flash_block_size) * flash_block_size;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
679 if (length < img_size) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
680 diag_printf("Invalid FLASH image size/length combination\n");
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
681 return;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
682 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
683 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
684 if (flash_addr_set &&
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
685 ((stat = flash_verify_addr((void *)flash_addr)) ||
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
686 (stat = flash_verify_addr((void *)(flash_addr+img_size-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
687 _show_invalid_flash_address(flash_addr, stat);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
688 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
689 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
690 if (flash_addr_set && flash_addr & (flash_block_size-1)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
691 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
692 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
693 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
694 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
695 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
696 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
697 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
698 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
699 if (!no_copy) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
700 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
701 ((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
702 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
703 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
704 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
705 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
706 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
707 return;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
708 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
709 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
710 // 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
711 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
712 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
713 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
714 " 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
715 flash_addr, img->flash_base);
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
716
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
717 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
718 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
719 if (img->size != length) {
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
720 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
721 " 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
722 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
723 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
724 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
725 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
726 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
727 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
728 if (defaults_assumed) {
310
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
729 if (no_copy &&
113a540ea6db Improve FLASH create - from Thomas Koeller
gthomas
parents: 307
diff changeset
730 !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
731 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
732 (void *)mem_addr)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
733 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
734 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
735 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
736 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
737 } else {
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
738 // If not image by that name, try and find an empty slot
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
739 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
740 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
741 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
742 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
743 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
744 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
745 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
746 if (!no_copy) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
747 // Safety check - make sure the address range is not within the code we're running
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
748 if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+img_size-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
749 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
750 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
751 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
752 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
753 // Erase area to be programmed
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
754 if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
755 diag_printf("Can't erase region at %p: %s\n", err_addr, flash_errmsg(stat));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
756 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
757 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
758 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
759 if (prog_ok) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
760 // Now program it
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
761 if ((stat = flash_program((void *)flash_addr, (void *)mem_addr, img_size, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
762 diag_printf("Can't program region at %p: %s\n", err_addr, flash_errmsg(stat));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
763 prog_ok = false;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
764 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
765 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
766 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
767 if (prog_ok) {
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
768 // Update directory
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
769 memset(img, 0, sizeof(*img));
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
770 strcpy(img->name, name);
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
771 img->flash_base = flash_addr;
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
772 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
773 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
774 img->size = length;
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
775 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
776 #ifdef CYGSEM_REDBOOT_FIS_CRC_CHECK
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
777 if (!no_copy) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
778 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
779 } else {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
780 // No way to compute this, sorry
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
781 img->file_cksum = 0;
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
782 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
783 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
784 fis_update_directory();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
785 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
786 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
787
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
788 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
789 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
790 fis_delete(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
791 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
792 char *name;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
793 int num_reserved, i, stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
794 void *err_addr;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
795 struct fis_image_desc *img;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
796
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
797 if (!scan_opts(argc, argv, 2, 0, 0, (void **)&name, OPTION_ARG_TYPE_STR, "image name"))
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
798 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
799 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
800 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
801 }
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
802 #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
803 // 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
804 arm_fis_delete(name);
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
805 return;
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
806 #endif
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
807 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
808 num_reserved = 0;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
809 #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
810 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
811 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
812 #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
813 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
814 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
815 #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
816 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
817 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
818 #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
819 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
820 #endif
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
821 #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
822 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
823 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
824 #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
825 num_reserved++;
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
826 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
827
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
828 img = fis_lookup(name, &i);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
829 if (img) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
830 if (i < num_reserved) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
831 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
832 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
833 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
834 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
835 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
836 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
837 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
838 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
839 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
840 }
119
77cec8369160 Merge from eCos master repository on 2000-09-01-07:47:03-BST
jlarmour
parents: 117
diff changeset
841 // Erase Data blocks (free space)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
842 if ((stat = flash_erase((void *)img->flash_base, img->size, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
843 diag_printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat));
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
844 } else {
280
96e3418e1f5b From Jani Monoses: fix HTTP loading, FIS delete
gthomas
parents: 210
diff changeset
845 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
846 fis_update_directory();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
847 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
848 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
849
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
850 static void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
851 fis_load(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
852 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
853 char *name;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 126
diff changeset
854 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
855 CYG_ADDRESS mem_addr;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
856 bool mem_addr_set = false;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
857 bool show_cksum = false;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
858 struct option_info opts[3];
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 157
diff changeset
859 #ifdef CYGPKG_REDBOOT_FIS_CRC_CHECK
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
860 unsigned long cksum;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 157
diff changeset
861 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
862 int num_options;
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
863 #ifdef CYGPKG_COMPRESS_ZLIB
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
864 bool decompress = false;
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
865 #endif
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
866 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
867
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
868 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
869 (void **)&mem_addr, (bool *)&mem_addr_set, "memory [load] base address");
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
870 init_opts(&opts[1], 'c', false, OPTION_ARG_TYPE_FLG,
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
871 (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
872 num_options = 2;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
873 #ifdef CYGPKG_COMPRESS_ZLIB
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
874 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG,
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
875 (void **)&decompress, 0, "decompress");
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
876 num_options++;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
877 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
878
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
879 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
880 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
881 fis_usage("invalid arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
882 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
883 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
884 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
885 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
886 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
887 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
888 if (!mem_addr_set) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
889 mem_addr = img->mem_base;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
890 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
891 // 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
892 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
893 if (!valid_address((void *)mem_addr)) {
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
894 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
895 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
896 }
962
0138b3d6b8a0 * src/flash.c: Only perform RAM check in fis load command when
jlarmour
parents: 849
diff changeset
897 #endif
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
898 #ifdef CYGPKG_COMPRESS_ZLIB
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
899 if (decompress) {
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
900 int err;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
901 _pipe_t fis_load_pipe;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
902 _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
903 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
904 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
905 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
906 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
907
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
908 err = (*_dc_init)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
909
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
910 if (0 == err)
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
911 err = (*_dc_inflate)(p);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
912
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
913 // 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
914 // error value.
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
915 err = (*_dc_close)(p, err);
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
916
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 160
diff changeset
917 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
918 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
919 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
920 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
921 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
922
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
923 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
924 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
925 load_address_end = (unsigned long)p->out_buf;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
926
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
927 // Reload fis directory
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
928 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
929 } else // dangling block
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
930 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
931 {
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
932 flash_read((void *)img->flash_base, (void *)mem_addr, img->data_length, (void **)&err_addr);
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
933
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
934 // Set load address/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
935 load_address = mem_addr;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
936 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
937 }
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 195
diff changeset
938 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
939
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
940 #ifdef CYGPKG_REDBOOT_FIS_CRC_CHECK
284
3e80ecaaa3f8 * src/crc.c: Removed. Replaced with the CRC package.
asl
parents: 280
diff changeset
941 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
942 if (show_cksum) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
943 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
944 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
945 // 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
946 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
947 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
948 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
949 img->file_cksum, cksum);
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
950 entry_address = NO_MEMORY;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
951 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 130
diff changeset
952 }
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
953 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
954 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
955 #endif // CYGOPT_REDBOOT_FIS
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
956
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
957 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
958 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
959 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
960 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
961 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
962 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
963 bool mem_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
964 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
965 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
966 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
967 struct option_info opts[3];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
968 bool prog_ok;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
969
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
970 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
971 (void **)&mem_addr, (bool *)&mem_addr_set, "memory base address");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
972 init_opts(&opts[1], 'f', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
973 (void **)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
974 init_opts(&opts[2], 'l', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
975 (void **)&length, (bool *)&length_set, "image length [in FLASH]");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
976 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
977 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
978 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
979 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
980 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
981
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
982 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
983 fis_usage("required parameter missing");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
984 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
985 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
986
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
987 // Round up length to FLASH block size
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
988 #ifndef CYGPKG_HAL_MIPS // FIXME: compiler is b0rken
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
989 length = ((length + flash_block_size - 1) / flash_block_size) * flash_block_size;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
990 #endif
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
991 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
992 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
993 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
994 _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
995 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
996 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
997 if (flash_addr_set && flash_addr & (flash_block_size-1)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
998 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
999 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
1000 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1001 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1002 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
1003 ((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
1004 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
1005 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
1006 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1007 // Safety check - make sure the address range is not within the code we're running
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1008 if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+length-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1009 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
1010 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1011 }
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
1012 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
1013 (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
1014 (void *)mem_addr)) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1015 return; // The guy gave up
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1016 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1017 prog_ok = true;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1018 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1019 // Erase area to be programmed
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1020 if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1021 diag_printf("Can't erase region at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1022 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1023 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1024 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1025 if (prog_ok) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1026 // Now program it
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1027 if ((stat = flash_program((void *)flash_addr, (void *)mem_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1028 diag_printf("Can't program region at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1029 prog_ok = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1030 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1031 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1032 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1033
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1034 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1035 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
1036 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1037 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1038 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1039 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1040 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1041 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1042 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1043 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1044
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1045 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1046 (void **)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1047 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1048 (void **)&length, (bool *)&length_set, "length");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1049 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
1050 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1051 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1052 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1053 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1054
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1055 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
1056 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1057 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1058 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1059 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1060 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1061 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1062 _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
1063 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1064 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1065 if (flash_addr_set && flash_addr & (flash_block_size-1)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1066 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
1067 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
1068 return;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 172
diff changeset
1069 }
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1070 // Safety check - make sure the address range is not within the code we're running
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1071 if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+length-1))) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1072 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
1073 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1074 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1075 if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1076 diag_printf("Error erasing at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1077 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1078 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1079
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
1080 #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
1081
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1082 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1083 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
1084 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1085 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1086 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1087 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1088 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1089 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1090 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1091 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1092 struct option_info opts[2];
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1093
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1094 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1095 (void **)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1096 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1097 (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
1098 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
1099 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1100 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1101 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1102 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1103
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1104 /* 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
1105 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1106 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1107 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
1108 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
1109 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1110 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1111
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1112 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1113 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1114 } 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
1115 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1116 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1117 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1118 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1119 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1120 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1121 _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
1122 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1123 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1124 if ((stat = flash_lock((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1125 diag_printf("Error locking at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1126 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1127 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1128
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1129 static void
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1130 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
1131 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1132 char *name;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1133 int stat;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1134 unsigned long length;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1135 CYG_ADDRESS flash_addr;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1136 bool flash_addr_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1137 bool length_set = false;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1138 void *err_addr;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1139 struct option_info opts[2];
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 init_opts(&opts[0], 'f', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1142 (void **)&flash_addr, (bool *)&flash_addr_set, "FLASH memory base address");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1143 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1144 (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
1145 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
1146 {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1147 fis_usage("invalid arguments");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1148 return;
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
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1151 if (name) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1152 struct fis_image_desc *img;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1153 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
1154 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
1155 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1156 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1157
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1158 flash_addr = img->flash_base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1159 length = img->size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1160 } 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
1161 fis_usage("missing argument");
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1162 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1163 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1164 if (flash_addr_set &&
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1165 ((stat = flash_verify_addr((void *)flash_addr)) ||
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1166 (stat = flash_verify_addr((void *)(flash_addr+length-1))))) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1167 _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
1168 return;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1169 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1170
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1171 if ((stat = flash_unlock((void *)flash_addr, length, (void **)&err_addr)) != 0) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1172 diag_printf("Error unlocking at %p: %s\n", err_addr, flash_errmsg(stat));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1173 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1174 }
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 161
diff changeset
1175 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1176
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1177 // 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
1178 int __flash_init = 0;
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1179
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1180 void
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1181 _flash_info(void)
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1182 {
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1183 if (!__flash_init) return;
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1184 diag_printf("FLASH: %p - %p, %d blocks of %p bytes each.\n",
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1185 flash_start, (CYG_ADDRWORD)flash_end + 1, flash_num_blocks, (void *)flash_block_size);
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1186 }
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1187
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1188 bool
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1189 do_flash_init(void)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1190 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1191 int stat;
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1192 void *err_addr;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1193
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 165
diff changeset
1194 if (!__flash_init) {
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
1195 if ((stat = flash_init((void *)(workspace_end-FLASH_MIN_WORKSPACE),
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1196 FLASH_MIN_WORKSPACE, diag_printf)) != 0) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
1197 diag_printf("FLASH: driver init failed: %s\n", flash_errmsg(stat));
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1198 return false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1199 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1200 flash_get_limits((void *)0, (void **)&flash_start, (void **)&flash_end);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1201 // Keep 'end' address as last valid location, to avoid wrap around problems
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1202 flash_end = (void *)((CYG_ADDRESS)flash_end - 1);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1203 flash_get_block_info(&flash_block_size, &flash_num_blocks);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1204 workspace_end = (unsigned char *)(workspace_end-FLASH_MIN_WORKSPACE);
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1205 #ifdef CYGOPT_REDBOOT_FIS
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1206 # ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1207 fis_work_block = fis_zlib_common_buffer;
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1208 if(CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE < flash_block_size) {
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1209 diag_printf("FLASH: common buffer too small\n");
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1210 workspace_end += FLASH_MIN_WORKSPACE;
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1211 return false;
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1212 }
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1213 # else
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1214 workspace_end = (unsigned char *)(workspace_end-flash_block_size);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1215 fis_work_block = workspace_end;
307
906a5d289c6d Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents: 284
diff changeset
1216 # endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1217 fisdir_size = flash_block_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1218 if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1219 fis_addr = (void *)((CYG_ADDRESS)flash_end + 1 +
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1220 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1221 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1222 fis_addr = (void *)((CYG_ADDRESS)flash_start +
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1223 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 202
diff changeset
1224 }
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 1208
diff changeset
1225 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1226 #endif
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1227 __flash_init = 1;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1228 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1229 return true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1230 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1231
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1232 // Wrapper to avoid compiler warnings
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1233 static void
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1234 _do_flash_init(void)
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1235 {
1268
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1236 static int init_done = 0;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1237 if (init_done) return;
205922255412 Minor fconfig fixes
gthomas
parents: 1251
diff changeset
1238 init_done = 1;
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1239 do_flash_init();
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1240 }
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1241
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
1242 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
1243
160
0d0f03f76f6a Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents: 159
diff changeset
1244 static void
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1245 do_fis(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1246 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1247 struct cmd *cmd;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1248
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1249 if (argc < 2) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1250 fis_usage("too few arguments");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1251 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1252 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1253 if (!do_flash_init()) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1254 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
1255 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 183
diff changeset
1256 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1257 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
1258 argv[1])) != (struct cmd *)0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1259 (cmd->fun)(argc, argv);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1260 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1261 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1262 fis_usage("unrecognized command");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1263 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1264
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 153
diff changeset
1265 // EOF flash.c