1 #include <mk20dx128.h>
2 #include "hal_ftm.h"
3 
4 #ifdef  USE_FULL_ASSERT
5   #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
6 void assert_failed(uint8_t *file, uint32_t line);
7 #else
8   #define assert_param(expr) ((void)0)
9 #endif /* USE_FULL_ASSERT */
10 
11 #define HAL_NVIC_EnableIRQ(irq)    NVIC_ENABLE_IRQ(irq)
12 
13 #define GPIOA   ((GPIO_TypeDef *)&GPIOA_PDOR)
14 #define GPIOB   ((GPIO_TypeDef *)&GPIOB_PDOR)
15 #define GPIOC   ((GPIO_TypeDef *)&GPIOC_PDOR)
16 #define GPIOD   ((GPIO_TypeDef *)&GPIOD_PDOR)
17 #define GPIOE   ((GPIO_TypeDef *)&GPIOE_PDOR)
18 #define GPIOZ   ((GPIO_TypeDef *)NULL)
19 
20 #define I2C0    ((I2C_TypeDef *)0x40066000)
21 #define I2C1    ((I2C_TypeDef *)0x40067000)
22 
23 #undef  SPI0
24 #define SPI0    ((SPI_TypeDef *)0x4002C000)
25 #define SPI1    ((SPI_TypeDef *)0x4002D000)
26 
27 #define UART0   ((UART_TypeDef *)&UART0_BDH)
28 #define UART1   ((UART_TypeDef *)&UART1_BDH)
29 #define UART2   ((UART_TypeDef *)&UART2_BDH)
30 
31 typedef struct {
32     uint32_t dummy;
33 } I2C_TypeDef;
34 
35 typedef struct {
36     uint32_t dummy;
37 } UART_TypeDef;
38 
39 typedef struct {
40     uint32_t dummy;
41 } SPI_TypeDef;
42 
43 typedef struct {
44     volatile uint32_t PDOR;         // Output register
45     volatile uint32_t PSOR;         // Set output register
46     volatile uint32_t PCOR;         // Clear output register
47     volatile uint32_t PTOR;         // Toggle output register
48     volatile uint32_t PDIR;         // Data Input register
49     volatile uint32_t PDDR;         // Data Direction register
50 } GPIO_TypeDef;
51 
52 #define GPIO_OUTPUT_TYPE    ((uint32_t)0x00000010)  // Indicates OD
53 
54 #define GPIO_MODE_INPUT     ((uint32_t)0x00000000)
55 #define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001)
56 #define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011)
57 #define GPIO_MODE_AF_PP     ((uint32_t)0x00000002)
58 #define GPIO_MODE_AF_OD     ((uint32_t)0x00000012)
59 #define GPIO_MODE_ANALOG    ((uint32_t)0x00000003)
60 #define GPIO_MODE_IT_RISING ((uint32_t)1)
61 #define GPIO_MODE_IT_FALLING ((uint32_t)2)
62 
63 #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) || \
64     ((MODE) == GPIO_MODE_OUTPUT_PP) || \
65     ((MODE) == GPIO_MODE_OUTPUT_OD) || \
66     ((MODE) == GPIO_MODE_AF_PP) || \
67     ((MODE) == GPIO_MODE_AF_OD) || \
68     ((MODE) == GPIO_MODE_ANALOG))
69 
70 #define GPIO_NOPULL         ((uint32_t)0)
71 #define GPIO_PULLUP         ((uint32_t)1)
72 #define GPIO_PULLDOWN       ((uint32_t)2)
73 
74 #define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \
75     ((PULL) == GPIO_PULLDOWN))
76 
77 #define GPIO_SPEED_FREQ_LOW       ((uint32_t)0)
78 #define GPIO_SPEED_FREQ_MEDIUM    ((uint32_t)1)
79 #define GPIO_SPEED_FREQ_HIGH      ((uint32_t)2)
80 #define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)3)
81 
82 #define IS_GPIO_AF(af)      ((af) >= 0 && (af) <= 7)
83 
84 typedef struct {
85     uint32_t Pin;
86     uint32_t Mode;
87     uint32_t Pull;
88     uint32_t Speed;
89     uint32_t Alternate;
90 } GPIO_InitTypeDef;
91 
92 #define GPIO_PORT_TO_PORT_NUM(GPIOx) \
93     ((&GPIOx->PDOR - &GPIOA_PDOR) / (&GPIOB_PDOR - &GPIOA_PDOR))
94 
95 #define GPIO_PIN_TO_PORT_PCR(GPIOx, pin) \
96     (&PORTA_PCR0 + (GPIO_PORT_TO_PORT_NUM(GPIOx) * 0x400) + (pin))
97 
98 #define GPIO_AF2_I2C0   2
99 #define GPIO_AF2_I2C1   2
100 #define GPIO_AF2_SPI0   2
101 #define GPIO_AF3_FTM0   3
102 #define GPIO_AF3_FTM1   3
103 #define GPIO_AF3_FTM2   3
104 #define GPIO_AF3_UART0  3
105 #define GPIO_AF3_UART1  3
106 #define GPIO_AF3_UART2  3
107 #define GPIO_AF4_FTM0   4
108 #define GPIO_AF6_FTM1   6
109 #define GPIO_AF6_FTM2   6
110 #define GPIO_AF6_I2C1   6
111 #define GPIO_AF7_FTM1   7
112 
__WFI(void)113 __attribute__((always_inline)) static inline void __WFI(void) {
114     __asm volatile ("wfi");
115 }
116 
117 void mp_hal_set_interrupt_char(int c);
118 
119 void mp_hal_gpio_clock_enable(GPIO_TypeDef *gpio);
120 
121 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *init);
122 
123 struct _pin_obj_t;
124 #define mp_hal_pin_obj_t const struct _pin_obj_t *
125 #define mp_hal_pin_high(p) (((p)->gpio->PSOR) = (p)->pin_mask)
126 #define mp_hal_pin_low(p)  (((p)->gpio->PCOR) = (p)->pin_mask)
127 #define mp_hal_pin_read(p) (((p)->gpio->PDIR >> (p)->pin) & 1)
128 #define mp_hal_pin_write(p, v)  ((v) ? mp_hal_pin_high(p) : mp_hal_pin_low(p))
129