Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
safemode.c File Reference
#include <stdio.h>
#include "ac_cfg.h"
#include "avrdude.h"
#include "libavrdude.h"
+ Include dependency graph for safemode.c:

Go to the source code of this file.

Functions

int safemode_writefuse (unsigned char fuse, char *fusename, PROGRAMMER *pgm, AVRPART *p, int tries)
 
int safemode_readfuses (unsigned char *lfuse, unsigned char *hfuse, unsigned char *efuse, unsigned char *fuse, PROGRAMMER *pgm, AVRPART *p)
 
int safemode_memfuses (int save, unsigned char *lfuse, unsigned char *hfuse, unsigned char *efuse, unsigned char *fuse)
 

Function Documentation

◆ safemode_memfuses()

int safemode_memfuses ( int  save,
unsigned char *  lfuse,
unsigned char *  hfuse,
unsigned char *  efuse,
unsigned char *  fuse 
)
292{
293 static unsigned char safemode_lfuse = 0xff;
294 static unsigned char safemode_hfuse = 0xff;
295 static unsigned char safemode_efuse = 0xff;
296 static unsigned char safemode_fuse = 0xff;
297
298 switch (save) {
299
300 /* Save the fuses as safemode setting */
301 case 1:
302 safemode_lfuse = *lfuse;
303 safemode_hfuse = *hfuse;
304 safemode_efuse = *efuse;
305 safemode_fuse = *fuse;
306
307 break;
308 /* Read back the fuses */
309 default:
310 *lfuse = safemode_lfuse;
311 *hfuse = safemode_hfuse;
312 *efuse = safemode_efuse;
313 *fuse = safemode_fuse;
314 break;
315 }
316
317 return 0;
318}
void save(Archive &archive, wxString const &d)
Definition GLGizmoEmboss.cpp:1557

References save().

Referenced by avr_write_byte(), and avrdude_main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ safemode_readfuses()

