blob: c6d0179d8f72332a1cec9577f2a89ce05e8264a8 (
plain)
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
|
#include "u.h"
#include "mem.h"
#include "../port/lib.h"
#include "dat.h"
#include "fns.h"
#include "io.h"
static ulong gpioreserved;
static Lock gpiolock;
void
gpioreserve(int n)
{
ulong mask;
mask = 1<<n;
ilock(&gpiolock);
if(gpioreserved & mask)
panic("gpioreserve: duplicate use of GPIO %d", n);
gpioreserved |= mask;
iunlock(&gpiolock);
}
/*
* set direction and alternative function bits in the GPIO control register,
* following the configuration bits in cfg.
*/
void
gpioconfig(int n, ulong cfg)
{
GpioReg *g;
ilock(&gpiolock);
g = GPIOREG;
if(cfg & Gpio_out)
g->iopm |= 1<<n;
else
g->iopm &= ~(1<<n);
iunlock(&gpiolock);
}
ulong
gpioget(int n)
{
return GPIOREG->iopd & (1<<n);
}
void
gpioset(int n, int v)
{
GpioReg *g;
ulong mask;
mask = 1<<n;
ilock(&gpiolock);
g = GPIOREG;
if(v)
g->iopd |= mask;
else
g->iopd &= ~mask;
iunlock(&gpiolock);
}
void
gpiorelease(int n)
{
ulong mask;
mask = 1<<n;
ilock(&gpiolock);
if((gpioreserved & mask) != mask)
panic("gpiorelease: unexpected release of GPIO %d", n);
gpioreserved &= ~mask;
iunlock(&gpiolock);
}
|