Mercurial > flash_v2
annotate packages/devs/flash/arm/iq80310/current/src/iq80310_flash.c @ 1764:96ec7e534d98
V2 flash header files clean-up. Eliminate flash_priv.h, moving the
functionality into flash_dev.h instead.
| author | bartv |
|---|---|
| date | Tue, 22 Feb 2005 21:03:43 +0000 |
| parents | 244c544171e7 |
| children |
| rev | line source |
|---|---|
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
2 // |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
3 // iq80310_flash.c |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
4 // |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
5 // Flash programming |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
6 // |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
8 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
9 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
12 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
13 // 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:
184
diff
changeset
|
14 // 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:
184
diff
changeset
|
15 // 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:
184
diff
changeset
|
16 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
17 // 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:
184
diff
changeset
|
18 // 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:
184
diff
changeset
|
19 // 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:
184
diff
changeset
|
20 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
21 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
22 // 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:
184
diff
changeset
|
23 // 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:
184
diff
changeset
|
24 // 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:
184
diff
changeset
|
25 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
26 // 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:
184
diff
changeset
|
27 // 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:
184
diff
changeset
|
28 // 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:
184
diff
changeset
|
29 // 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:
184
diff
changeset
|
30 // 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:
184
diff
changeset
|
31 // 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:
184
diff
changeset
|
32 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
33 // 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:
184
diff
changeset
|
34 // 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:
184
diff
changeset
|
35 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
36 // 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
|
37 // 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:
184
diff
changeset
|
38 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
184
diff
changeset
|
39 //####ECOSGPLCOPYRIGHTEND#### |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
40 //========================================================================== |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
41 //#####DESCRIPTIONBEGIN#### |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
42 // |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
43 // Author(s): gthomas |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
44 // Contributors: gthomas, msalter |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
45 // Date: 2000-07-26 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
46 // Purpose: |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
47 // Description: |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
48 // |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
49 //####DESCRIPTIONEND#### |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
50 // |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
51 //========================================================================== |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
52 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
53 #include <pkgconf/hal.h> |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
54 #include <cyg/hal/hal_arch.h> |
| 1270 | 55 #include <cyg/infra/diag.h> |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
56 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
57 #include <cyg/io/flash.h> |
|
1764
96ec7e534d98
V2 flash header files clean-up. Eliminate flash_priv.h, moving the
bartv
parents:
1270
diff
changeset
|
58 #include <cyg/io/flash_dev.h> |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
59 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
60 #include "flash.h" |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
61 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
62 #define _si(p) ((p[1]<<8)|p[0]) |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
63 |
| 1270 | 64 extern int strncmp(const char *s1, const char *s2, size_t len); |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
65 int |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
66 flash_hwr_init(void) |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
67 { |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
68 struct FLASH_query data, *qp; |
| 1270 | 69 int num_regions, region_size; |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
70 |
| 1270 | 71 flash_dev_query((void*)&data); |
| 72 | |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
73 qp = &data; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
74 if (/*(qp->manuf_code == FLASH_Intel_code) && */ |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
75 (strncmp(qp->id, "QRY", 3) == 0)) { |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
76 num_regions = _si(qp->num_regions)+1; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
77 region_size = _si(qp->region_size)*256; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
78 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
79 flash_info.block_size = region_size; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
80 flash_info.blocks = num_regions; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
81 flash_info.start = (void *)0x00000000; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
82 flash_info.end = (void *)(0x00000000+(num_regions*region_size)); |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
83 return FLASH_ERR_OK; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
84 } else { |
|
162
2395031e7a66
Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents:
152
diff
changeset
|
85 (*flash_info.pf)("Can't identify FLASH sorry\n"); |
| 1270 | 86 diag_dump_buf((void*)&data, sizeof(data)); |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
87 return FLASH_ERR_HWR; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
88 } |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
89 } |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
90 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
91 // Map a hardware status to a package error |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
92 int |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
93 flash_hwr_map_error(int err) |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
94 { |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
95 if (err & 0x7E) { |
|
162
2395031e7a66
Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents:
152
diff
changeset
|
96 (*flash_info.pf)("Err = %x\n", err); |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
97 if (err & 0x10) { |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
98 return FLASH_ERR_PROGRAM; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
99 } else |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
100 if (err & 0x20) { |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
101 return FLASH_ERR_ERASE; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
102 } else |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
103 return FLASH_ERR_HWR; // FIXME |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
104 } else { |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
105 return FLASH_ERR_OK; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
106 } |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
107 } |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
108 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
109 // See if a range of FLASH addresses overlaps currently running code |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
110 bool |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
111 flash_code_overlaps(void *start, void *end) |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
112 { |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
113 extern char _stext[], _etext[]; |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
114 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
115 return ((((unsigned long)&_stext >= (unsigned long)start) && |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
116 ((unsigned long)&_stext < (unsigned long)end)) || |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
117 (((unsigned long)&_etext >= (unsigned long)start) && |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
118 ((unsigned long)&_etext < (unsigned long)end))); |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
diff
changeset
|
119 } |
