SimpleFOClibrary 2.4.0
Loading...
Searching...
No Matches
drivers/hardware_specific/teensy/teensy4_mcu.h
Go to the documentation of this file.
1#ifndef TEENSY4_MCU_DRIVER_H
2#define TEENSY4_MCU_DRIVER_H
3
4#include "teensy_mcu.h"
5
6// if defined
7// - Teensy 4.0
8// - Teensy 4.1
9#if defined(__arm__) && defined(CORE_TEENSY) && ( defined(__IMXRT1062__) || defined(ARDUINO_TEENSY40) || defined(ARDUINO_TEENSY41) || defined(ARDUINO_TEENSY_MICROMOD) )
10
11// teensy 4 driver configuration parameters
12typedef struct Teensy4DriverParams {
13 IMXRT_FLEXPWM_t* flextimers[3] = {NULL};
14 int submodules[3];
15 int channels[6];
16 float dead_zone;
17} Teensy4DriverParams;
18
19
20// pin definition from https://github.com/PaulStoffregen/cores/blob/master/teensy4/pwm.c
21struct pwm_pin_info_struct {
22 uint8_t type; // 0=no pwm, 1=flexpwm, 2=quad
23 uint8_t module; // 0-3, 0-3
24 uint8_t channel; // 0=X, 1=A, 2=B
25 uint8_t muxval; //
26};
27#define M(a, b) ((((a) - 1) << 4) | (b))
28#if defined(__IMXRT1062__)
29const struct pwm_pin_info_struct pwm_pin_info[] = {
30 {1, M(1, 1), 0, 4}, // FlexPWM1_1_X 0 // AD_B0_03
31 {1, M(1, 0), 0, 4}, // FlexPWM1_0_X 1 // AD_B0_02
32 {1, M(4, 2), 1, 1}, // FlexPWM4_2_A 2 // EMC_04
33 {1, M(4, 2), 2, 1}, // FlexPWM4_2_B 3 // EMC_05
34 {1, M(2, 0), 1, 1}, // FlexPWM2_0_A 4 // EMC_06
35 {1, M(2, 1), 1, 1}, // FlexPWM2_1_A 5 // EMC_08
36 {1, M(2, 2), 1, 2}, // FlexPWM2_2_A 6 // B0_10
37 {1, M(1, 3), 2, 6}, // FlexPWM1_3_B 7 // B1_01
38 {1, M(1, 3), 1, 6}, // FlexPWM1_3_A 8 // B1_00
39 {1, M(2, 2), 2, 2}, // FlexPWM2_2_B 9 // B0_11
40 {2, M(1, 0), 0, 1}, // QuadTimer1_0 10 // B0_00
41 {2, M(1, 2), 0, 1}, // QuadTimer1_2 11 // B0_02
42 {2, M(1, 1), 0, 1}, // QuadTimer1_1 12 // B0_01
43 {2, M(2, 0), 0, 1}, // QuadTimer2_0 13 // B0_03
44 {2, M(3, 2), 0, 1}, // QuadTimer3_2 14 // AD_B1_02
45 {2, M(3, 3), 0, 1}, // QuadTimer3_3 15 // AD_B1_03
46 {0, M(1, 0), 0, 0},
47 {0, M(1, 0), 0, 0},
48 {2, M(3, 1), 0, 1}, // QuadTimer3_1 18 // AD_B1_01
49 {2, M(3, 0), 0, 1}, // QuadTimer3_0 19 // AD_B1_00
50 {0, M(1, 0), 0, 0},
51 {0, M(1, 0), 0, 0},
52 {1, M(4, 0), 1, 1}, // FlexPWM4_0_A 22 // AD_B1_08
53 {1, M(4, 1), 1, 1}, // FlexPWM4_1_A 23 // AD_B1_09
54 {1, M(1, 2), 0, 4}, // FlexPWM1_2_X 24 // AD_B0_12
55 {1, M(1, 3), 0, 4}, // FlexPWM1_3_X 25 // AD_B0_13
56 {0, M(1, 0), 0, 0},
57 {0, M(1, 0), 0, 0},
58 {1, M(3, 1), 2, 1}, // FlexPWM3_1_B 28 // EMC_32
59 {1, M(3, 1), 1, 1}, // FlexPWM3_1_A 29 // EMC_31
60 {0, M(1, 0), 0, 0},
61 {0, M(1, 0), 0, 0},
62 {0, M(1, 0), 0, 0},
63 {1, M(2, 0), 2, 1}, // FlexPWM2_0_B 33 // EMC_07
64#ifdef ARDUINO_TEENSY40
65 {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 34 // SD_B0_03
66 {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 35 // SD_B0_02
67 {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 36 // SD_B0_01
68 {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 37 // SD_B0_00
69 {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 38 // SD_B0_05
70 {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 39 // SD_B0_04
71#endif
72#ifdef ARDUINO_TEENSY41
73 {0, M(1, 0), 0, 0},
74 {0, M(1, 0), 0, 0},
75 {1, M(2, 3), 1, 6}, // FlexPWM2_3_A 36 // B1_00
76 {1, M(2, 3), 2, 6}, // FlexPWM2_3_B 37 // B1_01
77 {0, M(1, 0), 0, 0},
78 {0, M(1, 0), 0, 0},
79 {0, M(1, 0), 0, 0},
80 {0, M(1, 0), 0, 0},
81 {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 42 // SD_B0_03
82 {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 43 // SD_B0_02
83 {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 44 // SD_B0_01
84 {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 45 // SD_B0_00
85 {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 46 // SD_B0_05
86 {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 47 // SD_B0_04
87 {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_0_B
88 {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_A
89 {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_B
90 {1, M(3, 3), 2, 1}, // FlexPWM3_3_B 51 // EMC_22
91 {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_B
92 {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_A
93 {1, M(3, 0), 1, 1}, // FlexPWM3_0_A 54 // EMC_29
94#endif
95#ifdef ARDUINO_TEENSY_MICROMOD
96 {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 34 // SD_B0_03
97 {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 35 // SD_B0_02
98 {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 36 // SD_B0_01
99 {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 37 // SD_B0_00
100 {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 38 // SD_B0_04
101 {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 39 // SD_B0_05
102 {2, M(2, 1), 0, 1}, // QuadTimer2_1 40 // B0_04
103 {2, M(2, 2), 0, 1}, // QuadTimer2_2 41 // B0_05
104 {0, M(1, 0), 0, 0}, // duplicate QuadTimer3_0
105 {0, M(1, 0), 0, 0}, // duplicate QuadTimer3_1
106 {0, M(1, 0), 0, 0}, // duplicate QuadTimer3_2
107 {2, M(4, 0), 0, 1}, // QuadTimer4_0 45 // B0_09
108#endif
109};
110
111// function finding the flexpwm instance given the submodule
112int flexpwm_to_index(IMXRT_FLEXPWM_t* flexpwm);
113// find the trigger TRG0 for the given timer and submodule
114int flexpwm_submodule_to_trig(IMXRT_FLEXPWM_t* flexpwm, int submodule);
115// find the external trigger for the given timer and submodule
116int flexpwm_submodule_to_ext_sync(IMXRT_FLEXPWM_t* flexpwm, int submodule);
117// function to connecting the triggers
118void xbar_connect(unsigned int input, unsigned int output);
119// function to initialize the xbar
120void xbar_init();
121
122#endif
123
124#endif
125#endif