Search Results

'7 Segment'에 해당하는 글들

  1. 2008/06/25  프린터포트 제어를 통한 7-Segment 제어 (1)

프린터포트 제어를 통한 7-Segment 제어

2008/06/25 13:02 뚝딱뚝딱

1. 프로젝트 설명

  '운영체제 이론과 실습'이란 학교 강의 중 팀 프로젝트로 Linux의 Device Driver를 제작하여 프린터 포트를 통해 7-Segment 제어와 스위치 입력을 받는 과제를 수행하게 되었다.

1) Kernel 2.6.24 버젼에서 구현할 것-

2) 7-Segment에  'P' -> 'L' -> 'A' -> 'Y'란 글자가 연속적으로 흐르게 할 것.

3) Minor 1, 2로 나눠 글자의 흐름 속도를 다르게 할 것.

4) 수동 접촉 방식 스위치로 채터링 기능을 구현하고, 원클릭, 더블클릭을 구분할 것.


  프린터 포트 제어를 위한 Device Driver는 자료가 많아 쉽게 구현 할 수 있을 줄 알았는데, 여러가지 문제점으로 인해 시간이 상당히 오래 걸렸으며, 리눅스 버젼에 따른 차이점을 파악하지 못해 고생했다. 결국 날짜 기한을 맞추지 못해 평가 점수가 많이 깍였다. 다만,  문제점을 추적하며 Device Driver에 대한 이해와 리눅스 환경에 대해 이해를 단기간에 많이 해서 결과적으로는 값진 프로젝트였다.


2. 구현 동영상 및 사진


 

사용자 삽입 이미지
DSC-T30 | Program | 1/40sec | F3.5 | ISO-250
사용자 삽입 이미지
DSC-T30 | Program | 1/13sec | F3.5 | ISO-320


3. 개발 환경

  • VMWare Workstation 5.0, 6.0
  • Linux Fedora 7
  • OrCad Capture 10.3

4. 회로도

 

사용자 삽입 이미지



5. 소스






6. 실행 방법

VMware에서는 동작하지 않기 때문에(아래에서 설명) Linux가 설치된 PC에서 실행한다.

1) parport 드라이버 내리기

   root> rmmod parport_pc

   root> rmmod parport

-> 부팅 후 이미 Linux Printer Port가 올라가 있기 때문에 인터럽트가 충돌된다. 따라서 Printer Port 드라이버를 내려야 한다.

2) segment 드라이버 파일 생성

  root> mknod /dev/segment c 240 1

  root> mknod /dev/segment c 240 2

->  Segment 드라이버의 Minor 1, 2를 Dev폴더에 파일 생성

3) segment 드라이버 올리기

  root> insmod segment.ko

-> Segment 드라이버를 올린다.

4) segment_app 어플리케이션 실행

  root> ./segment_app



7. 구현 시 문제점 및 해결 방안

1) VMware 5.0에서 Fedora 9 설치 후 VMWare-Tools 인스톨 오류

  VMware 5.0을 사용하고 있었고,  Shared Folder 사용을 위해 WMWare-Tools를 사용하려고 인스톨을 하려 했는데, 계속해서 커널 버젼이 맞지 않는다는 오류로 설치가 실패했다.

What is the location of the directory of C header files that match your running
kernel? [/usr/src/linux/include]

  이와 같은 오류가 발생하여 인터넷을 검색하면서 이것저것 방법을 시도했지만 모두 실패했었다. 그 후 다른 이유로 VMware Version을 5.0에서 6.0으로 버젼을 올리게 되었는데, 혹시나 하는 마음에 VMware-tools를 인스톨 해봤는데 아무 문제 없이 설치가 되었다.

아래는 시도해 보지 않았지만, 왠지 성공할 듯하여 링크를 남긴다.

http://blog.daum.net/itbankgo-4/1306448

