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