mirror of https://github.com/CIRCL/Circlean
Remove led related stuff
parent
0d3e3d4ce5
commit
deca259529
|
@ -1,2 +0,0 @@
|
||||||
led: led.c
|
|
||||||
gcc -ggdb -o led led.c
|
|
|
@ -1,81 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
/* GPIO registers address */
|
|
||||||
#define BCM2708_PERI_BASE 0x20000000
|
|
||||||
#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */
|
|
||||||
#define BLOCK_SIZE (256)
|
|
||||||
|
|
||||||
/* GPIO setup macros. Always use GPIO_IN(x) before using GPIO_OUT(x) or GPIO_ALT(x,y) */
|
|
||||||
#define GPIO_IN(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
|
|
||||||
#define GPIO_OUT(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3))
|
|
||||||
#define GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
|
|
||||||
|
|
||||||
#define GPIO_SET(g) *(gpio+7) = 1<<(g) /* sets bit which are 1, ignores bit which are 0 */
|
|
||||||
#define GPIO_CLR(g) *(gpio+10) = 1<<(g) /* clears bit which are 1, ignores bit which are 0 */
|
|
||||||
#define GPIO_LEV(g) (*(gpio+13) >> (g)) & 0x00000001
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define GPIO_4 4
|
|
||||||
|
|
||||||
int mem_fd;
|
|
||||||
void *gpio_map;
|
|
||||||
volatile uint32_t *gpio;
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
int i;
|
|
||||||
/* open /dev/mem */
|
|
||||||
mem_fd = open("/dev/mem", O_RDWR|O_SYNC);
|
|
||||||
if (mem_fd == -1) {
|
|
||||||
perror("Cannot open /dev/mem");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* mmap GPIO */
|
|
||||||
gpio_map = mmap(NULL, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO_BASE);
|
|
||||||
if (gpio_map == MAP_FAILED) {
|
|
||||||
perror("mmap() failed");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
/* Always use volatile pointer! */
|
|
||||||
gpio = (volatile uint32_t *)gpio_map;
|
|
||||||
|
|
||||||
|
|
||||||
GPIO_IN(GPIO_4); /* must use GPIO_IN before we can use GPIO_OUT */
|
|
||||||
GPIO_OUT(GPIO_4);
|
|
||||||
|
|
||||||
//Turn on led
|
|
||||||
while (1) {
|
|
||||||
//printf("Enable LED\n");
|
|
||||||
GPIO_SET(GPIO_4);
|
|
||||||
usleep(1000000);
|
|
||||||
//printf("Disable GPIO\n"); // Does not seem to work?
|
|
||||||
//GPIO_CLR(GPIO_4);
|
|
||||||
//usleep(1000000);
|
|
||||||
}
|
|
||||||
/* Free up ressources */
|
|
||||||
/* munmap GPIO */
|
|
||||||
ret = munmap(gpio_map, BLOCK_SIZE);
|
|
||||||
if (ret == -1) {
|
|
||||||
perror("munmap() failed");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
/* close /dev/mem */
|
|
||||||
ret = close(mem_fd);
|
|
||||||
if (ret == -1) {
|
|
||||||
perror("Cannot close /dev/mem");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
ledBtn: ledBtn.c
|
|
||||||
gcc -o ledBtn ledBtn.c
|
|
|
@ -1,282 +0,0 @@
|
||||||
/***************************************************************************************/
|
|
||||||
/* */
|
|
||||||
/* file : ledBtn.c */
|
|
||||||
/* */
|
|
||||||
/* synopsis : */
|
|
||||||
/* the compiled code should be ran with root privileges to allow for access to */
|
|
||||||
/* the GPIO pins through direct GPIO register manipulation in C-code. */
|
|
||||||
/* After initialization, the code update the LEDs status according to the commands */
|
|
||||||
/* passed on std input (using a pipe). */
|
|
||||||
/* It also monitors the push-button and triggers a reboot sequence */
|
|
||||||
/* when it is depressed. */
|
|
||||||
/* */
|
|
||||||
/* */
|
|
||||||
/* This code is based on examples from */
|
|
||||||
/* http://elinux.org/RPi_Low-level_peripherals#C */
|
|
||||||
/* How to access GPIO registers from C-code on the Raspberry-Pi, Example program */
|
|
||||||
/* Dom and Gert, 15-January-2012, Revised: 15-Feb-2013 */
|
|
||||||
/* */
|
|
||||||
/* and from Raphael Vinot (CIRCL.lu) */
|
|
||||||
/* */
|
|
||||||
/* v 1.00 - 22/02/2015 - initial release (Marc Durvaux) */
|
|
||||||
/* v 1.10 - 27/02/2015 - added 'z' command for debugging, improved handling of */
|
|
||||||
/* concateneted command sequences */
|
|
||||||
/* */
|
|
||||||
/* */
|
|
||||||
/* */
|
|
||||||
/***************************************************************************************/
|
|
||||||
|
|
||||||
// Includes
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
// Constant for low-level access to GPIO
|
|
||||||
#define BCM2708_PERI_BASE 0x20000000
|
|
||||||
#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */
|
|
||||||
#define BLOCK_SIZE (4*1024)
|
|
||||||
|
|
||||||
// global variables related to GPIO
|
|
||||||
int mem_fd ;
|
|
||||||
void *gpio_map ;
|
|
||||||
volatile unsigned *gpio ; // I/O access
|
|
||||||
|
|
||||||
// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y)
|
|
||||||
#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
|
|
||||||
#define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3))
|
|
||||||
#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
|
|
||||||
|
|
||||||
#define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0
|
|
||||||
#define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0
|
|
||||||
|
|
||||||
#define GET_GPIO(g) (*(gpio+13)&(1<<g)) // 0 if LOW, (1<<g) if HIGH
|
|
||||||
|
|
||||||
#define GPIO_PULL *(gpio+37) // Pull up/pull down
|
|
||||||
#define GPIO_PULLCLK0 *(gpio+38) // Pull up/pull down clock
|
|
||||||
|
|
||||||
// LED and push-button GPIO pin mapping (from schematic)
|
|
||||||
#define GREEN_LED 17
|
|
||||||
#define YELLOW_LED 18
|
|
||||||
#define RED_LED 22
|
|
||||||
#define PUSHBUTTON 23
|
|
||||||
|
|
||||||
// Time tic (in nsec) for loops : 10 ms
|
|
||||||
#define TIME_TIC 10000000L
|
|
||||||
// Blink half-period in tics
|
|
||||||
#define MAX_COUNT 30
|
|
||||||
// Button long pression threshold
|
|
||||||
#define LONG_PUSH 300
|
|
||||||
|
|
||||||
|
|
||||||
// forward declaration of functions
|
|
||||||
void setup_io() ;
|
|
||||||
void do_reboot() ;
|
|
||||||
|
|
||||||
/***************************************************************************************/
|
|
||||||
//
|
|
||||||
// main
|
|
||||||
// input : path and name of the FIFO must be passed as 1st argument
|
|
||||||
//
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int fd, nbytes ;
|
|
||||||
int state, count, repeat_count ;
|
|
||||||
int Btn_state, Btn_prev_state, Btn_press_count ;
|
|
||||||
char code ;
|
|
||||||
|
|
||||||
state = 0 ; // initialize state variable
|
|
||||||
count = 0 ; // initialize loop counter
|
|
||||||
repeat_count = 0 ;
|
|
||||||
code = 0 ;
|
|
||||||
|
|
||||||
setup_io() ; // initialize GPIO pointer and GPIO pins
|
|
||||||
Btn_state = GET_GPIO( PUSHBUTTON) ; // get push-button initial state
|
|
||||||
Btn_prev_state = Btn_state ;
|
|
||||||
Btn_press_count = 0 ;
|
|
||||||
|
|
||||||
fd = open(argv[1], O_RDONLY) ;
|
|
||||||
if (fd < 0) {
|
|
||||||
perror("open") ;
|
|
||||||
exit (2) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
Btn_state = GET_GPIO( PUSHBUTTON) ;
|
|
||||||
if (Btn_state != 0) { // button released
|
|
||||||
Btn_press_count = 0 ; // reset counter
|
|
||||||
} else { // button pressed
|
|
||||||
Btn_press_count++ ;
|
|
||||||
if (Btn_state != Btn_prev_state) {
|
|
||||||
//printf("Button pressed!\n");
|
|
||||||
if (state >= 4) { // final state, immediate reboot
|
|
||||||
close(fd) ;
|
|
||||||
do_reboot() ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Btn_press_count == LONG_PUSH) { // trigger forced reboot
|
|
||||||
state = 10 ; // LED animation before reboot
|
|
||||||
repeat_count = 0 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Btn_prev_state = Btn_state ;
|
|
||||||
|
|
||||||
nbytes = read(fd, &code, 1) ;
|
|
||||||
if (nbytes < 0) {
|
|
||||||
perror("read") ;
|
|
||||||
exit (2) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nbytes > 0) {
|
|
||||||
switch (code) { // codes evaluated at every tic
|
|
||||||
case 'z' : // clear without restart (for debugging)
|
|
||||||
GPIO_CLR = 1<<GREEN_LED ;
|
|
||||||
GPIO_CLR = 1<<YELLOW_LED ;
|
|
||||||
GPIO_CLR = 1<<RED_LED ;
|
|
||||||
state = 0 ;
|
|
||||||
break ;
|
|
||||||
case 'r' : // Ready
|
|
||||||
GPIO_SET = 1<<GREEN_LED ;
|
|
||||||
state = 1 ;
|
|
||||||
break ;
|
|
||||||
case 'p' : // Processing
|
|
||||||
GPIO_CLR = 1<<GREEN_LED ;
|
|
||||||
GPIO_SET = 1<<YELLOW_LED ;
|
|
||||||
state = 2 ;
|
|
||||||
break ;
|
|
||||||
case 'e' : // Error (process aborted)
|
|
||||||
GPIO_CLR = 1<<GREEN_LED ;
|
|
||||||
GPIO_CLR = 1<<YELLOW_LED ;
|
|
||||||
GPIO_SET = 1<<RED_LED ;
|
|
||||||
state = 6 ;
|
|
||||||
break ;
|
|
||||||
case 'c' : // task successfully completed
|
|
||||||
GPIO_CLR = 1<<YELLOW_LED ;
|
|
||||||
GPIO_SET = 1<<GREEN_LED ;
|
|
||||||
state = 4 ;
|
|
||||||
count = 0 ;
|
|
||||||
break ;
|
|
||||||
case 'f' : // file processing successfully completed
|
|
||||||
GPIO_SET = 1<<GREEN_LED ;
|
|
||||||
state = 3 ;
|
|
||||||
count = 0 ;
|
|
||||||
break ;
|
|
||||||
} // end switch
|
|
||||||
}
|
|
||||||
|
|
||||||
count++ ;
|
|
||||||
if (count >= MAX_COUNT) {
|
|
||||||
count = 0 ;
|
|
||||||
|
|
||||||
switch (state) { // states evaluated after MAX_COUNT tics
|
|
||||||
case 3 : // green LED flash OFF
|
|
||||||
GPIO_CLR = 1<<GREEN_LED ;
|
|
||||||
state = 2 ;
|
|
||||||
break ;
|
|
||||||
case 4 : // green LED blinks OFF
|
|
||||||
GPIO_CLR = 1<<GREEN_LED ;
|
|
||||||
state = 5 ;
|
|
||||||
break ;
|
|
||||||
case 5 : // green LED blinks ON
|
|
||||||
GPIO_SET = 1<<GREEN_LED ;
|
|
||||||
state = 4 ;
|
|
||||||
break ;
|
|
||||||
case 10 : // start LED animation before reboot
|
|
||||||
GPIO_SET = 1<<GREEN_LED ;
|
|
||||||
GPIO_SET = 1<<YELLOW_LED ;
|
|
||||||
GPIO_SET = 1<<RED_LED ;
|
|
||||||
state = 11 ;
|
|
||||||
break ;
|
|
||||||
case 11 : // LED animation before reboot
|
|
||||||
GPIO_CLR = 1<<GREEN_LED ;
|
|
||||||
GPIO_CLR = 1<<YELLOW_LED ;
|
|
||||||
GPIO_CLR = 1<<RED_LED ;
|
|
||||||
repeat_count++ ;
|
|
||||||
if (repeat_count > 5) {
|
|
||||||
state = 12 ;
|
|
||||||
} else {
|
|
||||||
state = 10 ;
|
|
||||||
}
|
|
||||||
break ;
|
|
||||||
case 12 : // proceed with reboot
|
|
||||||
close(fd) ;
|
|
||||||
do_reboot() ;
|
|
||||||
break ;
|
|
||||||
} // end switch
|
|
||||||
} // end if
|
|
||||||
|
|
||||||
// loop delay
|
|
||||||
nanosleep((struct timespec[]){{0, TIME_TIC}}, NULL) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0 ; // we should never come here!
|
|
||||||
} // main
|
|
||||||
|
|
||||||
/***************************************************************************************/
|
|
||||||
//
|
|
||||||
// Set up a memory region to access 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 ;
|
|
||||||
|
|
||||||
// initializes the LED and push-button pins
|
|
||||||
INP_GPIO( GREEN_LED) ; // must use INP_GPIO before we can use OUT_GPIO
|
|
||||||
OUT_GPIO( GREEN_LED) ;
|
|
||||||
INP_GPIO( YELLOW_LED) ;
|
|
||||||
OUT_GPIO( YELLOW_LED) ;
|
|
||||||
INP_GPIO( RED_LED) ;
|
|
||||||
OUT_GPIO( RED_LED) ;
|
|
||||||
INP_GPIO( PUSHBUTTON) ;
|
|
||||||
|
|
||||||
// initializes LEDs to OFF state
|
|
||||||
GPIO_CLR = 1<<GREEN_LED ;
|
|
||||||
GPIO_CLR = 1<<YELLOW_LED ;
|
|
||||||
GPIO_CLR = 1<<RED_LED ;
|
|
||||||
|
|
||||||
} // setup_io
|
|
||||||
|
|
||||||
/***************************************************************************************/
|
|
||||||
//
|
|
||||||
// Call system reboot
|
|
||||||
//
|
|
||||||
void do_reboot() {
|
|
||||||
static char *execArgv[5] ; /* define arguments for shutdown exec */
|
|
||||||
|
|
||||||
execArgv[0] = "shutdown" ;
|
|
||||||
execArgv[1] = "-r" ;
|
|
||||||
execArgv[2] = "now" ;
|
|
||||||
execArgv[3] = NULL ;
|
|
||||||
|
|
||||||
//printf("going to reboot!\n") ;
|
|
||||||
execv("/sbin/shutdown", execArgv) ;
|
|
||||||
} // do_reboot
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*** END OF FILE ***********************************************************************/
|
|
|
@ -1,27 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
FIFO="/tmp/ledBtnFIFO"
|
|
||||||
#mkfifo $FIFO
|
|
||||||
|
|
||||||
#sudo ./ledBtn $FIFO
|
|
||||||
|
|
||||||
# send command "READY"
|
|
||||||
echo "r" > $FIFO
|
|
||||||
#sleep 1
|
|
||||||
# send command "PROCESSING"
|
|
||||||
echo "p" > $FIFO
|
|
||||||
sleep 1
|
|
||||||
# send command "FILE processed"
|
|
||||||
echo "f" > $FIFO
|
|
||||||
sleep 3
|
|
||||||
# send command "FILE processed"
|
|
||||||
echo "f" > $FIFO
|
|
||||||
sleep 3
|
|
||||||
# send command "processing successfully COMPLETED"
|
|
||||||
echo "c" > $FIFO
|
|
||||||
sleep 2
|
|
||||||
# send command "ZERO (clear display and return state to 0)"
|
|
||||||
echo "z" > $FIFO
|
|
||||||
sleep 2
|
|
||||||
# send command "ERROR"
|
|
||||||
echo "e" > $FIFO
|
|
||||||
|
|
Loading…
Reference in New Issue