/*!************************************************************************** *! *! FILE NAME : para.c *! use hqm parport *! ********************** INCLUDE FILES SECTION ******************************/ #include #include #include #include #include #include #include #include #include #include #include #ifdef __CRIS__ #include #endif #ifdef DEBUG #ifdef __CRIS__ /* for glibc debugging */ typedef void (*bozo)(char *buf); extern bozo console_print_etrax; /* from crt0.o */ #define D(x) #else #define console_print_etrax(x) { printf( "%s", x); fflush(NULL); } #define D(x) x #endif #else #define console_print_etrax(x) #define D(x) #endif #define HQM_PPORT_SET _IOW('l', 0x12, char) /********************** CONSTANT AND MACRO SECTION *************************/ static char *usage = "\nUsage: keydata \n\n -rdddddddd send digit string ddddd\n\n"; int devfd = 0; char *bit0 = "00100111111001000000110100000001100000000001000000000010100000001101111000001010100000011111"; char *bit1 = "00100111111001000000110100000001100000000001000000000010100000001100111000011010000000111111"; char *bit2 = "00100111111001000000110100000001100000000001000000000010100000001100111000011001000000111111"; char *bit3 = "00100111111001000000110100000001100000000001000000000010100000001100111000011011000000011111"; char *bit4 = "00100111111001000000110100000001100000000001000000000010100000001100111000011000100000111111"; char *bit5 = "00100111111001000000110100000001100000000001000000000010100000001100111000011010100000011111"; char *bit6 = "00100111111001000000110100000001100000000001000000000010100000001101111000001010000000111111"; char *bit7 = "00100111111001000000110100000001100000000001000000000010100000001101111000001001000000111111"; char *bit8 = "00100111111001000000110100000001100000000001000000000010100000001101111000001011000000011111"; char *bit9 = "00100111111001000000110100000001100000000001000000000010100000001101111000001000100000111111"; char *(keys[256]); /* 250 usec clock, 6.7 clocks per bit A keypress is approx 152 msec so, ten keypresses should be 1.52 sec (* 82000 (/ 1.52 2.286 )) */ #define UCLOCK 54523 /* #define UCLOCK 1675 */ #define HIGH 0xFF #define LOW 0x00 int DEMO = 0; void setbits( int bitmap ) { int val; if (DEMO) { printf("****** In DEMO mode; won't open real device\n"); } else { val = ioctl(devfd, HQM_PPORT_SET, bitmap); if (val != 0) { fprintf(stderr, "Error: ioctl returned nonzero value %d", val); exit(1); } } } /* void clock_delay (int usec) { */ struct timespec sleeper = {0, 0}; struct timespec rem = {0, 0}; void clock_delay (int usec) { /* sleeper.tv_nsec = usec; nanosleep(&sleeper, &rem); */ int i; int j = 10, k= 20; for (i = 0; i < usec; i++) { j = j+1; k = j+k; } } void send_keypad_char (char c) { char *datastr = keys[0]; char ch; switch (c) { case '0': datastr = keys[0]; break; case '1': datastr = keys[1]; break; case '2': datastr = keys[2]; break; case '3': datastr = keys[3]; break; case '4': datastr = keys[4]; break; case '5': datastr = keys[5]; break; case '6': datastr = keys[6]; break; case '7': datastr = keys[7]; break; case '8': datastr = keys[8]; break; case '9': datastr = keys[9]; break; } while (*datastr != 0) { ch = *datastr++; if (ch == '0') { setbits(LOW); } else { setbits(HIGH); } clock_delay(UCLOCK); } } void init_keydata () { keys[0] = bit0; keys[1] = bit1; keys[2] = bit2; keys[3] = bit3; keys[4] = bit4; keys[5] = bit5; keys[6] = bit6; keys[7] = bit7; keys[8] = bit8; keys[9] = bit9; } void send_single (int bits) { devfd = open("/dev/pport", O_WRONLY); if (devfd < 0) { fprintf(stderr, "Error: couldn't open /dev/pport\n"); exit(1); } setbits (bits); sleep(5); close( devfd ); } void flash (int n) { devfd = open("/dev/pport", O_WRONLY); if (devfd < 0) { fprintf(stderr, "Error: couldn't open /dev/pport\n"); exit(1); } while (n-- > 0) { setbits (0xff); clock_delay(UCLOCK * 10); setbits (0x00); clock_delay(UCLOCK * 10); } close( devfd ); } void test_pport(char *digits) { char *c = digits; struct timeval start_time; struct timeval end_time; struct timezone tz; init_keydata(); printf("Sending pport data %s\n", digits); gettimeofday(&start_time, &tz); if (DEMO) { } else { devfd = open("/dev/pport", O_WRONLY); if (devfd < 0) { fprintf(stderr, "Error: couldn't open /dev/pport\n"); exit(1); } } setbits (HIGH); clock_delay(UCLOCK * 4); while(*c != 0) { char cc = *c++; send_keypad_char(cc); } setbits (HIGH); if (DEMO) { } else { close( devfd ); } gettimeofday(&end_time, &tz); printf("start time = %ld %ld\n", start_time.tv_sec, start_time.tv_usec); printf("end time = %ld %ld\n", end_time.tv_sec, end_time.tv_usec); if (end_time.tv_usec < start_time.tv_usec) { end_time.tv_sec -= 1; end_time.tv_usec += 1000000; } printf("delta = %ld %ld", end_time.tv_sec - start_time.tv_sec , end_time.tv_usec - start_time.tv_usec); } /*#************************************************************************** *# *# FUNCTION NAME: main *# *# DESCRIPTION : check flags and calls requested functions *# *#**************************************************************************/ int main(int argc, char *argv[]) { /* check number of arg's */ if ( (argc < 2) || (argc > 3) ) { printf( usage ); exit(0); } /* check what to do */ if ( argv[1][0] != '-' ) { printf( usage ); exit(0); } if (strchr( argv[1], 'r' ) != NULL) { /* perform action */ test_pport((argv[1])+2); } else if (strchr( argv[1], 'U' ) != NULL) { /* perform action */ send_single(0xff); } else if (strchr( argv[1], 'D' ) != NULL) { /* perform action */ send_single(0x00); } else if (strchr( argv[1], 'F' ) != NULL) { /* perform action */ flash(50); } return 0; }