다음 이전 차례

3. PnP 하드웨어 인식시키기

수많은 훌륭한 기능에도 불구하고 리눅스는 아직도 플러그 앤 플레이(PnP) 하드웨어를 제대로 지원하지 못하고 있다. 여러분도 알다시피 플러그 앤 플레이는 IBM 아키텍처의 하드웨어에서 주변기기를 설치할 때의 아주 고질적인 I/O 주소, IRQ, DMA 설정 문제에서의 불편함을 해소하기 위해서 나온 개념이며 이미 상당히 오래 전부터 필요한 필수 기능이었다.

실제 PnP 하드웨어 인식/설정 기능이 얼마나 효율적인가의 문제는 제쳐두고라도 컴퓨터 산업의 큰 힘들에 의하여 이미 표준적인 기능이 되어버린 상태이므로 반론의 여지없이 PnP 기능은 리눅스 커널의 주요 기능으로 자리잡아야 한다고 본다.

물론 대부분의 장치에 대하여 하드웨어 인식시에 잘 찾아내어 사용하지만 표준적인 I/O 주소 또는 IRQ를 사용하지 않는 경우에는 제대로 인식하지 못하는 경우가 많다. 주변장치를 얼마 갖고 있지 않은 사람들에게는 별 문제되지 않지만 이서네트 카드를 두 개 인식시켜야 한다든지 할 때는 골치 아픈 일이 아닐 수 없다.

대부분은 주변장치와 같이 포장되어 있는 PnP 기능을 끄는 도스용 소프트웨어를 가지고 특정 주소와 IRQ를 맞춰서 사용하기도 하지만 필자의 경험으로는 제대로 되지 않는 경우가 허다했다. 이에 대한 답이 있다. 아직 리눅스 커널에서 PnP가 지원되지는 않지만 ISA PnP 툴이라는 것을 사용하면 거의 대부분의 문제를 해결할 수 있다.

3.1 ISA PnP 도구, 어디서 구할 수 있는가?

그리고 여러분이 프로그램세계 1월호 부록인 알짜 레드햇 4.0 CD를 가지고 있다면 다면 CD롬을 마운트한 후 마운트 디렉터리로부터 misc/pnp/utils 위치에서 isapnptools-1.8.tgz 파일을 찾아볼 수 있을 것이다. 필자가 본 최신 소스는 1.9 버전이었고 알찬 맨 페이지도 들어있었다.

3.2 ISA PnP 도구의 구성

/etc/isapnp.conf
/usr/man/man5/isapnp.conf.5
/usr/man/man8/isapnp.8
/usr/sbin/isapnp
/usr/sbin/pnpdump

3.3 ISA PnP 도구의 사용법

몇 가지 간단한 규칙만 익히면 된다. ISA PnP 도구의 사용법은 다음과 같은 절차를 거친다.

  1. pnpdump로 현재의 ISA용 PnP 하드웨어에 대한 정보를 입수한다.
  2. /etc/isapnp.conf 파일을 보면서 설정하고 싶은 I/O 주소, IRQ 등을 설정한다.
  3. isapnp를 실행시켜 PnP 하드웨어를 설정한다.
  4. 모듈을 로딩한다.

여기서 한 가지 중요하게 짚고 넘어가야 할 점이 있다. ISA PnP 도구를 사용하여 설정할 수 있는 하드웨어는 리눅스에서 그 기능을 모듈로 제공하는 것에만 유효하다. 이미 커널 안으로 들어가 버린 기능에 대해서는 ISA PnP 도구를 쓸 기회가 주어지지 않기 때문이다. 하지만 리눅스 커널 기능의 대부분이 모듈로 독립하여 사용할 수 있기에 문제되는 경우는 거의 없을 것이다.

3.4 ISA PnP 도구 컴파일하기

필자가 컴파일한 환경은 커널 버전 2.0.30, C 라이브러리 5.4.23, 컴파일러는 gcc 2.7.2.1 이다. 간단히 소스를 풀고 make 명령을 내리면 다음과 같은 에러 메시지가 나온다.

[yong@freeyong isapnptools-1.8]$ make
cc -O2 -Wall -DREALTIME -DNEEDSETSCHEDULER
 -DNEEDNANOSLEEP  -c pnpdump.c -o pnpdump.o
pnpdump.c:36: conflicting types for `nanosleep'
/usr/include/time.h:124: previous declaration
 of `nanosleep'
make: *** [pnpdump.o] Error 1

