aboutsummaryrefslogtreecommitdiff
path: root/arch/avr32dd20.h
blob: 7a6b8f1103cd14ca5138a50d6ce4d395324ef9eb (plain)
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
// arch/avr32dd20.h: avr32dd20 support header
// Copyright (C) 2023 Selene ToyKeeper
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once

////////// clock speed / delay stuff //////////

#define F_CPU  12000000UL
#define BOGOMIPS  (F_CPU/3800)
#define DELAY_ZERO_TIME  1020

inline void mcu_clock_speed();

///// clock dividers
// this should work, but needs further validation
inline void clock_prescale_set(uint8_t n);

// TODO: allow hwdef to define a base clock speed,
//       and adjust these values accordingly
typedef enum
{
    // Actual clock is 12 MHz
    clock_div_1 =   (0), // 12 MHz
    clock_div_2 =   (CLKCTRL_PDIV_2X_gc  | CLKCTRL_PEN_bm), // 6 MHz
    clock_div_4 =   (CLKCTRL_PDIV_4X_gc  | CLKCTRL_PEN_bm), // 3 MHz
    clock_div_8 =   (CLKCTRL_PDIV_8X_gc  | CLKCTRL_PEN_bm), // 1.5 MHz
    clock_div_16 =  (CLKCTRL_PDIV_16X_gc | CLKCTRL_PEN_bm), // 0.75 MHz
    clock_div_32 =  (CLKCTRL_PDIV_32X_gc | CLKCTRL_PEN_bm), // 375 kHz
    clock_div_64 =  (CLKCTRL_PDIV_64X_gc | CLKCTRL_PEN_bm), // 187.5 kHz
} clock_div_t;


////////// ADC voltage / temperature //////////

#define hwdef_set_admux_therm  mcu_set_admux_therm
inline void mcu_set_admux_therm();

#define hwdef_set_admux_voltage mcu_set_admux_voltage
inline void mcu_set_admux_voltage();

inline void mcu_adc_sleep_mode();

inline void mcu_adc_start_measurement();

//#define mcu_adc_on  hwdef_set_admux_voltage
//void mcu_adc_on();

inline void mcu_adc_off();

#define ADC_vect  ADC0_RESRDY_vect
inline void mcu_adc_vect_clear();

// read ADC differently for temperature and voltage
#define MCU_ADC_RESULT_PER_TYPE

inline uint16_t mcu_adc_result_temp();

inline uint16_t mcu_adc_result_volts();

inline uint8_t mcu_adc_lsb();


////////// WDT //////////

inline void mcu_wdt_active();

inline void mcu_wdt_standby();

inline void mcu_wdt_stop();

#define WDT_vect  RTC_PIT_vect
inline void mcu_wdt_vect_clear();


////////// PCINT - pin change interrupt (e-switch) //////////

// set these in hwdef
//#define SWITCH_PORT     VPORTD.IN
//#define SWITCH_VECT     PORTD_PORT_vect

inline void mcu_switch_vect_clear();

inline void mcu_pcint_on();

inline void mcu_pcint_off();


////////// misc //////////

void reboot();

inline void prevent_reboot_loop();