embox

Форк
0
/
rdc_gpio.c 
99 строк · 2.2 Кб
1
/**
2
 * @file
3
 * @brief RDC GPIO driver
4
 *
5
 * @date 31.03.11
6
 * @author Nikolay Korotkiy
7
 */
8

9
#include <assert.h>
10
#include <asm/io.h>
11
#include <embox/unit.h>
12

13
#include <drivers/gpio/gpio_driver.h>
14

15
#define GPIO_CHIP_ID OPTION_GET(NUMBER,gpio_chip_id)
16

17
EMBOX_UNIT_INIT(gpio_init);
18

19
#define RDC_CONTROL   0x80003848
20
#define RDC_DATA      0x8000384c
21

22
#define PCI_ADDR_SEL  0xcf8
23
#define PCI_DATA_REG  0xcfc
24

25
#define GPIO_RTCRD    (1 << 16) /* Red LED */
26
#define GPIO_RTCAS    (1 << 15) /* Reset button */
27

28
static unsigned long g_last_value = 0xffffffff;
29

30
static inline void set_control(unsigned long mask) {
31
	unsigned long tmp;
32
	/* Select control register */
33
	out32(RDC_CONTROL, PCI_ADDR_SEL);
34
	tmp = in32(PCI_DATA_REG);
35
	/* raise to set GPIO function */
36
	tmp |= mask;
37
	out32(tmp, PCI_DATA_REG);
38
}
39

40
static inline void set_data(unsigned long mask) {
41
	out32(RDC_DATA, PCI_ADDR_SEL);
42
	g_last_value |= mask;
43
	out32(g_last_value, PCI_DATA_REG);
44
}
45

46
static inline void clear_data(unsigned long mask) {
47
	out32(RDC_DATA, PCI_ADDR_SEL);
48
	g_last_value &= ~mask;
49
	out32(g_last_value, PCI_DATA_REG);
50
}
51

52
static int rdc_gpio_setup_mode(unsigned char port, gpio_mask_t pins, int mode) {
53
	if ((mode & GPIO_MODE_OUT_SECTION) &&
54
		(mode & GPIO_MODE_IN_SECTION)) { /* mode is incorrect */
55
		return -1;
56
	}
57

58
	if (mode & GPIO_MODE_IN) {
59
		/* raise logic level to turn off pull-down */
60
		set_data(pins);
61
		/* select as GPIO function */
62
		set_control(pins);
63
	} else if (mode & GPIO_MODE_OUT) {
64
		set_control(pins);
65
	}
66

67
	return 0;
68
}
69

70
static void rdc_gpio_set(unsigned char port, gpio_mask_t pins, char level) {
71
	if (level) {
72
		set_data(pins);
73
	} else {
74
		clear_data(pins);
75
	}
76
}
77

78
static gpio_mask_t rdc_gpio_get(unsigned char port, gpio_mask_t pins) {
79
	unsigned long tmp;
80
	out32(RDC_DATA, PCI_ADDR_SEL);
81
	tmp = in32(PCI_DATA_REG);
82
	return tmp & pins;
83
}
84

85
static struct gpio_chip rdc_gpio_chip = {
86
	.setup_mode = rdc_gpio_setup_mode,
87
	.get = rdc_gpio_get,
88
	.set = rdc_gpio_set,
89
	.nports = 1
90
};
91

92
static int gpio_init(void) {
93
	/* Example: blink led */
94
	set_control(GPIO_RTCRD);
95
	out32(RDC_DATA, PCI_ADDR_SEL);
96
//	out32(0, PCI_DATA_REG);          // red led on
97
//	out32(GPIO_RTCRD, PCI_DATA_REG); // red led off
98
	return gpio_register_chip(&rdc_gpio_chip, GPIO_CHIP_ID);
99
}
100

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

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

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

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