AlcapDAQ  1
flash.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <malloc.h>
4 
5 #include "flash.h"
6 #include "CAENVMElib.h"
7 
8 static int GetFlashStatus32(cvFlashAccess *Flash, uint8_t *Status)
9 {
10  int res = 0;
11  uint32_t reg32;
12 
13 
14  // Enable flash
15  res |= CAENVME_WriteRegister(Flash->Handle,Flash->Sel_Flash,Flash->FlashEnable);
16  // Status read Command
17  reg32 = STATUS_READ_CMD;
18  res |= CAENVME_WriteRegister(Flash->Handle, Flash->RW_Flash, reg32);
19  // Status read
20  res |= CAENVME_ReadRegister(Flash->Handle, Flash->RW_Flash, &reg32);
21  // Disable flash
22  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, !Flash->FlashEnable);
23  *Status = (uint8_t)(reg32 & 0xFF);
24 
25  return res;
26 
27 }
28 
29 
30 // *****************************************************************************
31 // GetFlashStatus: read the status register of the flash
32 // Parameters: Status: pointer to the Status variable
33 // Return: 0 on Success, < 0 on error
34 // *****************************************************************************
35 static int GetFlashStatus(cvFlashAccess *Flash, uint8_t *Status) {
36 
37  int ret;
38 
39  ret = GetFlashStatus32(Flash, Status);
40 
41  return ret;
42 
43 }
44 
45 
46 static int WriteFlashPage32(cvFlashAccess *Flash, uint8_t *data, int pagenum)
47 {
48  unsigned int i;
49  int res = 0;
50  uint8_t stat;
51  uint32_t flash_addr;
52  uint32_t reg32;
53 
54  if (Flash->PageSize == 264) // 4 and 8 Mbit
55  flash_addr = (uint32_t)pagenum << 9;
56  else if (Flash->PageSize == 528) // 16 and 32 Mbit
57  flash_addr = (uint32_t)pagenum << 10;
58  else // 64 Mbit
59  flash_addr = (uint32_t)pagenum << 11;
60 
61  reg32 = !Flash->FlashEnable;
62  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, reg32);
63  // Enable flash
64  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, Flash->FlashEnable);
65 
66  // Opcode
68 
69  // Page address
70 
71  res |= CAENVME_WriteRegister(Flash->Handle,Flash->RW_Flash, (flash_addr>>16) & 0xFF);
72 
73  res |= CAENVME_WriteRegister(Flash->Handle,Flash->RW_Flash, (flash_addr>>8) & 0xFF);
74 
75  res |= CAENVME_WriteRegister(Flash->Handle,Flash->RW_Flash, flash_addr & 0xFF);
76 
77  // Fill buffer
78  for (i=0; i<Flash->PageSize; i++) {
79  res |= CAENVME_WriteRegister(Flash->Handle,Flash->RW_Flash, data[i]);
80  }
81 
82  // Disable flash
83  reg32 = !Flash->FlashEnable;
84  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, reg32);
85 
86  // wait for Tep (Time of erase and programming)
87  do
88  res |= GetFlashStatus(Flash, &stat);
89  while (!(stat & 0x80));
90 
91  return res;
92 }
93 
94 
95 static int ReadFlashPage32(cvFlashAccess *Flash, uint8_t *data, int pagenum)
96 {
97  unsigned int i;
98  int res = 0;
99  uint32_t flash_addr;
100  uint32_t Rbuff;
101  uint32_t reg32;
102  int rcnt = 0;
103 
104  if (Flash->PageSize == 264) // 4 and 8 Mbit
105  flash_addr = (uint32_t)pagenum << 9;
106  else if (Flash->PageSize == 528) // 16 and 32 Mbit
107  flash_addr = (uint32_t)pagenum << 10;
108  else // 64 Mbit
109  flash_addr = (uint32_t)pagenum << 11;
110 
111  reg32 = !Flash->FlashEnable;
112  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, reg32);
113  // Enable flash
114  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, Flash->FlashEnable);
115 
116  // Opcode
117 
119  // Page address
120 
121  res |= CAENVME_WriteRegister(Flash->Handle, Flash->RW_Flash, (flash_addr>>16) & 0xFF);
122 
123  res |= CAENVME_WriteRegister(Flash->Handle, Flash->RW_Flash, (flash_addr>>8) & 0xFF);
124 
125  res |= CAENVME_WriteRegister(Flash->Handle, Flash->RW_Flash, flash_addr & 0xFF);
126  // additional don't care bytes
127  for (i=0; i<4; i++) {
128  res |= CAENVME_WriteRegister(Flash->Handle, Flash->RW_Flash, 0);
129  }
130 
131  // Read Flash Page
132  rcnt = 0;
133  for (i=0; i<Flash->PageSize; i++) {
134  CAENVME_ReadRegister(Flash->Handle, Flash->RW_Flash, &Rbuff);
135  data[i] = (uint8_t) Rbuff;
136  }
137 
138  // Disable flash
139  reg32 = !Flash->FlashEnable;
140  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, reg32);
141 
142  return res;
143 }
144 
145 
146 static int ReadFlashSecurityReg32(cvFlashAccess *Flash, uint8_t *data)
147 {
148  int i;
149  int res = 0;
150  uint32_t data32[2048];
151  uint32_t reg32;
152 
153  reg32 = !Flash->FlashEnable;
154  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, reg32);
155  // enable flash (NCS = 0)
156  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, Flash->FlashEnable);
157 
158  // write opcode
160  res |= CAENVME_WriteRegister(Flash->Handle, Flash->RW_Flash, reg32);
161  // additional don't care bytes
162  reg32 = 0;
163  for (i=0; i<3; i++)
164  res |= CAENVME_WriteRegister(Flash->Handle, Flash->RW_Flash, reg32);
165 
166  // read flash page
167  for (i=0; i<AT45_IDREG_LENGTH; i++)
168  res |= CAENVME_ReadRegister(Flash->Handle, Flash->RW_Flash,(data32+i));
169 
170  // disable flash (NCS = 1)
171  reg32 = !Flash->FlashEnable;
172  res |= CAENVME_WriteRegister(Flash->Handle, Flash->Sel_Flash, reg32);
173  for (i=0; i<AT45_IDREG_LENGTH; i++)
174  data[i] = (uint8_t)data32[i];
175 
176  return res;
177 }
178 
179 
180 // *****************************************************************************
181 // WriteFlashPage: write one page of the flash memory
182 // Parameters: data: pointer to the data buffer
183 // pagenum: flash page number
184 // Return: 0 on Success, < 0 on error
185 // *****************************************************************************
186 int WriteFlashPage(cvFlashAccess *Flash, uint8_t *data, int pagenum) {
187 
188  int ret;
189 
190  ret = WriteFlashPage32(Flash, data, pagenum);
191 
192  return ret;
193 
194 }
195 
196 // *****************************************************************************
197 // ReadFlashPage: read one page of the flash memory
198 // Parameters: data: pointer to the data buffer
199 // pagenum: flash page number
200 // Return: 0 on Success, < 0 on error
201 // *****************************************************************************
202 int ReadFlashPage(cvFlashAccess *Flash, uint8_t *data, int pagenum) {
203 
204  int ret;
205 
206 
207  ret = ReadFlashPage32(Flash, data, pagenum);
208 
209  return ret;
210 
211 }
212 
213 
214 // *****************************************************************************
215 // ReadFlashSecurityReg
216 // *****************************************************************************
217 int ReadFlashSecurityReg(cvFlashAccess *Flash, uint8_t *data) {
218 
219  int ret;
220 
221  ret = ReadFlashSecurityReg32(Flash, data);
222  return ret;
223 
224 }