2) VMware를 통한 프린터 포트 제어 시 인터럽트 충돌

  Device Driver를 제작하여 VMware에서 실행한 결과 프린터포트의 포트입출력은 정상적으로 수행이 되었다. 이제 인터럽트만 하면 되는데, 인터럽트를 'request_irq'명령어로 등록하려고 하면 이미 다른 곳에서 사용하고 있다는 메시지가 발생했다. 이미 드라이버가 올려져 있는 'parport'라는 드라이버에서 인터럽트를 사용해서 발생하는 문제였는데, rmmod를 통해 드라이버를 내리면 가능할 듯하였다. 그래서 'rmmod parport_pc', 'rmmod parport'를 통해 내렸더니 인터럽트 충돌메세지는 발생하지 않고 정상적으로 등록이 되었으나, 기본적인 포트의 입출력이 되지 않는 문제가 발생했다. 

  그래서 PC에 VMware가 아닌 Linux를 설치하고 테스트해 본 결과 정상적으로 동작하였다. 물론 'parport'는 내리고 수행하였다. 아마 VMware에서는 가상의 프린터 포트를 제어하기 위해 'parport'라는 드라이버를 사용하는 듯했다. 결국 VMware를 버리고 PC에서 작업을 해야만 했다.


3) 커널 2.6.23에서 DEvice Driver 개발 시 수정해야 할 사항

  드라이버는 유영창씨께서 쓰신 'IT EXPERT 리눅스 디바이스 드라이버'의 2.6 코드를 참고로 작성하였다. 컴파일 시 몇가지 문제가 발생하는 데, 문제는 책에서 예문으로 설명한 코드들이 커널 2.6.24와 여러 차이점이 있다는 것이다. 같은 2.6대라서 별 차이 없겠지 하던 생각이 잘못되었었다. 또한 컴파일 시 인자 형태가 다르다는 Warning을 무시했었던게 문제였다.

  - SA_INTERRUPT 옵션이 없어졌다.

request_irq(PRN_IRQ, segment_interrupt, 0, DEV_NAME, NULL)

- WORKQUE 관련 인자들 및 사용법이 바뀌었다.

// WorkQueue
DECLARE_WAIT_QUEUE_HEAD( waitqueue_read );
DECLARE_DELAYED_WORK( work_delayed_queue, call_segmentfunc );

..

schedule_delayed_work( &work_delayed_queue, 200 );

4) 더블 클릭 구현의 어려움

  더블 클릭은 Driver에서 일정 시간 시연 후 클릭이 더 발생했는 지를 검사하여 Application에 알려줘야 되는데, 타이머 안에서 workqueue를 제어하려다 보니까 리눅스가 계속 다운되는 증상이 발생하였다. 아마 정해진 영역안에서 수행해야 하는 것을 외부에서 참조해서 발생한 것 같다. 이 문제는 결국 시간 제약으로 인해 해결 하지 못했다.


8. 참고 자료


  여담) 텍스트큐브의 위지윅 에디터에서는 Undo 기능이 되지 않아, 다른 방안을 모색 중 Windows Live Writer를 통해 포스팅을 하게 되었다. 워드에서 작업하는 것과 같이 상당히 편리하며 오프라인으로 작업을 하기 때문에 속도와 안정성이 보장되는 것이 좋다. 단, 단순히 색을 바꾸거나 글자 크기, 정렬을 바꾸는 기능이  없는 것이 불편하다.

2008/06/25 13:02 2008/06/25 13:02
  1. gomjang  2009/01/09 22:53     댓글주소  수정/삭제  댓글쓰기
    저 프린터 포트 관련 자료 좀 올려주실수 있으신가요???
    아니면 어떻게 검색을해서 접근을 해야할지 모르겟네요....
    밑단을 배우니 너무 잼있네요...
    전 프린트 포트가없어 rgb 포트로 제어를 해보려고 하는데 포트에 관한 datasheet 찾는 방법좀 알려주세요

    gljcjjang@paran.com
menu openmenu close