-
Notifications
You must be signed in to change notification settings - Fork 27
/
PJ_RPI.c
89 lines (70 loc) · 2.13 KB
/
PJ_RPI.c
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
#include "PJ_RPI.h"
struct bcm2835_peripheral gpio = {GPIO_BASE};
struct bcm2835_peripheral bsc0 = {BSC0_BASE};
// Exposes the physical address defined in the passed structure using mmap on /dev/mem
int map_peripheral(struct bcm2835_peripheral *p)
{
// Open /dev/mem
if ((p->mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
printf("Failed to open /dev/mem, try checking permissions.\n");
return -1;
}
p->map = mmap(
NULL,
BLOCK_SIZE,
PROT_READ|PROT_WRITE,
MAP_SHARED,
p->mem_fd, // File descriptor to physical memory virtual file '/dev/mem'
p->addr_p // Address in physical map that we want this memory block to expose
);
if (p->map == MAP_FAILED) {
perror("mmap");
return -1;
}
p->addr = (volatile unsigned int *)p->map;
return 0;
}
void unmap_peripheral(struct bcm2835_peripheral *p) {
munmap(p->map, BLOCK_SIZE);
close(p->mem_fd);
}
void dump_bsc_status() {
unsigned int s = BSC0_S;
printf("BSC0_S: ERR=%d RXF=%d TXE=%d RXD=%d TXD=%d RXR=%d TXW=%d DONE=%d TA=%d\n",
(s & BSC_S_ERR) != 0,
(s & BSC_S_RXF) != 0,
(s & BSC_S_TXE) != 0,
(s & BSC_S_RXD) != 0,
(s & BSC_S_TXD) != 0,
(s & BSC_S_RXR) != 0,
(s & BSC_S_TXW) != 0,
(s & BSC_S_DONE) != 0,
(s & BSC_S_TA) != 0 );
}
// Function to wait for the I2C transaction to complete
void wait_i2c_done() {
//Wait till done, let's use a timeout just in case
int timeout = 50;
while((!((BSC0_S) & BSC_S_DONE)) && --timeout) {
usleep(1000);
}
if(timeout == 0)
printf("wait_i2c_done() timeout. Something went wrong.\n");
}
void i2c_init()
{
INP_GPIO(0);
SET_GPIO_ALT(0, 0);
INP_GPIO(1);
SET_GPIO_ALT(1, 0);
}
// Priority
int SetProgramPriority(int priorityLevel)
{
struct sched_param sched;
memset (&sched, 0, sizeof(sched));
if (priorityLevel > sched_get_priority_max (SCHED_RR))
priorityLevel = sched_get_priority_max (SCHED_RR);
sched.sched_priority = priorityLevel;
return sched_setscheduler (0, SCHED_RR, &sched);
}