forked from apullin/imageproc-lib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dfmem.h
224 lines (198 loc) · 7.61 KB
/
dfmem.h
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
/*
* Copyright (c) 2008-2013, Regents of the University of California
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the University of California, Berkeley nor the names
* of its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*
* ATMEL DataFlash Memory (dfmem) Interface
*
* by Fernando L. Garcia Bermudez
*
* v.1.0
*
* Usage:
* #include "dfmem.h"
*
* // Initialize memory interface
* dfmemSetup();
*
* unsigned int page = 0, byte = 0, buffer = 1;
* unsigned char phrase[] = "Just what do you think you're doing, Dave?",
* itsaid[sizeof(phrase)];
*
* // Send string to the memory
* dfmemWrite(phrase, sizeof(phrase), page, byte, buffer);
*
* // Get same string back
* dfmemRead(page, byte, sizeof(phrase), itsaid);
*
* // Both phrase and itsaid now contain the same string
*/
#ifndef __DFMEM_H
#define __DFMEM_H
#include <stdint.h>
typedef struct {
unsigned int byte_address_bits;
unsigned int max_sector;
unsigned int max_pages;
unsigned int buffer_size;
unsigned int bytes_per_page;
unsigned int pages_per_block;
unsigned int blocks_per_sector;
unsigned int pages_per_sector;
} DfmemGeometryStruct;
typedef DfmemGeometryStruct* DfmemGeometry;
// Handles initialization of communication peripherals and makes sure the
// memory is initially deselected. Chip select defined in BSP header.
void dfmemSetup (void);
// Writes the contents of a data array to memory.
//
// It's an implementation of the dfmem's "Main Memory Page Program Through
// Buffer" command.
//
// The pointer and length of a data array is passed along with the page where
// they will be written starting at a certain byte and utilizing one of the
// dfmem's internal buffers.
//
// Parameters : data = pointer to the input data array,
// length = length of this data array (should be <= 528-byte),
// page = 0-8191 (13 bits),
// byte = 0-527 (10 bits),
// buffer = 1 or 2.
void dfmemWrite (unsigned char *data, unsigned int length, unsigned int page,
unsigned int byte, unsigned char buffer);
// Writes the contents of a data array to a memory buffer.
//
// It's an implementation of the dfmem's "Buffer Write" command.
//
// The pointer and length of a data array is passed along with the starting
// byte where they will be written in a specified dfmem's internal buffer.
//
// Parameters : data = pointer to the input data array,
// length = length of this data array (should be <= 528-byte),
// byte = 0-527 (10 bits),
// buffer = 1 or 2.
void dfmemWriteBuffer (unsigned char *data, unsigned int length,
unsigned int byte, unsigned char buffer);
// Writes the contents of a buffer to a memory page without pre-erasing it.
//
// It's an implementation of the dfmem's "Buffer to Main Memory Page Program
// without Built-in Erase" command.
//
// The page where the specified dfmem's internal buffer contents will be
// written is passed.
//
// Parameters : page = 0-8191 (13 bits),
// buffer = 1 or 2.
void dfmemWriteBuffer2MemoryNoErase (unsigned int page, unsigned char buffer);
// Read the contents of a memory page into a data array.
//
// It's an implementation of the dfmem's "Main Memory Page Read" command.
//
// The page and the starting byte of the memory to read is passed along with
// the length of data to be retrieved into the data array.
//
// Parameters : page = 0-8191 (13 bits),
// byte = 0-527 (10 bits),
// length = # of bytes to retrieve (should be <= 528-byte),
// data = pointer to the output data array.
void dfmemRead (unsigned int page, unsigned int byte, unsigned int length,
unsigned char *data);
// Read the contents of a memory page into a memory buffer.
//
// It's an implementation of the dfmem's "Main Memory Page to Buffer Transfer"
// command.
//
// The page and the specified dfmem's internal buffer are passed.
//
// Parameters : page = 0-8191 (13 bits),
// buffer = 1 or 2.
//
// TODO (fgb) : Needs further testing before release.
//void dfmemReadPage2Buffer (unsigned int page, unsigned char buffer)
// Erase the contents of a memory page.
//
// It's an implementation of the dfmem's "Page Erase" command.
//
// The page to be erased is passed.
//
// Parameters : page = 0-8191 (13 bits).
void dfmemErasePage(unsigned int page);
// Erase the contents of a memory block.
//
// It's an implementation of the dfmem's "Block Erase" command.
//
// One of the pages within the specified block is passed.
//
// Parameters : page = 0-8191 (13 bits).
void dfmemEraseBlock(unsigned int page);
// Erase the contents of a memory sector.
//
// It's an implementation of the dfmem's "Sector Erase" command.
//
// One of the pages within the specified sector is passed.
//
// Parameters : page = 0-8191 (13 bits).
void dfmemEraseSector(unsigned int page);
// Erase the contents of the whole memory chip.
//
// It's an implementation of the dfmem's "Chip Erase" command.
//
// Note: Errata recommends not to use it!
void dfmemEraseChip(void);
// Requests dfmem status register and returns its ready(RDY) bit.
//
// Returns : ready(RDY) bit
unsigned char dfmemIsReady (void);
// Requests dfmem status register and returns it.
//
// Returns : status register
unsigned char dfmemGetStatus (void);
// Requests dfmem manufacturer id and returns it.
//
// Returns : manufacturer id
unsigned char dfmemGetManufacturerID (void);
// Reads out dfmem geometry parameters
void dfmemGetGeometryParams(DfmemGeometry geo);
// Requests dfmem device ID data, returning the memory density.
//
// Returns : device density code (5 bits)
unsigned char dfmemGetChipSize (void);
// Puts dfmem in deep power-down mode.
void dfmemDeepSleep();
// Resumes dfmem from deep power-down mode.
void dfmemResumeFromDeepSleep();
// Saves to the current buffer, keeping track of position in memory.
void dfmemSave(unsigned char* data, unsigned int length);
// This function will write the current buffer into the flash memory if it
// contains any data, and then swaps the buffer pointer.
void dfmemSync();
// This resets the current page and offset tracking variable to zero.
void dfmemZeroIndex();
//Get the factory programmed unique identifier, which is the first 8 bytes
// of a 64-byte array
uint64_t dfmemGetUnqiueID();
#endif // __DFMEM_H