-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmygpio.h
executable file
·153 lines (131 loc) · 3.82 KB
/
mygpio.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*-----------------------------------------
Author: ForgotFun
Refer to: http://forgotfun.org
-----------------------------------------*/
#ifndef _MYGPIO_H
#define _MYGPIO_H
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <wait.h>
#define MMAP_PATH "/dev/mem"
#define RALINK_GPIO_DIR_IN 0
#define RALINK_GPIO_DIR_OUT 1
#define RALINK_REG_PIOINT 0x690
#define RALINK_REG_PIOEDGE 0x6A0
#define RALINK_REG_PIORENA 0x650
#define RALINK_REG_PIOFENA 0x660
#define RALINK_REG_PIODATA 0x620
#define RALINK_REG_PIODIR 0x600
#define RALINK_REG_PIOSET 0x630
#define RALINK_REG_PIORESET 0x640
#define RALINK_REG_PIO6332INT 0x694
#define RALINK_REG_PIO6332EDGE 0x6A4
#define RALINK_REG_PIO6332RENA 0x654
#define RALINK_REG_PIO6332FENA 0x664
#define RALINK_REG_PIO6332DATA 0x624
#define RALINK_REG_PIO6332DIR 0x604
#define RALINK_REG_PIO6332SET 0x634
#define RALINK_REG_PIO6332RESET 0x644
#define RALINK_REG_PIO9564INT 0x698
#define RALINK_REG_PIO9564EDGE 0x6A8
#define RALINK_REG_PIO9564RENA 0x658
#define RALINK_REG_PIO9564FENA 0x668
#define RALINK_REG_PIO9564DATA 0x628
#define RALINK_REG_PIO9564DIR 0x608
#define RALINK_REG_PIO9564SET 0x638
#define RALINK_REG_PIO9564RESET 0x648
static uint8_t* gpio_mmap_reg = NULL;
static int gpio_mmap_fd = 0;
static int gpio_mmap(void)
{
if ((gpio_mmap_fd = open(MMAP_PATH, O_RDWR)) < 0) {
fprintf(stderr, "unable to open mmap file");
return -1;
}
gpio_mmap_reg = (uint8_t*) mmap(NULL, 1024, PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, gpio_mmap_fd, 0x10000000);
if (gpio_mmap_reg == MAP_FAILED) {
perror("foo");
fprintf(stderr, "failed to mmap");
gpio_mmap_reg = NULL;
close(gpio_mmap_fd);
return -1;
}
return 0;
}
int mt76x8_gpio_get_pin(int pin)
{
uint32_t tmp = 0;
/* MT7621, MT7628 */
if (pin <= 31) {
tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIODATA);
tmp = (tmp >> pin) & 1u;
} else if (pin <= 63) {
tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332DATA);
tmp = (tmp >> (pin-32)) & 1u;
} else if (pin <= 95) {
tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564DATA);
tmp = (tmp >> (pin-64)) & 1u;
tmp = (tmp >> (pin-24)) & 1u;
}
return tmp;
}
void mt76x8_gpio_set_pin_direction(int pin, int is_output)
{
uint32_t tmp;
/* MT7621, MT7628 */
if (pin <= 31) {
tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIODIR);
if (is_output)
tmp |= (1u << pin);
else
tmp &= ~(1u << pin);
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIODIR) = tmp;
} else if (pin <= 63) {
tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332DIR);
if (is_output)
tmp |= (1u << (pin-32));
else
tmp &= ~(1u << (pin-32));
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332DIR) = tmp;
} else if (pin <= 95) {
tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564DIR);
if (is_output)
tmp |= (1u << (pin-64));
else
tmp &= ~(1u << (pin-64));
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564DIR) = tmp;
}
}
void mt76x8_gpio_set_pin_value(int pin, int value)
{
uint32_t tmp;
/* MT7621, MT7628 */
if (pin <= 31) {
tmp = (1u << pin);
if (value)
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIOSET) = tmp;
else
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIORESET) = tmp;
} else if (pin <= 63) {
tmp = (1u << (pin-32));
if (value)
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332SET) = tmp;
else
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332RESET) = tmp;
} else if (pin <= 95) {
tmp = (1u << (pin-64));
if (value)
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564SET) = tmp;
else
*(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564RESET) = tmp;
}
}
#endif