개발자의 개발환경이 어떤지는 모르겠으나 Makefile에서 PNPFLAGS 부분에서 -DNEEDNANOSLEEP을 삭제한다. 이 방법은 README에 적혀있는 대로이다.

[yong@freeyong isapnptools-1.8]$ make
cc -O2 -Wall -DREALTIME -DNEEDSETSCHEDULER
 -c pnpdump.c -o pnpdump.o
cc  pnpdump.o  -o pnpdump
flex -i -t isapnp.y > isapnp.c
cc -O2 -Wall   -c isapnp.c -o isapnp.o
isapnp.y:934: warning: prototype for `yywrap' follows
isapnp.y:76: warning: non-prototype definition here
isapnp.y:1360: warning: `yyunput' defined but not used
cc  isapnp.o  -o isapnp

make install 과정은 없으므로 pnpdump와 isapnp 바이너리를 /sbin 디렉터리에 직접 복사한다.

3.5 PnP 정보를 덤프하기

# pnpdump > /etc/isapnp.conf

pnpdump 명령을 내리면 여러분의 PnP BIOS를 점검하고 PnP 하드웨어를 발견하게 되면 리다이렉션으로 주어진 /etc/isapnp.conf 파일에 결과를 출력한다.

3.6 /etc/isapnp.conf 파일 편집하기

리눅스/유닉스에서의 작업이 다 그러하다는 것을 알 것이다. 편집기를 가지고 난해하기 짝이 없는 설정 파일을 여러분의 상황에 알맞게 편집한다. 파일 형식 이 어떠한지 알아보도록 하자.

# $Id: pnpdump.c,v 1.8 1997/01/14 21:05:35 fox Exp $
# This is free software, see the sources for details.
# This software has NO WARRANTY, use at your OWN RISK
#
# For details of this file format, see isapnp.conf(5)
#
# Compiler flags: -DREALTIME -DNEEDSETSCHEDULER -DNEED
# NANOSLEEP
#
# Trying port address 0203
# Trying port address 0207
# Trying port address 020b
# Board 1 has serial identifier 5e 00 19 1c 0b 19 80
# 8c 4a

# (DEBUG)
(READPORT 0x020b)
(ISOLATE)
(IDENTIFY *)

# Card 1: (serial identifier 5e 00 19 1c 0b 19 80 8c 4a)
# RTL8019 Serial No 1645579 [checksum 5e]
# Version 1.0, Vendor version 1.0
# ANSI string -->Plug & Play Ethernet Cardb --
#
# Logical device id RTL8019
#   Device support I/O range check register
#
# Edit the entries below to uncomment out the
# configuration required.
# Note that only the first value of any range is given,
# this may be changed if r
# Don't forget to uncomment the activate (ACT Y)
# when happy

(CONFIGURE RTL8019/1645579 (LD 0
#   Compatible device id PNP80d6
#   Logical device decodes 10 bit IO address lines
#     Minimum IO base address 0x0220
#     Maximum IO base address 0x0380
#     IO base alignment 32 bytes
#     Number of IO addresses required: 32
(IO 0 (BASE 0x0340))
#   IRQ 3, 4, 5, 9, 10, 11, 12 or 15.
#     High true, edge sensitive interrupt
(INT 0 (IRQ 10 (MODE +E)))
(ACT Y)
))
# End tag... Checksum 0x00 (OK)

