summaryrefslogtreecommitdiffhomepage
path: root/digital/zigbit/bitcloud/stack/Components/HAL/drivers/OFD/include/ofdMemoryDriver.h
blob: d158af2616134339818b30244392cb1508874f78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/**************************************************************************//**
\file   ofdMemoryDriver.h

\brief  The implementation interface of external flash.

\author
    Atmel Corporation: http://www.atmel.com \n
    Support email: avr@atmel.com

  Copyright (c) 2008-2011, Atmel Corporation. All rights reserved.
  Licensed under Atmel's Limited License Agreement (BitCloudTM).

\internal
  History:
    31/07/09 A. Khromykh - Created
*******************************************************************************/
/******************************************************************************
 *   WARNING: CHANGING THIS FILE MAY AFFECT CORE FUNCTIONALITY OF THE STACK.  *
 *   EXPERT USERS SHOULD PROCEED WITH CAUTION.                                *
 ******************************************************************************/
#ifndef _OFDMEMORYDRIVER_H
#define _OFDMEMORYDRIVER_H

#ifdef _OTAU_
/******************************************************************************
                   Includes section
******************************************************************************/
#include <gpio.h>

/******************************************************************************
                   Define(s) section
******************************************************************************/
#if EXTERNAL_MEMORY == AT25F2048

  #if !defined(ATMEGA1281) && !defined(ATMEGA128RFA1)
    #error 'at25f2048 is supported only for atmega1281/128rfa1.'
  #endif

  // flash instruction format (see at25f2048 manual)
  #define WREN          0x06
  #define WRDI          0x04
  #define RDSR          0x05
  #define WRSR          0x01
  #define READ          0x03
  #define PROGRAM       0x02
  #define SECTOR_ERASE  0x52
  #define CHIP_ERASE    0x62
  #define RDID          0x15

  // status register bits
  #define RDY         0x01
  #define WEN         0x02
  #define BP0         0x04
  #define BP1         0x08
  #define WPEN        0x80

  // Atmel ID
  #define OFD_MANUFACTURER_ID   0x1F
  // at25f2048
  #define OFD_DEVICE_ID         0x63

  #define PAGE_SIZE                 256

  // flash sectors
  #define SECTOR_ONE             0x00000000ul
  #define SECTOR_TWO             0x00010000ul
  #define SECTOR_THREE           0x00020000ul
  #define SECTOR_FOUR            0x00030000ul
  // 2 Mbits
  #define OFD_FLASH_SIZE         262144
  // image consists mcu flash - bootloader size + eeprom size. 128k - 4k + 4k
  #define OFD_IMAGE_SIZE                                  131072
  #define OFD_FLASH_START_ADDRESS                              0
  #define OFD_IMAGE1_START_ADDRESS       OFD_FLASH_START_ADDRESS
  #define OFD_IMAGE2_START_ADDRESS       (OFD_FLASH_START_ADDRESS + OFD_IMAGE_SIZE)

  #define OFD_MCU_FLASH_SIZE                       OFD_IMAGE_SIZE
  #define OFD_MCU_EEPROM_SIZE                                4096
  #define OFD_EEPROM_OFFSET_WITHIN_IMAGE   (OFD_MCU_FLASH_SIZE - OFD_MCU_EEPROM_SIZE)
  // 1 byte (action for bootloader), 2 bytes (images crc), 1 byte table of image types.
  #define OFD_SERVICE_INFO_SIZE                                 4

