embox

Форк
0
/
k1921vk035_gpio.c 
114 строк · 3.5 Кб
1
#include <stdint.h>
2
#include <hal/reg.h>
3
#include <kernel/irq.h>
4

5
#include <drivers/gpio/gpio_driver.h>
6

7
#include <framework/mod/options.h>
8
#include <K1921VK035.h>
9
#include <plib035.h>
10

11
#define GPIO_CHIP_ID OPTION_GET(NUMBER, gpio_chip_id)
12

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);
17

18
	} else { // GPIO_PORT_B
19
		RCU_AHBClkCmd(RCU_AHBClk_GPIOB, ENABLE);
20
		RCU_AHBRstCmd(RCU_AHBRst_GPIOB, ENABLE);
21
	}
22
	return 0;
23
}
24

25
static int k1921vk035_gpio_int_setup(unsigned char port) {
26
	if (port == GPIO_PORT_A) {
27
		NVIC_EnableIRQ(GPIOA_IRQn);
28
	} else { // GPIO_PORT_B
29
		NVIC_EnableIRQ(GPIOB_IRQn);
30
	}
31
	return 0;
32
}
33

34
static int k1921vk035_gpio_setup_mode(unsigned char port, gpio_mask_t pins, int mode) {
35
	/* Enable port */
36
	k1921vk035_gpio_clock_setup(port);
37

38
	GPIO_TypeDef* GPIO = port == GPIO_PORT_A ? GPIOA : GPIOB;
39

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;
51
	} else {
52
		gpio_init_struct.DriveMode = GPIO_DriveMode_HighFast;
53
	}
54
	gpio_init_struct.Digital = ENABLE;
55
	GPIO_Init(GPIO, &gpio_init_struct);
56

57
	k1921vk035_gpio_int_setup(port);
58

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);
68

69
	GPIO_ITPolConfig(GPIO, pins, GPIO_IntPol);
70
	GPIO_ITEdgeConfig(GPIO, pins, GPIO_IntEdge);
71
	GPIO_ITTypeConfig(GPIO, pins, GPIO_IntType);
72

73
	// XXX GPIO_MODE_IN_INT_DIS unused (default)
74
	GPIO_ITCmd(GPIO, pins, (mode & GPIO_MODE_IN_INT_EN) != 0);
75

76
	return 0;
77
}
78

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;
81
	if (level) {
82
		GPIO_SetBits(GPIO, pins);
83
	} else {
84
		GPIO_ClearBits(GPIO, pins);
85
	}
86
}
87

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;
91
}
92

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,
97
	.nports = 2};
98

99
GPIO_CHIP_DEF(&k1921vk035_gpio_chip);
100

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;
104
	// GPIO_PORT_A = 0; GPIO_PORT_B = 1
105
	gpio_handle_irq(&k1921vk035_gpio_chip, gpio == GPIOB, mask);
106
	GPIO_ITStatusClear(gpio, mask);
107
	return IRQ_HANDLED;
108
}
109

110
#define GPIOA_IRQn 3
111
#define GPIOB_IRQn 4
112

113
STATIC_IRQ_ATTACH(GPIOA_IRQn, gpio_irq_handler, GPIOA);
114
STATIC_IRQ_ATTACH(GPIOB_IRQn, gpio_irq_handler, GPIOB);
115

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.