PNP(4)

명칭
pnp - PnP 디바이스의 서포트

서식
controller pnp0

해설
FreeBSD 의 PnP 디바이스 서포트에 의해, 유저가 PnP 카드의 설정을 강제 설정하는 것이 가능하게 됩니다. 또, 디바이스 드라이버가 PnP 카드의 파라미터를 취득·변경하는 것이 가능하게 됩니다.

수동으로 강제 설정하는 기능을 이용하기 위해서(때문에)는, 커널을 options USERCONFIG 부착으로 컴파일 할 필요가 있습니다. 이 때 커널은, PnP 디바이스의 설정을 기록하기 위한 일정한 크기의 테이블 (디폴트로 20 엔트리)을 확보합니다. PnP 카드 1 개(살)이 복수의 독립한 디바이스로부터 구성되어 있다 일도 있습니다 (5 개(살) 6 개(살)이나 있다고 하는 것은 비정상이지는 않습니다).

커널을 “-c” 플래그 첨부로 부트 하는 것으로, PnP 카드의 설정 변경의 명령을 사용할 수 있습니다. 커멘드는
    pnp CSN LDN
그렇다고 하는 순차 순서로부터 시작됩니다. 여기서, CSN 및 LDN 는 각각, 디바이스에 차이고 있는 카드 선택 번호 (Card Select Number) 및 논리 디바이스 번호 (Logiacal Device Number) 입니다. 이 순차 순서에 이어, 이하의 명령의 임의의 편성을 사용할 수 있습니다.

irqN line
    카드상의 세치기 0 또는 1 (역주: N 로 지정) 에 사용하는 IRQ 선을 설정합니다. line 에 0 을 지정하는 것은, IRQ 선을 사용하지 않는 것을 의미합니다.

drqN n
    카드상의 DMA 0 또는 1 (역주: N 로 지정) 에 사용하는 DRQ 채널을 설정합니다. 채널에 4 를 지정하는 것은, 채널을 사용하지 않는 것을 의미합니다.

portN address
    N 번째의 포트 area (port's range) 의 기저 주소 (base address) (을)를 설정합니다 (N=0..7). address 에 0 을 지정하는 것은, 포트를 사용하지 않는 것을 의미합니다.

memN address
    N 번째의 메모리 area (memory's range) 의 기저 주소 (base address) (을)를 설정합니다 (N=0..3). address 에 0 을 지정하는 것은, 메모리 area를 사용하지 않는 것을 의미합니다.

bios
    PnP 디바이스의 설정으로서 BIOS 가 설정한 것을 사용합니다. 이것은 디폴트이며, BIOS 가 PnP 를 서포트하고 있는 경우에는 통상은 이것으로 좋을 것입니다. BIOS 설정을 사용하는 경우에는 “flags” 이외의 파라미터는 무시됩니다.

os  PnP 디바이스의 설정에, 이 엔트리로 지정한 것을 사용합니다.

enable
    PnP 디바이스를 유효하게 합니다.

disable
    PnP 디바이스를 무효로 합니다.

delete
    디바이스에 사용되고 있는 엔트리를 해방해, 다른 CSN/LDN 의 조를 가진다 다른 디바이스로 사용할 수 있도록(듯이) 합니다.

flags
    디바이스 드라이버에 건네주는 32 비트의 flags 엔트리의 값을 설정합니다. flags 는, 특별한 동작 모드를 지정하는데 사용되는 일이 있습니다. (예를 들면, 어떤 종류의 사운드 카드로 SB 와 WSS 의 에뮬레이션을 바꾸는, 등)

현재의 테이블내의 설정치는, userconfig 의 ls 명령로 표시됩니다. 이 테이블은, 유저가 행한 변경에 가세해 PnP 디바이스 드라이버가 액세스 한 모든 논리 디바이스의 엔트리를 보관 유지합니다.

테이블의 변경 결과는, dset(8) 명령에 의해 파일 시스템상의 부트 이미지에 보존됩니다. (역주: 커널의 ELF 화에 의해 dset 명령은 폐지되었습니다)

PnP 를 서포트하는 디바이스 드라이버
커널은 PnP 디바이스를 자동적으로 인식해 설정합니다. PnP 디바이스는 이하의 데이터 구조로 식별합니다.

    struct pnp_device {
    	char	*pd_name;
    	char	*(*pd_probe ) (u_long csn, u_long vendor_id);
    	void	(*pd_attach ) (u_long csn, u_long vend_id, char * name,
    		    struct isa_device *dev);
    	u_long	*pd_count;
    	u_int	*imask;
    	struct	isa_device dev;
    };

프로브 (probe) routine는, 건네받는 vendor_id 가 자신이 인식하는 것인지, 카드중의 필요한 디바이스가 유효하게 되어 있는지를 체크해, 체크에 실패했을 경우에는 NULL 치를, 성공했을 경우에는 NULL 가 아닌 값 (일반적으로 디바이스명을 가리키는 포인터)(을)를 돌려줍니다. 프로브 routine내에 있어, 논리 디바이스가 유효한지 어떤지의 체크에는, read_pnp_parms() (을)를 사용할 수 있습니다.

아탓치 (attach) routine는, PnP 카드를 ISA 액세스 가능하게 하는, 설정을 취득하는, 디바이스의 ISA 드라이버를 부르는, 그렇다고 한 필요한 초기화를 모두 실시하는 것이 필요합니다.

다음의 routine와 데이터 구조를 사용할 수 있습니다.

struct pnp_cinfo
    이 데이터 구조 ( /usr/i386/isa/pnp.h 그리고 정의되고 있다) (은)는, PnP 논리 디바이스에 관련하는 모든 정보를 포함하고 있습니다.

read_pnp_parms(struct pnp_cinfo *d, int ldn)
    이 함수는 요구된 논리 디바이스의 설정을 돌려줍니다. 이 함수는 프로브 및 아탓치의 routine로부터 불리는 것만을 상정하고 있기 (위해)때문에, CSN 를 지정할 수 없습니다.

write_pnp_parms(struct pnp_cinfo *d, int ldn)
    이 함수는 요구된 논리 디바이스의 파라미터를 설정합니다. 동시에, 커널의 강제 설정용 테이블의 엔트리를 갱신합니다. BIOS 나 (userconfig 를 사용한다) 유저가, 어떻게 파라미터를 설정해야할 것인가를 잘 알고 있을 것이므로, 디바이스 드라이버는 통상 디바이스의 설정을 변경해야 하는 것은 없습니다. 특히, userconfig 에 의한 강제 설정 메카니즘을 파탄시켜 버리기 (위해)때문에, 무효가 되어 있는 논리 디바이스를 유효하게 해 되지 않습니다. 디바이스 드라이버는 논리 디바이스나 포트 area등을 무효로 해도 괜찮습니다가, 이것은, 특정의 디바이스나 파라미터가 문제를 일으키는 것을 알 수 있고 있는 경우에 한정해야 합니다.

enable_pnp_card(void)
    이 함수는 아탓치르틴 내부에서 마셔, 카드의 ISA 포트/메모리의 주소 area에 액세스 하기 전에 부르지 않으면 안됩니다.

관련 항목
dset(8) (역주: 폐지되었습니다)

버그
비주얼 배치에는, PnP 디바이스 설정의 서포트가 없습니다. userconfig 의 명령로 PnP 디바이스의 설정을 취득할 수가 있으면 훌륭한 일이지요.

저자
PnP 서포트는 Sujal Patel 하지만 처음에 다룬 것을 바탕으로, Luigi Rizzo 하지만 썼습니다.

역사
pnp 하 FreeBSD 2.2.5 에 처음으로 등장했습니다.