작업 환경
-메인 OS : Windows 8.1K(Intel Core i5-4590)
-작업 OS : Ubuntu 14.04.5 LTS 64bit(VirtualBox)
-장 비 명 : Hybus-Smart4412
fnd_tactsw.c
#include<termios.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<asm/ioctls.h>
#define tact_d "/dev/tactsw"
#define fnd_d "/dev/fnd"
void calc(int *num , char op , int *i);
void PrintFnd(int rst , int k , unsigned char *fnd_data);
int main()
{
int tact , fnd , sum=0 , i=0;
char op;
int num[2];
unsigned char c;
tact = open(tact_d , O_RDWR);
if(tact < 0)
{
printf("tact : open failed!\n");
}
while(1)
{
while(1)
{
read(tact , &c , sizeof(c)); //scanf() 처럼 블록상태가 되지 않기 때문에
usleep(100000);
if(c) break;
}
switch(c)
{
case 1: printf("%d입력\n" , c);num[i]=1;i++; break;
case 2: printf("%d입력\n" , c);num[i]=2;i++; break;
case 3: printf("%d입력\n" , c);num[i]=3;i++; break;
case 4: printf("%d입력\n" , c);num[i]=4;i++; break;
case 5: printf("%d입력\n" , c);num[i]=5;i++; break;
case 6: printf("%d입력\n" , c);num[i]=6;i++; break;
case 7: op='+';printf("%c입력\n" , op);break;
case 8: op='-';printf("%c입력\n" , op);break;
case 9: op='*';printf("%c입력\n" , op);break;
case 10: op='/';printf("%c입력\n" , op);break;
case 11: calc(num , op , &i); break;
case 12: printf("Shutdown!\n"); return;
}
}
close(tact);
return 0;
}
void calc(int *num , char op , int *i)
{
int rst , k , fnd , divided , reminder;
unsigned char fnd_data[4];
fnd = open(fnd_d , O_RDWR);
fnd_data[0] = 0xFF;
fnd_data[1] = 0xFF;
fnd_data[2] = 0xFF;
fnd_data[3] = 0xFF;
write(fnd , &fnd_data , sizeof(fnd_data));
switch(op)
{
case '+':rst = num[0]+num[1];break;
case '-':rst = num[0]-num[1];break;
case '*':rst = num[0]*num[1];break;
case '/':rst = num[0]/num[1];break;
}
if(op != '/')
{
if(rst <10)
{
for(k=0 ; k<3 ; ++k)
fnd_data[k] = 0xFF;
PrintFnd(rst , k , fnd_data);
}
else if(rst>=10 && rst <100)
{
for(k=0 ; k<2 ; ++k)
fnd_data[k] = 0xFF;
divided = rst/10;
PrintFnd(divided , k , fnd_data);
reminder = rst%10;
PrintFnd(reminder , k+1 , fnd_data);
}
}
else if(op == '/')
{
for(k=0 ; k<2 ; ++k)
fnd_data[k] = 0xFF;
divided = num[0]/num[1];
PrintFnd(divided , k , fnd_data);
fnd_data[k] &= ~0x80;
reminder = num[0]%num[1];
PrintFnd(reminder , k+1 , fnd_data);
}
write(fnd , &fnd_data , sizeof(fnd_data));
usleep(100000);
*i = 0;
}
void PrintFnd(int rst , int k , unsigned char *fnd_data)
{
if(rst==0)
fnd_data[k]=0xC0;
if(rst==1)
fnd_data[k]=0xF9;
if(rst==2)
fnd_data[k]=0xA4;
if(rst==3)
fnd_data[k]=0xB0;
if(rst==4)
fnd_data[k]=0x99;
if(rst==5)
fnd_data[k]=~0x6D;
if(rst==6)
fnd_data[k]=~0x7D;
if(rst==7)
fnd_data[k]=~0x07;
if(rst==8)
fnd_data[k]=~0x7F;
if(rst==9)
fnd_data[k]=0x10;
}
1. 초기설정
sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib lib32z1
2. 컴파일
/opt/gnueabi/opt/ext-toolchain/bin/arm-linux-gnueabihf-gcc fnd_tactsw.c -o fnd_tactsw
3. Test
- 윈도우(메인 OS)로 실행파일 복사
- Tera Term에서 포트 설정 후 설정 -> 시리얼 포트 -> 속도를 115200으로 설정
- Hybus-Smart4412 장비 부팅
- 메뉴 -> 전송 -> ZMODEM -> 보내기 에서 실행파일 선택
- chmod 777 [실행파일명] (실행파일 권한 설정)
- ./[실행파일명] (실행 후 테스트)
(★중요 : 만약 소스파일을 수정 했다면 Tera Term 에서 먼저 rm [실행파일명] 을 한 뒤 다시 ZMODEM -> 보내기 에서 실행파일 선택 후 chmod 777 [실행파일명] 와 ./[실행파일명] 다시 실행)
'Embedded > Kernel Porting' 카테고리의 다른 글
[Kernel Porting] 캐릭터LCD에 문자찍기 (0) | 2016.12.18 |
---|---|
[Kernel Porting] 캐릭터LCD에 Hello World 표현하기 (0) | 2016.12.18 |
[Kernel Porting] FND에 소수점 표현하기 (0) | 2016.12.18 |
[Kernel Proting] FND 점멸하기 (0) | 2016.12.18 |
[Kernel Porting] Tact 스위치를 이용한 응용문제 (0) | 2016.12.18 |