]> git.sur5r.net Git - freertos/blob
eb23e7938be3023ea647330e6f4c1ff93d464d92
[freertos] /
1 /*
2  * @brief        Flash/EEPROM programming
3  *
4  * @note
5  * Copyright(C) NXP Semiconductors, 2012
6  * All rights reserved.
7  *
8  * @par
9  * Software that is described herein is for illustrative purposes only
10  * which provides customers with programming information regarding the
11  * LPC products.  This software is supplied "AS IS" without any warranties of
12  * any kind, and NXP Semiconductors and its licensor disclaim any and
13  * all warranties, express or implied, including all implied warranties of
14  * merchantability, fitness for a particular purpose and non-infringement of
15  * intellectual property rights.  NXP Semiconductors assumes no responsibility
16  * or liability for the use of the software, conveys no license or rights under any
17  * patent, copyright, mask work right, or any other intellectual property rights in
18  * or to any products. NXP Semiconductors reserves the right to make changes
19  * in the software without notification. NXP Semiconductors also makes no
20  * representation or warranty that such application will be suitable for the
21  * specified use without further testing or modification.
22  *
23  * @par
24  * Permission to use, copy, modify, and distribute this software and its
25  * documentation is hereby granted, under NXP Semiconductors' and its
26  * licensor's relevant copyrights in the software, without fee, provided that it
27  * is used in conjunction with NXP Semiconductors microcontrollers.  This
28  * copyright, permission, and disclaimer notice must appear in all copies of
29  * this code.
30  */
31
32 #ifndef __FLASH_EEPROM_001_H
33 #define __FLASH_EEPROM_001_H
34
35 #include "sys_config.h"
36 #include "cmsis.h"
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 /** @defgroup IP_FLASH_EEPROM_001 IP: Flash/EEPROM programming
43  * @ingroup IP_Drivers
44  * @{
45  */
46
47 #if defined(CHIP_LPC1347)
48 #define ERASE_PAGE_SUPPORT
49 #define EEPROM_RW_SUPPORT
50 #endif
51
52 /** The maximum number of flash programing parameters */
53 #define FLASH_PARAMETER_NUM     (5)
54
55 /** The maximum number of flash programing results */
56 #define FLASH_RESULT_NUM        (4)
57
58 /** Flash programming function type */
59 typedef void (*FLASH_ENTRY_T)(unsigned int[], unsigned int[]);
60
61 /**
62  * @brief Flash command code definitions
63  */
64 typedef enum {
65         FLASH_PREPARE = 50,                             /*!< Prepare sector(s) for write operation */
66         FLASH_COPY_RAM_TO_FLASH = 51,   /*!< Copy RAM to Flash */
67         FLASH_ERASE = 52,                               /*!< Erase sector(s) */
68         FLASH_BLANK_CHECK = 53,                 /*!< Blank check sector(s) */
69         FLASH_READ_PART_ID = 54,                /*!< Read chip part ID */
70         FLASH_READ_BOOT_VER = 55,               /*!< Read chip boot code version */
71         FLASH_COMPARE = 56,                             /*!< Compare memory areas */
72         FLASH_REINVOKE_ISP = 57,                /*!< Reinvoke ISP */
73         FLASH_READ_UID = 58,                    /*!< Read UID */
74 #if defined(ERASE_PAGE_SUPPORT)
75         FLASH_ERASE_PAGE = 59,                  /*!< Erase page */
76 #endif
77 #if defined(EEPROM_RW_SUPPORT)
78         FLASH_EEPROM_WRITE = 61,                /*!< EEPROM Write */
79         FLASH_EEPROM_READ = 62,                 /*!< EEPROM Read */
80 #endif
81 }  FLASH_CMD_CODE_T;
82
83 /**
84  * @brief Flash status code definitions
85  */
86 typedef enum {
87         CMD_SUCCESS,                            /*!< Command is executed successfully. */
88         INVALID_COMMAND,                        /*!< Invalid command. */
89         SRC_ADDR_ERROR,                         /*!< Source address is not on a word boundary. */
90         DST_ADDR_ERROR,                         /*!< Destination address is not on a correct boundary. */
91         SRC_ADDR_NOT_MAPPED,            /*!< Source address is not mapped in the memory map. */
92         DST_ADDR_NOT_MAPPED,            /*!< Destination address is not mapped in the memory map. */
93         COUNT_ERROR,                            /*!< Byte count is not multiple of 4 or is not a permitted value. */
94         INVALID_SECTOR,                         /*!< Sector number is invalid. */
95         SECTOR_NOT_BLANK,                               /*!< Sector is not blank. */
96         SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION,        /*!< Command to prepare sector for write operation was not executed. */
97         COMPARE_ERROR,                          /*!< Source and destination data is not same. */
98         BUSY,                                           /*!< Flash programming hardware interface is busy. */
99 } FLASH_STATUS_CODE_T;
100
101 /**
102  * @brief Command parameter table structure
103  */
104 typedef struct {
105         uint32_t cmd;                   /*!< Command code */
106         uint32_t pParams[FLASH_PARAMETER_NUM];  /*!< Parameters*/
107 } FLASH_COMMAND_T;
108
109 /**
110  * @brief Command result table structure
111  */
112 typedef struct {
113         uint32_t status;                /*!< Status code */
114         uint32_t pResult[FLASH_RESULT_NUM];             /*!< Results*/
115 } FLASH_OUTPUT_T;
116
117 /* Flash Programming Command Description
118    Command                  Parameters              Return Code                                 Result
119    ----------------------------------------------------------------------------------------------------------
120    FLASH_PREPARE            Start Sector Number     CMD_SUCCESS                                 None
121                             End Sector Number       BUSY
122                                                     INVALID_SECTOR
123    FLASH_COPY_RAM2FLASH     Destination Flash Addr  CMD_SUCCESS                                 None
124                             Source RAM Addr         SRC_ADDR_ERROR
125                             Number of bytes written SRC_ADDR_NOT_MAPPED
126                             CCLK in kHz             DST_ADDR_NOT_MAPPED
127                                                     COUNT_ERROR
128                                                     SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION
129                                                     BUSY
130    FLASH_ERASE              Start Sector Number     CMD_SUCCESS                                 None
131                             Emd Sector Number       BUSY
132                             CCLK in kHz             SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION
133                                                     INVALID_SECTOR
134    FLASH_BLANK_CHECK        Start Sector Number     CMD_SUCCESS                                 Non Blank Sector Offset(if Status code is SECTOR_NOT_BLANK)
135                             End Sector Number       BUSY                                        Content of non blank word location
136                                                     SECTOR_NOT_BLANK
137                                                     INVALID_SECTOR
138    FLASH_READ_PART_ID       None                    CMD_SUCCESS                                 Part ID
139    FLASH_READ_BOOT_VER      None                    CMD_SUCCESS                                 <byte1(Major)>.<byte0(Minor)>
140    FLASH_COMPARE            Destination Addr        CMD_SUCCESS                                 Offset of the first mismatch
141                             Source Address          COMPARE_ERROR
142                             Number of bytes compared COUNT_ERROR
143                                                     ADDR_ERROR
144                                                     ADDR_NOT_MAPPED
145    FLASH_REINVOKE_ISP       None                    None                                        None
146    FLASH_READ_UID           None                    CMD_SUCCESS                                 The first 32-bit word
147                                                                                                 The second 32-bit word.
148                                                                                                 The third 32-bit word.
149                                                                                                 The fourth 32-bit word
150    FLASH_ERASE_PAGE         Start Page Number       CMD_SUCCESS                                 None
151                             End Page Number         BUSY
152                             CCLK in kHz             SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION
153                                                     INVALID_SECTOR
154    FLASH_EEPROM_WRITE       EEPROM Addr             CMD_SUCCESS                                 None
155                             RAM Addr                SRC_ADDR_NOT_MAPPED
156                             Number of bytes written DST_ADDR_NOT_MAPPED
157                             CCLK in kHz
158    FLASH_EEPROM_READ        EEPROM Addr             CMD_SUCCESS                                 None
159                             RAM Addr                SRC_ADDR_NOT_MAPPED
160                             Number of bytes read    DST_ADDR_NOT_MAPPED
161                             CCLK in kHz
162  */
163
164 /**
165  * @brief       Execute flash programming command
166  * @param       entry   : Flash Programing entry
167  * @param       pCommand        : Command information
168  * @param       pOutput : Output information
169  * @return      Nothing
170  */
171 STATIC INLINE void IP_FLASH_Execute(FLASH_ENTRY_T entry, FLASH_COMMAND_T *pCommand, FLASH_OUTPUT_T *pOutput)
172 {
173         (entry) ((unsigned int *) pCommand, (unsigned int *) pOutput);
174 }
175
176 /**
177  * @brief [Prepare sectors] command parameter table structure
178  */
179 typedef struct {
180         uint32_t cmd;           /*!< Command code */
181         uint32_t start;         /*!< Start Sector Number */
182         uint32_t end;           /*!<End Sector Number (should be greater than or equal to start sector number).*/
183 } FLASH_PREPARE_SECTORS_COMMAND_T;
184
185 /**
186  * @brief [Prepare sectors] command result table structure
187  */
188 typedef struct {
189         uint32_t status;                        /*!< Status code */
190 } FLASH_PREPARE_SECTORS_OUTPUT_T;
191
192 /**
193  * @brief [Copy Ram to Flash] command parameter table structure
194  */
195 typedef struct {
196         uint32_t cmd;           /*!< Command code */
197         uint32_t dst;           /*!< Destination flash address where data bytes are to be written (256 byte boundary) */
198         uint32_t src;           /*!<Source RAM address from which data bytes are to be read (a word boudary).*/
199         uint32_t byteNum;       /*!<Number of bytes to be written. Should be 256 | 512 | 1024 | 4096.*/
200         uint32_t cclk;          /*!<System Clock Frequency (CCLK) in kHz.*/
201 } FLASH_COPY_RAM_TO_FLASH_COMMAND_T;
202
203 /**
204  * @brief [Copy Ram to Flash] command result table structure
205  */
206 typedef struct {
207         uint32_t status;                        /*!< Status code */
208 } FLASH_COPY_RAM_TO_FLASH_OUTPUT_T;
209
210 /**
211  * @brief [Erase Sector(s)] command parameter table structure
212  */
213 typedef struct {
214         uint32_t cmd;           /*!< Command code */
215         uint32_t start;         /*!< Start Sector Number */
216         uint32_t end;           /*!<End Sector Number (should be greater than or equal to start sector number).*/
217         uint32_t cclk;          /*!<System Clock Frequency (CCLK) in kHz.*/
218 } FLASH_ERASE_SECTORS_COMMAND_T;
219
220 /**
221  * @brief [Erase Sector(s)] command result table structure
222  */
223 typedef struct {
224         uint32_t status;                        /*!< Status code */
225 } FLASH_ERASE_SECTORS_OUTPUT_T;
226
227 /**
228  * @brief [Blank check sector(s)] command parameter table structure
229  */
230 typedef struct {
231         uint32_t cmd;           /*!< Command code */
232         uint32_t start;         /*!< Start Sector Number */
233         uint32_t end;           /*!<End Sector Number (should be greater than or equal to start sector number).*/
234 } FLASH_BLANK_CHECK_SECTORS_COMMAND_T;
235
236 /**
237  * @brief [Blank check sector(s)] command result table structure
238  */
239 typedef struct {
240         uint32_t status;                        /*!< Status code */
241         uint32_t firstNonBlankLoc;      /*!< Offset of the first non blank word location if the Status Code is SECTOR_NOT_BLANK.*/
242         uint32_t firstNonBlankVal;      /*!<Contents of non blank word location.*/
243 } FLASH_BLANK_CHECK_SECTORS_OUTPUT_T;
244
245 /**
246  * @brief [Read Part Identification number] command parameter table structure
247  */
248 typedef struct {
249         uint32_t cmd;           /*!< Command code */
250 } FLASH_READ_PART_ID_COMMAND_T;
251
252 /**
253  * @brief [Read Part Identification number] command result table structure
254  */
255 typedef struct {
256         uint32_t status;        /*!< Status code */
257         uint32_t partID;        /*!< Part Identification Number*/
258 } FLASH_READ_PART_ID_OUTPUT_T;
259
260 /**
261  * @brief [Read Boot code version number] command parameter table structure
262  */
263 typedef struct {
264         uint32_t cmd;           /*!< Command code */
265 } FLASH_READ_BOOTCODE_VER_COMMAND_T;
266
267 /**
268  * @brief [Read Boot code version number] command result table structure
269  */
270 typedef struct {
271         uint32_t status;        /*!< Status code */
272         uint8_t minor;          /*!< Minor*/
273         uint8_t major;          /*!< Major*/
274 } FLASH_READ_BOOTCODE_VER_OUTPUT_T;
275
276 /**
277  * @brief [Compare memory] command parameter table structure
278  */
279 typedef struct {
280         uint32_t cmd;           /*!< Command code */
281         uint32_t dst;           /*!<Starting flash or RAM address of data bytes to be compared (a word boundary) */
282         uint32_t src;           /*!<Starting flash or RAM address of data bytes to be compared (a word boudary).*/
283         uint32_t byteNum;       /*!<Number of bytes to be compared; should be a multiple of 4.*/
284 } FLASH_COMPARE_MEM_COMMAND_T;
285
286 /**
287  * @brief [Compare memory] command result table structure
288  */
289 typedef struct {
290         uint32_t status;        /*!< Status code */
291         uint32_t offset;        /*!< Offset of the first mismatch if the Status Code is COMPARE_ERROR.*/
292 } FLASH_COMPARE_MEM_OUTPUT_T;
293
294 /**
295  * @brief [Reinvoke ISP] command parameter table structure
296  */
297 typedef struct {
298         uint32_t cmd;           /*!< Command code */
299 } FLASH_REINVOKE_ISP_COMMAND_T;
300
301 /**
302  * @brief [Reinvoke ISP] command result table structure
303  */
304 typedef struct {
305         uint32_t status;        /*!< Status code */
306 } FLASH_REINVOKE_ISP_OUTPUT_T;
307
308 /**
309  * @brief [ReadUID] command parameter table structure
310  */
311 typedef struct {
312         uint32_t cmd;           /*!< Command code */
313 } FLASH_READ_UID_COMMAND_T;
314
315 /**
316  * @brief [ReadUID] command result table structure
317  */
318 typedef struct {
319         uint32_t status;        /*!< Status code */
320         uint32_t id[4];         /*!< UID*/
321 } FLASH_READ_UID_OUTPUT_T;
322
323 #if defined(ERASE_PAGE_SUPPORT)
324 /**
325  * @brief [Erase page(s)] command parameter table structure
326  */
327 typedef struct {
328         uint32_t cmd;           /*!< Command code */
329         uint32_t start;         /*!< Start Page Number */
330         uint32_t end;           /*!<End Page Number (should be greater than or equal to start page number).*/
331         uint32_t cclk;          /*!<System Clock Frequency (CCLK) in kHz.*/
332 } FLASH_ERASE_PAGES_COMMAND_T;
333
334 /**
335  * @brief [Erase page(s)] command result table structure
336  */
337 typedef struct {
338         uint32_t status;        /*!< Status code */
339 } FLASH_ERASE_PAGES_OUTPUT_T;
340
341 #endif /* defined(ERASE_PAGE_SUPPORT) */
342
343 #if defined(EEPROM_RW_SUPPORT)
344 /**
345  * @brief [Write EEPROM] command parameter table structure
346  */
347 typedef struct {
348         uint32_t cmd;                   /*!< Command code */
349         uint32_t eepromAddr;    /*!< EEPROM address.*/
350         uint32_t ramAddr;               /*!< RAM address.*/
351         uint32_t byteNum;               /*!<Number of bytes to be written.*/
352         uint32_t cclk;                  /*!<System Clock Frequency (CCLK) in kHz.*/
353 } EEPROM_WRITE_COMMAND_T;
354
355 /**
356  * @brief [Write EEPROM] command result table structure
357  */
358 typedef struct {
359         uint32_t status;        /*!< Status code */
360 } EEPROM_WRITE_OUTPUT_T;
361
362 /**
363  * @brief [Read EEPROM] command parameter table structure
364  */
365 typedef struct {
366         uint32_t cmd;           /*!< Command code */
367         uint32_t eepromAddr;    /*!< EEPROM address.*/
368         uint32_t ramAddr;               /*!< RAM address.*/
369         uint32_t byteNum;               /*!<Number of bytes to be written.*/
370         uint32_t cclk;                  /*!<System Clock Frequency (CCLK) in kHz.*/
371 } EEPROM_READ_COMMAND_T;
372
373 /**
374  * @brief [Read EEPROM] command result table structure
375  */
376 typedef struct {
377         uint32_t status;        /*!< Status code */
378 } EEPROM_READ_OUTPUT_T;
379
380 #endif /* defined(EEPROM_RW_SUPPORT) */
381
382 /**
383  * @}
384  */
385
386 #ifdef __cplusplus
387 }
388 #endif
389
390 #endif /* __FLASH_EEPROM_001_H */