1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _STM32F4XX_GPIO_H_
18 #define _STM32F4XX_GPIO_H_
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 #include <stdint.h>
25 
26 #define GPIO_HANDLE_OFFSET    1  /* to make sure that 0 stays an invalid number */
27 
28 
29 #define GPIO_PORTA 0
30 #define GPIO_PORTB 1
31 #define GPIO_PORTC 2
32 #define GPIO_PORTD 3
33 #define GPIO_PORTE 4
34 #define GPIO_PORTF 5
35 #define GPIO_PORTG 6
36 #define GPIO_PORTH 7
37 #define GPIO_PORTI 8
38 
39 #define GPIO_PORT_SHIFT 4
40 
41 /*
42  * This is a shorthand to specify a GPIO by port and number.
43  * Use GPIO_PA(5) for the Nucleo green LED LD2.
44  */
45 #define GPIO_PA(x) ((GPIO_PORTA << GPIO_PORT_SHIFT) + (x))
46 #define GPIO_PB(x) ((GPIO_PORTB << GPIO_PORT_SHIFT) + (x))
47 #define GPIO_PC(x) ((GPIO_PORTC << GPIO_PORT_SHIFT) + (x))
48 #define GPIO_PD(x) ((GPIO_PORTD << GPIO_PORT_SHIFT) + (x))
49 #define GPIO_PE(x) ((GPIO_PORTE << GPIO_PORT_SHIFT) + (x))
50 #define GPIO_PF(x) ((GPIO_PORTF << GPIO_PORT_SHIFT) + (x))
51 #define GPIO_PG(x) ((GPIO_PORTG << GPIO_PORT_SHIFT) + (x))
52 #define GPIO_PH(x) ((GPIO_PORTH << GPIO_PORT_SHIFT) + (x))
53 #define GPIO_PI(x) ((GPIO_PORTI << GPIO_PORT_SHIFT) + (x))
54 
55 #define GPIO_PIN_MASK 0xf
56 
57 enum StmGpioAltFunc
58 {
59     GPIO_AF00 = 0,
60     GPIO_AF01,
61     GPIO_AF02,
62     GPIO_AF03,
63     GPIO_AF04,
64     GPIO_AF05,
65     GPIO_AF06,
66     GPIO_AF07,
67     GPIO_AF08,
68     GPIO_AF09,
69     GPIO_AF10,
70     GPIO_AF11,
71     GPIO_AF12,
72     GPIO_AF13,
73     GPIO_AF14,
74     GPIO_AF15,
75     GPIO_AF_SYS = GPIO_AF00,
76     GPIO_AF_TIM1 = GPIO_AF01,
77     GPIO_AF_TIM2 = GPIO_AF01,
78     GPIO_AF_TIM3 = GPIO_AF02,
79     GPIO_AF_TIM4 = GPIO_AF02,
80     GPIO_AF_TIM5 = GPIO_AF02,
81     GPIO_AF_TIM9 = GPIO_AF03,
82     GPIO_AF_TIM10 = GPIO_AF03,
83     GPIO_AF_TIM11 = GPIO_AF03,
84     GPIO_AF_I2C1 = GPIO_AF04,
85     GPIO_AF_I2C2_A = GPIO_AF04,
86     GPIO_AF_I2C3_A = GPIO_AF04,
87     GPIO_AF_SPI1 = GPIO_AF05,
88     GPIO_AF_I2S1 = GPIO_AF05,
89     GPIO_AF_SPI2_A = GPIO_AF05,
90     GPIO_AF_I2S2_A = GPIO_AF05,
91     GPIO_AF_SPI3_A = GPIO_AF05,
92     GPIO_AF_I2S3_A = GPIO_AF05,
93     GPIO_AF_SPI2_B = GPIO_AF06,
94     GPIO_AF_I2S2_B = GPIO_AF06,
95     GPIO_AF_SPI3_B = GPIO_AF06,
96     GPIO_AF_I2S3_B = GPIO_AF06,
97     GPIO_AF_SPI4_B = GPIO_AF06,
98     GPIO_AF_I2S4_B = GPIO_AF06,
99     GPIO_AF_SPI5_B = GPIO_AF06,
100     GPIO_AF_I2S5_B = GPIO_AF06,
101     GPIO_AF_SPI3_C = GPIO_AF07,
102     GPIO_AF_I2S3_C = GPIO_AF07,
103     GPIO_AF_USART1 = GPIO_AF07,
104     GPIO_AF_USART2 = GPIO_AF07,
105     GPIO_AF_USART6 = GPIO_AF08,
106     GPIO_AF_I2C2_B = GPIO_AF09,
107     GPIO_AF_I2C3_B = GPIO_AF09,
108     GPIO_AF_OTG1 = GPIO_AF10,
109     GPIO_AF_SDIO = GPIO_AF12,
110     GPIO_AF_EVENT = GPIO_AF15,
111 };
112 
113 enum StmGpioSpeed       /* CL (pF)     50,  50,   10,  10   */
114 {                       /* VDD (V) >=   2.7, 1.7,  2.7, 1.7 */
115     GPIO_SPEED_LOW = 0, /* Max (MHz)    4,   2,    8,   4   */
116     GPIO_SPEED_MEDIUM,  /*             25,  12.5, 50,  20   */
117     GPIO_SPEED_FAST,    /*             50,  25,  100,  50   */
118     GPIO_SPEED_HIGH,    /*            100,  50,  180, 100   */
119 };
120 
121 void gpioBitbangedUartOut(uint32_t chr);
122 
123 #ifdef __cplusplus
124 }
125 #endif
126 
127 #endif
128