다음 이전 차례

7. 몇몇 쓸만한 포트

여기에는 범용 TTL 로직 I/O에 직접 쓰이는 일반적인 포트에 대한 프로그래밍 정보가 있다.

패러랠 포트 (BASE = 0x3bc for /dev/lp0, 0x378 for /dev/lp1, and 0x278 for /dev/lp2): (여러분이 표준 프린터 처럼 제어하는 방법만 필요하다면, Printing-HOWTO를 보라) 뒤에 설명한 표준 출력 전용 모드에 덧붙여서, 대부분의 프린터 포트에는 '확장 된' 양방향 모드가 있다. 이 새로운 ECP/EPP 모드(일반적으로 IEEE 1284 표준 이라 한다)에 대한 정보는, < www.fapo.com/> 와 < www.senet.com.au/~cpeacock/parallel.htm>를 참조하면 된다. 여러 분이 사용자-모드 프로그램에서 IRQ 또는 DMA를 사용할 수 없기 때문에, 여러 분은 ECP/EPP를 사용하는 커널 드라이버를 만들어야만 할 것이라는 것을 기억 한다; 필자는 누군가가 이러한 드라이버를 만들고 있을 것이라 생각하지만, 자세 한 것은 알지 못한다.

포트 BASE+0 (데이터 포트)은 포트 (D0 to D7은 각각 0에서 7번 비트에 해당 한다. 상태 0 = low (0 V), 1 = high (5 V))의 데이터 신호를 제어한다. 이 포트 에 데이터를 쓰면 포트의 핀에 데이터를 보내게 된다. 포트를 읽게 되면 표준 또는 확장된 쓰기 모드로 마지막에 쓰여진 데이터 또는 확장된 읽기 모드의 또 다른 장치의 핀에서의 데이터를 리턴한다. 포트 BASE+1 (상태 포트)은 읽기 전용으로, 다음과 같은 입력 신호의 상태를 리턴한다.

Bits 0 과 1 은 예약되어 있다. Bit 2 IRQ 상태 (핀이 아니다. 필자도 어떻게 돌아가는지는 알지 못한다.) Bit 3 ERROR (1=high) Bit 4 SLCT (1=high) Bit 5 PE (1=high) Bit 6 ACK (1=high) Bit 7 -BUSY (0=high) (high와 low 상태에 대해서는 확신할 수 없다.) Port BASE+2 (Control port)는 쓰기만 가능하고(읽기를 시도하면 마지막 써넣은 값이 리턴된다), 다음과 같은 상태 시그널을 제어한다: Bit 0 -STROBE (0=high) Bit 1 AUTO_FD_XT (1=high) Bit 2 -INIT (0=high) Bit 3 SLCT_IN (1=high) Bit 4 병렬 포트 IRQ를 사용 가능하도록 한다 (which occurs on the low-to-high transition of ACK) when set to 1. Bit 5 확장 모드 방향을 제어한다 (0 = 쓰기, 1 = 읽기), 쓰기만 가능하다(이 비 트를 읽는 것은 전혀 쓸모가 없다). Bits 6과 7은 예약되어 있다.

(다시 한번 말하지만, high와 low상태의 순서에 대해서는 확신하지 못한다.) 핀 배열 (포트의 25-핀 암컷 D-쉘 커넥터) (i=input, o=output):

1io -STROBE, 2io D0, 3io D1, 4io D2, 5io D3, 6io D4, 7io D5, 8io D6, 9io D7, 10i ACK, 11i -BUSY, 12i PE, 13i SLCT, 14o AUTO_FD_XT, 15i ERROR, 16o -INIT, 17o SLCT_IN, 18-25 Ground

