본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지-김상식-20100907

by 알 수 없는 사용자 2010. 9. 7.
728x90
반응형
컴퓨터의 병렬 포트를 이용해서 직접 입출력을 해보았다.

1. 먼저, 컴퓨터의 BIOS에서 다음과 같이 설정한다. 
Parallel Port Address : 378
Parallel Port Mode : Normal
Parallel Port IRQ : IRQ7

2. vmware 자체 바이오스에서도 위와 같이 설정한다.

3. vmware에서 리눅스 부팅 후, vmware 메뉴 vm->setting을 클릭하면 새로운 창이 하나 뜬다.  Hardware 탭을 보면 Parallel Port가 보일 것이다. 클릭 하면 옆에 Device status에 Connected가 있는데 이를 체크하고 OK버튼을 누른다. 이 설정을 해야만 vmware에서 Parallel Port를 사용할 수 있다.


4. 병렬 포트의 출력 부분에 LED를 연결하면 1초 간격으로 ON/OFF를 반복한다.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
  int iDev;
  int iCnt;
  char cDummy;

  // "/dev/port" 파일을 연다
  iDev = open("/dev/port", O_RDWR);
  if(iDev >= 0
  {
    printf("open() 성공\n");
  }
  else
  {
    printf("open() 실패\n");
    return 0;
  }

  // Led ON/OFF..
  for(iCnt = 0 ; iCnt < 10 ; ++iCnt)
  {
    // /dev/port의 0x378위치로 파일 포인터를 옮긴다.
    lseek(iDev, 0x378, SEEK_SET);
    cDummy = 0xFF;
    write(iDev, &cDummy, 1);  // 병렬 포트에 cDummy값을 출력
    sleep(1);          // 1초 딜레이

    // /dev/port의 0x378위치로 파일 포인터를 옮긴다.
    lseek(iDev, 0x378, SEEK_SET);
    cDummy = 0x00;
    write(iDev, &cDummy, 1);  // 병렬 포트에 cDummy값을 출력
    sleep(1);          // 1초 딜레이
  }

  close(iDev);
  return 0;
}

5. 프린트 포트에 대한 정보를 읽는다.(SELECT핀, 13번핀의 상태에 따라 ON/OFF가 출력된다)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/lp.h>

int main()
{
  int iDev;
  int iState;

  // "/dev/lp0" 파일을 연다
  iDev = open("/dev/lp0", O_RDWR | O_NDELAY);
  if(iDev >= 0
  {
    printf("open() 성공\n");
  }
  else
  {
    printf("open() 실패\n");
    return 0;
  }

  while(1)
  {
    // 프린트 포트에 대한 정보를 읽어 온다.
    ioctl(iDev, LPGETSTATUS, &iState);

    // PSELECT핀이 High면 ON 출력, Low면 OFF 출력
    if(iState & LP_PSELECD)
    {
      printf("ON\n");
    }
    else
    {
      printf("OFF\n");
    }
    usleep(50000);
  }
  close(iDev);

  return 0;
}


그 외에 /dev/parport0 을 이용해서도 병렬 포트 출력이 가능했다.
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/ppdev.h>
#include <linux/parport.h>

int main()
{
  int fd;
  int iCnt;
  int mode;
  int cDummy;

  // "/dev/parport0"을 연다.
  fd = open("/dev/parport0", O_RDWR);
  if(fd == -1) {
    printf("open() error\n");
    return 0;
  }

  mode = IEEE1284_MODE_ECP;
  // Claim the port
  ioctl(fd, PPCLAIM);
  // set ECP mode
  ioctl(fd, PPSETMODE, &mode);

  for(iCnt = 0 ; iCnt < 10 ; ++iCnt)
  {
    cDummy = 0xff;
    write(fd, &cDummy, 1);
    sleep(1);

    cDummy = 0x00;
    write(fd, &cDummy, 1);
    sleep(1);
  }

  // Release the port
  ioctl(fd, PPRELEASE);
  close(fd);

  return 0;
}

728x90