即插即用,在
Linux底下?不好办,你还是换老的非即插即用设备吧。这是我初次接触
Linux时,那些
Linux高手们告诉我的。可是,我觉得总该有办法的。经过不懈的努力,我发现了两种方法。一是先从DOS启动,初始化设备后,再用loadlin加载到
Linux中。但这不是我所梦寐以求的,因为每次需要大量
时间来启动。我继续不停的寻找,终于有一天,我找到了我需要的东西,一个称为isapnptools的应用
程序。
9 q8 B3 Z* g% k. e
+ ?( K( [. |4 A+ e2 I 现在,大多数发行套件中都有isapnptools。如果你的套件中有,安装它即可。如果你的发行套件中没有它,到http://www.roestock.demon.co.uk/isapnptools/ 去
下载一份,解压后把isapnp 和 pnpdump 拷贝到目录 /sbin中即可。
1 N1 ~% d3 O9 R) W- f6 O# z. g" y
. |& S' ]! S# y, v 下面就是实战阶段了。需要准备的就是把你所有要装的即插即用设备全部装好,以ROOT身份登陆。然后运行以下命令/sbin/pnpdump %26gt; /etc/isapnp.conf,这会把你
机器上所有的即插即用设备
信息写入文件/etc/isapnp.conf中,下面是我的机器上的/etc/isapnp.conf文件的一部分:
; V8 z: x9 t) K! B
8 j3 @! x1 a0 W% T4 O' r3 k6 \# $Id: plugnplay.html,v 1.1.1.1 1998/12/26 04:41:14 jack Exp $
& M. U, X: I9 A$ i' ~: ~: O2 J
# This is free software, see the sources for details.
4 V, G5 a1 U9 c/ \3 P/ u9 t7 |
/ L. R; D# ?% T7 f% o2 V" ^# This software has NO WARRANTY, use at your OWN RISK
& K- y0 x9 N7 d6 B% s0 N0 w
9 \* l4 D7 |. D* v' n8 H. _' I
#
* E6 F. e8 e) A0 l: s9 q( ^6 l
0 }: z( c& j5 j5 |) a* b& V" c# For details of this file format, see isapnp.conf(5)
4 ^& y S4 Z' f7 B# o/ F% B& d; O( f! J# t4 b c: l
#
3 y- g3 l/ b5 y$ U9 N7 K. c2 g7 ?* b @3 G5 f
# For latest information on isapnp and pnpdump see:
% ^" F4 A6 L; k
" |( A4 S. k @
# http://www.roestock.demon.co.uk/isapnptools/
% Y7 D r' H$ Z; C
. D) j) a( e* `( b$ }
#
8 Z5 {1 w, K. k3 {+ M. }8 |( d9 t% k; h1 Q5 w
# Compiler flags: -DREALTIME -DNEEDSETSCHEDULER
2 e- b& w( u( j
& ~' V2 \& u$ N6 N
#
. a5 N& V z: z' Z- p4 \( h$ W. B9 M3 }* I! S5 n
# Trying port address 0203
2 H+ N8 S/ r) G% R( g9 _4 f
5 x; c* m# n# I# Board 1 has serial identifier c5 c0 7f 53 05 01 22 05 07
9 h6 |7 ?: p% a j4 ^7 I+ u6 o4 u# u, u5 u
# Board 2 has serial identifier 5a 80 86 00 01 20 00 a8 65
/ a F) w& W, }: f) y" l
. }( S$ T: N' \/ ^. R7 h N9 X9 R; u# Board 3 has serial identifier e8 46 46 46 46 90 30 72 56
( S8 i( @/ x& b6 |6 A. G* u# d2 r N, z/ u
2 U2 S- x) Q) l. r# (DEBUG)
6 m7 ~$ H5 V" w
2 e3 H- z5 c3 J9 J(READPORT 0x0203)
1 p" B5 W# q; @3 O
# L* v1 n5 n" H. {(ISOLATE PRESERVE)
5 N, {3 ~" C; G/ k$ @; a: \& b! K- _- ^) `
(IDENTIFY *)
/ u) M/ ~- y% D+ i
$ P4 G8 ]# c, C% m1 [% {$ X2 ](VERBOSITY 2)
2 V( F! S+ F) {8 \) B
4 N" u) d3 g1 w6 K(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING
" h; @9 U# P5 S' z( N9 }1 U
, i& o1 S- H1 c! y: P7 a+ ^; l5 q: J6 i' K* E* d7 ~
# Card 1: (serial identifier c5 c0 7f 53 05 01 22 05 07)
, L8 H% u% K7 O" k
" }' A) p) F7 Q# k
# Vendor Id AXE2201, Serial Number 3229569797, checksum 0xC5.
5 i K* u% }* C: B7 X2 J3 f
: s6 v6 a4 |- z+ u/ q# Version 1.0, Vendor version 0.0
$ I4 G! g) H* a) z0 E$ n
% t( S& s/ o6 R) M# f' f1 r# ANSI string --%26gt;Ethernet PnP ISA Card /S %26lt;--
' m& S# V* i! A: J5 {9 n6 U5 q7 h8 L% r) e4 H
#
9 E* f( @+ Z' j4 C
0 C7 \7 O. M, ? G& ?# Logical device id AXE2201
) b5 a% e. {8 @' E6 u" Q
/ N) @; S* f* W; G3 L* V7 X# Device support I/O range check register
0 ]5 H& @. w9 I
& y$ N1 J O' f+ M2 w" [2 q( C
#
5 j, `4 N9 A* `, R) B
( B4 n* ?6 M2 m) ^0 k- Z
# Edit the entries below to uncomment out the configuration required.
8 ~! K" t# {, z2 u! N# s$ @- ~6 l2 `$ L: l: g, ?0 Q$ J
# Note that only the first value of any range is given, this may be
1 Z/ i4 J, Y% M' y$ g) V! s. M
2 y9 \/ k0 K% d1 z, ?7 k: G# changed if required
+ l9 [5 N) R. ~1 x. i/ {6 B8 J7 l! C8 l2 _( _+ v2 B6 T
# Don't forget to uncomment the activate (ACT Y) when happy
2 M/ Y0 b" K k7 S P) {" K
b$ Y, Q2 W7 G( E0 K& V; A ^: L; y! p! O' W0 i! L2 \
(CONFIGURE AXE2201/3229569797 (LD 0
! q% ]# a |% s' [: G
8 c2 C' U. G9 r% y( H# Compatible device id PNP80d6
6 X$ L, u$ |2 Y# i- P% x. Y. a! h
0 b0 @+ `# k0 t: l1 h) f- h" k# Logical device decodes 10 bit IO address lines
" C" P* i4 |& M% G- r2 a, [3 t6 p
$ ?8 `8 ~3 a( P( r4 r# Minimum IO base address 0x0240
6 O @* M/ j4 y- q- u0 V# X. d9 \2 D" G( l# W* B2 y* |
# Maximum IO base address 0x0380
8 K8 {% O( D# j9 ?4 N$ Q1 U# `- k0 W9 k
# IO base alignment 32 bytes
- t! `" y, C0 @
: L! R' j3 x* v4 P6 t& F7 d# Number of IO addresses required: 32
9 W& M' X! u u( H& x, J
: l/ \2 r5 h2 l8 r
# (IO 0 (SIZE 32) (BASE 0x0240))
! u. {. h3 ]2 U' i- z
2 o; h" y2 K2 D+ O# ]: {' T6 H# IRQ 3, 5, 9, 10, 11, 12 or 15.
* A# c" e @7 p3 N' w$ M# r2 V9 D2 H* h( w f
# High true, edge sensitive interrupt
1 b& K9 |& S3 w6 p5 K5 |: m1 O1 `6 ~+ C( E' ^ H4 w
# (INT 0 (IRQ 3 (MODE E)))
/ _2 E9 S J0 P' Y5 b( r/ ~2 a& f3 {6 G
# (ACT Y)
) i- d" T6 x! d y7 B4 o
$ m `2 L. y* l))
4 g, Y3 K3 H4 R. l
- R4 U% K' a. B. g- [6 T
# End tag... Checksum 0x00 (OK)
/ [# H) M4 b7 p
/ m0 r( R. N! ]9 V% B
# 略去
声卡部分
6 Q9 [: `( x& h* }% E
0 G5 K T, e+ w3 k5 u
#略去modem卡部分
2 d R' d, p3 |
x$ e) [: a1 w
! t! V, F8 c) T# i# Returns all cards to the "Wait for Key" state
- u1 @" k. N" i' g: E4 D
- Q3 W& |; b" J; f$ Z! v' P& H
(WAITFORKEY)
. x8 ]. g. ]5 ]3 _, ^/ E9 R0 H) w/ `. F; U
, Y. u3 q* l3 A. _- J7 q1 D" h 我的
系统中共有三个即插即用设备,分别是NE2000兼容
网卡,Yamaha OPL~SA2声卡和一个USR 56K modem。由于文件太长,我略去了声卡和modem部分。
+ u: Q; X! T& y5 ~
5 o/ B+ ]! \+ a5 Y+ F 接下来就是为每个设备分配所需资源。有许多方法可以实现。第一种,也是最简单的方法就是,如果你在同一台机器上也装了WIN95或WIN98,通过控制面板的系统的属性页,可以看到在WINDOWS系统下各即插即用设备的资源,记下用到Linux即可。如果你的机器中没有其它的
操作系统,采用第二种方法。即手动分配资源,只要各设备资源不发生冲突就行。手动分配资源以前,最好先看一下已经使用的中断列表、I/O列列表,它们分别位于/proc/interrupts、/proc/ioports、/proc/dma。一旦你确定了各设备使用的资源,就可以分配了。
1 M+ P+ l, E1 P- s8 F( r% V2 N; {7 V. W
) ?9 `0 U) H$ _5 ` 选择分配给每个设备的资源非常简单。你只要去掉你的设备所需资源前的注释号即可。
描述资源的行很容易找到,因为它们总是以INT, IO或 DMA开头。在这些行之前是你所能使用资源的
描述。你可以选一组,因为象下面这样的一行说明它们有优先权的区别。
6 u2 D$ x! U- D, o
+ N3 P* l: _* N0 G# R9 a% _) `
# Start dependent functions: priority preferred
. r- R) s% y/ h# Z& Z8 j& m! }6 K
, a4 {& h$ k: ~7 y6 u) Z! G2 s 在去掉所需资源的注释号后,你还必须去掉(ACT Y)行上的注释号来告诉ISAPNP激活该设备。
+ }) l& x* Y$ S, V: C% F7 e( m3 @2 @5 F! k5 z
下面是我的/etc/isapnp.conf经过
编辑并去掉注释行后的样本:
5 l8 Y' J8 N1 L' E) Q4 _) E8 y
3 M( r$ [7 ]; s0 U, O
READPORT 0x0203)
9 w. }7 i! t' ?' K
2 h* m3 z+ u c" U7 O& M
(ISOLATE PRESERVE)
* h. Q4 q3 n4 M1 d: v& T8 N/ F
s" M6 m$ D; _ j, q
(IDENTIFY *)
' y8 s, P$ G L: s+ p& s% j2 L! B0 R8 }& a+ q( V
(VERBOSITY 2)
) P& i2 b# o- y# Z8 ?
# M l; ~- Z) o( e4 r
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING
0 A) Q+ k/ k! k
4 d# A8 P# {6 d9 Z4 ]3 m9 T; t
v: s: x8 f: i' |3 J. r* J
(CONFIGURE AXE2201/3229569797 (LD 0
7 x/ W% k( B; M1 i. i& i
) j: G k8 u! U(IO 0 (SIZE 32) (BASE 0x0240))
1 s5 y9 j7 ^6 q; f
, h) W/ E5 q7 [0 A: _2 t. c+ U' H. R(INT 0 (IRQ 3 (MODE E)))
3 }" R, H1 z: Q- }9 _% U# ^8 V, }, M* K0 b, `$ b: @
(ACT Y)
6 g0 p9 C! H: j; Q
5 E. L* p1 |. S. z- c))
1 [7 l5 z4 k. N
# z" ~% N7 j: x( E& J1 A" P5 }
3 Y9 p& U9 ]0 ~0 n, t(CONFIGURE YMH0020/2156265473 (LD 0
4 ]( d& J; E9 D* T0 P- {+ G. w
( ?. t- R) l! V! w* u(IO 0 (SIZE 16) (BASE 0x0220))
4 ~# c% v9 e' _. c
% V6 {4 Q( p' T: t4 A( J(IO 1 (SIZE 8) (BASE 0x0530))
# y3 ]6 o1 B! v6 _
, s E3 n- a6 T0 l. @' W9 v( \
(IO 2 (SIZE 4) (BASE 0x0388))
! A! \3 A. C7 j* W+ U& T$ ]$ V. X. p! q/ l" D6 E7 _1 Z( F
(IO 3 (SIZE 2) (BASE 0x0330))
& r( e* j$ G; j7 V8 R+ ~
6 s; H# a) V: K(IO 4 (SIZE 2) (BASE 0x0370))
2 _: x8 _. X# {) ? M5 {' J$ B# w2 y3 v0 }* ?7 I9 E! X
(INT 0 (IRQ 5 (MODE E)))
9 ?8 u$ M1 {; B$ ?: J7 u
7 @& x, {0 `; I1 s: u
(DMA 0 (CHANNEL 0))
$ J R2 J1 l" Q0 m- f1 Y) Z7 z/ R, H& }# E# [
(DMA 1 (CHANNEL 1))
% t& l( c2 e# f( E6 F6 d% g
9 W- D+ @4 b% W(ACT Y)
) X* K! z ]2 O1 _7 Z
9 k$ c; s& y, V8 C))
) x. h0 ?8 M: f! \. j% g* ]- q
) [6 ^9 p5 s9 D8 V1 F9 h. O+ n
3 G$ i6 w) @* g+ E) n" N8 \2 R(CONFIGURE YMH0020/2156265473 (LD 1
' \4 [# @* R) Y* E: x- F" x3 X
( V c7 @6 |. {/ p6 I5 b(IO 0 (SIZE 1) (BASE 0x0201))
9 r- G/ V; |: G' @2 @: E
2 w! S6 l9 Q M/ A( S9 u
(NAME "YMH0020/2156265473[1]{OPL3-SA2 Sound Chip }")
, I f9 f# U' _$ M4 s
8 M3 j' c; J9 L9 r' G(ACT Y)
) y @; [/ G9 }: S6 a. F! `# r/ U0 B* c, |: d+ Z0 T. ?& E
))
4 w3 z6 e- T7 a7 M2 V i1 e) c
% W/ ?$ a! R# k% y- D+ G& Q/ F. ?5 D1 h1 D
(CONFIGURE USR3090/1179010630 (LD 0
/ C: N! ]3 h* z+ R- Z( P; z& }, s
5 u# W6 p: q% z8 J% b& h9 _ `& f h0 ]9 y(IO 0 (SIZE 8) (BASE 0x02f8))
6 b; s! Y3 `, W, h: C( }2 Y
" f' l7 p# z" L! ]* I1 O5 f(INT 0 (IRQ 3 (MODE E)))
0 {* s3 d. D& s
# o6 V$ X1 v2 g' x) t+ ]* l: V
(NAME "USR3090/1179010630[0]{U.S. Robotics 56K Voice INT}")
! q( N& W' b/ z G; a- Q( g: q
% i9 i- H6 k' j(ACT Y)
) x V H9 H. o, B' F t% q* I2 q8 P* ] R1 g( N+ ~8 W" a0 l
))
# q/ \. F) F1 P+ v- ]1 [% N/ e) O* t" c5 ]
# r/ d- o2 v6 p! m: U9 O
(WAITFORKEY)
1 F) O7 V& @4 H* [6 D5 _. s2 Q4 s( u! c6 g) c: a& M- _8 I
O3 K n8 K* [6 X2 Z! S/ D 如果喜欢,留着其余的注释也行。下一步就是
测试你的配置是否正确。使用以下命令/sbin/isapnp /etc/isapnp.conf,屏幕会出现一些信息,样本如下:
7 _8 d' Q3 L8 z2 j1 O; p
$ l8 ~( C( W6 T' xBoard 1 has Identity c5 c0 7f 53 05 01 22 05 07: AXE2201
# L1 K p) n7 X, K# m
7 A' N: k) ^* _3 I' Z2 \Serial No 3229569797 [checksum c5]
) L' S5 R3 F8 U1 G o& c& j) j; F. C: `# \
Board 2 has Identity 5a 80 86 00 01 20 00 a8 65: YMH0020
5 ?' _2 J" M' s) ~. U+ n
; U. F9 O6 V, X9 Y7 XSerial No 2156265473 [checksum 5a]
4 Z; a0 U& M5 m. I6 X1 {* x- g; F) i/ n ~0 {' y5 @+ U
Board 3 has Identity e8 46 46 46 46 90 30 72 56: USR3090
1 S) `% ? D, e3 [& ]. }7 ~2 u& ]4 m
# {; y, J: x# w2 lSerial No 1179010630 [checksum e8]
+ C6 R- J/ y6 O4 w! y( n* m
) d8 h s& p9 J2 m' \+ T( N
如果你的配置文件有问题或发生资源冲突,它就会告诉你。发生问题不要着急,从头慢慢查找原因,一步一步再来。如果一切平安无事,你还必须保证你的即插即用设备在启动时能进行认证。不幸的是许多发行套件的初始脚本执行方式不同。如果你的发行套件中有isapnptools的话,可能你已经有正确的初始脚本。如果没有,仿照/etc/rc.d/init.d中的格式,自己写一个。
0 k4 y- I7 a* T0 C2 O; S, R `. k
O: }- A8 X6 o3 F0 V. H; }% z 最后一步是让你的内核支持即插即用设备。目前,内核支持isapnp设置的即插即用设备的唯一方法是把它们编译为模块。所以,对每一个被认为是即插即用的设备,确信把它编译为内核支持的模块。
0 T' E) U. X3 \+ _" X7 _- \. Y; P3 a. v
好了,不用再为你的新的设备不能被Linux接受而烦恼了,去尽情享受Linux带给你的乐趣吧。