embox

Форк
0
93 строки · 2.2 Кб
1
/**
2
 * @file imx.c
3
 * @brief
4
 * @author Denis Deryugin <deryugin.denis@gmail.com>
5
 * @version
6
 * @date 13.06.2017
7
 */
8

9
#include <drivers/common/memory.h>
10
#include <drivers/gpio/gpio_driver.h>
11
#include <embox/unit.h>
12
#include <hal/reg.h>
13
#include <util/log.h>
14

15
#define GPIO_CHIP_ID OPTION_GET(NUMBER,gpio_chip_id)
16
#define GPIO_PORTS   OPTION_GET(NUMBER, gpio_ports)
17
#define BASE_ADDR(n) ((OPTION_GET(NUMBER, base_addr)) + (n) * 0x4000)
18

19
#define GPIO_DR(n)         (BASE_ADDR(n) + 0x00)
20
#define GPIO_GDIR(n)       (BASE_ADDR(n) + 0x04)
21
#define GPIO_PSR(n)        (BASE_ADDR(n) + 0x08)
22
#define GPIO_ICR1(n)       (BASE_ADDR(n) + 0x0C)
23
#define GPIO_ICR2(n)       (BASE_ADDR(n) + 0x10)
24
#define GPIO_IMR(n)        (BASE_ADDR(n) + 0x14)
25
#define GPIO_ISR(n)        (BASE_ADDR(n) + 0x18)
26
#define GPIO_EDGE_SEL(n)   (BASE_ADDR(n) + 0x1C)
27

28
#define GPIO_DIR_IN     0
29
#define GPIO_DIR_OUT    1
30

31
EMBOX_UNIT_INIT(imx_gpio_init);
32

33
static struct gpio_chip imx_gpio_chip;
34

35
static int imx_gpio_init(void) {
36
	for (int i = 0; i <= GPIO_PORTS; i++) {
37
		log_debug("GPIO%d base address=%p", i, BASE_ADDR(i));
38
	}
39

40
	return gpio_register_chip(&imx_gpio_chip, GPIO_CHIP_ID);
41
}
42

43
static int imx_gpio_setup_mode(unsigned char port, gpio_mask_t mask, int mode) {
44
	uint32_t val = 0;
45
	uint32_t tmp;
46

47
	log_debug("Set GPIO%d;mask=0x%08x;mode=%d", port, mask, mode);
48

49
	switch (mode) {
50
	case GPIO_MODE_IN:
51
		val = mask * GPIO_DIR_IN;
52
		break;
53
	case GPIO_MODE_OUT:
54
		val = mask * GPIO_DIR_OUT;
55
		break;
56
	default:
57
		return -1;
58
	}
59

60
	tmp = REG32_LOAD(GPIO_GDIR(port));
61
	tmp &= ~mask;
62
	tmp |= val;
63
	REG32_STORE(GPIO_GDIR(port), tmp);
64

65
	return 0;
66
}
67

68
static void imx_gpio_set(unsigned char port, gpio_mask_t mask, char level) {
69
	log_debug("set level %d for GPIO#%d 0x%08x", level, port, mask);
70

71
	if (level == 0) {
72
		REG32_CLEAR(GPIO_DR(port), mask);
73
	} else {
74
		REG32_ORIN(GPIO_DR(port), mask);
75
	}
76
}
77

78
gpio_mask_t imx_gpio_get(unsigned char port, gpio_mask_t mask) {
79
	int ret = REG32_LOAD(GPIO_PSR(port)) & mask;
80

81
	log_debug("get level for GPIO#%d 0x%08x=0x%08x", port, mask, ret);
82

83
	return ret;
84
}
85

86
static struct gpio_chip imx_gpio_chip = {
87
	.setup_mode = imx_gpio_setup_mode,
88
	.get = imx_gpio_get,
89
	.set = imx_gpio_set,
90
	.nports = GPIO_PORTS
91
};
92

93
PERIPH_MEMORY_DEFINE(imx_gpio, BASE_ADDR(0), (0x4000 * 5));
94

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

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

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

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