2 * Copyright © 2018 Keith Packard <keithp@keithp.com>
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.
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.
15 #ifndef _AO_ARCH_FUNCS_H_
16 #define _AO_ARCH_FUNCS_H_
20 #define ao_power_register(gpio)
21 #define ao_power_unregister(gpio)
23 static inline void ao_enable_port(struct stm_gpio *port)
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);
52 static inline void ao_disable_port(struct stm_gpio *port)
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);
81 #define ao_gpio_set(port, bit, v) stm_gpio_set(port, bit, v)
83 #define ao_gpio_get(port, bit) stm_gpio_get(port, bit)
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);\
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); \
97 stm_pupdr_set(port, bit, STM_PUPDR_NONE); \
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); \
106 #endif /* _AO_ARCH_FUNCS_H_ */