IBM 명세서에서 1, 14, 16, 17(제어 출력)번 핀은 개방된 collector 드라이버를 4.7 킬로오옴 저항을 통해서 5V로 끌어 올린다고 한다. (sink 20 mA, source 0.55 mA, 고수준 출력 5.0 V - pullup). 나머지 핀들은 sink 24 mA, source 15 mA, and 고수준 출력은 최소 2.4 V. 양쪽 모두 low 상태에서는 최대 0.5 V 이 다. IBM 아키텍처가 아닌 것의 병렬 포트는 거의 표준을 따르지 못할 것이다. 더 자세한 정보른 아래를 참조한다.

< www.hut.fi/~then/circuits/lptpower.html>. 마지막으로, 경고: 접지 할 때 주의하도록 한다. 필자는 컴퓨터가 켜 있을 때 연 결을 해서 병렬 포트 몇 개를 망가뜨렸다. 이러한 경우에는 보드에 통합되어 있 지 않은 병렬 포트를 사용하는 것이 좋을 것으로 보인다. (여러분은 두번째 저렴 한 표준 `멀티-IO'카드에서 병렬 포트를 구할 수 있다; 필요 없는 포트는 사용 을 금지한다, 그리고 카드의 병렬 포트 주소를 비어 있는 주소로 잡는다. 병렬 포트의 IRQ에 대해서 걱정할 필요는 없다, 사실 거의 쓰이지 않기 때문이다. 게임 (조이스틱) 포트 (0x200-0x207 포트): (일반 조이스틱을 제어하므로, 커널- 수준의 조이스틱 드라이버가 있다. te.unc.edu/pub/Linux/kernel/patches/ystick-* 을 참조한다.) 핀 배열 (포트의 15핀 암컷 D-쉘 커넥터):

1,8,9,15: +5 V (파워) 4,5,12: 접지 2,7,10,14: 각각 BA1, BA2, BB1, BB2의 디지털 입력 3,6,11,13: 각각 AX, AY, BX, BY, 아날로그 입력

+5 V 핀은 보드의 전원 선에 직접 연결되는 것으로 보인다, 그래서 많은 전력의 출처를 명시(?)할 수 있어야 한다. 보드에 의존하는, 파워 서플라이와 게임 포트 디지털 입력은 포트에 연결하는 두 조이스틱의 버튼에 쓰인다. (조이스틱 A와 조이스틱 B, 각각 버튼 두개) 이들은 보통 TTL-수준의 입력이 되어야 하고, 상 태 포트에서 직접 상태를 읽을 수 있다(아래를 참조). 실제 조이스틱은 버튼을 누르면 low(0V) 상태를, 다른 경우에는 high (1킬로 오옴 저항을 통하여 전원 핀에서의 5V)를 리턴한다.

이른바 아날로그 입력은 저항을 측정한다. 게임 포트에는 네 개의 입력에 연결 된 네 개의 원샷 다중 진동기가 있다. 각 입력에는, 입력 핀과 다중 진동기 사이 에 2.2 킬로오옴 저항이 있다. 다중 진동기와 접지. 실제 조이스틱은 각 축마다 전위차계를 지니고 있고 (X와 Y), +5V와 알맞은 입력 핀 사이에 연결되어 있다.(조이스틱 A에는 AX 또는 AY가 있고, 조이스틱 B에는 BX 또는 BY가 있다). 다중 진동기가 활성화 되었을 때는 출력 선을 High로 놓고 각각의 출력 선의 전압이 낮아지기 전에 타이밍 콘덴서가 3.3V가 될 때까지 기다린다. 따라서 다 중 진동기의 높은 전위에서의 간격은 조이스틱의 전위차계에 있는 저항에 비례 한다.(예를 들면, 각 축에서 조이스틱의 위치는) 다음과 같다:

R = (t - 24.2) / 0.011,

R은 전위차계의 저항이고 t는 높은 전위의 유지 시간으로 초를 단위로 한다. 따라서, 아날로그 입력을 읽으려면, 우선 다중 진동기를 활성화 시켜야 하고 (port white와 함께, 아래를 참조) (포트를 계속 읽으면서) 네 축의 상태가 높은 전위에서 낮게 떨어질 때까지 기다려야(polling) 한다. 이러한 polling은 CPU 시 간을 많이 점유하고 리눅스와 같이 실시간 멀티태스킹을 지원하지 않는 시스템 에서는, 포트를 계속 기다릴 수 없으므로 결과가 그리 정확하지 않다. (여러분이 커널 레벨 드라이버를 사용하여 polling 하는 동안 인터럽트를 금지하지 않는 동 안은 그렇지만, 이 방법은 CPU 시간을 더 만이 소모한다.) 신호가 오랜 시간(수 십 밀리초)을 점유할 것이라는 것을 안다면, polling하기 전에 CPU 시간을 다른 프로세스에 주기 위하여 usleep()를 호출할 수 있다.

여러분이 읽고 쓰기를 원하는 I/O 포트가 0x201 뿐이다(다른 포트는 완전히 동 일한 방식으로 동작하거나 아무것도 하지 않는다). 이 포트에 쓰기를 하면 (무엇 을 쓰는 지는 중요하지 않다) 다중 진동기가 활성화된다. 이 포트를 읽으면 입력 시그널의 상태를 리턴한다.

Bit 0: AX (status (1=high) of the multivibrator output) Bit 1: AY (status (1=high) of the multivibrator output) Bit 2: BX (status (1=high) of the multivibrator output) Bit 3: BY (status (1=high) of the multivibrator output) Bit 4: BA1 (digital input, 1=high) Bit 5: BA2 (digital input, 1=high) Bit 6: BB1 (digital input, 1=high) Bit 7: BB2 (digital input, 1=high)

직렬 포트: 여러분이 지원하려는 장치가 RS-232와 닮았다면, 여러분은 직렬 포 트를 사용할 수 있어야 한다. 리눅스 직렬 드라이버는 대부분의 모든 응용 프로 그램이 필요한 것으로는 충분하다. (여러분은 직렬 포트를 직접 조작하지는 말아 야 한다; 어쨌든, 여러분은 이러한 일을 하는 커널 드라이버를 작성해야 할 것이 다.); 이 포트는 매우 다양한 용도로 쓰이는데, 비표준 bps 비율을 사용하여도 문제를 일으키지 않는다.

유닉스 시스템의 직렬 포트 프로그래밍에 대한 더 자세한 정보는 termios(3) 메 뉴얼 페이지, 시리얼 드라이버 소스 코드(/usr/src/linux/drivers/char/serial.c), < www.easysw.com/~mike/serial/index.html>를 참조한다. 여러분이 좋은 아날로그 I/O를 원한다면, 여러분은 ADC와 DAC칩을 병렬 포트 에 연결할 수 있다. (힌트: 파워를 위해서는 게임 포트 커넥터 또는 컴퓨터 케이 스의 바깥에 연결하는 예비 디스크 드라이브의 파워 커넥터를 사용한다, 여러분 이 낮은 전력 장치를 사용하거나 파워 때문에 병렬 포트 자체를 사용할 수 있는 것이 아니라면) 또는, AD/DA 카드를 구입한다(더 느린 카드들 대부분은 I/O 포 트가 제어한다). 부정확하고 영점 불안정함에도 한 개나 두 개의 채널에 만족한 다면, 리눅스 사운드 드라이버에서 지원되는 저가의 사운드 카드도 할 수 있다. (이는 충분히 빠르다.)

다른 힌트: 여러분이 리눅스용 프린트된 회로 보드 디자인 소프트웨어를 찾고 있다면, Pcb라 불리는 공개의 X11 응용 프로그램이 있는데, 잘 동작할 것이다. 최악의 경우 여러분이 복잡해서 아무것도 할 수 없을 수도 있다. 이 프로그램은 많은 리눅스 배포본에 포함되어 있고, ite.unc.edu/pub/Linux/apps/circuits/pcb-*에서 구할 수 있다.


다음 이전 차례