int safemode_readfuses ( unsigned char *  lfuse,
unsigned char *  hfuse,
unsigned char *  efuse,
unsigned char *  fuse,
PROGRAMMER pgm,
AVRPART p 
)
80{
81
82 unsigned char value;
83 unsigned char fusegood = 0;
84 unsigned char allowfuseread = 1;
85 unsigned char safemode_lfuse;
86 unsigned char safemode_hfuse;
87 unsigned char safemode_efuse;
88 unsigned char safemode_fuse;
89 AVRMEM * m;
90
91 safemode_lfuse = *lfuse;
92 safemode_hfuse = *hfuse;
93 safemode_efuse = *efuse;
94 safemode_fuse = *fuse;
95
96
97 /* Read fuse three times */
98 fusegood = 2; /* If AVR device doesn't support this fuse, don't want
99 to generate a verify error */
100 m = avr_locate_mem(p, "fuse");
101 if (m != NULL) {
102 fusegood = 0; /* By default fuse is a failure */
103 if(pgm->read_byte(pgm, p, m, 0, &safemode_fuse) != 0)
104 {
105 allowfuseread = 0;
106 }
107 avrdude_message(MSG_DEBUG, "%s: safemode read 1, fuse value: %x\n",progname, safemode_fuse);
108 if(pgm->read_byte(pgm, p, m, 0, &value) != 0)
109 {
110 allowfuseread = 0;
111 }
112 avrdude_message(MSG_DEBUG, "%s: safemode read 2, fuse value: %x\n",progname, value);
113 if (value == safemode_fuse) {
114 if (pgm->read_byte(pgm, p, m, 0, &value) != 0)
115 {
116 allowfuseread = 0;
117 }
118 avrdude_message(MSG_DEBUG, "%s: safemode read 3, fuse value: %x\n",progname, value);
119 if (value == safemode_fuse)
120 {
121 fusegood = 1; /* Fuse read OK three times */
122 }
123 }
124 }
125
126 //Programmer does not allow fuse reading.... no point trying anymore
127 if (allowfuseread == 0)
128 {
129 return -5;
130 }
131
132 if (fusegood == 0) {
133 avrdude_message(MSG_INFO, "%s: safemode: Verify error - unable to read fuse properly. "
134 "Programmer may not be reliable.\n", progname);
135 return -1;
136 }
137 else if (fusegood == 1) {
138 avrdude_message(MSG_NOTICE, "%s: safemode: fuse reads as %X\n", progname, safemode_fuse);
139 }
140
141
142 /* Read lfuse three times */
143 fusegood = 2; /* If AVR device doesn't support this fuse, don't want
144 to generate a verify error */
145 m = avr_locate_mem(p, "lfuse");
146 if (m != NULL) {
147 fusegood = 0; /* By default fuse is a failure */
148 if (pgm->read_byte(pgm, p, m, 0, &safemode_lfuse) != 0)
149 {
150 allowfuseread = 0;
151 }
152 avrdude_message(MSG_DEBUG, "%s: safemode read 1, lfuse value: %x\n",progname, safemode_lfuse);
153 if (pgm->read_byte(pgm, p, m, 0, &value) != 0)
154 {
155 allowfuseread = 0;
156 }
157 avrdude_message(MSG_DEBUG, "%s: safemode read 2, lfuse value: %x\n",progname, value);
158 if (value == safemode_lfuse) {
159 if (pgm->read_byte(pgm, p, m, 0, &value) != 0)
160 {
161 allowfuseread = 0;
162 }
163 avrdude_message(MSG_DEBUG, "%s: safemode read 3, lfuse value: %x\n",progname, value);
164 if (value == safemode_lfuse){
165 fusegood = 1; /* Fuse read OK three times */
166 }
167 }
168 }
169
170 //Programmer does not allow fuse reading.... no point trying anymore
171 if (allowfuseread == 0)
172 {
173 return -5;
174 }
175
176
177 if (fusegood == 0) {
178 avrdude_message(MSG_INFO, "%s: safemode: Verify error - unable to read lfuse properly. "
179 "Programmer may not be reliable.\n", progname);
180 return -1;
181 }
182 else if (fusegood == 1) {
183 avrdude_message(MSG_DEBUG, "%s: safemode: lfuse reads as %X\n", progname, safemode_lfuse);
184 }
185
186 /* Read hfuse three times */
187 fusegood = 2; /* If AVR device doesn't support this fuse, don't want
188 to generate a verify error */
189 m = avr_locate_mem(p, "hfuse");
190 if (m != NULL) {
191 fusegood = 0; /* By default fuse is a failure */
192 if (pgm->read_byte(pgm, p, m, 0, &safemode_hfuse) != 0)
193 {
194 allowfuseread = 0;
195 }
196 avrdude_message(MSG_DEBUG, "%s: safemode read 1, hfuse value: %x\n",progname, safemode_hfuse);
197 if (pgm->read_byte(pgm, p, m, 0, &value) != 0)
198 {
199 allowfuseread = 0;
200 }
201 avrdude_message(MSG_DEBUG, "%s: safemode read 2, hfuse value: %x\n",progname, value);
202 if (value == safemode_hfuse) {
203 if (pgm->read_byte(pgm, p, m, 0, &value) != 0)
204 {
205 allowfuseread = 0;
206 }
207 avrdude_message(MSG_DEBUG, "%s: safemode read 3, hfuse value: %x\n",progname, value);
208 if (value == safemode_hfuse){
209 fusegood = 1; /* Fuse read OK three times */
210 }
211 }
212 }
213
214 //Programmer does not allow fuse reading.... no point trying anymore
215 if (allowfuseread == 0)
216 {
217 return -5;
218 }
219
220 if (fusegood == 0) {
221 avrdude_message(MSG_INFO, "%s: safemode: Verify error - unable to read hfuse properly. "
222 "Programmer may not be reliable.\n", progname);
223 return -2;
224 }
225 else if (fusegood == 1){
226 avrdude_message(MSG_NOTICE, "%s: safemode: hfuse reads as %X\n", progname, safemode_hfuse);
227 }
228
229 /* Read efuse three times */
230 fusegood = 2; /* If AVR device doesn't support this fuse, don't want
231 to generate a verify error */
232 m = avr_locate_mem(p, "efuse");
233 if (m != NULL) {
234 fusegood = 0; /* By default fuse is a failure */
235 if (pgm->read_byte(pgm, p, m, 0, &safemode_efuse) != 0)
236 {
237 allowfuseread = 0;
238 }
239 avrdude_message(MSG_DEBUG, "%s: safemode read 1, efuse value: %x\n",progname, safemode_efuse);
240 if (pgm->read_byte(pgm, p, m, 0, &value) != 0)
241 {
242 allowfuseread = 0;
243 }
244 avrdude_message(MSG_DEBUG, "%s: safemode read 2, efuse value: %x\n",progname, value);
245 if (value == safemode_efuse) {
246 if (pgm->read_byte(pgm, p, m, 0, &value) != 0)
247 {
248 allowfuseread = 0;
249 }
250 avrdude_message(MSG_DEBUG, "%s: safemode read 3, efuse value: %x\n",progname, value);
251 if (value == safemode_efuse){
252 fusegood = 1; /* Fuse read OK three times */
253 }
254 }
255 }
256
257 //Programmer does not allow fuse reading.... no point trying anymore
258 if (allowfuseread == 0)
259 {
260 return -5;
261 }
262
263 if (fusegood == 0) {
264 avrdude_message(MSG_INFO, "%s: safemode: Verify error - unable to read efuse properly. "
265 "Programmer may not be reliable.\n", progname);
266 return -3;
267 }
268 else if (fusegood == 1) {
269 avrdude_message(MSG_NOTICE, "%s: safemode: efuse reads as %X\n", progname, safemode_efuse);
270 }
271
272 *lfuse = safemode_lfuse;
273 *hfuse = safemode_hfuse;
274 *efuse = safemode_efuse;
275 *fuse = safemode_fuse;
276
277 return 0;
278}
#define MSG_DEBUG
Definition avrdude.h:54
#define MSG_INFO
Definition avrdude.h:51
char * progname
Definition main.c:61
#define MSG_NOTICE
Definition avrdude.h:52
int avrdude_message(const int msglvl, const char *format,...)
Definition main.c:93
AVRMEM * avr_locate_mem(AVRPART *p, char *desc)
Definition avrpart.c:354
Definition libavrdude.h:283
static PROGRAMMER * pgm
Definition main.c:192
int(* read_byte)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned long addr, unsigned char *value)
Definition libavrdude.h:670

