annotate packages/io/flash/current/doc/flash.sgml @ 1722:c4240af0fa28

* removed the functions cyg_flash_get_limits and cyg_flash_get_block_info. Reimplemented the legacy functions that depended on them and flashiodev.c
author asl
date Sat, 21 Aug 2004 13:47:55 +0000
parents 3845779eca10
children 172edf8a96d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
1 <!-- {{{ Banner -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
2
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
3 <!-- =============================================================== -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
4 <!-- -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
5 <!-- flash.sgml -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
6 <!-- -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
7 <!-- eCos FLASH support -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
8 <!-- -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
9 <!-- =============================================================== -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
10 <!-- ####COPYRIGHTBEGIN#### -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
11 <!-- -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
12 <!-- =============================================================== -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
13 <!-- Copyright (C) 2004 Andrew Lunn -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
14 <!-- This material may be distributed only subject to the terms -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
15 <!-- and conditions set forth in the Open Publication License, v1.0 -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
16 <!-- or later (the latest version is presently available at -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
17 <!-- http://www.opencontent.org/openpub/) -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
18 <!-- Distribution of the work or derivative of the work in any -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
19 <!-- standard (paper) book form is prohibited unless prior -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
20 <!-- permission obtained from the copyright holder -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
21 <!-- =============================================================== -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
22 <!-- -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
23 <!-- ####COPYRIGHTEND#### -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
24 <!-- =============================================================== -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
25 <!-- #####DESCRIPTIONBEGIN#### -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
26 <!-- -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
27 <!-- ####DESCRIPTIONEND#### -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
28 <!-- =============================================================== -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
29
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
30 <!-- }}} -->
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
31
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
32 <PART id="io-flash">
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
33 <TITLE>FLASH Library</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
34 <CHAPTER id="ecos-flash-library">
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
35 <TITLE>The eCos FLASH Library</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
36 <PARA>The FLASH library is an optional part of eCos, and is only
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
37 applicable to some platforms.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
38 <PARA>The eCos FLASH library provides the following functionality:</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
39
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
40 <orderedlist>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
41 <listitem><PARA>Identifying installed device of a FLASH family.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
42 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
43 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
44 <listitem><PARA>Read, erasing and writing to FLASH blocks.</PARA></listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
45 <listitem><PARA>Validating an address is within the FLASH.</PARA></listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
46 <listitem><PARA>Determining the number and size of FLASH blocks.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
47 <PARA></listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
48 </orderedlist>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
49
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
50 <PARA> There are two APIs with the flash library. The old API is
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
51 retained for backwards compatibility reasons, but should slowly be
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
52 replaced with the new API which is much more flexible and does not
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
53 pollute the name space as much.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
54 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
55
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
56 <SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
57 <TITLE>Notes on using the FLASH library</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
58
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
59 <PARA>FLASH devices cannot be read from when an erase or write
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
60 operation is active. This means it is not possible to execute code
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
61 from flash while an erase or write operation is active. It is possible
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
62 to use the library when the executable image is resident in FLASH. The
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
63 low level drivers are written such that the linker places the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
64 functions that actually manipulate the flash into RAM. However the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
65 library may not be interrupt safe. An interrupt must not cause
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
66 execution of code that is resident in FLASH. This may be the image
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
67 itself, or RedBoot. In some configurations of eCos, ^C on the serial
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
68 port or debugging via Ethernet may cause an interrupt handler to call
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
69 RedBoot. If RedBoot is resident in FLASH this will cause a crash.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
70 Similarly, if another thread invokes a virtual vector function to
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
71 access RedBoot, eg to perform a <FUNCTION>diag_printf()</FUNCTION> a
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
72 crash could result.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
73 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
74
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
75 <PARA> Thus with a ROM based image or a ROM based Redboot it is
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
76 recommended to disable interrupts while erasing or programming
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
77 flash. Using both a ROMRAM or RAM images and a ROMRAM or RAM RedBoot
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
78 are safe and there is no need to disable interrupts. Similarly,
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
79 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
80 </SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
81
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
82 <SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
83 <TITLE>Danger, Will Robinson! Danger!</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
84
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
85 <PARA>Unlike nearly every other aspect of embedded system programming,
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
86 getting it wrong with FLASH devices can render your target system
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
87 useless. Most targets have a boot loader in the FLASH. Without this
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
88 boot loader the target will obviously not boot. So before starting to
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
89 play with this library its worth investigating a few things. How do
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
90 you recover your target if you delete the boot loader? Do you have the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
91 necessary JTAG cable? Or is specialist hardware needed? Is it even
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
92 possible to recover the target boards or must it be thrown into the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
93 rubbish bin? How does killing the board affect your project schedule?
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
94 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
95
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
96 </SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
97 </CHAPTER>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
98
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
99 <CHAPTER id="ecos-flash-v2">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
100 <TITLE>The Version 2 eCos FLASH API</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
101
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
102 <PARA> There are two APIs described here. The first is the application
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
103 API which programs should use. The second API is that between the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
104 FLASH IO library and the device drivers. </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
105
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
106 <SECT1 id="ecos-flash-v2-api">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
107 <TITLE>FLASH user API</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
108 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
109
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
110 <PARA>All of the functions described below are declared in the header
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
111 file <filename>&lt;cyg/io/flash.h.h&gt;</filename> which all users of
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
112 the FLASH library should include.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
113
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
114 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
115 <TITLE>Initializing the FLASH library</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
116
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
117 <PARA>The FLASH library needs to be initialized before other FLASH
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
118 operations can be performed. This only needs to be done once. The
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
119 following function will only do the initialization once so it's safe
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
120 to call multiple times: </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
121
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
122 <PROGRAMLISTING>__externC int cyg_flash_init(const cyg_flash_printf *pf);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
123 typedef int cyg_flash__printf(const char *fmt, ...); </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
124
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
125 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
126 The parameter <parameter>pf</parameter> is a pointer to a function
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
127 which is to be used for diagnostic output. Typically the function
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
128 <function>diag_printf()</function> will be passed. Normally this
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
129 function is not used by the higher layer of the library unless
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
130 <literal>CYGSEM_IO_FLASH_CHATTER</literal> is enabled. Passing a
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
131 <parameter>NULL</parameter> is not recommended, even when
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
132 CYGSEM_IO_FLASH_CHATTER is disabled. The lower layers of the library
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
133 may unconditionally call this function, especially when errors occur,
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
134 probably resulting in a more serious error/crash!.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
135 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
136
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
137 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
138 <TITLE>Retrieving information about FLASH devices</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
139
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
140 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
141 The following five functions return information about the FLASH.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
142 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
143
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
144 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
145 __externC int cyg_flash_get_info(cyg_uint32 devno, cyg_flash_info_t * info);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
146 __externC int cyg_flash_get_info_addr(cyg_flashaddr_t flash_base, cyg_flash_info_t * info);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
147 __externC int cyg_flash_verify_addr(const flashaddr_t address);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
148 __externC int cyg_flash_code_overlaps(const flashaddr_t start, const flashaddr_t end);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
149 __extern size_t cyg_flash_block_size(const cyg_flashaddr_t flash_base);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
150
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
151 typedef struct cyg_block_info
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
152 size_t block_size;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
153 cyg_unit32 blocks;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
154 } cyg_block_info_t;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
155
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
156 typedef struct {
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
157 flashaddr_t start; // First address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
158 flashaddr_t end; // Last address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
159 cyg_uint32 num_block_infos // Number of entries
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
160 cyg_block_info_t *blocks_info; // Info about one block size
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
161 } cyg_flash_info_t;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
162 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
163
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
164 <PARA><FUNCTION>cyg_flash_get_info()</FUNCTION> is the main function
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
165 to get information about installed flash devices. Parameter
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
166 <PARAMETER>devno</PARAMETER> is used to iterate over the available
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
167 flash devices, starting from 0. If the devno'th device exists, the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
168 structure pointed to by <PARAMETER>info</PARAMETER> is filled in and
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
169 <LITERAL>CYG_FLASH_ERR_OK</LITERAL> is returned, otherwise
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
170 <LITERAL>CYG_FLASH_ERR_INVALID</LITERAL>.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
171 <FUNCTION>cyg_flash_get_info()</FUNCTION> if similar, but returns the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
172 information about the flash device at the given address.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
173 <FUNCTION>cyg_flash_block_size()</FUNCTION> returns the size of the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
174 block at the given address. <FUNCTION>cyg_flash_verify_addr()
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
175 </FUNCTION> tests if the target addresses is within one of the FLASH
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
176 devices, returning <LITERAL>CYG_FLASH_ERR_OK </LITERAL> if so.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
177 <FUNCTION> cyg_flash_code_overlaps() </FUNCTION> checks if the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
178 executing code is resident in the section of flash indicated by
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
179 <PARAMETER>start</PARAMETER> and <PARAMETER> end </PARAMETER>. If
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
180 this function returns <LITERAL>CYG_FLASH_ERR_OK</LITERAL> the code is
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
181 inside the address refion given. Erase and program operations within
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
182 this range are very likely to cause the target to crash and burn
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
183 horribly. Note the FLASH library does allow you to shoot yourself in
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
184 the foot in this way.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
185 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
186 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
187
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
188 <TITLE>Reading from FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
189
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
190 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
191 There are two methods for reading from FLASH. The first is to use the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
192 following function. </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
193
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
194 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
195 __externC int cyg_flash_read(flashaddr_t *flash_base, const void *ram_base, const size_t len, flashaddr_t **err_address);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
196 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
197
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
198 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
199 <PARAMETER>flash_base</PARAMETER> is where in the flash to read
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
200 from. <PARAMETER>ram_base</PARAMETER> indicates where the data read
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
201 from flash should be placed into RAM. <PARAMETER>len</PARAMETER> is
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
202 the number of bytes to be read from the FLASH and
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
203 <PARAMETER>err_address</PARAMETER> is used to return the location in
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
204 FLASH that any error occurred while reading.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
205 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
206
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
207 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
208 The second method is to simply <FUNCTION>memcpy()</FUNCTION> directly
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
209 from the FLASH. This is not recommended since some types of device
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
210 cannot be read in this way, eg NAND FLASH. Using the FLASH library
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
211 function to read the FLASH will always work so making it easy to port
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
212 code from one FLASH device to another.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
213 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
214
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
215 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
216 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
217
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
218 <TITLE>Erasing areas of FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
219
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
220 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
221 Blocks of FLASH can be erased using the following function:
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
222 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
223
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
224 <PROGRAMLISTING>__externC int cyg_flash_erase(flashaddr_t *flash_base, const size_t len, flashaddr_t **err_address);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
225 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
226
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
227 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
228 <PARAMETER>flash_base</PARAMETER> is where in the flash to erase
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
229 from. <PARAMETER>len</PARAMETER> is the minimum number of bytes to
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
230 erase in the FLASH and <PARAMETER>err_address</PARAMETER> is used to
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
231 return the location in FLASH that any error occurred while erasing. It
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
232 should be noted that FLASH devices are block oriented when erasing. It
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
233 is not possible to erase a few bytes within a block, the whole block
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
234 will be erased. <PARAMETER>flash_base</PARAMETER> may be anywhere
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
235 within the first block to be erased and <PARAMETER>flash_base+len
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
236 </PARAMETER> maybe anywhere in the last block to be erased. </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
237
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
238 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
239 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
240
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
241 <TITLE>Programming the FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
242
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
243 <PARA> Programming of the flash is achieved using the following
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
244 function.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
245
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
246 <PROGRAMLISTING>__externC int cyg_flash_program(const flashaddr_t *flash_base, void *ram_base, const size_t len, flashaddr_t **err_address);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
247 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
248
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
249 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
250 <PARAMETER>flash_base</PARAMETER> is where in the flash to program
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
251 from. <PARAMETER>ram_base</PARAMETER> indicates where the data to be
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
252 programmed into FLASH should be read from in RAM. <PARAMETER>len
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
253 </PARAMETER> is the number of bytes to be program into the FLASH and
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
254 <PARAMETER>err_address</PARAMETER> is used to return the location in
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
255 FLASH that any error occurred while programming. </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
256
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
257 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
258 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
259
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
260 <TITLE>Locking and unlocking blocks</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
261
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
262 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
263 Some flash devices have the ability to lock and unlock blocks. A
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
264 locked block cannot be erased or programmed without it first being
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
265 unlocked. For devices which support this feature and when <LITERAL>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
266 CYGHWR_IO_FLASH_BLOCK_LOCKING</LITERAL> is enabled then the following
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
267 two functions are available:</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
268
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
269 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
270 __externC int cyg_flash_lock(const flashaddr_t *flash_base, const size_t len, flashaddr_t **err_address);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
271 __externC int cyg_flash_unlock(const flashaddr_t *flash_base, const size_t len, flashaddr_t **err_address);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
272 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
273
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
274 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
275
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
276 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
277 <TITLE>Locking FLASH Mutex's</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
278
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
279 <PARA>When the eCos kernel package is included in the eCos
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
280 configuration, the FLASH IO library will perform mutex locking on
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
281 FLASH operations. This makes the API defined here thread safe. However
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
282 applications may wish to directly access the contents of the FLASH. In
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
283 order for this to be thread safe it is necessary for the application
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
284 to use the following two functions to inform the FLASH IO library that
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
285 the FLASH devices are being used and other API calls should be
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
286 blocked.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
287
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
288 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
289 __externC int cyg_flash_mutex_lock(const flashaddr_t *from, const size_t len);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
290 __externC int cyg_flash_mutex_unlock(const flashaddr_t *from, const size_t len);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
291 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
292
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
293 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
294
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
295 <TITLE>Return values and errors</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
296
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
297 <PARA>All the functions above, except <FUNCTION>cyg_flash_code_overlaps()
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
298 </FUNCTION> return one of the following return values.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
299
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
300 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
301 CYG_FLASH_ERR_OK No error - operation complete
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
302 CYG_FLASH_ERR_INVALID Invalid FLASH address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
303 CYG_FLASH_ERR_ERASE Error trying to erase
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
304 CYG_FLASH_ERR_LOCK Error trying to lock/unlock
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
305 CYG_FLASH_ERR_PROGRAM Error trying to program
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
306 CYG_FLASH_ERR_PROTOCOL Generic error
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
307 CYG_FLASH_ERR_PROTECT Device/region is write-protected
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
308 CYG_FLASH_ERR_NOT_INIT FLASH info not yet initialized
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
309 CYG_FLASH_ERR_HWR Hardware (configuration?) problem
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
310 CYG_FLASH_ERR_ERASE_SUSPEND Device is in erase suspend mode
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
311 CYG_FLASH_ERR_PROGRAM_SUSPEND Device is in program suspend mode
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
312 CYG_FLASH_ERR_DRV_VERIFY Driver failed to verify data
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
313 CYG_FLASH_ERR_DRV_TIMEOUT Driver timed out waiting for device
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
314 CYG_FLASH_ERR_DRV_WRONG_PART Driver does not support device
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
315 CYG_FLASH_ERR_LOW_VOLTAGE Not enough juice to complete job
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
316 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
317
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
318 <PARA>To turn an error code into a human readable string the following
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
319 function can be used:</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
320
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
321 <PROGRAMLISTING>__externC const char *cyg_flash_errmsg(const int err);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
322 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
323 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
324
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
325 <SECT1 id="ecos-flash-v2-dev">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
326 <TITLE>FLASH device API</TITLE> <PARA>This section describes the API
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
327 between the FLASH IO library the FLASH device drivers.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
328
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
329 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
330 <TITLE>The FLASH device Structure</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
331
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
332 <PARA>This structure keeps all the information about a single driver.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
333
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
334 <PROGRAMLISTING>struct cyg_flash_dev {
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
335 struct cyg_flash_dev_funs *funs; // Function pointers
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
336 flashaddr_t *start; // First address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
337 flashaddr_t *end; // Last address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
338 void *priv; // Devices private data
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
339 cyg_uint32 num_block_infos; // Number of entries
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
340 cyg_block_info_t *blocks_info; // Info about one block size
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
341
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
342
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
343 // The following are only written to by the FLASH IO layer.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
344 cyg_flash_printf *pf; // Pointer to diagnostic printf
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
345 cyg_bool init; // Device has been initialized
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
346 #ifdef CYG_KERNEL
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
347 cyg_mutex_t mutex; // Mutex for thread safeness
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
348 #endif
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
349 struct cyg_flash_dev *next; // Pointer to next device
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
350 }
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
351
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
352 struct cyg_flash_dev_funs {
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
353 int (*flash_init) (struct cyg_flash_dev *dev);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
354 size_t (*flash_query) (struct cyg_flash_dev *dev, void * data, const size_t len);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
355 int (*flash_erase_block) (struct cyg_flash_dev *dev, const flashaddr_t *block_base);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
356 int (*flash_program) (struct cyg_flash_dev *dev, flashaddr_t *base, const void* data, const size_t len);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
357 int (*flash_read) (struct cyg_flash_dev *dev, const flashaddr_t *base, void* data, const size_t len);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
358 int (*flash_hwr_map_error) (struct cyg_flash_dev *dev, int err);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
359 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
360 int (*flash_block_lock) (struct cyg_flash_dev *dev, const flashaddr_t *block_base);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
361 int (*flash_block_unlock) (struct cyg_flash_dev *dev, const flashaddr_t *block_base);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
362 #endif
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
363 }
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
364 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
365
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
366 <PARA>The FLASH IO layer will only pass requests for operations on a single block.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
367 </SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
368 </CHAPTER>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
369
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
370 <CHAPTER id="ecos-flash-v1">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
371 <TITLE>The legacy Version 1 eCos FLASH API</TITLE>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
372 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
373 The library has a number of limitations:</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
374
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
375 <orderedlist>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
376 <listitem><PARA>Only one family of FLASH device may be supported at once.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
377 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
378 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
379 <listitem><PARA>Multiple devices of one family are supported, but they must
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
380 be contiguous in memory.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
381 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
382 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
383 <listitem><PARA>The library is not thread or interrupt safe under
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
384 some conditions.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
385 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
386 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
387 <listitem><PARA>The library currently does not use the eCos naming
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
388 convention for its functions. This may change in the
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
389 future but backward compatibility is likely to be kept.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
390 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
391 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
392 </orderedlist>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
393
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
394 <PARA> There are two APIs described here. The first is the application
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
395 API which programs should use. The second API is that between the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
396 FLASH io library and the device drivers. </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
397
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
398 <SECT1 id="ecos-flash-v1-api">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
399 <TITLE>FLASH user API</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
400
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
401 <PARA>All of the functions described below are declared in the header
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
402 file <filename>&lt;cyg/io/flash.h.h&gt;</filename> which all users of
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
403 the FLASH library should include.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
404
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
405
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
406 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
407 <TITLE>Initializing the FLASH library</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
408
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
409 <PARA>The FLASH library needs to be initialized before other FLASH
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
410 operations can be performed. This only needs to be done once. The
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
411 following function will only do the initialization once so it's safe
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
412 to call multiple times: </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
413
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
414 <PROGRAMLISTING>externC int flash_init( _printf *pf );
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
415 typedef int _printf(const char *fmt, ...); </PROGRAMLISTING>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
416
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
417 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
418 The parameter <parameter>pf</parameter> is a pointer to a function
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
419 which is to be used for diagnostic output. Typically the function
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
420 <function>diag_printf()</function> will be passed. Normally this
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
421 function is not used by the higher layer of the library unless
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
422 <literal>CYGSEM_IO_FLASH_CHATTER</literal> is enabled. Passing a
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
423 <parameter>NULL</parameter> is not recommended, even when
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
424 CYGSEM_IO_FLASH_CHATTER is disabled. The lower layers of the library
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
425 may unconditionally call this function, especially when errors occur,
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
426 probably resulting in a more serious error/crash!.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
427 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
428
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
429 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
430 <TITLE>Retrieving information about the FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
431
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
432 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
433 The following four functions return information about the FLASH.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
434 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
435
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
436 <PROGRAMLISTING>externC int flash_get_block_info(int *block_size, int *blocks);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
437 externC int flash_get_limits(void *target, void **start, void **end);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
438 externC int flash_verify_addr(void *target);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
439 externC bool flash_code_overlaps(void *start, void *end);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
440 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
441
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
442 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
443 The function <FUNCTION>flash_get_block_info()</FUNCTION> returns the
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
444 size and number of blocks. When the device has a mixture of block
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
445 sizes, the size of the "normal" block will be returned. Please read
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
446 the source code to determine exactly what this means.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
447 <FUNCTION>flash_get_limits()</FUNCTION> returns the lower and upper
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
448 memory address the FLASH occupies. The <PARAMETER>target</PARAMETER>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
449 parameter is current unused. <FUNCTION> flash_verify_addr()
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
450 </FUNCTION> tests if the target addresses is within the flash,
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
451 returning <LITERAL>FLASH_ERR_OK</LITERAL> if so. Lastly, <FUNCTION>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
452 flash_code_overlaps() </FUNCTION> checks if the executing code is
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
453 resident in the section of flash indicated by
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
454 <PARAMETER>start</PARAMETER> and <PARAMETER> end</PARAMETER>. If this
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
455 function returns true, erase and program operations within this range
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
456 are very likely to cause the target to crash and burn horribly. Note
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
457 the FLASH library does allow you to shoot yourself in the foot in this
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
458 way.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
459
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
460 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
461 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
462
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
463 <TITLE>Reading from FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
464
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
465 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
466 There are two methods for reading from FLASH. The first is to use the
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
467 following function. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
468
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
469 <PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
470 externC int flash_read(void *flash_base, void *ram_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
471 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
472
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
473 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
474 <PARAMETER>flash_base</PARAMETER> is where in the flash to read
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
475 from. <PARAMETER>ram_base</PARAMETER> indicates where the data read
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
476 from flash should be placed into RAM. <PARAMETER>len</PARAMETER> is
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
477 the number of bytes to be read from the FLASH and
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
478 <PARAMETER>err_address</PARAMETER> is used to return the location in
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
479 FLASH that any error occurred while reading.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
480 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
481
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
482 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
483 The second method is to simply <FUNCTION>memcpy()</FUNCTION> directly
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
484 from the FLASH. This is not recommended since some types of device
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
485 cannot be read in this way, eg NAND FLASH. Using the FLASH library
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
486 function to read the FLASH will always work so making it easy to port
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
487 code from one FLASH device to another.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
488 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
489
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
490 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
491 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
492
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
493 <TITLE>Erasing areas of FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
494
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
495 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
496 Blocks of FLASH can be erased using the following function:
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
497 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
498
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
499 <PROGRAMLISTING>externC int flash_erase(void *flash_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
500 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
501
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
502 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
503 <PARAMETER>flash_base</PARAMETER> is where in the flash to erase
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
504 from. <PARAMETER>len</PARAMETER> is the minimum number of bytes to
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
505 erase in the FLASH and <PARAMETER>err_address</PARAMETER> is used to
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
506 return the location in FLASH that any error occurred while erasing. It
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
507 should be noted that FLASH devices are block oriented when erasing. It
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
508 is not possible to erase a few bytes within a block, the whole block
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
509 will be erased. <PARAMETER>flash_base</PARAMETER> may be anywhere
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
510 within the first block to be erased and <PARAMETER>flash_base+len
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
511 </PARAMETER> maybe anywhere in the last block to be erased. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
512
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
513 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
514 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
515
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
516 <TITLE>Programming the FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
517
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
518 <PARA> Programming of the flash is achieved using the following
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
519 function.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
520
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
521 <PROGRAMLISTING>externC int flash_program(void *flash_base, void *ram_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
522 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
523
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
524 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
525 <PARAMETER>flash_base</PARAMETER> is where in the flash to program
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
526 from. <PARAMETER>ram_base</PARAMETER> indicates where the data to be
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
527 programmed into FLASH should be read from in RAM. <PARAMETER>len
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
528 </PARAMETER> is the number of bytes to be program into the FLASH and
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
529 <PARAMETER>err_address</PARAMETER> is used to return the location in
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
530 FLASH that any error occurred while programming. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
531
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
532 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
533 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
534
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
535 <TITLE>Locking and unlocking blocks</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
536
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
537 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
538 Some flash devices have the ability to lock and unlock blocks. A
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
539 locked block cannot be erased or programmed without it first being
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
540 unlocked. For devices which support this feature and when <LITERAL>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
541 CYGHWR_IO_FLASH_BLOCK_LOCKING</LITERAL> is enabled then the following
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
542 two functions are available:</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
543
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
544 <PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
545 externC int flash_lock(void *flash_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
546 externC int flash_unlock(void *flash_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
547 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
548
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
549 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
550 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
551
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
552 <TITLE>Return values and errors</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
553
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
554 <PARA>All the functions above, except <FUNCTION>flash_code_overlaps()
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
555 </FUNCTION> return one of the following return values.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
556
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
557 <PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
558 FLASH_ERR_OK No error - operation complete
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
559 FLASH_ERR_INVALID Invalid FLASH address
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
560 FLASH_ERR_ERASE Error trying to erase
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
561 FLASH_ERR_LOCK Error trying to lock/unlock
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
562 FLASH_ERR_PROGRAM Error trying to program
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
563 FLASH_ERR_PROTOCOL Generic error
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
564 FLASH_ERR_PROTECT Device/region is write-protected
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
565 FLASH_ERR_NOT_INIT FLASH info not yet initialized
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
566 FLASH_ERR_HWR Hardware (configuration?) problem
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
567 FLASH_ERR_ERASE_SUSPEND Device is in erase suspend mode
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
568 FLASH_ERR_PROGRAM_SUSPEND Device is in program suspend mode
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
569 FLASH_ERR_DRV_VERIFY Driver failed to verify data
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
570 FLASH_ERR_DRV_TIMEOUT Driver timed out waiting for device
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
571 FLASH_ERR_DRV_WRONG_PART Driver does not support device
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
572 FLASH_ERR_LOW_VOLTAGE Not enough juice to complete job
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
573 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
574
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
575 <PARA>To turn an error code into a human readable string the following
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
576 function can be used:</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
577
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
578 <PROGRAMLISTING>externC char *flash_errmsg(int err);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
579 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
580 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
581
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
582 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
583
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
584 <TITLE> Notes on using the FLASH library</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
585
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
586 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
587 The FLASH library evolved from the needs and environment of RedBoot
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
588 rather than being a general purpose eCos component. This history
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
589 explains some of the problems with the library. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
590
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
591 <PARA>The library is not thread safe. Multiple simultaneous calls to
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
592 its library functions will likely fail and may cause a crash. It is
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
593 the callers responsibility to use the necessary mutex's if needed.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
594 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
595
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
596 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
597 </SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
598
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
599 <SECT1 id="ecos-flash-v1-dev">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
600 <TITLE>FLASH device API</TITLE> <PARA>This section describes the API
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
601 between the FLASH IO library the FLASH device drivers.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
602
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
603 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
604 <TITLE>The flash_info structure</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
605
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
606 <PARA> The <parameter>flash_info</parameter>structure is used by both
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
607 the FLASH IO library and the device driver.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
608 <PROGRAMLISTING>struct flash_info {
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
609 int block_size; // Assuming fixed size "blocks"
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
610 int blocks; // Number of blocks
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
611 int buffer_size; // Size of write buffer (only defined for some devices)
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
612 unsigned long block_mask;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
613 void *start, *end; // Address range
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
614 int init; // FLASH API initialised
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
615 _printf *pf; // printf like function for diagnostics
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
616 };
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
617 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
618
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
619 <PARA>block_mask is used internally in the FLASH IO library. It
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
620 contains a mask which can be used to turn an arbitrary address in
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
621 flash to the base address of the block which contains the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
622 address.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
623
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
624 <PARA>There exists one global instance of this structure with the name
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
625 <parameter>flash_info</parameter>. All calls into the device driver
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
626 makes use of this global structure to maintain state.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
627
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
628 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
629
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
630 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
631 <TITLE>Initializing the device driver</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
632
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
633 <PARA>The FLASH IO library will call the following function to
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
634 initialize the device driver:</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
635
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
636 <PROGRAMLISTING>externC int flash_hwr_init(void);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
637 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
638
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
639 <PARA>The device driver should probe the hardware to see if the FLASH
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
640 devices exist. If it does it should fill in <parameter>start, end,
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
641 blocks and block_size.</parameter>If the FLASH contains a write buffer
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
642 the size of this should be placed in <parameter>buffer_size
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
643 </parameter>. On successful probing the function should return
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
644 <literal>FLASH_ERR_OK</literal>. When things go wrong it can be
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
645 assumed that <parameter>pf</parameter> points to a printf like
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
646 function for outputting error messages.
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
647 </PARA>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
648 </SECT2>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
649
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
650 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
651 <TITLE>Querying the FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
652
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
653 <PARA>FLASH devices can be queried to return there manufacture ID,
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
654 size etc. This function allows this information to be returned.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
655
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
656 <PROGRAMLISTING>int flash_query(unsigned char *data);</PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
657
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
658 <PARA>The caller must know the size of data to be returned and provide
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
659 an appropriately sized buffer pointed to be parameter
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
660 <parameter>data</parameter>. This function is generally used by
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
661 <function>flash_hwr_init()</function>.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
662
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
663 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
664 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
665 <TITLE>Erasing a block of FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
666
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
667 <PARA>So that the FLASH IO layer can erase a block of FLASH the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
668 following function should be provided.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
669
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
670 <PROGRAMLISTING>int flash_erase_block(volatile flash_t *block, unsigned int block_size);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
671 </PROGRAMLISTING>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
673 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
674 <SECT2>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
675 <TITLE>Programming a region of FLASH</TITLE>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
676
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
677 <PARA>The following function must be provided so that data can be
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
678 written into the FLASH.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
679
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
680 <PROGRAMLISTING>int flash_program_buf(volatile flash_t *addr, flash_t *data, int len,
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
681 unsigned long block_mask, int buffer_size);</PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
682
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
683 <PARA>The device will only be asked to program data in one block of
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
684 the flash. The FLASH IO layer will break longer user requests into a
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
685 smaller writes.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
686
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
687 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
688 <TITLE>Reading a region from FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
689
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
690 <PARA>Some FLASH devices are not memory mapped so it is not possible
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
691 to read there contents directly. The following function read a region
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
692 of FLASH.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
693
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
694 <PROGRAMLISTING>int flash_read_buf(volatile flash_t* addr, flash_t* data, int len);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
695 </PROGRAMLISTING>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
696
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
697 <PARA>As with writing to the flash, the FLASH IO layer will break
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
698 longer user requests for data into a number of reads which are at
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
699 maximum one block in size.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
700
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
701 <PARA>A device which cannot be read directy should set
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
702 <LITERAL>CYGSEM_IO_FLASH_READ_INDIRECT</LITERAL> so that the IO layer
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
703 makes use of the <function>flash_read_buf()</function>function.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
704
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
705 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
707 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
708 <TITLE>Locking and unlocking FLASH blocks</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
709
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
710 <PARA>Some flash devices allow blocks to be locked so that they cannot
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
711 be written to. The device driver should provide the following
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
712 functions to manipulate these locks.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
713
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
714 <PROGRAMLISTING>int flash_lock_block(volatile flash_t *block);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
715 int flash_unlock_block(volatile flash_t *block, int block_size, int blocks);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
716 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
717
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
718 <PARA>These functions are only used if
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
719 <LITERAL>CYGHWR_IO_FLASH_BLOCK_LOCKING</LITERAL></PARA>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
720
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
721 </SECT2>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
722
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
723 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
724 <TITLE>Mapping FLASH error codes to FLASH IO error codes</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
725
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
726 <PARA>The functions <function>flash_erase_block(),
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
727 flash_program_buf(), flash_read_buf(), flash_lock_block() and
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
728 flash_unlock_block()</function> return an error code which is specific
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
729 to the flash device. To map this into a FLASH IO error code, the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
730 driver should provide the following function: </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
731
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
732 <PROGRAMLISTING>int flash_hwr_map_error(int err);</PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
733
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
734 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
735
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
736 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
737 <TITLE>Determining if code is in FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
738
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
739 <PARA>Although a general function, the device driver is expected to
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
740 provide the implementation of the function
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
741 <function>flash_code_overlaps()</function>.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
742
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
743 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
744
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
745 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
746 <TITLE>Implementation Notes</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
747
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
748 <PARA>The FLASH IO layer will manipulate the caches as required. The
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
749 device drivers do not need to enable/disable caches when performing
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
750 operations of the FLASH.<PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
751
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
752 <PARA>Device drivers should keep all chatter to a minimum when
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
753 <literal>CYGSEM_IO_FLASH_CHATTER</literal> is not defined. All output
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
754 should use the print function in the <parameter>pf</parameter> in
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
755 <parameter>flash_info</parameter> and not
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
756 <function>diag_printf()</function></PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
757
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
758 <PARA>Device driver functions which manipulate the state of the flash
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
759 so that it cannot be read from for program execute need to ensure
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
760 there code is placed into RAM. The linker will do this if the
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
761 appropriate attribute is added to the function. e.g:</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
762
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
763 <PROGRAMLISTING>int flash_program_buf(volatile flash_t *addr, flash_t *data, int len,
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
764 unsigned long block_mask, int buffer_size)
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
765 __attribute__ ((section (".2ram.flash_program_buf")));</PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
766
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
767 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
768 </SECT1>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
769 </CHAPTER>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
770 </PART>