-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path__generic_tpm.h
74 lines (66 loc) · 2.56 KB
/
__generic_tpm.h
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
#include "common.h"
#include "MKL25Z4.h"
#include "tpm_channel_mode_enum.h"
#ifndef TPM_CLOCK_MASK
#error Missing #define TPM_CLOCK_MASK
#endif
#ifndef PORT_CLOCK_MASK
#error Missing #define PORT_CLOCK_MASK
#endif
#ifndef PORT
#error MISSING #define PORT
#endif
#ifndef TPM
#error MISSING #define UART
#endif
#ifndef TPM_MODULE_NAME
#error MISSING #define UART_MODULE_NAME
#endif
#define INIT(N) CONCAT(N, _init)
void INIT(TPM_MODULE_NAME)(uint32_t cpwms, uint32_t cmod, uint32_t prescaler) {
// enable clocks
SIM->SOPT2 &= ~SIM_SOPT2_TPMSRC_MASK;
SIM->SOPT2 |= SIM_SOPT2_TPMSRC(1);
SIM->SCGC5 |= PORT_CLOCK_MASK;
SIM->SCGC6 |= TPM_CLOCK_MASK;
// set cpwms cmod prescaler
TPM->SC &= ~(TPM_SC_CPWMS_MASK | TPM_SC_CMOD_MASK | TPM_SC_PS_MASK);
TPM->SC |= TPM_SC_CPWMS(cpwms) | TPM_SC_CMOD(cmod) | TPM_SC_PS(prescaler);
#if defined(CHANNEL_0_PIN) && defined(CHANNEL_0_PIN_MUX)
PORT->PCR[CHANNEL_0_PIN] &= ~PORT_PCR_MUX_MASK;
PORT->PCR[CHANNEL_0_PIN] |= PORT_PCR_MUX(CHANNEL_0_PIN_MUX);
#endif
#if defined(CHANNEL_1_PIN) && defined(CHANNEL_1_PIN_MUX)
PORT->PCR[CHANNEL_1_PIN] &= ~PORT_PCR_MUX_MASK;
PORT->PCR[CHANNEL_1_PIN] |= PORT_PCR_MUX(CHANNEL_1_PIN_MUX);
#endif
#if defined(CHANNEL_2_PIN) && defined(CHANNEL_2_PIN_MUX)
PORT->PCR[CHANNEL_2_PIN] &= ~PORT_PCR_MUX_MASK;
PORT->PCR[CHANNEL_2_PIN] |= PORT_PCR_MUX(CHANNEL_2_PIN_MUX);
#endif
#if defined(CHANNEL_3_PIN) && defined(CHANNEL_3_PIN_MUX)
PORT->PCR[CHANNEL_3_PIN] &= ~PORT_PCR_MUX_MASK;
PORT->PCR[CHANNEL_3_PIN] |= PORT_PCR_MUX(CHANNEL_3_PIN_MUX);
#endif
#if defined(CHANNEL_4_PIN) && defined(CHANNEL_4_PIN_MUX)
PORT->PCR[CHANNEL_4_PIN] &= ~PORT_PCR_MUX_MASK;
PORT->PCR[CHANNEL_4_PIN] |= PORT_PCR_MUX(CHANNEL_4_PIN_MUX);
#endif
#if defined(CHANNEL_5_PIN) && defined(CHANNEL_5_PIN_MUX)
PORT->PCR[CHANNEL_5_PIN] &= ~PORT_PCR_MUX_MASK;
PORT->PCR[CHANNEL_5_PIN] |= PORT_PCR_MUX(CHANNEL_5_PIN_MUX);
#endif
}
#define SET_MOD(N) CONCAT(N, _set_mod)
inline void SET_MOD(TPM_MODULE_NAME)(uint32_t mod) {
TPM->MOD = TPM_MOD_MOD(mod);
}
#define SET_CHANNEL_MODE(N) CONCAT(N, _set_channel_mode)
void SET_CHANNEL_MODE(TPM_MODULE_NAME)(unsigned int channel, tpm_channel_mode_t mode) {
TPM->CONTROLS[channel].CnSC &= ~(TPM_CnSC_MSB_MASK | TPM_CnSC_MSA_MASK | TPM_CnSC_ELSB_MASK | TPM_CnSC_ELSA_MASK);
TPM->CONTROLS[channel].CnSC |= mode;
}
#define SET_CHANNEL_VAL(N) CONCAT(N, _set_channel_val)
inline void SET_CHANNEL_VAL(TPM_MODULE_NAME)(unsigned int channel, uint32_t val) {
TPM->CONTROLS[channel].CnV = TPM_CnV_VAL(val);
}