#elif EXTERNAL_MEMORY == AT45DB041

  #if !defined(ATMEGA1281) && !defined(ATMEGA128RFA1) && !defined(ATXMEGA256A3) && !defined(ATXMEGA256D3)
    #error 'at45db041 is supported only for atmega1281/128rfa1, atxmega256a/d3.'
  #endif

  // flash instruction format (see at45db041 manual)
  #define WRITE_BUF1    0x84
  #define WRITE_BUF2    0x87
  #define RDSR          0xD7
  #define READ          0xE8
  #define PROGRAM_BUF1  0x88
  #define PROGRAM_BUF2  0x89
  #define BLOCK_ERASE   0x50

  // status register bits
  #define RDY         0x80
  // unchanged bit mask within status register xx0111xx
  #define STATUS_UNCHANGED_BIT_MASK      0x3C
  #define STATUS_UNCHANGED_BITS          0x1C

  #define PAGE_SIZE                  264
  // block addresses
  #define FIRST_HALF_BLOCK_NUMBER    0
  #define SECOND_HALF_BLOCK_NUMBER   128

  // 4 Mbits
  #define OFD_FLASH_SIZE         540672

  #if defined(ATMEGA1281) || defined(ATMEGA128RFA1)
    // image consists mcu flash - bootloader size + eeprom size. 128k - 4k + 4k
    // image uses 497 pages. 1 block = 8 pages
    #define OFD_USED_BLOCKS_AMOUNT                              63
    #define OFD_IMAGE_SIZE                                  131072
    #define OFD_MCU_FLASH_SIZE                      OFD_IMAGE_SIZE
    #define OFD_EEPROM_OFFSET_WITHIN_IMAGE   (OFD_MCU_FLASH_SIZE - OFD_MCU_EEPROM_SIZE)
    #define OFD_LOAD_NO_COMMAND_TO_NVM
  #elif  defined(ATXMEGA256A3) || defined(ATXMEGA256D3)
    // image consists mcu flash + eeprom size. 256k + 4k
    // image uses 1009 pages. 1 block = 8 pages
    #define OFD_USED_BLOCKS_AMOUNT                             128
    #define OFD_IMAGE_SIZE                                  266240
    #define OFD_MCU_FLASH_SIZE                              262144
    #define OFD_EEPROM_OFFSET_WITHIN_IMAGE       OFD_MCU_FLASH_SIZE
    #define OFD_LOAD_NO_COMMAND_TO_NVM      NVM.CMD = NVM_CMD_NO_OPERATION_gc
  #endif

  #define OFD_FLASH_START_ADDRESS                              0
  #define OFD_IMAGE1_START_ADDRESS       OFD_FLASH_START_ADDRESS
  #define OFD_IMAGE2_START_ADDRESS                        270336

  #define OFD_MCU_EEPROM_SIZE                                4096
  // 1 byte (action for bootloader), 2 bytes (images crc), 1 byte table of image types.
  #define OFD_SERVICE_INFO_SIZE                                 4

#elif EXTERNAL_MEMORY == AT25DF041A

  #if !defined(ATXMEGA256A3) && !defined(ATXMEGA256D3)
    #error 'at25df041a is supported only for atxmega256a3.'
  #endif

  // flash instruction format (see at25df041a manual)
  #define WREN             0x06
  #define WRDI             0x04
  #define RDSR             0x05
  #define WRSR             0x01
  #define READ             0x03
  #define PROGRAM          0x02
  #define SECTOR_ERASE     0xD8
  #define CHIP_ERASE       0x60
  #define RDID             0x9F
  #define PROTECT_SECTOR   0x36
  #define UNPROTECT_SECTOR 0x39

  // status register arguments
  #define GLOBAL_UNPROTECT 0x00
  #define GLOBAL_PROTECT   0x7F

  // status register bits
  #define RDY         0x01
  #define WEN         0x02
  #define SWP0        0x04
  #define SWP1        0x08
  #define WPP         0x10
  #define EPE         0x20
  #define SPM         0x40
  #define WPRL        0x80

  // Atmel ID
  #define OFD_MANUFACTURER_ID   0x1F
  // at25df041a
  #define OFD_DEVICE_ID_1       0x44
  #define OFD_DEVICE_ID_2       0x01
  #define EXT_STRING_LENGTH     0x00

  #define PAGE_SIZE             256

  // flash sectors
  #define SECTOR_ONE             0x00000000ul
  #define SECTOR_TWO             0x00010000ul
  #define SECTOR_THREE           0x00020000ul
  #define SECTOR_FOUR            0x00030000ul
  // 4 Mbits
  #define OFD_FLASH_SIZE         524288
  // image consists mcu flash size + eeprom size. 256k + 4k
  #define OFD_IMAGE_SIZE                                  266240
  #define OFD_FLASH_START_ADDRESS                              0
  #define OFD_IMAGE1_START_ADDRESS       OFD_FLASH_START_ADDRESS
  // this is fake start address used for code compatibility
  #define OFD_IMAGE2_START_ADDRESS       (OFD_FLASH_START_ADDRESS + OFD_IMAGE_SIZE)

  #define OFD_MCU_FLASH_SIZE                       OFD_IMAGE_SIZE
  #define OFD_MCU_EEPROM_SIZE                                4096
  #define OFD_EEPROM_OFFSET_WITHIN_IMAGE   (OFD_MCU_FLASH_SIZE - OFD_MCU_EEPROM_SIZE)
  // 1 byte (action for bootloader), 2 bytes (images crc), 1 byte table of image types.
  #define OFD_SERVICE_INFO_SIZE                                 4

