프로그래밍

clcd_key(미완_삽입모드X)

Dilrong 2015. 5. 27. 20:06
//헤더파일  
#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