|
@@ -11,6 +11,47 @@
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
+#ifdef ARM
|
|
|
|
+
|
|
|
|
+ int mem_fd;
|
|
|
|
+ void *gpio_map;
|
|
|
|
+
|
|
|
|
+ // I/O access
|
|
|
|
+ volatile unsigned *gpio;
|
|
|
|
+
|
|
|
|
+ void setup_io()
|
|
|
|
+ {
|
|
|
|
+ /* open /dev/mem */
|
|
|
|
+ if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
|
|
|
|
+ printf("can't open /dev/mem \n");
|
|
|
|
+ exit(-1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* mmap GPIO */
|
|
|
|
+ gpio_map = mmap(
|
|
|
|
+ NULL, //Any adddress in our space will do
|
|
|
|
+ BLOCK_SIZE, //Map length
|
|
|
|
+ PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory
|
|
|
|
+ MAP_SHARED, //Shared with other processes
|
|
|
|
+ mem_fd, //File to map
|
|
|
|
+ GPIO_BASE //Offset to GPIO peripheral
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ close(mem_fd); //No need to keep mem_fd open after mmap
|
|
|
|
+
|
|
|
|
+ if (gpio_map == MAP_FAILED) {
|
|
|
|
+ printf("mmap error %d\n", (int)gpio_map);//errno also set!
|
|
|
|
+ exit(-1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Always use volatile pointer!
|
|
|
|
+ gpio = (volatile unsigned *)gpio_map;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ } // setup_io
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
void write_pin(int pin, int value)
|
|
void write_pin(int pin, int value)
|
|
{
|
|
{
|
|
#ifdef __linux__
|
|
#ifdef __linux__
|
|
@@ -18,7 +59,7 @@ void write_pin(int pin, int value)
|
|
char c = (value)?'1':'0';
|
|
char c = (value)?'1':'0';
|
|
write(fifos[pin], &c, 1);
|
|
write(fifos[pin], &c, 1);
|
|
#else
|
|
#else
|
|
- digitalWrite(pin, value);
|
|
|
|
|
|
+ GPIO_WRITE(pin, value);
|
|
#endif
|
|
#endif
|
|
#else
|
|
#else
|
|
digitalWrite(pin, value);
|
|
digitalWrite(pin, value);
|
|
@@ -34,7 +75,7 @@ int read_pin(int pin)
|
|
while(read(fifos[pin], &c,1)<=0)usleep(10);
|
|
while(read(fifos[pin], &c,1)<=0)usleep(10);
|
|
return (c=='0')?0:1;
|
|
return (c=='0')?0:1;
|
|
#else
|
|
#else
|
|
- return digitalRead(pin);
|
|
|
|
|
|
+ return GET_GPIO(pin);
|
|
#endif
|
|
#endif
|
|
#else
|
|
#else
|
|
return digitalRead(pin);
|
|
return digitalRead(pin);
|
|
@@ -49,9 +90,9 @@ void init_read_pin(int d, int clk, int ack)
|
|
fifos[clk]=open("/tmp/fifoclk", O_RDONLY | O_NONBLOCK);
|
|
fifos[clk]=open("/tmp/fifoclk", O_RDONLY | O_NONBLOCK);
|
|
fifos[ack]=open("/tmp/fifoack", O_WRONLY );
|
|
fifos[ack]=open("/tmp/fifoack", O_WRONLY );
|
|
#else
|
|
#else
|
|
- pinMode(d, INPUT);
|
|
|
|
- pinMode(clk, INPUT);
|
|
|
|
- pinMode(ack, OUTPUT);
|
|
|
|
|
|
+ INP_GPIO(d);
|
|
|
|
+ INP_GPIO(clk);
|
|
|
|
+ OUT_GPIO(ack);
|
|
#endif
|
|
#endif
|
|
#else
|
|
#else
|
|
pinMode(d, INPUT);
|
|
pinMode(d, INPUT);
|
|
@@ -67,9 +108,9 @@ void init_write_pin(int d, int clk, int ack)
|
|
fifos[clk]=open("/tmp/fifodata", O_WRONLY);
|
|
fifos[clk]=open("/tmp/fifodata", O_WRONLY);
|
|
fifos[ack]=open("/tmp/fifoclk", O_WRONLY);
|
|
fifos[ack]=open("/tmp/fifoclk", O_WRONLY);
|
|
#else
|
|
#else
|
|
- pinMode(d, OUTPUT);
|
|
|
|
- pinMode(clk, OUTPUT);
|
|
|
|
- pinMode(ack, INPUT);
|
|
|
|
|
|
+ OUT_GPIO(d);
|
|
|
|
+ OUT_GPIO(clk);
|
|
|
|
+ INP_GPIO(ack);
|
|
#endif
|
|
#endif
|
|
#else
|
|
#else
|
|
pinMode(d, OUTPUT);
|
|
pinMode(d, OUTPUT);
|