#else
  #error 'Unknown memory type.'
#endif

#define OFD_START_EEPROM_SREC_ADDRESS     0x810000
#define OFD_LITTLE_TO_BIG_ENDIAN(A)  ((((uint32_t)A & 0xFFul) << 24)   \
                                   | (((uint32_t)A & 0xFF00ul) << 8)   \
                                   | (((uint32_t)A >> 8) & 0xFF00ul)   \
                                   | (((uint32_t)A >> 24) & 0xFFul))


typedef struct
{
  union
  {
    uint32_t   flashOffset;
    uint16_t   eepromOffset;
  };
  uint8_t  *data;
  uint32_t  length;
} OfdInternalMemoryAccessParam_t;

// image type table
typedef uint8_t OfdImageTable_t;

/******************************************************************************
                   Prototypes section
******************************************************************************/
/**************************************************************************//**
\brief Starts image erasing in the external memory.
******************************************************************************/
void ofdEraseImage(void);

/**************************************************************************//**
\brief Writes data to the external memory.
******************************************************************************/
void ofdWriteData(void);

/**************************************************************************//**
\brief Checks image crc.
******************************************************************************/
void ofdCheckCrc(void);

/**************************************************************************//**
\brief Starts saving internal flash.
******************************************************************************/
void ofdSaveCurrentFlashImage(void);

/**************************************************************************//**
\brief Reads image crc from internal eeprom.
******************************************************************************/
void ofdReadCrc(void);

/**************************************************************************//**
\brief Counts crc current memory area. CRC-8. Polynom 0x31    x^8 + x^5 + x^4 + 1.

\param[in]
  crc - first crc state
\param[in]
  pcBlock - pointer to the memory for crc counting
\param[in]
  length - memory size

\return
  current area crc
******************************************************************************/
uint8_t ofdCrc(uint8_t crc, uint8_t *pcBlock, uint8_t length);

/**************************************************************************//**
\brief Finds storage space.
******************************************************************************/
void ofdFindStorageSpace(void);

/**************************************************************************//**
\brief Sets action for internal bootloader.
******************************************************************************/
void ofdSetActionForBootloader(void);

/**************************************************************************//**
\brief Flushs memory buffer to flash.
******************************************************************************/
void ofdFlushData(void);

#if EXTERNAL_MEMORY == AT25DF041A
/**************************************************************************//**
\brief Unprotects memory sectors for writing and erasing.
******************************************************************************/
void ofdUnprotectMemorySectors(void);
#endif

/******************************************************************************
                 Inline static functions prototypes section.
******************************************************************************/
// Macros for the EXT_MEM_CS pin manipulation.
#if defined(ATMEGA1281)

HAL_ASSIGN_PIN(EXT_MEM_CS, F, 3);

#elif defined(ATMEGA128RFA1)

HAL_ASSIGN_PIN(EXT_MEM_CS, G, 5);

#elif defined(ATXMEGA256A3) || defined(ATXMEGA256D3)

HAL_ASSIGN_PIN(EXT_MEM_CS, D, 4);

#endif

#endif // _OTAU_

#endif /* _OFDMEMORYDRIVER_H */