forked from zephyrproject-rtos/zephyr
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
drivers: stm32-gpio: Provide GPIO driver for stm32f2
Add necessary GPIO defines for the stm32f2 series soc Signed-off-by: qianfan Zhao <[email protected]>
- Loading branch information
1 parent
6091a7f
commit 6fb7b04
Showing
7 changed files
with
332 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* | ||
* Copyright (c) 2018 qianfan Zhao <[email protected]> | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef _STM32F2X_GPIO_REGISTERS_H_ | ||
#define _STM32F2X_GPIO_REGISTERS_H_ | ||
|
||
/** | ||
* @brief | ||
* | ||
* Based on reference manual: | ||
* stm32f2X advanced ARM ® -based 32-bit MCUs | ||
* | ||
* Chapter 6: General-purpose I/Os (GPIO) | ||
* Chapter 7: System configuration controller (SYSCFG) | ||
*/ | ||
|
||
struct stm32f2x_gpio { | ||
u32_t moder; | ||
u32_t otyper; | ||
u32_t ospeedr; | ||
u32_t pupdr; | ||
u32_t idr; | ||
u32_t odr; | ||
u32_t bsrr; | ||
u32_t lckr; | ||
u32_t afr[2]; | ||
}; | ||
|
||
union syscfg_exticr { | ||
u32_t val; | ||
struct { | ||
u16_t rsvd__16_31; | ||
u16_t exti; | ||
} bit; | ||
}; | ||
|
||
/* 7.2 SYSCFG registers */ | ||
struct stm32f2x_syscfg { | ||
u32_t memrmp; | ||
u32_t pmc; | ||
union syscfg_exticr exticr1; | ||
union syscfg_exticr exticr2; | ||
union syscfg_exticr exticr3; | ||
union syscfg_exticr exticr4; | ||
u32_t cmpcr; | ||
}; | ||
|
||
#endif /* _STM32F2X_GPIO_REGISTERS_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
/* | ||
* Copyright (c) 2018 qianfan Zhao <[email protected]> | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
/** | ||
* @brief | ||
* | ||
* Based on reference manual: | ||
* STM32F205xx, STM32F207xx, STM32F215xx and STM32F217xx | ||
* advanced ARM-based 32-bit MCUs | ||
* | ||
* Chapter 6: General-purpose I/Os (GPIO) | ||
*/ | ||
|
||
#include <errno.h> | ||
|
||
#include <device.h> | ||
#include "soc.h" | ||
#include "soc_registers.h" | ||
#include <gpio.h> | ||
#include <gpio/gpio_stm32.h> | ||
|
||
int stm32_gpio_flags_to_conf(int flags, int *pincfg) | ||
{ | ||
int direction = flags & GPIO_DIR_MASK; | ||
int pud = flags & GPIO_PUD_MASK; | ||
|
||
if (!pincfg) { | ||
return -EINVAL; | ||
} | ||
|
||
if (direction == GPIO_DIR_OUT) { | ||
*pincfg = STM32_MODER_OUTPUT_MODE; | ||
} else { | ||
/* pull-{up,down} maybe? */ | ||
*pincfg = STM32_MODER_INPUT_MODE; | ||
if (pud == GPIO_PUD_PULL_UP) { | ||
*pincfg = *pincfg | STM32_PUPDR_PULL_UP; | ||
} else if (pud == GPIO_PUD_PULL_DOWN) { | ||
*pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; | ||
} else { | ||
/* floating */ | ||
*pincfg = *pincfg | STM32_PUPDR_NO_PULL; | ||
} | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
int stm32_gpio_configure(u32_t *base_addr, int pin, int conf, int altf) | ||
{ | ||
volatile struct stm32f2x_gpio *gpio = | ||
(struct stm32f2x_gpio *)(base_addr); | ||
unsigned int mode, otype, ospeed, pupd; | ||
unsigned int pin_shift = pin << 1; | ||
unsigned int afr_bank = pin / 8; | ||
unsigned int afr_shift = (pin % 8) << 2; | ||
u32_t scratch; | ||
|
||
mode = (conf >> STM32_MODER_SHIFT) & STM32_MODER_MASK; | ||
otype = (conf >> STM32_OTYPER_SHIFT) & STM32_OTYPER_MASK; | ||
ospeed = (conf >> STM32_OSPEEDR_SHIFT) & STM32_OSPEEDR_MASK; | ||
pupd = (conf >> STM32_PUPDR_SHIFT) & STM32_PUPDR_MASK; | ||
|
||
scratch = gpio->moder & ~(STM32_MODER_MASK << pin_shift); | ||
gpio->moder = scratch | (mode << pin_shift); | ||
|
||
scratch = gpio->ospeedr & ~(STM32_OSPEEDR_MASK << pin_shift); | ||
gpio->ospeedr = scratch | (ospeed << pin_shift); | ||
|
||
scratch = gpio->otyper & ~(STM32_OTYPER_MASK << pin); | ||
gpio->otyper = scratch | (otype << pin); | ||
|
||
scratch = gpio->pupdr & ~(STM32_PUPDR_MASK << pin_shift); | ||
gpio->pupdr = scratch | (pupd << pin_shift); | ||
|
||
scratch = gpio->afr[afr_bank] & ~(STM32_AFR_MASK << afr_shift); | ||
gpio->afr[afr_bank] = scratch | (altf << afr_shift); | ||
|
||
return 0; | ||
} | ||
|
||
int stm32_gpio_set(u32_t *base, int pin, int value) | ||
{ | ||
struct stm32f2x_gpio *gpio = (struct stm32f2x_gpio *)base; | ||
|
||
int pval = 1 << (pin & 0xf); | ||
|
||
if (value) { | ||
gpio->odr |= pval; | ||
} else { | ||
gpio->odr &= ~pval; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
int stm32_gpio_get(u32_t *base, int pin) | ||
{ | ||
struct stm32f2x_gpio *gpio = (struct stm32f2x_gpio *)base; | ||
|
||
return (gpio->idr >> pin) & 0x1; | ||
} | ||
|
||
int stm32_gpio_enable_int(int port, int pin) | ||
{ | ||
volatile struct stm32f2x_syscfg *syscfg = | ||
(struct stm32f2x_syscfg *)SYSCFG_BASE; | ||
volatile union syscfg_exticr *exticr; | ||
|
||
/* Enable System Configuration Controller clock. */ | ||
struct device *clk = | ||
device_get_binding(STM32_CLOCK_CONTROL_NAME); | ||
|
||
struct stm32_pclken pclken = { | ||
.bus = STM32_CLOCK_BUS_APB2, | ||
.enr = LL_APB2_GRP1_PERIPH_SYSCFG | ||
}; | ||
|
||
clock_control_on(clk, (clock_control_subsys_t *) &pclken); | ||
|
||
int shift = 0; | ||
|
||
if (pin <= 3) { | ||
exticr = &syscfg->exticr1; | ||
} else if (pin <= 7) { | ||
exticr = &syscfg->exticr2; | ||
} else if (pin <= 11) { | ||
exticr = &syscfg->exticr3; | ||
} else if (pin <= 15) { | ||
exticr = &syscfg->exticr4; | ||
} else { | ||
return -EINVAL; | ||
} | ||
|
||
shift = 4 * (pin % 4); | ||
|
||
exticr->val &= ~(0xf << shift); | ||
exticr->val |= port << shift; | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
/* | ||
* Copyright (c) 2018 qianfan Zhao <[email protected]> | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef _STM32F2X_SOC_REGISTERS_H_ | ||
#define _STM32F2X_SOC_REGISTERS_H_ | ||
|
||
/* include register mapping headers */ | ||
#include "gpio_registers.h" | ||
|
||
#endif /* _STM32F2X_SOC_REGISTERS_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters