]> git.donarmstrong.com Git - qmk_firmware.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F1/pinmap.c
Merge commit '1fe4406f374291ab2e86e95a97341fd9c475fcb8'
[qmk_firmware.git] / tmk_core / tool / mbed / mbed-sdk / libraries / mbed / targets / hal / TARGET_STM / TARGET_STM32F1 / pinmap.c
1 /* mbed Microcontroller Library
2  *******************************************************************************
3  * Copyright (c) 2014, STMicroelectronics
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice,
10  *    this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  *    this list of conditions and the following disclaimer in the documentation
13  *    and/or other materials provided with the distribution.
14  * 3. Neither the name of STMicroelectronics nor the names of its contributors
15  *    may be used to endorse or promote products derived from this software
16  *    without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  *******************************************************************************
29  */
30 #include "mbed_assert.h"
31 #include "pinmap.h"
32 #include "PortNames.h"
33 #include "mbed_error.h"
34
35 // GPIO mode look-up table
36 // Warning: the elements order must be the same as the one defined in PinNames.h
37 static const uint32_t gpio_mode[13] = {
38     GPIO_MODE_INPUT,              //  0 = STM_MODE_INPUT
39     GPIO_MODE_OUTPUT_PP,          //  1 = STM_MODE_OUTPUT_PP
40     GPIO_MODE_OUTPUT_OD,          //  2 = STM_MODE_OUTPUT_OD
41     GPIO_MODE_AF_PP,              //  3 = STM_MODE_AF_PP
42     GPIO_MODE_AF_OD,              //  4 = STM_MODE_AF_OD
43     GPIO_MODE_ANALOG,             //  5 = STM_MODE_ANALOG
44     GPIO_MODE_IT_RISING,          //  6 = STM_MODE_IT_RISING
45     GPIO_MODE_IT_FALLING,         //  7 = STM_MODE_IT_FALLING
46     GPIO_MODE_IT_RISING_FALLING,  //  8 = STM_MODE_IT_RISING_FALLING
47     GPIO_MODE_EVT_RISING,         //  9 = STM_MODE_EVT_RISING
48     GPIO_MODE_EVT_FALLING,        // 10 = STM_MODE_EVT_FALLING
49     GPIO_MODE_EVT_RISING_FALLING, // 11 = STM_MODE_EVT_RISING_FALLING
50     0x10000000                    // 12 = STM_MODE_IT_EVT_RESET (not in STM32Cube HAL)
51 };
52
53 // Enable GPIO clock and return GPIO base address
54 uint32_t Set_GPIO_Clock(uint32_t port_idx)
55 {
56     uint32_t gpio_add = 0;
57     switch (port_idx) {
58         case PortA:
59             gpio_add = GPIOA_BASE;
60             __GPIOA_CLK_ENABLE();
61             break;
62         case PortB:
63             gpio_add = GPIOB_BASE;
64             __GPIOB_CLK_ENABLE();
65             break;
66         case PortC:
67             gpio_add = GPIOC_BASE;
68             __GPIOC_CLK_ENABLE();
69             break;
70         case PortD:
71             gpio_add = GPIOD_BASE;
72             __GPIOD_CLK_ENABLE();
73             break;
74         default:
75             error("Pinmap error: wrong port number.");
76             break;
77     }
78     return gpio_add;
79 }
80
81 /**
82  * Configure pin (input, output, alternate function or analog) + output speed + AF
83  */
84 void pin_function(PinName pin, int data)
85 {
86     MBED_ASSERT(pin != (PinName)NC);
87     // Get the pin informations
88     uint32_t mode  = STM_PIN_MODE(data);
89     uint32_t pupd  = STM_PIN_PUPD(data);
90     uint32_t afnum = STM_PIN_AFNUM(data);
91
92     uint32_t port_index = STM_PORT(pin);
93     uint32_t pin_index  = STM_PIN(pin);
94
95     // Enable GPIO clock
96     uint32_t gpio_add = Set_GPIO_Clock(port_index);
97     GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
98
99     // Enable AFIO clock
100     __HAL_RCC_AFIO_CLK_ENABLE();
101
102     // Configure Alternate Function
103     // Warning: Must be done before the GPIO is initialized
104     if (afnum > 0) {
105         switch (afnum) {
106             case 1: // Remap SPI1
107                 __HAL_AFIO_REMAP_SPI1_ENABLE();
108                 break;
109             case 2: // Remap I2C1
110                 __HAL_AFIO_REMAP_I2C1_ENABLE();
111                 break;
112             case 3: // Remap USART1
113                 __HAL_AFIO_REMAP_USART1_ENABLE();
114                 break;
115             case 4: // Remap USART2
116                 __HAL_AFIO_REMAP_USART2_ENABLE();
117                 break;
118             case 5: // Partial Remap USART3
119                 __HAL_AFIO_REMAP_USART3_PARTIAL();
120                 break;
121             case 6: // Partial Remap TIM1
122                 __HAL_AFIO_REMAP_TIM1_PARTIAL();
123                 break;
124             case 7: // Partial Remap TIM3
125                 __HAL_AFIO_REMAP_TIM3_PARTIAL();
126                 break;
127             case 8: // Full Remap TIM2
128                 __HAL_AFIO_REMAP_TIM2_ENABLE();
129                 break;
130             case 9: // Full Remap TIM3
131                 __HAL_AFIO_REMAP_TIM3_ENABLE();
132                 break;
133             default:
134                 break;
135         }
136     }
137
138     // Configure GPIO
139     GPIO_InitTypeDef GPIO_InitStructure;
140     GPIO_InitStructure.Pin   = (uint32_t)(1 << pin_index);
141     GPIO_InitStructure.Mode  = gpio_mode[mode];
142     GPIO_InitStructure.Pull  = pupd;
143     GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
144     HAL_GPIO_Init(gpio, &GPIO_InitStructure);
145
146     // Disconnect JTAG-DP + SW-DP signals.
147     // Warning: Need to reconnect under reset
148     if ((pin == PA_13) || (pin == PA_14)) {
149         __HAL_AFIO_REMAP_SWJ_DISABLE(); // JTAG-DP Disabled and SW-DP Disabled
150     }
151     if ((pin == PA_15) || (pin == PB_3) || (pin == PB_4)) {
152         __HAL_AFIO_REMAP_SWJ_NOJTAG(); // JTAG-DP Disabled and SW-DP enabled
153     }
154 }
155
156 /**
157  * Configure pin pull-up/pull-down
158  */
159 void pin_mode(PinName pin, PinMode mode)
160 {
161     MBED_ASSERT(pin != (PinName)NC);
162
163     uint32_t port_index = STM_PORT(pin);
164     uint32_t pin_index  = STM_PIN(pin);
165
166     // Enable GPIO clock
167     uint32_t gpio_add = Set_GPIO_Clock(port_index);
168     GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
169
170     // Configure open-drain and pull-up/down
171     switch (mode) {
172         case PullNone:
173             break;
174         case PullUp:
175         case PullDown:
176             // Set pull-up / pull-down for Input mode
177             if (pin_index < 8) {
178                 if ((gpio->CRL & (0x03 << (pin_index * 4))) == 0) { // MODE bits = Input mode
179                     gpio->CRL |= (0x08 << (pin_index * 4)); // Set pull-up / pull-down
180                 }
181             } else {
182                 if ((gpio->CRH & (0x03 << ((pin_index % 8) * 4))) == 0) { // MODE bits = Input mode
183                     gpio->CRH |= (0x08 << ((pin_index % 8) * 4)); // Set pull-up / pull-down
184                 }
185             }
186             break;
187         case OpenDrain:
188             // Set open-drain for Output mode (General Purpose or Alternate Function)
189             if (pin_index < 8) {
190                 if ((gpio->CRL & (0x03 << (pin_index * 4))) > 0) { // MODE bits = Output mode
191                     gpio->CRL |= (0x04 << (pin_index * 4)); // Set open-drain
192                 }
193             } else {
194                 if ((gpio->CRH & (0x03 << ((pin_index % 8) * 4))) > 0) { // MODE bits = Output mode
195                     gpio->CRH |= (0x04 << ((pin_index % 8) * 4)); // Set open-drain
196                 }
197             }
198             break;
199         default:
200             break;
201     }
202 }