summaryrefslogtreecommitdiffstatshomepage
path: root/teensy/hal_gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'teensy/hal_gpio.c')
-rw-r--r--teensy/hal_gpio.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/teensy/hal_gpio.c b/teensy/hal_gpio.c
new file mode 100644
index 0000000000..0811f76fda
--- /dev/null
+++ b/teensy/hal_gpio.c
@@ -0,0 +1,115 @@
+#include <stdint.h>
+#include <mk20dx128.h>
+#include "teensy_hal.h"
+
+#define GPIO_NUMBER 32
+
+void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
+{
+ /* Check the parameters */
+ assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
+ assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
+ assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
+
+ /* Configure the port pins */
+ for (uint32_t position = 0; position < GPIO_NUMBER; position++) {
+ uint32_t bitmask = 1 << position;
+ if ((GPIO_Init->Pin & bitmask) == 0) {
+ continue;
+ }
+
+ volatile uint32_t *port_pcr = GPIO_PIN_TO_PORT_PCR(GPIOx, position);
+
+ /*--------------------- GPIO Mode Configuration ------------------------*/
+ /* In case of Alternate function mode selection */
+ if ((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) {
+ /* Check the Alternate function parameter */
+ assert_param(IS_GPIO_AF(GPIO_Init->Alternate));
+ /* Configure Alternate function mapped with the current IO */
+
+ *port_pcr &= ~PORT_PCR_MUX_MASK;
+ *port_pcr |= PORT_PCR_MUX(GPIO_Init->Alternate);
+ }
+
+ /* Configure IO Direction mode (Input, Output, Alternate or Analog) */
+ if (GPIO_Init->Mode == GPIO_MODE_INPUT || GPIO_Init->Mode == GPIO_MODE_ANALOG) {
+ GPIOx->PDDR &= ~bitmask;
+ } else {
+ GPIOx->PDDR |= bitmask;
+ }
+
+ /* In case of Output or Alternate function mode selection */
+ if ((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) ||
+ (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) {
+ /* Check the Speed parameter */
+ assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
+
+ /* Configure the IO Speed */
+ if (GPIO_Init->Speed > GPIO_SPEED_MEDIUM) {
+ *port_pcr &= ~PORT_PCR_SRE;
+ } else {
+ *port_pcr |= PORT_PCR_SRE;
+ }
+
+ /* Configure the IO Output Type */
+ if (GPIO_Init->Mode & GPIO_OUTPUT_TYPE) {
+ *port_pcr |= PORT_PCR_ODE;
+ } else {
+ *port_pcr &= ~PORT_PCR_ODE;
+ }
+ }
+
+ /* Activate the Pull-up or Pull down resistor for the current IO */
+ if (GPIO_Init->Pull == GPIO_NOPULL) {
+ *port_pcr &= ~PORT_PCR_PE;
+ } else {
+ *port_pcr |= PORT_PCR_PE;
+ if (GPIO_Init->Pull == GPIO_PULLDOWN) {
+ *port_pcr &= ~PORT_PCR_PS;
+ } else {
+ *port_pcr |= PORT_PCR_PS;
+ }
+ }
+
+#if 0
+ /*--------------------- EXTI Mode Configuration ------------------------*/
+ /* Configure the External Interrupt or event for the current IO */
+ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE)
+ {
+ /* Enable SYSCFG Clock */
+ __SYSCFG_CLK_ENABLE();
+
+ temp = ((uint32_t)0x0F) << (4 * (position & 0x03));
+ SYSCFG->EXTICR[position >> 2] &= ~temp;
+ SYSCFG->EXTICR[position >> 2] |= ((uint32_t)(__HAL_GET_GPIO_SOURCE(GPIOx)) << (4 * (position & 0x03)));
+
+ /* Clear EXTI line configuration */
+ EXTI->IMR &= ~((uint32_t)iocurrent);
+ EXTI->EMR &= ~((uint32_t)iocurrent);
+
+ if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)
+ {
+ EXTI->IMR |= iocurrent;
+ }
+ if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)
+ {
+ EXTI->EMR |= iocurrent;
+ }
+
+ /* Clear Rising Falling edge configuration */
+ EXTI->RTSR &= ~((uint32_t)iocurrent);
+ EXTI->FTSR &= ~((uint32_t)iocurrent);
+
+ if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)
+ {
+ EXTI->RTSR |= iocurrent;
+ }
+ if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)
+ {
+ EXTI->FTSR |= iocurrent;
+ }
+ }
+#endif
+ }
+}
+