sunxi_gpio 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +45 -0
- data/ext/sunxi_gpio/extconf.rb +3 -0
- data/ext/sunxi_gpio/gpio_lib.c +177 -0
- data/ext/sunxi_gpio/gpio_lib.h +160 -0
- data/ext/sunxi_gpio/gpio_lib_wrap.c +2339 -0
- data/lib/sunxi_gpio/pin.rb +145 -0
- data/lib/sunxi_gpio/pin_values.rb +65 -0
- metadata +80 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6c50611c24ebb118b677a76ef041ec5e26a65faf
|
4
|
+
data.tar.gz: 7743b9dce6dcabc6ce586d3734c832caa745ce53
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7cda901080750937c67c20de0155891e4694ed3928485bfe168f8030ce798e3a4359dc6ec97809463a1cea422fd49b0c7ccc1e3d3915ae6122221ca0d4d5b955
|
7
|
+
data.tar.gz: 9bdc783d08856e7f83ce8ed4c1dd3f4060d8a93bdfe700c4fc239ec19e533019af4772e52a328f538e7dad54077a2fd56375697998865f64593a0e64a14ef44f
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
sunxi_gpio gem
|
2
|
+
===============
|
3
|
+
|
4
|
+
Native Ruby Extension to work with Sunxi GPIO. This gem is currently **beta**. It supports writing, reading, watching.
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
## Installtion
|
9
|
+
|
10
|
+
```
|
11
|
+
gem install sunxi_gpio
|
12
|
+
```
|
13
|
+
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
### Simple writing
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
require 'sunxi_gpio/pin'
|
21
|
+
|
22
|
+
pin = SunxiGPIO::Pin.new(pin: :PB2, direction: :out)
|
23
|
+
pin.on
|
24
|
+
sleep 1
|
25
|
+
pin.off
|
26
|
+
```
|
27
|
+
|
28
|
+
|
29
|
+
### Watching
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
require 'sunxi_gpio/pin'
|
33
|
+
|
34
|
+
pin = SunxiGPIO::Pin.new(pin: :PB2, direction: :out)
|
35
|
+
|
36
|
+
pin.watch do
|
37
|
+
puts "Pin changed from #{last_value} to #{value}"
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
|
42
|
+
## Contributors
|
43
|
+
|
44
|
+
* [phortx](https://github.com/phortx)
|
45
|
+
* [happychriss](https://github.com/happychriss)
|
@@ -0,0 +1,177 @@
|
|
1
|
+
/*
|
2
|
+
* gpio_lib.c
|
3
|
+
*
|
4
|
+
* Copyright 2013 Stefan Mavrodiev <support@olimex.com>
|
5
|
+
*
|
6
|
+
* This program is free software; you can redistribute it and/or modify
|
7
|
+
* it under the terms of the GNU General Public License as published by
|
8
|
+
* the Free Software Foundation; either version 2 of the License, or
|
9
|
+
* (at your option) any later version.
|
10
|
+
*
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
* GNU General Public License for more details.
|
15
|
+
*
|
16
|
+
* You should have received a copy of the GNU General Public License
|
17
|
+
* along with this program; if not, write to the Free Software
|
18
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
* MA 02110-1301, USA.
|
20
|
+
*/
|
21
|
+
|
22
|
+
|
23
|
+
#include <ctype.h>
|
24
|
+
#include <string.h>
|
25
|
+
#include <stdlib.h>
|
26
|
+
#include <stdio.h>
|
27
|
+
#include <math.h>
|
28
|
+
#include <time.h>
|
29
|
+
#include <signal.h>
|
30
|
+
#include <sys/types.h>
|
31
|
+
#include <sys/stat.h>
|
32
|
+
#include <fcntl.h>
|
33
|
+
#include <sys/mman.h>
|
34
|
+
#include <sys/select.h>
|
35
|
+
#include <pthread.h>
|
36
|
+
#include <unistd.h>
|
37
|
+
#include <sched.h>
|
38
|
+
|
39
|
+
#include "gpio_lib.h"
|
40
|
+
|
41
|
+
|
42
|
+
unsigned int SUNXI_PIO_BASE = 0;
|
43
|
+
static volatile long int *gpio_map = NULL;
|
44
|
+
|
45
|
+
int sunxi_gpio_init(void) {
|
46
|
+
int fd;
|
47
|
+
unsigned int addr_start, addr_offset;
|
48
|
+
unsigned int PageSize, PageMask;
|
49
|
+
|
50
|
+
|
51
|
+
fd = open("/dev/mem", O_RDWR);
|
52
|
+
if(fd < 0) {
|
53
|
+
return SETUP_DEVMEM_FAIL;
|
54
|
+
}
|
55
|
+
|
56
|
+
PageSize = sysconf(_SC_PAGESIZE);
|
57
|
+
PageMask = (~(PageSize-1));
|
58
|
+
|
59
|
+
addr_start = SW_PORTC_IO_BASE & PageMask;
|
60
|
+
addr_offset = SW_PORTC_IO_BASE & ~PageMask;
|
61
|
+
|
62
|
+
gpio_map = (void *)mmap(0, PageSize*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, addr_start);
|
63
|
+
if(gpio_map == MAP_FAILED) {
|
64
|
+
return SETUP_MMAP_FAIL;
|
65
|
+
}
|
66
|
+
|
67
|
+
SUNXI_PIO_BASE = (unsigned int)gpio_map;
|
68
|
+
SUNXI_PIO_BASE += addr_offset;
|
69
|
+
|
70
|
+
close(fd);
|
71
|
+
return SETUP_OK;
|
72
|
+
}
|
73
|
+
|
74
|
+
int sunxi_gpio_set_cfgpin(unsigned int pin, unsigned int val) {
|
75
|
+
|
76
|
+
unsigned int cfg;
|
77
|
+
unsigned int bank = GPIO_BANK(pin);
|
78
|
+
unsigned int index = GPIO_CFG_INDEX(pin);
|
79
|
+
unsigned int offset = GPIO_CFG_OFFSET(pin);
|
80
|
+
|
81
|
+
if(SUNXI_PIO_BASE == 0) {
|
82
|
+
return -1;
|
83
|
+
}
|
84
|
+
|
85
|
+
struct sunxi_gpio *pio =
|
86
|
+
&((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
|
87
|
+
|
88
|
+
|
89
|
+
cfg = *(&pio->cfg[0] + index);
|
90
|
+
cfg &= ~(0xf << offset);
|
91
|
+
cfg |= val << offset;
|
92
|
+
|
93
|
+
*(&pio->cfg[0] + index) = cfg;
|
94
|
+
|
95
|
+
return 0;
|
96
|
+
}
|
97
|
+
|
98
|
+
int sunxi_gpio_get_cfgpin(unsigned int pin) {
|
99
|
+
|
100
|
+
unsigned int cfg;
|
101
|
+
unsigned int bank = GPIO_BANK(pin);
|
102
|
+
unsigned int index = GPIO_CFG_INDEX(pin);
|
103
|
+
unsigned int offset = GPIO_CFG_OFFSET(pin);
|
104
|
+
if(SUNXI_PIO_BASE == 0)
|
105
|
+
{
|
106
|
+
return -1;
|
107
|
+
}
|
108
|
+
struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
|
109
|
+
cfg = *(&pio->cfg[0] + index);
|
110
|
+
cfg >>= offset;
|
111
|
+
return (cfg & 0xf);
|
112
|
+
}
|
113
|
+
int sunxi_gpio_output(unsigned int pin, unsigned int val) {
|
114
|
+
|
115
|
+
unsigned int bank = GPIO_BANK(pin);
|
116
|
+
unsigned int num = GPIO_NUM(pin);
|
117
|
+
|
118
|
+
if(SUNXI_PIO_BASE == 0)
|
119
|
+
{
|
120
|
+
return -1;
|
121
|
+
}
|
122
|
+
struct sunxi_gpio *pio =&((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
|
123
|
+
|
124
|
+
if(val)
|
125
|
+
*(&pio->dat) |= 1 << num;
|
126
|
+
else
|
127
|
+
*(&pio->dat) &= ~(1 << num);
|
128
|
+
|
129
|
+
return 0;
|
130
|
+
}
|
131
|
+
|
132
|
+
int sunxi_gpio_input(unsigned int pin) {
|
133
|
+
|
134
|
+
unsigned int dat;
|
135
|
+
unsigned int bank = GPIO_BANK(pin);
|
136
|
+
unsigned int num = GPIO_NUM(pin);
|
137
|
+
|
138
|
+
if(SUNXI_PIO_BASE == 0)
|
139
|
+
{
|
140
|
+
return -1;
|
141
|
+
}
|
142
|
+
|
143
|
+
struct sunxi_gpio *pio =&((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
|
144
|
+
|
145
|
+
dat = *(&pio->dat);
|
146
|
+
dat >>= num;
|
147
|
+
|
148
|
+
return (dat & 0x1);
|
149
|
+
}
|
150
|
+
|
151
|
+
// http://www.cubieforums.com/index.php?topic=2881.15
|
152
|
+
int sunxi_gpio_set_pull(unsigned int pin, unsigned int val) {
|
153
|
+
unsigned int pull;
|
154
|
+
unsigned int bank = GPIO_BANK(pin);
|
155
|
+
unsigned int index = GPIO_PULL_INDEX(pin);
|
156
|
+
unsigned int offset = GPIO_PULL_OFFSET(pin);
|
157
|
+
struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
|
158
|
+
|
159
|
+
pull = *(&pio->pull[0] + index);
|
160
|
+
pull &= ~(0x3 << offset);
|
161
|
+
pull |= val << offset;
|
162
|
+
|
163
|
+
*(&pio->pull[0] + index) = pull;
|
164
|
+
|
165
|
+
return 0;
|
166
|
+
}
|
167
|
+
|
168
|
+
void sunxi_gpio_cleanup(void)
|
169
|
+
{
|
170
|
+
unsigned int PageSize;
|
171
|
+
if (gpio_map == NULL)
|
172
|
+
return;
|
173
|
+
|
174
|
+
PageSize = sysconf(_SC_PAGESIZE);
|
175
|
+
munmap((void*)gpio_map, PageSize*2);
|
176
|
+
}
|
177
|
+
|
@@ -0,0 +1,160 @@
|
|
1
|
+
#ifndef _GPIO_LIB_H_
|
2
|
+
#define _GPIO_LIB_H_
|
3
|
+
|
4
|
+
|
5
|
+
#define SW_PORTC_IO_BASE 0x01c20800
|
6
|
+
|
7
|
+
|
8
|
+
#define SUNXI_GPIO_A 0
|
9
|
+
#define SUNXI_GPIO_B 1
|
10
|
+
#define SUNXI_GPIO_C 2
|
11
|
+
#define SUNXI_GPIO_D 3
|
12
|
+
#define SUNXI_GPIO_E 4
|
13
|
+
#define SUNXI_GPIO_F 5
|
14
|
+
#define SUNXI_GPIO_G 6
|
15
|
+
#define SUNXI_GPIO_H 7
|
16
|
+
#define SUNXI_GPIO_I 8
|
17
|
+
|
18
|
+
#define SETUP_OK 0
|
19
|
+
#define SETUP_DEVMEM_FAIL 1
|
20
|
+
#define SETUP_MALLOC_FAIL 2
|
21
|
+
#define SETUP_MMAP_FAIL 3
|
22
|
+
|
23
|
+
#define HIGH 1
|
24
|
+
#define LOW 0
|
25
|
+
|
26
|
+
#define INPUT 0
|
27
|
+
#define OUTPUT 1
|
28
|
+
#define PER 2
|
29
|
+
|
30
|
+
|
31
|
+
struct sunxi_gpio {
|
32
|
+
unsigned int cfg[4];
|
33
|
+
unsigned int dat;
|
34
|
+
unsigned int drv[2];
|
35
|
+
unsigned int pull[2];
|
36
|
+
};
|
37
|
+
|
38
|
+
/* gpio interrupt control */
|
39
|
+
struct sunxi_gpio_int {
|
40
|
+
unsigned int cfg[3];
|
41
|
+
unsigned int ctl;
|
42
|
+
unsigned int sta;
|
43
|
+
unsigned int deb;
|
44
|
+
};
|
45
|
+
|
46
|
+
struct sunxi_gpio_reg {
|
47
|
+
struct sunxi_gpio gpio_bank[9];
|
48
|
+
unsigned char res[0xbc];
|
49
|
+
struct sunxi_gpio_int gpio_int;
|
50
|
+
};
|
51
|
+
|
52
|
+
#define GPIO_BANK(pin) ((pin) >> 5)
|
53
|
+
#define GPIO_NUM(pin) ((pin) & 0x1F)
|
54
|
+
|
55
|
+
#define GPIO_CFG_INDEX(pin) (((pin) & 0x1F) >> 3)
|
56
|
+
#define GPIO_CFG_OFFSET(pin) ((((pin) & 0x1F) & 0x7) << 2)
|
57
|
+
|
58
|
+
#define GPIO_PULL_INDEX(pin) (((pin) & 0x1F) >> 4)
|
59
|
+
#define GPIO_PULL_OFFSET(pin) ((((pin) & 0x1F) & 0xf) << 1)
|
60
|
+
|
61
|
+
|
62
|
+
/* GPIO bank sizes */
|
63
|
+
#define SUNXI_GPIO_A_NR (32)
|
64
|
+
#define SUNXI_GPIO_B_NR (32)
|
65
|
+
#define SUNXI_GPIO_C_NR (32)
|
66
|
+
#define SUNXI_GPIO_D_NR (32)
|
67
|
+
#define SUNXI_GPIO_E_NR (32)
|
68
|
+
#define SUNXI_GPIO_F_NR (32)
|
69
|
+
#define SUNXI_GPIO_G_NR (32)
|
70
|
+
#define SUNXI_GPIO_H_NR (32)
|
71
|
+
#define SUNXI_GPIO_I_NR (32)
|
72
|
+
|
73
|
+
#define SUNXI_GPIO_NEXT(__gpio) ((__gpio##_START)+(__gpio##_NR)+0)
|
74
|
+
|
75
|
+
enum sunxi_gpio_number {
|
76
|
+
SUNXI_GPIO_A_START = 0,
|
77
|
+
SUNXI_GPIO_B_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_A), //32
|
78
|
+
SUNXI_GPIO_C_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_B), //64
|
79
|
+
SUNXI_GPIO_D_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_C), //96
|
80
|
+
SUNXI_GPIO_E_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_D), //128
|
81
|
+
SUNXI_GPIO_F_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_E), //160
|
82
|
+
SUNXI_GPIO_G_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_F), //192
|
83
|
+
SUNXI_GPIO_H_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_G), //224
|
84
|
+
SUNXI_GPIO_I_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_H) //256
|
85
|
+
};
|
86
|
+
|
87
|
+
/* SUNXI GPIO number definitions */
|
88
|
+
#define SUNXI_GPA(_nr) (SUNXI_GPIO_A_START + (_nr))
|
89
|
+
#define SUNXI_GPB(_nr) (SUNXI_GPIO_B_START + (_nr))
|
90
|
+
#define SUNXI_GPC(_nr) (SUNXI_GPIO_C_START + (_nr))
|
91
|
+
#define SUNXI_GPD(_nr) (SUNXI_GPIO_D_START + (_nr))
|
92
|
+
#define SUNXI_GPE(_nr) (SUNXI_GPIO_E_START + (_nr))
|
93
|
+
#define SUNXI_GPF(_nr) (SUNXI_GPIO_F_START + (_nr))
|
94
|
+
#define SUNXI_GPG(_nr) (SUNXI_GPIO_G_START + (_nr))
|
95
|
+
#define SUNXI_GPH(_nr) (SUNXI_GPIO_H_START + (_nr))
|
96
|
+
#define SUNXI_GPI(_nr) (SUNXI_GPIO_I_START + (_nr))
|
97
|
+
|
98
|
+
/* GPIO pin function config */
|
99
|
+
|
100
|
+
#define SUNXI_GPIO_INPUT (0)
|
101
|
+
#define SUNXI_GPIO_OUTPUT (1)
|
102
|
+
#define SUNXI_GPIO_PER (2)
|
103
|
+
|
104
|
+
#define SUNXI_GPA0_ERXD3 (2)
|
105
|
+
#define SUNXI_GPA0_SPI1_CS0 (3)
|
106
|
+
#define SUNXI_GPA0_UART2_RTS (4)
|
107
|
+
|
108
|
+
#define SUNXI_GPA1_ERXD2 (2)
|
109
|
+
#define SUNXI_GPA1_SPI1_CLK (3)
|
110
|
+
#define SUNXI_GPA1_UART2_CTS (4)
|
111
|
+
|
112
|
+
#define SUNXI_GPA2_ERXD1 (2)
|
113
|
+
#define SUNXI_GPA2_SPI1_MOSI (3)
|
114
|
+
#define SUNXI_GPA2_UART2_TX (4)
|
115
|
+
|
116
|
+
#define SUNXI_GPA10_UART1_TX (4)
|
117
|
+
#define SUNXI_GPA11_UART1_RX (4)
|
118
|
+
|
119
|
+
#define SUN4I_GPB22_UART0_TX (2)
|
120
|
+
#define SUN4I_GPB23_UART0_RX (2)
|
121
|
+
|
122
|
+
#define SUN5I_GPG3_UART0_TX (4)
|
123
|
+
#define SUN5I_GPG4_UART0_RX (4)
|
124
|
+
|
125
|
+
#define SUNXI_GPC2_NCLE (2)
|
126
|
+
#define SUNXI_GPC2_SPI0_CLK (3)
|
127
|
+
|
128
|
+
#define SUNXI_GPC6_NRB0 (2)
|
129
|
+
#define SUNXI_GPC6_SDC2_CMD (3)
|
130
|
+
|
131
|
+
#define SUNXI_GPC7_NRB1 (2)
|
132
|
+
#define SUNXI_GPC7_SDC2_CLK (3)
|
133
|
+
|
134
|
+
#define SUNXI_GPC8_NDQ0 (2)
|
135
|
+
#define SUNXI_GPC8_SDC2_D0 (3)
|
136
|
+
|
137
|
+
#define SUNXI_GPC9_NDQ1 (2)
|
138
|
+
#define SUNXI_GPC9_SDC2_D1 (3)
|
139
|
+
|
140
|
+
#define SUNXI_GPC10_NDQ2 (2)
|
141
|
+
#define SUNXI_GPC10_SDC2_D2 (3)
|
142
|
+
|
143
|
+
#define SUNXI_GPC11_NDQ3 (2)
|
144
|
+
#define SUNXI_GPC11_SDC2_D3 (3)
|
145
|
+
|
146
|
+
#define SUNXI_GPF2_SDC0_CLK (2)
|
147
|
+
#define SUNXI_GPF2_UART0_TX (4)
|
148
|
+
|
149
|
+
#define SUNXI_GPF4_SDC0_D3 (2)
|
150
|
+
#define SUNXI_GPF4_UART0_RX (4)
|
151
|
+
|
152
|
+
extern int sunxi_gpio_input(unsigned int pin);
|
153
|
+
extern int sunxi_gpio_init(void);
|
154
|
+
extern int sunxi_gpio_set_cfgpin(unsigned int pin, unsigned int val);
|
155
|
+
extern int sunxi_gpio_get_cfgpin(unsigned int pin);
|
156
|
+
extern int sunxi_gpio_output(unsigned int pin, unsigned int val);
|
157
|
+
extern void sunxi_gpio_cleanup(void);
|
158
|
+
extern int sunxi_gpio_set_pull(unsigned int pin, unsigned int val);
|
159
|
+
extern unsigned int SUNXI_PIO_BASE;
|
160
|
+
#endif
|