일단
첨부한 파일에 보면 test kit 제작 회로가 있다. 25pin을 다 사용하는 것이 아니라 GND포함 12pin만을 사용한다. 제어신호 3개와 LED 8개로 연결되 었다.
이를 기반으로 LED 신호 예제
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int fd;
int lp;
unsigned char buff[128]; //실제 사용하는 buff는 char 하나만 사용
fd = open("/dev/port", O_RDWR);
if(fd < 0 )
{
perror("/dev/port open error");
return 1;
}
for(lp = 0; lp < 10; lp++)
{
lseek(fd, 0x378, SEEK_SET);
buff[0] = 0xff; //점등할 LED, data를 입력할 때 bit로 계산하면 쉽게 알아볼 수 있다.
write(fd, buff, 1);
sleep(1);
lseek(fd, 0x378, SEEK_SET); //병렬포트의 물리적 주소가 0x378
buff[0] = 0x00;
write(fd, buff, 1);
sleep(1);
}
close(fd);
return 0;
}
switch 제어 예제
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/lp.h>
int main(int argc, char **argv)
{
int fd;
int prnstate;
int lp;
unsigned char buff[128];
fd = open("/dev/lp0", O_RDWR | O_NDELAY);
if(fd < 0)
{
perror("open error");
return 1;
}
while(1)
{
ioctl(fd, LPGETSTATUS, &prnstate); // 상태값을 받아온다.
if(!(prnstate & LP_PACK)) //1
{
printf("ON 1 \n");
}
if(!(prnstate & LP_POUTPA))//2
{
printf("ON 2 \n");
}
if(!(prnstate & LP_PSELECD))//3
{
printf("ON 3 \n");
}
//13 pin <-> GND pin
usleep(50000);
}
close(fd);
return 0;
}
위의 두 예제를 활용하여 원형 큐 구현 예제
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/lp.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int fd;
int fd_LED;
int prnstate;
int lp;
unsigned char buff[128];
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;
int front = 0;
int rear = 0;
fd = open("/dev/lp0", O_RDWR | O_NDELAY);
fd_LED = open("/dev/port", O_RDWR);
if(fd <0)
{
perror("open error");
return 1;
}
if(fd_LED <0)
{
perror("LED error");
return 1;
}
while(1)
{
ioctl(fd, LPGETSTATUS, &prnstate);
if(!(prnstate & LP_PACK)){
flag1 = 1;
}
if(!(prnstate & LP_POUTPA)){
flag2 = 1;
}
if(!(prnstate & LP_PSELECD)){
flag3 = 1;
}
if((prnstate & LP_PSELECD) && (flag3 ==1))//reset
{
printf("reset\n");
flag1 = 0;
flag2 = 0;
flag3 = 0;
lseek(fd_LED, 0x378, SEEK_SET);
buff[0] = 0x00;
write(fd_LED, buff, 1);
front = 0; rear = 0;
}
if((prnstate & LP_PACK) && (flag1 == 1)) //enqueue
{
printf("enqueue\n");
flag1 = 0;
flag2 = 0;
flag3 = 0;
if((front+1)%8 == rear)
{
printf("full\n");
continue;
}
lseek(fd_LED, 0x378, SEEK_SET);
buff[0] = buff[0] | (0x01<<front);
front = (front + 1)%8;
write(fd_LED, buff,1);
}
if((prnstate & LP_PSELECD) && (flag2 == 1)) //dequeue
{
printf("dequeue\n");
flag1 = 0;
flag2 = 0;
flag3 = 0;
if(front == rear)
{
printf("empty\n");
continue;
}
buff[0] = (buff[0]- (0x01<<rear));
lseek(fd_LED, 0x378, SEEK_SET);
write(fd_LED, buff,1);
rear = (rear+1)%8;
usleep(150000);
}
}
return 0;
}
그런데 사용하는 flag들(LP_PSELECD, LP_PACK, LP_PSELECD)을 어떻게 찾는지 아직 잘 모르겠다. 다른 스위치를 추가로 더 넣으면 어떻게 되는거지? LED가 추가되면???
'Programming > linux왕초보' 카테고리의 다른 글
1. Scatter/gather I/O(vectored I/O) (0) | 2012.01.29 |
---|---|
리눅스 파일 입출력 (Linux File I/O) (0) | 2012.01.29 |
VMware에서 telnet server 실행 및 접속 (0) | 2011.09.26 |
grep 사용하기 (1) | 2011.07.29 |
어셈 명령어 정리 (1) | 2011.03.22 |
리눅스 버젼확인은 어찌하나요???;; (0) | 2008.09.12 |
shell programming - 변수 (0) | 2008.09.11 |
shell programming - 제어문 (0) | 2008.09.11 |
shell programming - 제어문 (0) | 2008.09.11 |
shell programming - 반복문 (0) | 2008.09.11 |