5
#include <drivers/gpio/gpio_driver.h>
7
#include <framework/mod/options.h>
11
#define GPIO_CHIP_ID OPTION_GET(NUMBER, gpio_chip_id)
13
static int k1921vk035_gpio_clock_setup(unsigned char port) {
14
if (port == GPIO_PORT_A) {
15
RCU_AHBClkCmd(RCU_AHBClk_GPIOA, ENABLE);
16
RCU_AHBRstCmd(RCU_AHBRst_GPIOA, ENABLE);
19
RCU_AHBClkCmd(RCU_AHBClk_GPIOB, ENABLE);
20
RCU_AHBRstCmd(RCU_AHBRst_GPIOB, ENABLE);
25
static int k1921vk035_gpio_int_setup(unsigned char port) {
26
if (port == GPIO_PORT_A) {
27
NVIC_EnableIRQ(GPIOA_IRQn);
29
NVIC_EnableIRQ(GPIOB_IRQn);
34
static int k1921vk035_gpio_setup_mode(unsigned char port, gpio_mask_t pins, int mode) {
36
k1921vk035_gpio_clock_setup(port);
38
GPIO_TypeDef* GPIO = port == GPIO_PORT_A ? GPIOA : GPIOB;
40
GPIO_Init_TypeDef gpio_init_struct;
41
GPIO_StructInit(&gpio_init_struct);
42
gpio_init_struct.Pin = pins;
43
gpio_init_struct.Out = (mode & GPIO_MODE_OUT_SECTION) ? ENABLE : DISABLE;
44
gpio_init_struct.AltFunc = (mode & GPIO_MODE_OUT_ALTERNATE) ? ENABLE : DISABLE;
45
gpio_init_struct.OutMode = (mode & GPIO_MODE_OUT_OPEN_DRAIN) ? GPIO_OutMode_OD : GPIO_OutMode_PP;
46
gpio_init_struct.InMode = (mode & GPIO_MODE_IN_SCHMITT) ? GPIO_InMode_Schmitt : GPIO_InMode_CMOS;
47
gpio_init_struct.PullMode = (mode & GPIO_MODE_IN_PULL_UP) ? GPIO_PullMode_PU :
48
(mode & GPIO_MODE_IN_PULL_DOWN) ? GPIO_PullMode_PD : GPIO_PullMode_Disable;
49
if (port == GPIO_PORT_A) {
50
gpio_init_struct.DriveMode = GPIO_DriveMode_LowFast;
52
gpio_init_struct.DriveMode = GPIO_DriveMode_HighFast;
54
gpio_init_struct.Digital = ENABLE;
55
GPIO_Init(GPIO, &gpio_init_struct);
57
k1921vk035_gpio_int_setup(port);
59
GPIO_IntType_TypeDef GPIO_IntType =
60
((mode & GPIO_MODE_INT_MODE_LEVEL0) || (mode & GPIO_MODE_INT_MODE_LEVEL1)
61
? GPIO_IntType_Level : GPIO_IntType_Edge);
62
GPIO_IntEdge_TypeDef GPIO_IntEdge =
63
(((mode & GPIO_MODE_INT_MODE_RISING) && (mode & GPIO_MODE_INT_MODE_FALLING))
64
? GPIO_IntEdge_Any : GPIO_IntEdge_Polarity);
65
GPIO_IntPol_TypeDef GPIO_IntPol =
66
((mode & GPIO_MODE_INT_MODE_RISING) || (mode & GPIO_MODE_INT_MODE_LEVEL1)
67
? GPIO_IntPol_Positive : GPIO_IntPol_Negative);
69
GPIO_ITPolConfig(GPIO, pins, GPIO_IntPol);
70
GPIO_ITEdgeConfig(GPIO, pins, GPIO_IntEdge);
71
GPIO_ITTypeConfig(GPIO, pins, GPIO_IntType);
74
GPIO_ITCmd(GPIO, pins, (mode & GPIO_MODE_IN_INT_EN) != 0);
79
static void k1921vk035_gpio_set(unsigned char port, gpio_mask_t pins, char level) {
80
GPIO_TypeDef* GPIO = port == GPIO_PORT_A ? GPIOA : GPIOB;
82
GPIO_SetBits(GPIO, pins);
84
GPIO_ClearBits(GPIO, pins);
88
static gpio_mask_t k1921vk035_gpio_get(unsigned char port, gpio_mask_t pins) {
89
GPIO_TypeDef* GPIO = port == GPIO_PORT_A ? GPIOA : GPIOB;
90
return GPIO_ReadPort(GPIO) & pins;
93
static struct gpio_chip k1921vk035_gpio_chip = {
94
.setup_mode = k1921vk035_gpio_setup_mode,
95
.get = k1921vk035_gpio_get,
96
.set = k1921vk035_gpio_set,
99
GPIO_CHIP_DEF(&k1921vk035_gpio_chip);
101
static irq_return_t gpio_irq_handler(unsigned int irq_nr, void *gpio_) {
102
GPIO_TypeDef* gpio = (GPIO_TypeDef*)gpio_;
103
uint32_t mask = gpio->INTSTATUS;
105
gpio_handle_irq(&k1921vk035_gpio_chip, gpio == GPIOB, mask);
106
GPIO_ITStatusClear(gpio, mask);
113
STATIC_IRQ_ATTACH(GPIOA_IRQn, gpio_irq_handler, GPIOA);
114
STATIC_IRQ_ATTACH(GPIOB_IRQn, gpio_irq_handler, GPIOB);