include #include #include #include #include #include #include #include #include #include struct sigaction osa; #define DIOBASE 0xE8000000 static unsigned char _Stop = 0; void bypass_sigint (int sig_no) { _Stop = 1; printf ("STOP CALLED. \n"); } void setupSIGInterupt () { struct sigaction sa, osa; memset (&sa, 0, sizeof (sa)); sa.sa_handler = &bypass_sigint; sigaction (SIGINT, &sa, &osa); } int main (int argc, char **argv) { setupSIGInterupt (); volatile unsigned int *PDATA; unsigned char *iostart; int fd = open ("/dev/mem", O_RDWR | O_SYNC); iostart = mmap (0, getpagesize (), PROT_READ | PROT_WRITE, MAP_SHARED, fd, DIOBASE); PDATA = (unsigned int *) (iostart + 0x04); unsigned short int diovalue = *PDATA; //only need 16 bits unsigned short int olddiovalue = diovalue; while(!_Stop) { diovalue = *PDATA; if(diovalue != olddiovalue) { olddiovalue = diovalue; printf("STATE CHANGE! %d\n", diovalue); if(diovalue ^ 0x55DC) { printf("Stop!\n"); } else { printf("Execute!\n"); } } usleep(5000); } return 0; }