본문 바로가기

Embedded/Kernel Porting

[Kernel Porting] Dip스위치와 Dot matrix를 이용하여 다양하게 점멸해보기

작업 환경

-메인 OS : Windows 8.1K(Intel Core i5-4590)

-작업 OS : Ubuntu 14.04.5 LTS 64bit(VirtualBox)

-장 비 명 : Hybus-Smart4412


dot7.c

/*딥스위치 3번째와 6번째는 고장나 사용하지 않았음*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/ioctl.h>
#include<sys/stat.h>

//디바이스 드라이버가 들어있는 경로 위치를 적어논것
#define dip "/dev/dipsw"
#define dot "/dev/dot"

void LedUp();
void LedDown();
void LedAll();
void LedInside();
void LedOutside();
int main()
{
int dip_d , i , num;
unsigned char data;

//1. 해당 드라이버 경로
//2. O_RDWR
dip_d = open(dip,O_RDWR);
if(dip_d <0)
{
printf("열수 없습니다.\n");
exit(0);
}
while(1)
{
puts("**********JooSeok Menu**********");
puts("* 1. LED UP  Shift     *");
puts("* 2. LED DOWN  Shift     *");
puts("* 8. A   L   L     *");
puts("* 16. I N S I D E     *");
puts("* 64. O U T S I D E     *");
puts("* 128. E  X  I  T     *");
puts("********************************");

while(1)
{
read(dip_d , &data , sizeof(data));
if(data) break;
usleep(150000);
}
switch(data)
{
case 1:
 LedUp();
 break;
case 2:
 LedDown();
 break;
case 8:
 LedAll();
 break;
case 16:
 LedInside();
 break;
case 64:
 LedOutside();
 break;
case 128:
 close(dip_d);
 return 0;
putchar('\n');
}

return 0;
}

void LedUp()
{
int i , dot_d;
unsigned char data[8];
dot_d = open(dot , O_RDWR);

for(i=0 ; i<8 ; ++i)
{
memset(data , 0 , sizeof(data));
data[0] = 0x80>>i;
usleep(100000);
//1. 파일의 디스크립트
//2. 데이터 전달
//3. 크기를 넣어준다.
write(dot_d , &data , sizeof(data));
usleep(100000);
}

close(dot_d);
}

void LedDown()
{
int i , dot_d;
unsigned char data[8];

dot_d = open(dot , O_RDWR);

for(i=0 ; i<8 ; ++i)
{
memset(data , 0 , sizeof(data));
data[1] = 0x01<<i;
usleep(100000);
//1. 파일의 디스크립트
//2. 데이터 전달
//3. 크기를 넣어준다.
write(dot_d , &data , sizeof(data));
usleep(100000);
}

close(dot_d);
}

void LedAll()
{
int i , j , dot_d;
unsigned char data[8];

dot_d = open(dot , O_RDWR);

for(i=1 ; i<15 ; ++i)
{
memset(data , 0 , sizeof(data));
if(i%2 == 1)
{
for(j=0 ; j<8 ; ++j)
data[j] = 0x00;
}
else
{
for(j=0 ; j<8 ; ++j)
data[j] = 0xff;
}
usleep(100000);
write(dot_d , &data , sizeof(data));
usleep(100000);
}

close(dot_d);
}

void LedInside()
{
int i , dot_d;
unsigned char data[8];

dot_d = open(dot , O_RDWR);

for(i=0 ; i<4 ; ++i)
{
memset(data , 0 , sizeof(data));
data[2] = (0x80>>i) | (0x01<<i);
usleep(100000);
write(dot_d , &data , sizeof(data));
usleep(100000);
}

close(dot_d);
}

void LedOutside()
{
int i , dot_d;
unsigned char data[8];

dot_d = open(dot , O_RDWR);

for(i=0 ; i<4 ; ++i)
{
memset(data , 0 , sizeof(data));
data[3] = (0x10<<i) | (0x08>>i);
usleep(100000);
write(dot_d , &data , sizeof(data));
usleep(100000);
}

close(dot_d);
}


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 dot7.c -o dot7


3. Test

- 윈도우(메인 OS)로 실행파일 복사

- Tera Term에서 포트 설정 후  설정 -> 시리얼 포트 -> 속도를 115200으로 설정

- Hybus-Smart4412 장비 부팅

- 메뉴 -> 전송 -> ZMODEM -> 보내기 에서 실행파일 선택

- chmod 777 [실행파일명]  (실행파일 권한 설정)

- ./[실행파일명]  (실행 후 테스트)

(★중요 : 만약 소스파일을 수정 했다면 Tera Term 에서 먼저 rm [실행파일명] 을 한 뒤 다시 ZMODEM -> 보내기 에서 실행파일 선택 후 chmod 777 [실행파일명] 와 ./[실행파일명] 다시 실행)