설정 파일이 상당히 복잡해 보이기는 하지만 그 모든 것을 다 이해할 필요는 없다. 필자도 복잡하기 짝이 없는 isapnp.conf 맨 페이지를 모두 다 읽어보지는 않았다. 설정 파일에서 샵(#) 문자로 시작하는 줄은 여러분도 예상하다시피 주석문이다. 따라서 위의 설정 파일에서 실제로 사용되는 부분은 다음과 같다.

(READPORT 0x020b)
(ISOLATE)
(IDENTIFY *)
(CONFIGURE RTL8019/1645579 (LD 0
(IO 0 (BASE 0x0340))
(INT 0 (IRQ 10 (MODE +E)))
(ACT Y)
))

처음에는 (ACT Y)부터 시작해서 거의 모든 것이 주석문 처리되어 있을 것이다. 여러분의 작업은 주석문 처리되어 있는 것 중에 알맞은 것을 선택하여 # 문자를 지워 활성화시키는 일, 주석문에 자세히 적힌 I/O 주소, IRQ 범위에서 다른 주변기기와 충돌하지 않는 주소와 IRQ를 선택하는 일이다. 주석문이 영어로 되어 있기는 하나 필자가 생각하기에는 맨 페이지보다도 더 중요하고 실전적인 지식을 알려준다.

#     Compatible device id PNP80d6
#     Logical device decodes 10 bit IO address lines
#     Minimum IO base address 0x0220
#     Maximum IO base address 0x0380
#     IO base alignment 32 bytes
#     Number of IO addresses required: 32

위와 같은 문장을 볼 수 있을 것이다. 지정할 수 있는 I/O 최소 번지는 0x0220 이고 최대 번지는 0x0380이라고 가르쳐 주고 있다. 설정하기 전에 이미 리눅스가 부팅되고 나서 사용 중인 I/O 주소를 피해야 하므로 현재 사용중인 I/O 주소에 대하여 알아야 할 것이다. 이럴 때는 리눅스의 재미있는 파일 시스템인 /proc 시스템을 이용하자.

# cd /proc
# cat ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-009f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : npu
0170-0177 : ide1
01f0-01f7 : ide0
0220-022f : sound blaster
0230-0233 : sbpcd
02f8-02ff : serial(auto)
0376-0376 : ide1
0378-037f : lp
0388-038b : OPL3/OPL2

중복되는 주소만 피해서 설정하면 된다.

#     IRQ 3, 4, 5, 9, 10, 11, 12 or 15.
#     High true, edge sensitive interrupt
(INT 0 (IRQ 10 (MODE +E)))

이번에는 IRQ를 설정하는 부분이다. 친절하게 설정할 수 있는 IRQ로는 3, 4, 5, 9 등이 있다고 알려주고 있다. 역시 이미 사용중인 IRQ를 지정할 수는 없으므로 현재 사용중인 IRQ를 점검해보자.

# cd /proc
# cat interrupts
 0:  23254768  timer
 1:   312846  keyboard
 2:     0  cascade
 3:  6309207 + serial
 4:     1 + serial
 5:     1  sound blaster
 8:     0 + rtc
11:     60 + aic7xxx
12:   779889  PS/2 Mouse
13:     1  math error
14:  1616870 + ide0
15:   208796 + ide1

빈 IRQ 번호를 정하라.

3.7 isapnp 명령으로 PnP 설정하기

가장 어려운 고비인 /etc/isapnp.conf 파일 설정을 마쳤다.

# isapnp /etc/isapnp.conf

이렇게 하면 시스템이 잠깐 멈추는 기색을 보이고 나서 성공적으로 PnP 설정을 마칠 것이다. 만약 여러분이 제공한 정보가 올바르지 않아 PnP BIOS에 의해 설정이 거부되면 에러 메시지가 뜰 것이다.

3.8 원하는 모듈을 띄운다

필자는 대만제 PnP NE2000 호환 이서네트 카드를 인식시키려고 isapnp 도구를 사용하였다.

# modprobe ne io=0x340,irq=10

또는 커널 데몬(kerneld)을 사용하는 경우 /etc/conf.modules 파일에 다음 줄을 한 줄 추가하면 된다. 다음은 필자의 예이다.

alias scsi_hostadapter aic7xxx
alias eth1   ne
options sbpcd  sbpcd=0x230,1
options ne   io=0x340,irq=10
options wdt   irq=6

한 때 사운드블래스터 32 기종과 3Com509b의 인식 문제가 크게 대두된 적 있다. 사운드블래스터 최신 기종들이 IDE 인터페이스를 달고 나오며 그 IDE 인터페이스가 우리도 모르게 IRQ 10 또는 11번을 장악하는 사실을 몰랐기 때문이다. 안다 할지라도 사운드블래스터의 PnP 기능, IDE 인터페이스 기능을 마비시키는 것이 제대로 먹혀들지 않는 것 같았다. 필자도 알짜 레드햇 4.1 제작 당시 한 대의 테스트 머신에서 사운드블래스터 32를 사용하는 바람에 3Com509b를 포기한 적이 있었다.

끝으로 정말로 힘든 일을 해준 Peter Fox씨에게 감사하는 마음 갖는다. 그는 마이크로소프트 사의 PnP 스펙을 보고 힘겹게 리눅스용 프로그램을 만들었다고 한다. 한 사람의 노력으로 전세계의 사람들이 혜택을 누릴 수 있다는 것, 그것만큼 값진 것이 어디 있을까? 여러분도 프로그래머라면 금전적 이익 이외에 이러한 명예를 누려보는 것이 어떤가? 리눅스에 기여할 수 있는 분야는 정말 많다.


다음 이전 차례