annotate packages/io/flash/current/doc/flash.sgml @ 1749:80232dbac7fb

Flash API clean-ups
author bartv
date Mon, 22 Nov 2004 12:05:55 +0000
parents 172edf8a96d8
children
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 __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
149
1749
80232dbac7fb Flash API clean-ups
bartv
parents: 1746
diff changeset
150 typedef struct cyg_flash_block_info
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
151 size_t block_size;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
152 cyg_unit32 blocks;
1749
80232dbac7fb Flash API clean-ups
bartv
parents: 1746
diff changeset
153 } cyg_flash_block_info_t;
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
154
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
155 typedef struct {
1749
80232dbac7fb Flash API clean-ups
bartv
parents: 1746
diff changeset
156 flashaddr_t start; // First address
80232dbac7fb Flash API clean-ups
bartv
parents: 1746
diff changeset
157 flashaddr_t end; // Last address
80232dbac7fb Flash API clean-ups
bartv
parents: 1746
diff changeset
158 cyg_uint32 num_block_infos // Number of entries
80232dbac7fb Flash API clean-ups
bartv
parents: 1746
diff changeset
159 const cyg_flash_block_info_t *blocks_info; // Info about one block size
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
160 } cyg_flash_info_t;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
161 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
162
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
163 <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
164 to get information about installed flash devices. Parameter
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
165 <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
166 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
167 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
168 <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
169 <LITERAL>CYG_FLASH_ERR_INVALID</LITERAL>.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
170 <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
171 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
172 <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
173 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
174 </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
175 devices, returning <LITERAL>CYG_FLASH_ERR_OK </LITERAL> if so.
1746
172edf8a96d8 Eliminate cyg_flash_code_overlaps()
bartv
parents: 1722
diff changeset
176 </PARA>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
177 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
178 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
179
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
180 <TITLE>Reading from FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
181
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
182 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
183 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
184 following function. </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
185
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
186 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
187 __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
188 </PROGRAMLISTING>
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 <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
192 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
193 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
194 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
195 <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
196 FLASH that any error occurred while reading.
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
197 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
198
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
199 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
200 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
201 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
202 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
203 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
204 code from one FLASH device to another.
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 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
208 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
209
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
210 <TITLE>Erasing areas of FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
211
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
212 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
213 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
214 </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
215
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
216 <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
217 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
218
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
219 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
220 <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
221 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
222 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
223 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
224 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
225 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
226 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
227 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
228 </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
229
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
230 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
231 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
232
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
233 <TITLE>Programming the FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
234
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
235 <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
236 function.</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 <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
239 </PROGRAMLISTING>
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 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
242 <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
243 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
244 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
245 </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
246 <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
247 FLASH that any error occurred while programming. </PARA>
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 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
250 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
251
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
252 <TITLE>Locking and unlocking blocks</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
253
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
254 <PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
255 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
256 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
257 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
258 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
259 two functions are available:</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
260
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
261 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
262 __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
263 __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
264 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
265
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
266 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
267
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
268 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
269 <TITLE>Locking FLASH Mutex's</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
270
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
271 <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
272 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
273 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
274 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
275 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
276 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
277 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
278 blocked.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
279
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
280 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
281 __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
282 __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
283 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
284
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
285 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
286
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
287 <TITLE>Return values and errors</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
288
1746
172edf8a96d8 Eliminate cyg_flash_code_overlaps()
bartv
parents: 1722
diff changeset
289 <PARA>All the functions above return one of the following return
172edf8a96d8 Eliminate cyg_flash_code_overlaps()
bartv
parents: 1722
diff changeset
290 values.</PARA>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
291
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
292 <PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
293 CYG_FLASH_ERR_OK No error - operation complete
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
294 CYG_FLASH_ERR_INVALID Invalid FLASH address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
295 CYG_FLASH_ERR_ERASE Error trying to erase
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
296 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
297 CYG_FLASH_ERR_PROGRAM Error trying to program
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
298 CYG_FLASH_ERR_PROTOCOL Generic error
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
299 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
300 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
301 CYG_FLASH_ERR_HWR Hardware (configuration?) problem
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
302 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
303 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
304 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
305 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
306 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
307 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
308 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
309
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
310 <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
311 function can be used:</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
312
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
313 <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
314 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
315 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
316
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
317 <SECT1 id="ecos-flash-v2-dev">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
318 <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
319 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
320
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
321 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
322 <TITLE>The FLASH device Structure</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
323
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
324 <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
325
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
326 <PROGRAMLISTING>struct cyg_flash_dev {
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
327 struct cyg_flash_dev_funs *funs; // Function pointers
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
328 flashaddr_t *start; // First address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
329 flashaddr_t *end; // Last address
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
330 void *priv; // Devices private data
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
331 cyg_uint32 num_block_infos; // Number of entries
1749
80232dbac7fb Flash API clean-ups
bartv
parents: 1746
diff changeset
332 cyg_flash_block_info_t *blocks_info; // Info about one block size
1706
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
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
335 // 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
336 cyg_flash_printf *pf; // Pointer to diagnostic printf
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
337 cyg_bool init; // Device has been initialized
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
338 #ifdef CYG_KERNEL
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
339 cyg_mutex_t mutex; // Mutex for thread safeness
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
340 #endif
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
341 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
342 }
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
343
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
344 struct cyg_flash_dev_funs {
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
345 int (*flash_init) (struct cyg_flash_dev *dev);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
346 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
347 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
348 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
349 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
350 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
351 #ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
352 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
353 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
354 #endif
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
355 }
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
356 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
357
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
358 <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
359 </SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
360 </CHAPTER>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
361
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
362 <CHAPTER id="ecos-flash-v1">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
363 <TITLE>The legacy Version 1 eCos FLASH API</TITLE>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
364 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
365 The library has a number of limitations:</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
366
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
367 <orderedlist>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
368 <listitem><PARA>Only one family of FLASH device may be supported at once.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
369 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
370 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
371 <listitem><PARA>Multiple devices of one family are supported, but they must
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
372 be contiguous in memory.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
373 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
374 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
375 <listitem><PARA>The library is not thread or interrupt safe under
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
376 some conditions.
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>The library currently does not use the eCos naming
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
380 convention for its functions. This may change in the
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
381 future but backward compatibility is likely to be kept.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
382 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
383 </listitem>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
384 </orderedlist>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
385
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
386 <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
387 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
388 FLASH io library and the device drivers. </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
389
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
390 <SECT1 id="ecos-flash-v1-api">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
391 <TITLE>FLASH user API</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
392
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
393 <PARA>All of the functions described below are declared in the header
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
394 file <filename>&lt;cyg/io/flash.h.h&gt;</filename> which all users of
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
395 the FLASH library should include.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
396
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
397
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
398 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
399 <TITLE>Initializing the FLASH library</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
400
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
401 <PARA>The FLASH library needs to be initialized before other FLASH
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
402 operations can be performed. This only needs to be done once. The
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
403 following function will only do the initialization once so it's safe
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
404 to call multiple times: </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
405
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
406 <PROGRAMLISTING>externC int flash_init( _printf *pf );
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
407 typedef int _printf(const char *fmt, ...); </PROGRAMLISTING>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
408
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
409 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
410 The parameter <parameter>pf</parameter> is a pointer to a function
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
411 which is to be used for diagnostic output. Typically the function
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
412 <function>diag_printf()</function> will be passed. Normally this
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
413 function is not used by the higher layer of the library unless
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
414 <literal>CYGSEM_IO_FLASH_CHATTER</literal> is enabled. Passing a
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
415 <parameter>NULL</parameter> is not recommended, even when
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
416 CYGSEM_IO_FLASH_CHATTER is disabled. The lower layers of the library
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
417 may unconditionally call this function, especially when errors occur,
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
418 probably resulting in a more serious error/crash!.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
419 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
420
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
421 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
422 <TITLE>Retrieving information about the FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
423
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
424 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
425 The following four functions return information about the FLASH.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
426 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
427
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
428 <PROGRAMLISTING>externC int flash_get_block_info(int *block_size, int *blocks);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
429 externC int flash_get_limits(void *target, void **start, void **end);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
430 externC int flash_verify_addr(void *target);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
431 externC bool flash_code_overlaps(void *start, void *end);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
432 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
433
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
434 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
435 The function <FUNCTION>flash_get_block_info()</FUNCTION> returns the
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
436 size and number of blocks. When the device has a mixture of block
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
437 sizes, the size of the "normal" block will be returned. Please read
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
438 the source code to determine exactly what this means.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
439 <FUNCTION>flash_get_limits()</FUNCTION> returns the lower and upper
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
440 memory address the FLASH occupies. The <PARAMETER>target</PARAMETER>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
441 parameter is current unused. <FUNCTION> flash_verify_addr()
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
442 </FUNCTION> tests if the target addresses is within the flash,
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
443 returning <LITERAL>FLASH_ERR_OK</LITERAL> if so. Lastly, <FUNCTION>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
444 flash_code_overlaps() </FUNCTION> checks if the executing code is
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
445 resident in the section of flash indicated by
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
446 <PARAMETER>start</PARAMETER> and <PARAMETER> end</PARAMETER>. If this
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
447 function returns true, erase and program operations within this range
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
448 are very likely to cause the target to crash and burn horribly. Note
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
449 the FLASH library does allow you to shoot yourself in the foot in this
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
450 way.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
451
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
452 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
453 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
454
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
455 <TITLE>Reading from FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
456
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
457 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
458 There are two methods for reading from FLASH. The first is to use the
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
459 following function. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
460
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
461 <PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
462 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
463 </PROGRAMLISTING>
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 <PARAMETER>flash_base</PARAMETER> is where in the flash to read
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
467 from. <PARAMETER>ram_base</PARAMETER> indicates where the data read
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
468 from flash should be placed into RAM. <PARAMETER>len</PARAMETER> is
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
469 the number of bytes to be read from the FLASH and
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
470 <PARAMETER>err_address</PARAMETER> is used to return the location in
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
471 FLASH that any error occurred while reading.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
472 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
473
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
474 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
475 The second method is to simply <FUNCTION>memcpy()</FUNCTION> directly
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
476 from the FLASH. This is not recommended since some types of device
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
477 cannot be read in this way, eg NAND FLASH. Using the FLASH library
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
478 function to read the FLASH will always work so making it easy to port
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
479 code from one FLASH device to another.
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 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
483 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
484
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
485 <TITLE>Erasing areas of FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
486
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
487 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
488 Blocks of FLASH can be erased using the following function:
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
489 </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
490
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
491 <PROGRAMLISTING>externC int flash_erase(void *flash_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
492 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
493
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
494 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
495 <PARAMETER>flash_base</PARAMETER> is where in the flash to erase
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
496 from. <PARAMETER>len</PARAMETER> is the minimum number of bytes to
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
497 erase in the FLASH and <PARAMETER>err_address</PARAMETER> is used to
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
498 return the location in FLASH that any error occurred while erasing. It
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
499 should be noted that FLASH devices are block oriented when erasing. It
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
500 is not possible to erase a few bytes within a block, the whole block
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
501 will be erased. <PARAMETER>flash_base</PARAMETER> may be anywhere
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
502 within the first block to be erased and <PARAMETER>flash_base+len
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
503 </PARAMETER> maybe anywhere in the last block to be erased. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
504
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
505 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
506 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
507
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
508 <TITLE>Programming the FLASH</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
509
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
510 <PARA> Programming of the flash is achieved using the following
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
511 function.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
512
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
513 <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
514 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
515
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
516 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
517 <PARAMETER>flash_base</PARAMETER> is where in the flash to program
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
518 from. <PARAMETER>ram_base</PARAMETER> indicates where the data to be
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
519 programmed into FLASH should be read from in RAM. <PARAMETER>len
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
520 </PARAMETER> is the number of bytes to be program into the FLASH and
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
521 <PARAMETER>err_address</PARAMETER> is used to return the location in
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
522 FLASH that any error occurred while programming. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
523
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
524 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
525 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
526
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
527 <TITLE>Locking and unlocking blocks</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
528
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
529 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
530 Some flash devices have the ability to lock and unlock blocks. A
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
531 locked block cannot be erased or programmed without it first being
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
532 unlocked. For devices which support this feature and when <LITERAL>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
533 CYGHWR_IO_FLASH_BLOCK_LOCKING</LITERAL> is enabled then the following
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
534 two functions are available:</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
535
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
536 <PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
537 externC int flash_lock(void *flash_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
538 externC int flash_unlock(void *flash_base, int len, void **err_address);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
539 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
540
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
541 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
542 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
543
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
544 <TITLE>Return values and errors</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
545
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
546 <PARA>All the functions above, except <FUNCTION>flash_code_overlaps()
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
547 </FUNCTION> return one of the following return values.</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
548
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
549 <PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
550 FLASH_ERR_OK No error - operation complete
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
551 FLASH_ERR_INVALID Invalid FLASH address
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
552 FLASH_ERR_ERASE Error trying to erase
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
553 FLASH_ERR_LOCK Error trying to lock/unlock
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
554 FLASH_ERR_PROGRAM Error trying to program
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
555 FLASH_ERR_PROTOCOL Generic error
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
556 FLASH_ERR_PROTECT Device/region is write-protected
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
557 FLASH_ERR_NOT_INIT FLASH info not yet initialized
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
558 FLASH_ERR_HWR Hardware (configuration?) problem
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
559 FLASH_ERR_ERASE_SUSPEND Device is in erase suspend mode
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
560 FLASH_ERR_PROGRAM_SUSPEND Device is in program suspend mode
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
561 FLASH_ERR_DRV_VERIFY Driver failed to verify data
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
562 FLASH_ERR_DRV_TIMEOUT Driver timed out waiting for device
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
563 FLASH_ERR_DRV_WRONG_PART Driver does not support device
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
564 FLASH_ERR_LOW_VOLTAGE Not enough juice to complete job
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
565 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
566
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
567 <PARA>To turn an error code into a human readable string the following
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
568 function can be used:</PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
569
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
570 <PROGRAMLISTING>externC char *flash_errmsg(int err);
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
571 </PROGRAMLISTING>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
572 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
573
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
574 <SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
575
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
576 <TITLE> Notes on using the FLASH library</TITLE>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
577
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
578 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
579 The FLASH library evolved from the needs and environment of RedBoot
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
580 rather than being a general purpose eCos component. This history
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
581 explains some of the problems with the library. </PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
582
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
583 <PARA>The library is not thread safe. Multiple simultaneous calls to
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
584 its library functions will likely fail and may cause a crash. It is
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
585 the callers responsibility to use the necessary mutex's if needed.
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
586 <PARA>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
587
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
588 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
589 </SECT1>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
590
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
591 <SECT1 id="ecos-flash-v1-dev">
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
592 <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
593 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
594
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
595 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
596 <TITLE>The flash_info structure</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
597
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
598 <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
599 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
600 <PROGRAMLISTING>struct flash_info {
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
601 int block_size; // Assuming fixed size "blocks"
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
602 int blocks; // Number of blocks
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
603 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
604 unsigned long block_mask;
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
605 void *start, *end; // Address range
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
606 int init; // FLASH API initialised
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
607 _printf *pf; // printf like function for diagnostics
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
608 };
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
609 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
610
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
611 <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
612 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
613 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
614 address.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
615
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
616 <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
617 <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
618 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
619
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
620 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
621
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
622 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
623 <TITLE>Initializing the device driver</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
624
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
625 <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
626 initialize the device driver:</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 <PROGRAMLISTING>externC int flash_hwr_init(void);
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
629 </PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
630
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
631 <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
632 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
633 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
634 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
635 </parameter>. On successful probing the function should return
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
636 <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
637 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
638 function for outputting error messages.
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
639 </PARA>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
640 </SECT2>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
641
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
642 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
643 <TITLE>Querying the FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
644
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
645 <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
646 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
647
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
648 <PROGRAMLISTING>int flash_query(unsigned char *data);</PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
649
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
650 <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
651 an appropriately sized buffer pointed to be parameter
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
652 <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
653 <function>flash_hwr_init()</function>.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
654
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
655 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
656 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
657 <TITLE>Erasing a block of FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
658
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
659 <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
660 following function should be provided.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
661
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
662 <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
663 </PROGRAMLISTING>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
664
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
665 </SECT2>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
666 <SECT2>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
667 <TITLE>Programming a region of FLASH</TITLE>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
668
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
669 <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
670 written into the FLASH.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
671
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
672 <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
673 unsigned long block_mask, int buffer_size);</PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
674
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
675 <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
676 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
677 smaller writes.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
678
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
679 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
680 <TITLE>Reading a region from FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
681
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
682 <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
683 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
684 of FLASH.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
685
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
686 <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
687 </PROGRAMLISTING>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
688
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
689 <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
690 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
691 maximum one block in size.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
692
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
693 <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
694 <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
695 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
696
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
697 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
698
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
699 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
700 <TITLE>Locking and unlocking FLASH blocks</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
701
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
702 <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
703 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
704 functions to manipulate these locks.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
705
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
706 <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
707 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
708 </PROGRAMLISTING>
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>These functions are only used if
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
711 <LITERAL>CYGHWR_IO_FLASH_BLOCK_LOCKING</LITERAL></PARA>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
712
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
713 </SECT2>
1706
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
714
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
715 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
716 <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
717
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
718 <PARA>The functions <function>flash_erase_block(),
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
719 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
720 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
721 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
722 driver should provide the following function: </PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
723
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
724 <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
725
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
726 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
727
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
728 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
729 <TITLE>Determining if code is in FLASH</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
730
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
731 <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
732 provide the implementation of the function
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
733 <function>flash_code_overlaps()</function>.</PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
734
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
735 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
736
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
737 <SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
738 <TITLE>Implementation Notes</TITLE>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
739
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
740 <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
741 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
742 operations of the FLASH.<PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
743
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
744 <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
745 <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
746 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
747 <parameter>flash_info</parameter> and not
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
748 <function>diag_printf()</function></PARA>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
749
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
750 <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
751 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
752 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
753 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
754
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
755 <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
756 unsigned long block_mask, int buffer_size)
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
757 __attribute__ ((section (".2ram.flash_program_buf")));</PROGRAMLISTING>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
758
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
759 </SECT2>
3845779eca10 * src/flash.c: Major rewrite to implement a new API
asl
parents: 1672
diff changeset
760 </SECT1>
1672
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
761 </CHAPTER>
304f194b1c78 First draft version of documentation.
asl
parents:
diff changeset
762 </PART>