252fe77a5330eaa81b7783cd9bda4188f44a125f
[fw/altos] / src / stm32f4 / ao_arch_funcs.h
1 /*
2  * Copyright © 2018 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  */
14
15 #ifndef _AO_ARCH_FUNCS_H_
16 #define _AO_ARCH_FUNCS_H_
17
18 /* GPIO functions */
19
20 #define ao_power_register(gpio)
21 #define ao_power_unregister(gpio)
22
23 static inline void ao_enable_port(struct stm_gpio *port)
24 {
25         if ((port) == &stm_gpioa) {
26                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPAEN);
27                 ao_power_register(&ao_power_gpioa);
28         } else if ((port) == &stm_gpiob) {
29                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPBEN);
30                 ao_power_register(&ao_power_gpiob);
31         } else if ((port) == &stm_gpioc) {
32                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPCEN);
33                 ao_power_register(&ao_power_gpioc);
34         } else if ((port) == &stm_gpiod) {
35                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPDEN);
36                 ao_power_register(&ao_power_gpiod);
37         } else if ((port) == &stm_gpioe) {
38                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPEEN);
39                 ao_power_register(&ao_power_gpioe);
40         } else if ((port) == &stm_gpiof) {
41                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPFEN);
42                 ao_power_register(&ao_power_gpiof);
43         } else if ((port) == &stm_gpiog) {
44                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPGEN);
45                 ao_power_register(&ao_power_gpiog);
46         } else if ((port) == &stm_gpioh) {
47                 stm_rcc.ahb1enr |= (1 << STM_RCC_AHB1ENR_IOPHEN);
48                 ao_power_register(&ao_power_gpioh);
49         }
50 }
51
52 static inline void ao_disable_port(struct stm_gpio *port)
53 {
54         if ((port) == &stm_gpioa) {
55                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPAEN);
56                 ao_power_unregister(&ao_power_gpioa);
57         } else if ((port) == &stm_gpiob) {
58                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPBEN);
59                 ao_power_unregister(&ao_power_gpiob);
60         } else if ((port) == &stm_gpioc) {
61                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPCEN);
62                 ao_power_unregister(&ao_power_gpioc);
63         } else if ((port) == &stm_gpiod) {
64                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPDEN);
65                 ao_power_unregister(&ao_power_gpiod);
66         } else if ((port) == &stm_gpioe) {
67                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPEEN);
68                 ao_power_unregister(&ao_power_gpioe);
69         } else if ((port) == &stm_gpiof) {
70                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPFEN);
71                 ao_power_unregister(&ao_power_gpiof);
72         } else if ((port) == &stm_gpiog) {
73                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPGEN);
74                 ao_power_unregister(&ao_power_gpiog);
75         } else if ((port) == &stm_gpioh) {
76                 stm_rcc.ahb1enr &= ~(1 << STM_RCC_AHB1ENR_IOPHEN);
77                 ao_power_unregister(&ao_power_gpioh);
78         }
79 }
80
81 #define ao_gpio_set(port, bit, v) stm_gpio_set(port, bit, v)
82
83 #define ao_gpio_get(port, bit) stm_gpio_get(port, bit)
84
85 #define ao_enable_output(port,bit,v) do {                       \
86                 ao_enable_port(port);                           \
87                 ao_gpio_set(port, bit, v);                      \
88                 stm_moder_set(port, bit, STM_MODER_OUTPUT);\
89         } while (0)
90
91 #define ao_gpio_set_mode(port,bit,mode) do {                            \
92                 if (mode == AO_EXTI_MODE_PULL_UP)                       \
93                         stm_pupdr_set(port, bit, STM_PUPDR_PULL_UP);    \
94                 else if (mode == AO_EXTI_MODE_PULL_DOWN)                \
95                         stm_pupdr_set(port, bit, STM_PUPDR_PULL_DOWN);  \
96                 else                                                    \
97                         stm_pupdr_set(port, bit, STM_PUPDR_NONE);       \
98         } while (0)
99
100 #define ao_enable_input(port,bit,mode) do {                             \
101                 ao_enable_port(port);                                   \
102                 stm_moder_set(port, bit, STM_MODER_INPUT);              \
103                 ao_gpio_set_mode(port, bit, mode);                      \
104         } while (0)
105
106 #endif /* _AO_ARCH_FUNCS_H_ */