soc: arm: st_stm32: Cleanup gpio function code.
All series STM32 have mostly the same GPIO architecture and can share the same code for GPIO manipulation. Functions of the external interrupt line control are also the same. This patch extracts common code from them and put them into the 'common' folder. Functions of control GPIO of these series scattered in soc/arm/st_stm32/stm32xx/ folders contain these functions: stm32_gpio_flags_to_conf(), stm32_gpio_configure(), stm32_gpio_set(), stm32_gpio_get, stm32_gpio_enable_int(). This patch merges them into the gpio_stm32.c file. Signed-off-by: Song Qiang <songqiang1304521@gmail.com>
This commit is contained in:
parent
d4ef80ec57
commit
9612f9d840
36 changed files with 376 additions and 1478 deletions
|
@ -2,4 +2,3 @@ zephyr_include_directories(${ZEPHYR_BASE}/drivers)
|
|||
zephyr_sources(
|
||||
soc.c
|
||||
)
|
||||
zephyr_sources_ifdef(CONFIG_GPIO soc_gpio.c)
|
||||
|
|
|
@ -1,146 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2016 RnDity Sp. z o.o.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* Based on reference manual:
|
||||
* STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC,
|
||||
* STM32F398xE advanced ARM ® -based MCUs
|
||||
*
|
||||
* Chapter 11: 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 == NULL) {
|
||||
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 stm32f3x_gpio *gpio =
|
||||
(struct stm32f3x_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 stm32f3x_gpio *gpio = (struct stm32f3x_gpio *)base;
|
||||
|
||||
int pval = 1 << (pin & 0xf);
|
||||
|
||||
if (value != 0) {
|
||||
gpio->odr |= pval;
|
||||
} else {
|
||||
gpio->odr &= ~pval;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int stm32_gpio_get(u32_t *base, int pin)
|
||||
{
|
||||
struct stm32f3x_gpio *gpio = (struct stm32f3x_gpio *)base;
|
||||
|
||||
return (gpio->idr >> pin) & 0x1;
|
||||
}
|
||||
|
||||
int stm32_gpio_enable_int(int port, int pin)
|
||||
{
|
||||
volatile struct stm32f3x_syscfg *syscfg =
|
||||
(struct stm32f3x_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;
|
||||
}
|
|
@ -9,6 +9,6 @@
|
|||
|
||||
/* include register mapping headers */
|
||||
#include "flash_registers.h"
|
||||
#include "gpio_registers.h"
|
||||
#include "syscfg_registers.h"
|
||||
|
||||
#endif /* _STM32F3X_SOC_REGISTERS_H_ */
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef _STM32F3X_GPIO_REGISTERS_H_
|
||||
#define _STM32F3X_GPIO_REGISTERS_H_
|
||||
#ifndef _STM32_SYSCFG_REGISTERS_H_
|
||||
#define _STM32_SYSCFG_REGISTERS_H_
|
||||
|
||||
/**
|
||||
* @brief
|
||||
|
@ -13,22 +13,9 @@
|
|||
* Based on reference manual:
|
||||
* STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC,
|
||||
* STM32F398xE advanced ARM(r)-based MCUs
|
||||
*
|
||||
* Chapter 11: General-purpose I/Os
|
||||
*/
|
||||
|
||||
struct stm32f3x_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];
|
||||
u32_t brr;
|
||||
};
|
||||
#include "../common/soc_syscfg_common.h"
|
||||
|
||||
union syscfg_cfgr1 {
|
||||
u32_t val;
|
||||
|
@ -66,21 +53,13 @@ union syscfg_rcr {
|
|||
} bit;
|
||||
};
|
||||
|
||||
union syscfg__exticr {
|
||||
u32_t val;
|
||||
struct {
|
||||
u16_t exti;
|
||||
u16_t rsvd__16_31;
|
||||
} bit;
|
||||
};
|
||||
|
||||
struct stm32f3x_syscfg {
|
||||
struct stm32_syscfg {
|
||||
union syscfg_cfgr1 cfgr1;
|
||||
union syscfg_rcr rcr;
|
||||
union syscfg__exticr exticr1;
|
||||
union syscfg__exticr exticr2;
|
||||
union syscfg__exticr exticr3;
|
||||
union syscfg__exticr exticr4;
|
||||
union syscfg_exticr exticr1;
|
||||
union syscfg_exticr exticr2;
|
||||
union syscfg_exticr exticr3;
|
||||
union syscfg_exticr exticr4;
|
||||
u32_t cfgr2;
|
||||
u32_t rsvd_0x1C;
|
||||
u32_t rsvd_0x20;
|
||||
|
@ -98,4 +77,4 @@ struct stm32f3x_syscfg {
|
|||
u32_t cfgr3;
|
||||
};
|
||||
|
||||
#endif /* _STM32F3X_GPIO_REGISTERS_H_ */
|
||||
#endif /* _STM32_GPIO_REGISTERS_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue