HWA
Bare metal programming with style
atmegax8_fuses.h
Go to the documentation of this file.
1
2
/* This file is part of the HWA project.
3
* Copyright (c) 2020 Christophe Duparquet.
4
* All rights reserved. Read LICENSE.TXT for details.
5
*/
6
29
/* FIXME: there's a problem with avrdude reading/writing unprogrammed fuses of
30
* extended byte as 0 instead of 1.
31
*/
32
#define HW_DEVICE_FUSE_EB \
33
/* 0xF8 | */
\
34
HW_DEVICE_FUSE_BODLEVEL
35
36
42
#define HW_DEVICE_FUSE_HB \
43
HW_DEVICE_FUSE_RSTDISBL<<7 | \
44
HW_DEVICE_FUSE_DWEN<<6 | \
45
HW_DEVICE_FUSE_SPIEN<<5 | \
46
HW_DEVICE_FUSE_WDTON<<4 | \
47
HW_DEVICE_FUSE_EESAVE<<3 | \
48
HW_DEVICE_FUSE_BOOTSZ<<1 | \
49
HW_DEVICE_FUSE_BOOTRST
50
51
57
#define HW_DEVICE_FUSE_LB \
58
HW_DEVICE_FUSE_CKDIV8<<7 | \
59
HW_DEVICE_FUSE_CKOUT<<6 | \
60
HW_DEVICE_FUSE_SUT10<<4 | \
61
HW_DEVICE_FUSE_CKSEL31<<1 | \
62
HW_DEVICE_FUSE_CKSEL0
63
64
85
#if !defined HW_DEVICE_BOOTSECTION_SIZE
86
# define HW_DEVICE_BOOTSECTION_SIZE 4096
87
#endif
88
102
#ifndef HW_DEVICE_CLK_SRC
103
# define HW_DEVICE_CLK_SRC rc_8MHz
104
# define HW_DEVICE_CLK_SRC_HZ 8000000
105
#endif
106
134
#if defined DOXYGEN
135
# define HW_DEVICE_STARTUP_DELAYS
136
#endif
137
148
#if !defined HW_DEVICE_CLOCK_OUTPUT
149
# define HW_DEVICE_CLOCK_OUTPUT disabled
150
#endif
151
162
#if !defined HW_DEVICE_EXTERNAL_RESET
163
# define HW_DEVICE_EXTERNAL_RESET enabled
164
#endif
165
176
#if !defined HW_DEVICE_DEBUG_WIRE
177
# define HW_DEVICE_DEBUG_WIRE disabled
178
#endif
179
190
#if !defined HW_DEVICE_SERIAL_PROGRAMMING
191
# define HW_DEVICE_SERIAL_PROGRAMMING enabled
192
#endif
193
204
#if !defined HW_DEVICE_WATCHDOG_ALWAYS_ON
205
# define HW_DEVICE_WATCHDOG_ALWAYS_ON no
206
#endif
207
208
209
220
#if !defined HW_DEVICE_PRESERVE_EEPROM_THROUGH_CHIP_ERASE
221
# define HW_DEVICE_PRESERVE_EEPROM_THROUGH_CHIP_ERASE no
222
#endif
223
236
#if !defined HW_DEVICE_BROWNOUT_DETECTION
237
# define HW_DEVICE_BROWNOUT_DETECTION off
238
#endif
239
245
#if !defined HW_DEVICE_BOOT
246
# define HW_DEVICE_BOOT application
247
#endif
248
253
#if HW_DEVICE_BOOTSECTION_SIZE == 512
254
# define HW_DEVICE_FUSE_BOOTSZ 3
255
#elif HW_DEVICE_BOOTSECTION_SIZE == 1024
256
# define HW_DEVICE_FUSE_BOOTSZ 2
257
#elif HW_DEVICE_BOOTSECTION_SIZE == 2048
258
# define HW_DEVICE_FUSE_BOOTSZ 1
259
#elif HW_DEVICE_BOOTSECTION_SIZE == 4096
260
# define HW_DEVICE_FUSE_BOOTSZ 0
261
#else
262
# error HW_EM_VSL(HW_DEVICE_BOOTSECTION_SIZE, (512, 1024, 2048, 4096))
263
#endif
264
265
266
#ifndef HW_DEVICE_CLK_SRC_HZ
267
# define HW_DEVICE_CLK_SRC_HZ
268
#endif
269
270
#define _hw_is_rc_8MHz_rc_8MHz , 1
271
#define _hw_is_rc_128kHz_rc_128kHz , 1
272
#define _hw_is_low_freq_xosc_low_freq_xosc , 1
273
#define _hw_is_low_power_xosc_low_power_xosc , 1
274
#define _hw_is_full_swing_xosc_full_swing_xosc , 1
275
276
#if HW_IS(external,HW_DEVICE_CLK_SRC)
277
# define HW_DEVICE_FUSE_CKSEL31 0
278
# define HW_DEVICE_FUSE_CKSEL0 0
279
# define HW_NC_PB6 1
280
#elif HW_IS(rc_8MHz,HW_DEVICE_CLK_SRC)
281
# define HW_DEVICE_FUSE_CKSEL31 1
282
# define HW_DEVICE_FUSE_CKSEL0 0
283
# define hw_syshz_base 8000000
284
#elif HW_IS(rc_128kHz,HW_DEVICE_CLK_SRC)
285
# define HW_DEVICE_FUSE_CKSEL31 1
286
# define HW_DEVICE_FUSE_CKSEL0 1
287
# define hw_syshz_base 128000
288
#elif HW_IS(HW_DEVICE_CLK_SRC, low_freq_xosc)
289
# define hw_syshz_base HW_DEVICE_CLK_SRC_HZ
290
# define HW_DEVICE_FUSE_CKSEL31 2
291
# define HW_NC_PB6 1
292
# define HW_NC_PB7 1
293
#elif HW_IS(HW_DEVICE_CLK_SRC, low_power_xosc)
294
# define hw_syshz_base HW_DEVICE_CLK_SRC_HZ
295
# if HW_DEVICE_CLK_SRC_HZ < 900000
296
# define HW_DEVICE_FUSE_CKSEL31 4
297
# elif HW_DEVICE_CLK_SRC_HZ < 3000000
298
# define HW_DEVICE_FUSE_CKSEL31 5
299
# elif HW_DEVICE_CLK_SRC_HZ < 8000000
300
# define HW_DEVICE_FUSE_CKSEL31 6
301
# else
302
# define HW_DEVICE_FUSE_CKSEL31 7
303
# endif
304
# define HW_NC_PB6 1
305
# define HW_NC_PB7 1
306
#elif HW_IS(HW_DEVICE_CLK_SRC, full_swing_xosc)
307
# ifndef HW_DEVICE_CLK_SRC_HZ
308
# error HW_DEVICE_CLK_SRC_HZ must be defined as the frequency of the crystal used for clocking
309
# else
310
# define hw_syshz_base HW_DEVICE_CLK_SRC_HZ
311
# define HW_DEVICE_FUSE_CKSEL31 3
312
# endif
313
# define HW_NC_PB6 1
314
# define HW_NC_PB7 1
315
#else
316
# error HW_DEVICE_CLK_SRC can be `rc_8MHz`, `rc_128kHz`, `low_freq_xosc`, `low_power_xosc`, `full_swing_xosc`, or `external`.
317
#endif
318
319
/* Check that we have a valid hw_syshz_base
320
*/
321
#if HW_IS(,hw_syshz_base)
322
# error HW_DEVICE_CLK_SRC_HZ must be defined as the frequency of the crystal used for clocking
323
#endif
324
325
#if !defined HW_DEVICE_CLK_PSC
326
# define HW_DEVICE_CLK_PSC 8
327
#endif
328
329
#if HW_DEVICE_CLK_PSC == 8
330
# define HW_DEVICE_FUSE_CKDIV8 0
331
# define HW_SYSHZ hw_syshz_base/8
332
#elif HW_DEVICE_CLK_PSC == 1
333
# define HW_DEVICE_FUSE_CKDIV8 1
334
# define HW_SYSHZ hw_syshz_base
335
#else
336
# error HW_EM_VAL(HW_DEVICE_CLK_PSC,HW_DEVICE_CLK_PSC,(1,8))
337
#endif
338
339
340
341
#define _hw_is_4CK_4CK , 1
342
#define _hw_is_4CK_4ms_4CK_4ms , 1
343
#define _hw_is_4CK_64ms_4CK_64ms , 1
344
#define _hw_is_6CK_14CK_6CK_14CK , 1
345
#define _hw_is_6CK_14CK_4ms_6CK_14CK_4ms , 1
346
#define _hw_is_6CK_14CK_64ms_6CK_14CK_64ms , 1
347
#define _hw_is_258CK_14CK_4ms_258CK_14CK_4ms , 1
348
#define _hw_is_258CK_14CK_64ms_258CK_14CK_64ms , 1
349
#define _hw_is_1KCK_4ms_1KCK_4ms , 1
350
#define _hw_is_1KCK_64ms_1KCK_64ms , 1
351
#define _hw_is_1KCK_14CK_1KCK_14CK , 1
352
#define _hw_is_1KCK_14CK_4ms_1KCK_14CK_4ms , 1
353
#define _hw_is_1KCK_14CK_64ms_1KCK_14CK_64ms , 1
354
#define _hw_is_16KCK_14CK_16KCK_14CK , 1
355
#define _hw_is_16KCK_14CK_4ms_16KCK_14CK_4ms , 1
356
#define _hw_is_16KCK_14CK_64ms_16KCK_14CK_64ms , 1
357
#define _hw_is_32KCK_64ms_32KCK_64ms , 1
358
359
#if defined HW_DEVICE_STARTUP_DELAYS
360
# if HW_DEVICE_FUSE_CKSEL31 < 2
361
# define HW_DEVICE_FUSE_CKSEL0 0
362
# if HW_IS(HW_DEVICE_STARTUP_DELAYS, 6CK_14CK)
363
# define HW_DEVICE_FUSE_SUT10 0
364
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 6CK_14CK_4ms)
365
# define HW_DEVICE_FUSE_SUT10 1
366
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 6CK_14CK_64ms)
367
# define HW_DEVICE_FUSE_SUT10 2
368
# else
369
# error HW_EM_VSL(HW_DEVICE_STARTUP_DELAYS, (6CK_14CK, 6CK_14CK_4ms, 6CK_14CK_64ms))
370
# endif
371
# elif HW_DEVICE_FUSE_CKSEL31 == 2
372
# if HW_IS(HW_DEVICE_STARTUP_DELAYS, 4CK)
373
# define HW_DEVICE_FUSE_SUT10 0
374
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 4CK_4ms)
375
# define HW_DEVICE_FUSE_SUT10 1
376
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 4CK_64ms)
377
# define HW_DEVICE_FUSE_SUT10 2
378
# else
379
# error HW_EM_VSL(HW_DEVICE_STARTUP_DELAYS, (4CK, 4CK_4ms, 4CK_64ms))
380
# endif
381
# else
382
# if HW_IS(HW_DEVICE_STARTUP_DELAYS, 258CK_14CK_4ms)
383
# define HW_DEVICE_FUSE_CKSEL0 0
384
# define HW_DEVICE_FUSE_SUT10 0
385
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 258CK_14CK_64ms)
386
# define HW_DEVICE_FUSE_CKSEL0 0
387
# define HW_DEVICE_FUSE_SUT10 1
388
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 1KCK_14CK)
389
# define HW_DEVICE_FUSE_CKSEL0 0
390
# define HW_DEVICE_FUSE_SUT10 2
391
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 1KCK_14CK_4ms)
392
# define HW_DEVICE_FUSE_CKSEL0 0
393
# define HW_DEVICE_FUSE_SUT10 3
394
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 1KCK_14CK_64ms)
395
# define HW_DEVICE_FUSE_CKSEL0 1
396
# define HW_DEVICE_FUSE_SUT10 0
397
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 16KCK_14CK)
398
# define HW_DEVICE_FUSE_CKSEL0 1
399
# define HW_DEVICE_FUSE_SUT10 1
400
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 16KCK_14CK_4ms)
401
# define HW_DEVICE_FUSE_CKSEL0 1
402
# define HW_DEVICE_FUSE_SUT10 2
403
# elif HW_IS(HW_DEVICE_STARTUP_DELAYS, 16KCK_14CK_64ms)
404
# define HW_DEVICE_FUSE_CKSEL0 1
405
# define HW_DEVICE_FUSE_SUT10 3
406
# else
407
# error HW_EM_VSL(HW_DEVICE_STARTUP_DELAYS, (258CK_14CK_4ms, 258CK_14CK_64ms, 1KCK_14CK, \
408
1KCK_14CK_4ms, 1KCK_14CK_64ms, 16KCK_14CK, \
409
16KCK_14CK_4ms, 16KCK_14CK_64ms))
410
# endif
411
# endif
412
#else
413
# define HW_DEVICE_FUSE_SUT10 2
414
#endif
415
416
417
#if HW_IS(HW_DEVICE_CLOCK_OUTPUT, enabled)
418
# define HW_DEVICE_FUSE_CKOUT 0
419
# define HW_NC_PB0 1
420
#elif HW_IS(HW_DEVICE_CLOCK_OUTPUT, disabled)
421
# define HW_DEVICE_FUSE_CKOUT 1
422
#else
423
# error HW_EM_VSL(HW_DEVICE_EXTERNAL_RESET, (enabled, disabled))
424
#endif
425
426
427
#if HW_IS(HW_DEVICE_EXTERNAL_RESET, enabled)
428
# define HW_DEVICE_FUSE_RSTDISBL 1
429
# define HW_NC_PC6 1
430
#elif HW_IS(HW_DEVICE_EXTERNAL_RESET, disabled)
431
# define HW_DEVICE_FUSE_RSTDISBL 0
432
#else
433
# error HW_EM_VSL(HW_DEVICE_EXTERNAL_RESET, (enabled, disabled))
434
#endif
435
436
437
#if HW_IS(HW_DEVICE_DEBUG_WIRE, enabled)
438
# define HW_DEVICE_FUSE_DWEN 0
439
# define HW_NC_PC6 1
440
#elif HW_IS(HW_DEVICE_DEBUG_WIRE, disabled)
441
# define HW_DEVICE_FUSE_DWEN 1
442
#else
443
# error HW_EM_VSL(HW_DEVICE_DEBUG_WIRE, (enabled, disabled))
444
#endif
445
446
447
#if HW_IS(HW_DEVICE_SERIAL_PROGRAMMING, enabled)
448
# define HW_DEVICE_FUSE_SPIEN 0
449
#elif HW_IS(HW_DEVICE_SERIAL_PROGRAMMING, disabled)
450
# define HW_DEVICE_FUSE_SPIEN 1
451
#else
452
# error HW_EM_VSL(HW_DEVICE_SERIAL_PROGRAMMING, (enabled, disabled))
453
#endif
454
455
456
#define _hw_is_1700_2000mV_1700_2000mV , 1
457
#define _hw_is_2500_2900mV_2500_2900mV , 1
458
#define _hw_is_4100_4500mV_4100_4500mV , 1
459
460
#if HW_IS(HW_DEVICE_BROWNOUT_DETECTION, off)
461
# define HW_DEVICE_FUSE_BODLEVEL 7
462
#elif HW_IS(HW_DEVICE_BROWNOUT_DETECTION, 1700_2000mV)
463
# define HW_DEVICE_FUSE_BODLEVEL 6
464
#elif HW_IS(HW_DEVICE_BROWNOUT_DETECTION, 2500_2900mV)
465
# define HW_DEVICE_FUSE_BODLEVEL 5
466
#elif HW_IS(HW_DEVICE_BROWNOUT_DETECTION, 4100_4500mV)
467
# define HW_DEVICE_FUSE_BODLEVEL 4
468
#else
469
# error HW_EM_VSL(HW_DEVICE_BROWNOUT_DETECTION, (1700_2000mV, 2500_2900mV, 4100_4500mV, off))
470
#endif
471
472
#define _hw_is_application_application , 1
473
#define _hw_is_bootloader_bootloader , 1
474
475
476
#if HW_IS(HW_DEVICE_WATCHDOG_ALWAYS_ON, yes)
477
# define HW_DEVICE_FUSE_WDTON 0
478
#elif HW_IS(HW_DEVICE_WATCHDOG_ALWAYS_ON, no)
479
# define HW_DEVICE_FUSE_WDTON 1
480
#else
481
# error HW_EM_VSL(HW_DEVICE_WATCHDOG_ALWAYS_ON, (yes, no))
482
#endif
483
484
485
#if HW_IS(HW_DEVICE_PRESERVE_EEPROM_THROUGH_CHIP_ERASE, yes)
486
# define HW_DEVICE_FUSE_EESAVE 0
487
#elif HW_IS(HW_DEVICE_PRESERVE_EEPROM_THROUGH_CHIP_ERASE, no)
488
# define HW_DEVICE_FUSE_EESAVE 1
489
#else
490
# error HW_EM_VSL(HW_DEVICE_PRESERVE_EEPROM_FROM_CHIP_ERASE, (yes, no))
491
#endif
492
493
494
#if HW_IS(HW_DEVICE_BOOT, application)
495
# define HW_DEVICE_FUSE_BOOTRST 1
496
#elif HW_IS(HW_DEVICE_BOOT, bootloader)
497
# define HW_DEVICE_FUSE_BOOTRST 0
498
#else
499
# error HW_EM_VSL(HW_DEVICE_BOOT, (application, bootloader))
500
#endif
501
Generated for HWA by
1.8.6