//헤더파일 #include <sys/signal.h> #include <sys/types.h> #include <sys/mman.h> #include <fcntl.h> #include <asm/ioctls.h> #include <termios.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> //key_define #define KEY_NUM1 1 #define KEY_NUM2 2 #define KEY_NUM3 3 #define KEY_NUM4 4 #define KEY_NUM5 5 #define KEY_NUM6 6 #define KEY_NUM7 7 #define KEY_NUM8 8 #define KEY_NUM9 9 #define KEY_NUM10 10 #define KEY_NUM11 11 #define KEY_NUM12 12 #define KEY_NUM13 13 #define KEY_NUM14 14 #define KEY_NUM15 15 #define KEY_NUM16 16 //clcd phy_addr #define ADDRLCD 0x12380000 #define ADDRLCD_CMD 0x12300000 //fnd phy_addr #define FPGA_FND_CS0 (0x11000000) #define FPGA_FND_CS1 (0x11100000) #define FPGA_FND_CS2 (0x11200000) #define FPGA_FND_CS3 (0x11300000) #define FPGA_FND_CS4 (0x11400000) #define FPGA_FND_CS5 (0x11500000) #define FPGA_FND_CS6 (0x11600000) #define FPGA_FND_CS7 (0x11700000) //fnd size #define MAXFND 8 //debug...printf #define dbg(x...) printf(x) #define FALSE 0 #define TRUE 1 //key_file static char keyDev[] = "/dev/key"; static int keyFd = (-1); //mem_file static char MemDev[] = "/dev/mem"; static int MemFd = (-1); //fnd_file static char FndDev[] = "/dev/fnd"; static int FndFd = (-1); //clcd_mmap_addr unsigned short *pTextlcd; unsigned short *pTextlcd_cmd; unsigned short *pFnd0; unsigned short *pFnd1; unsigned short *pFnd2; unsigned short *pFnd3; unsigned short *pFnd4; unsigned short *pFnd5; unsigned short *pFnd6; unsigned short *pFnd7; unsigned short *p; //3bit setting void setcommand(unsigned short command) { command &= 0x00FF; *pTextlcd_cmd = command|0x0000; *pTextlcd_cmd = command|0x0400; *pTextlcd_cmd = command|0x0000; usleep(50); } //bit write void writeb(char ch) { unsigned short data; data = ch & 0x00FF; *pTextlcd = data|0x100; *pTextlcd = data|0x500; *pTextlcd = data|0x100; usleep(50); } //clcd init void init_clcd() { //8bit 2line , error prevent three apply setcommand(0x38); setcommand(0x38); setcommand(0x38); //display cusor_on setcommand(0x0e); //cusor_home setcommand(0x02); //cls setcommand(0x01); usleep(2000); } void left_cusor(){ setcommand(0x10); usleep(50); } void right_cusor(){ setcommand(0x14); usleep(50); } void init_fnd(){ *pFnd7 = 0x00; *pFnd6 = 0x00; *pFnd5 = 0x00; *pFnd4 = 0x00; *pFnd3 = 0x00; *pFnd2 = 0x00; *pFnd1 = 0x00; *pFnd0 = 0x00; } void caps_mod(int cmod){ if(cmod == FALSE){ *pFnd7 = 0x39; *pFnd6 = 0x77; *pFnd5 = 0x73; *pFnd4 = 0x6d; }else{ *pFnd7 = 0x00; *pFnd6 = 0x00; *pFnd5 = 0x00; *pFnd4 = 0x00; } } void ins_mod(int imod){ if(imod == FALSE){ *pFnd2 = 0x06; *pFnd1 = 0x54; *pFnd0 = 0x6d; }else{ *pFnd2 = 0x00; *pFnd1 = 0x00; *pFnd0 = 0x00; } } //key_distinction unsigned char key_get(int tmo){ unsigned char b; if (tmo) { if (tmo < 0) tmo = ~tmo * 1000; else tmo *= 1000000; while (tmo > 0) { usleep(100000); ioctl(keyFd, FIONREAD, &b); if (b) return(b); tmo -= 10000; } return(-1); /* timeout */ } else { read(keyFd, &b, sizeof(b)); return(b); } } int main() { unsigned char c; unsigned char temp; unsigned int len1=0; int key_count = 0; int cusor_count=FALSE; int del_count = FALSE; char buf1[15]={' '}; int imod = FALSE; int cmod = FALSE; int pos = 0; int line1 = TRUE; int line2 = FALSE; int firsttime = TRUE; //driver_open MemFd = open( MemDev, O_RDWR|O_SYNC); keyFd = open( keyDev, O_RDONLY ); FndFd = open( FndDev, O_RDWR); //clcd_mmap pTextlcd = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, ADDRLCD); pTextlcd_cmd = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, ADDRLCD_CMD); //fnd_mmap pFnd0 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS0); pFnd1 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS1); pFnd2 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS2); pFnd3 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS3); pFnd4 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS4); pFnd5 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS5); pFnd6 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS6); pFnd7 = mmap(NULL, 4, PROT_WRITE, MAP_SHARED, MemFd, FPGA_FND_CS7); //clcd_init init_clcd(); init_fnd(); ins_mod(imod); while (1){ temp = c; c = key_get(10); switch (c) { case KEY_NUM1: dbg("KEY_NUM1\n"); left_cusor(); cusor_count=TRUE; pos--; break; case KEY_NUM2: dbg("KEY_NUM2\n"); buf1[len1] = ' '; temp = c; del_count==TRUE; break; case KEY_NUM3: dbg("KEY_NUM3\n"); right_cusor(); cusor_count=TRUE; pos++; break; case KEY_NUM4: dbg("CAPS\n"); if(cmod == FALSE){ caps_mod(cmod); cmod = TRUE; }else{ caps_mod(cmod); cmod = FALSE; } cusor_count=TRUE; break; case KEY_NUM5: dbg("KEY_NUM5\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = '.'; }else if(cmod==1){ buf1[len1] = '!'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'q'; }else if(cmod==1){ buf1[len1] = 'Q'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'z'; }else if(cmod==1){ buf1[len1] = 'Z'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM6: dbg("KEY_NUM6\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 'a'; }else if(cmod==1){ buf1[len1] = 'A'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'b'; }else if(cmod==1){ buf1[len1] = 'B'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'c'; }else if(cmod==1){ buf1[len1] = 'C'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM7: dbg("KEY_NUM7\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 'd'; }else if(cmod==1){ buf1[len1] = 'D'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'e'; }else if(cmod==1){ buf1[len1] = 'E'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'f'; }else if(cmod==1){ buf1[len1] = 'F'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM8: dbg("INS\n"); if(imod == FALSE){ ins_mod(imod); imod = TRUE; }else{ ins_mod(imod); imod = FALSE; } cusor_count=TRUE; break; case KEY_NUM9: dbg("KEY_NUM9\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 'g'; }else if(cmod==1){ buf1[len1] = 'G'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'h'; }else if(cmod==1){ buf1[len1] = 'H'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'i'; }else if(cmod==1){ buf1[len1] = 'I'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM10: dbg("KEY_NUM10\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 'j'; }else if(cmod==1){ buf1[len1] = 'J'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'k'; }else if(cmod==1){ buf1[len1] = 'K'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'l'; }else if(cmod==1){ buf1[len1] = 'L'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM11: dbg("KEY_NUM11\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 'm'; }else if(cmod==1){ buf1[len1] = 'M'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'n'; }else if(cmod==1){ buf1[len1] = 'N'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'o'; }else if(cmod==1){ buf1[len1] = 'O'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM12: dbg("KEY_NUM12\n"); buf1[len1] = '*'; break; case KEY_NUM13: dbg("KEY_NUM13\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 'p'; }else if(cmod==1){ buf1[len1] = 'P'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'r'; }else if(cmod==1){ buf1[len1] = 'R'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 's'; }else if(cmod==1){ buf1[len1] = 'S'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM14: dbg("KEY_NUM14\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 't'; }else if(cmod==1){ buf1[len1] = 'T'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'u'; }else if(cmod==1){ buf1[len1] = 'U'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'v'; }else if(cmod==1){ buf1[len1] = 'V'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM15: dbg("KEY_NUM15\n"); if(key_count == 0){ if(cmod == 0){ buf1[len1] = 'w'; }else if(cmod==1){ buf1[len1] = 'W'; } key_count++; }else if(key_count == 1){ if(cmod == 0){ buf1[len1] = 'x'; }else if(cmod==1){ buf1[len1] = 'X'; } key_count++; }else if(key_count == 2){ if(cmod == 0){ buf1[len1] = 'y'; }else if(cmod==1){ buf1[len1] = 'Y'; } key_count++; }else{ key_count = 0; } break; case KEY_NUM16: dbg("KEY_NUM16\n"); buf1[len1] = '#'; break; default: /* timeout */ break; } if(firsttime==TRUE){ writeb(buf1[len1]); left_cusor(); left_cusor(); firsttime=FALSE; } //insert clcd_char key == if(cusor_count == FALSE && temp == c){ writeb(buf1[len1]); left_cusor(); //key !=, -> insert clcd_char }else if(cusor_count == FALSE && temp != c){ right_cusor(); writeb(buf1[len1]); left_cusor(); key_count=0; pos++; } if(del_count==TRUE){ writeb(buf1[len1]); left_cusor(); } if(pos == 15 && line1 == TRUE){ setcommand(0xc0); line2 = TRUE; line1 = FALSE; }else if(pos == 14 && line2 == TRUE){ setcommand(0x80); line2 = FALSE; line1 = TRUE; pos = 0; }else if(pos == 30 && line2 == TRUE){ setcommand(0x80); line2 = TRUE; line1 = FALSE; pos = 0; } del_count = FALSE; cusor_count = FALSE; //0xc0->2행 / 0x08->1행 } //munmap munmap(pTextlcd, 4); munmap(pTextlcd_cmd, 4); munmap(pFnd0, 4); munmap(pFnd1, 4); munmap(pFnd2, 4); munmap(pFnd3, 4); munmap(pFnd4, 4); munmap(pFnd5, 4); munmap(pFnd6, 4); munmap(pFnd7, 4); return 0; } /* EOF */
반응형
'프로그래밍' 카테고리의 다른 글
PAX270을 이용한 나랏글 키보드 (0) | 2015.06.19 |
---|---|
아두이노 프로젝트1 (0) | 2015.06.01 |
커널 로드 (0) | 2015.05.12 |
부트스트랩 (0) | 2015.05.12 |
FND_KAY.APP(미완) (0) | 2015.04.15 |