References avr_locate_mem(), avrdude_message(), MSG_DEBUG, MSG_INFO, MSG_NOTICE, pgm, progname, and programmer_t::read_byte.

Referenced by avrdude_main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ safemode_writefuse()

int safemode_writefuse ( unsigned char  fuse,
char *  fusename,
PROGRAMMER pgm,
AVRPART p,
int  tries 
)
37{
38 AVRMEM * m;
39 unsigned char fuseread;
40 int returnvalue = -1;
41
42 m = avr_locate_mem(p, fusename);
43 if (m == NULL) {
44 return -1;
45 }
46
47 /* Keep trying to write then read back the fuse values */
48 while (tries > 0) {
49 if (avr_write_byte(pgm, p, m, 0, fuse) != 0)
50 {
51 continue;
52 }
53 if (pgm->read_byte(pgm, p, m, 0, &fuseread) != 0)
54 {
55 continue;
56 }
57
58 /* Report information to user if needed */
59 avrdude_message(MSG_NOTICE, "%s: safemode: Wrote %s to %x, read as %x. %d attempts left\n",
60 progname, fusename, fuse, fuseread, tries-1);
61
62 /* If fuse wrote OK, no need to keep going */
63 if (fuse == fuseread) {
64 tries = 0;
65 returnvalue = 0;
66 }
67 tries--;
68 }
69
70 return returnvalue;
71}
int avr_write_byte(PROGRAMMER *pgm, AVRPART *p, AVRMEM *mem, unsigned long addr, unsigned char data)
Definition avr.c:791

References avr_locate_mem(), avr_write_byte(), avrdude_message(), MSG_NOTICE, pgm, progname, and programmer_t::read_byte.

Referenced by avrdude_main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: