Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Index   Calendar   Search
 
Linux og ISA Plug and Play.
Plug and Play kort var engang et problem for Linux. Det problem er nu stort set ikke-eksisterende, men man må selv sætte dem op til at fungere. Her vises lidt om, hvordan dette generelt gøres. Det skal hertil siges at det med 2.4 kernen ikke længere burde være nødvendigt at gøre nedenstående, da den har indbygget Plug and Play, men indtil da er der ingen vej udenom.
Af Martin Møller.


Der er en del kort, især lydkort, på markedet, der er mærket PnP, hvilket oprindeligt indikerede, at Windows ville være i stand til at finde en konfiguration af kortet, der ikke kom på tværs af de andre enheder i systemet. Det var dog ikke umiddelbart muligt at få disse enheder til at fungere under Linux til at starte med. Det er dog længe siden det var sådan. Et værktøj ved navn isapnp har eksisteret siden 1996 og er løbende blevet opdateret. Den version jeg har er fra den 10. november 1998, og må anses for at være tæt på 100% effektiv. Brugen er to-delt: Et program ved navn pnpdump scanner for plug-and-play kort og angiver alle de mulige værdier disse kort kan antage, og isapnp programmet aktiverer de værdier man har valgt. Disse skal afkommenteres, før isapnp har nogen effekt. De fleste distributioner leder efter filen /etc/isapnp.conf under opstart og kørrer automatisk isapnp på den, hvis de finder den. Vi vil her se på, hvordan man benytter pnpdump og isapnp med udgangspunkt i et SoundBlaster AWE 64 PnP. Lignende fremgangsmåder gælder for andre ISA PnP enheder.

Hvis maskinens BIOS kan indstilles til PnP og non-PnP OS, så sæt den til non-Pnp OS. Det har hverken Linux eller Windows nogen problemer med. Hvor denne mulighed befinder sig, og hvordan man kommer hen til den varierer for hver BIOS på markedet, men her er et par af de scenarioer jeg har observeret.

For at komme ind i BIOS
Compaq : F10 to gange (registrerer ikke altid første tryk)
IBM : F1
Intel : F1 / F2
Andre : Del(ete) (typisk)

Der vil normalt stå en sætning i retning af Press <key> to enter SETUP nederst på skærmen for de maskiner, der ikke smækker et stort logo op på skærmen under opstart. Her er det så key (f.eks. F2), der skal trykkes.
Hvis der er en opsætning for Plug and Play, vil den som regel befinde sig under en Advanced menu. Er der en indstilling for PnP OS, bør denne være Other PnP OS eller Disabled. Ikke noget med Windows. Husk at gemme indstillingerne.
Med dette på plads kan vi nu vende tilbage til Linux og få kortene konfigureret. Log ind som root og udfør pnpdump > /etc/isapnp.conf. Vi skal nu have redigeret i /etc/isapnp.conf filen. Det letteste er nok at bruge enten kedit (KDE) eller gedit (GNOME). Har du en anden foretrukken editor bruger du bare den. Først viser jeg lige et resultat af at have redigeret isapnp.conf filen til at passe med kortet:
/etc/isapnp.conf
# (DEBUG)
(READPORT 0x0203)
(ISOLATE PRESERVE)
(IDENTIFY *)
(VERBOSITY 2)
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING

# Card 1: (serial identifier 5a 10 00 86 5f 9d 00 8c 0e)
# Vendor Id CTL009d, Serial Number 268469855, checksum 0x5A.
# Version 1.0, Vendor version 2.0
# ANSI string -->Creative SB AWE64 PnP<--
#

(CONFIGURE CTL009d/268469855 (LD 0
#     ANSI string -->Audio<--

(INT 0 (IRQ 5 (MODE +E)))
(DMA 0 (CHANNEL 1))
(DMA 1 (CHANNEL 5))
(IO 0 (SIZE 16) (BASE 0x0220))
(IO 1 (SIZE 2) (BASE 0x0330))
(IO 2 (SIZE 4) (BASE 0x0388))

 (NAME "CTL009d/268469855[0]{Audio               }")

#     End dependent functions
(ACT Y)
))
#

(CONFIGURE CTL009d/268469855 (LD 2
#     ANSI string -->WaveTable<--

(IO 0 (SIZE 4) (BASE 0x0620))
(IO 1 (SIZE 4) (BASE 0x0A20))
(IO 2 (SIZE 4) (BASE 0x0E20))

 (NAME "CTL009d/268469855[2]{WaveTable           }")

#     End dependent functions
(ACT Y)
))
#
# End tag... Checksum 0x00 (OK)

# Returns all cards to the "Wait for Key" state
(WAITFORKEY)

Dette er en minimal udgave af isapnp.conf af pladshensyn og overskuelighed. Den initialiserer et SoundBlaster AWE64 PnP kort (dog kun Audio og WaveTable, jeg har udeladt Game/Joystik og IDE controllerne). Som det står her, er der ikke så meget mystik over det, men når man ser det rå output fra pnpdump kan man godt blive lidt forvirret. Nedenfor ses en rå pnpdump sektion for audio delen af ovenstående:

Audio uddrag af /etc/isapnp.conf
# $Id: pnpdump.c,v 1.16 1998/10/09 22:19:06 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)
#
# For latest information on isapnp and pnpdump see:
# http://www.roestock.demon.co.uk/isapnptools/
#
# Compiler flags: -DREALTIME
#
# Trying port address 0203
# Board 1 has serial identifier 5a 10 00 86 5f 9d 00 8c 0e

# (DEBUG)
(READPORT 0x0203)
(ISOLATE PRESERVE)
(IDENTIFY *)
(VERBOSITY 2)
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING

# Card 1: (serial identifier 5a 10 00 86 5f 9d 00 8c 0e)
# Vendor Id CTL009d, Serial Number 268469855, checksum 0x5A.
# Version 1.0, Vendor version 2.0
# ANSI string -->Creative SB AWE64 PnP<--
#
# Logical device id CTL0042
#
# 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 required
# Don't forget to uncomment the activate (ACT Y) when happy

(CONFIGURE CTL009d/268469855 (LD 0
#     ANSI string -->Audio<--

# Multiple choice time, choose one only !

#     Start dependent functions: priority preferred
#       IRQ 5.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 1.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 1))
#       Next DMA channel 5.
#             16 bit DMA only
#             Logical device is not a bus master
#             DMA may not execute in count by byte mode
#             DMA may execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 1 (CHANNEL 5))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0220
#             IO base alignment 1 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0330
#             Maximum IO base address 0x0330
#             IO base alignment 1 bytes
#             Number of IO addresses required: 2
# (IO 1 (SIZE 2) (BASE 0x0330))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0388
#             Maximum IO base address 0x0388
#             IO base alignment 1 bytes
#             Number of IO addresses required: 4
# (IO 2 (SIZE 4) (BASE 0x0388))

#       Start dependent functions: priority acceptable
#       IRQ 5, 7, 9 or 10.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0, 1 or 3.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 0))
#       Next DMA channel 5, 6 or 7.
#             16 bit DMA only
#             Logical device is not a bus master
#             DMA may not execute in count by byte mode
#             DMA may execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 1 (CHANNEL 5))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0280
#             IO base alignment 32 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0300
#             Maximum IO base address 0x0330
#             IO base alignment 48 bytes
#             Number of IO addresses required: 2
# (IO 1 (SIZE 2) (BASE 0x0300))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0388
#             Maximum IO base address 0x0388
#             IO base alignment 1 bytes
#             Number of IO addresses required: 4
# (IO 2 (SIZE 4) (BASE 0x0388))

#       Start dependent functions: priority acceptable
#       IRQ 5, 7, 9 or 10.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0, 1 or 3.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 0))
#       Next DMA channel 5, 6 or 7.
#             16 bit DMA only
#             Logical device is not a bus master
#             DMA may not execute in count by byte mode
#             DMA may execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 1 (CHANNEL 5))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0280
#             IO base alignment 32 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0300
#             Maximum IO base address 0x0330
#             IO base alignment 48 bytes
#             Number of IO addresses required: 2
# (IO 1 (SIZE 2) (BASE 0x0300))

#       Start dependent functions: priority acceptable
#       IRQ 5, 7, 9 or 10.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0, 1 or 3.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 0))
#       Next DMA channel 5, 6 or 7.
#             16 bit DMA only
#             Logical device is not a bus master
#             DMA may not execute in count by byte mode
#             DMA may execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 1 (CHANNEL 5))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0280
#             IO base alignment 32 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))

#       Start dependent functions: priority acceptable
#       IRQ 5, 7, 9 or 10.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0, 1 or 3.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 0))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0280
#             IO base alignment 32 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0300
#             Maximum IO base address 0x0330
#             IO base alignment 48 bytes
#             Number of IO addresses required: 2
# (IO 1 (SIZE 2) (BASE 0x0300))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0388
#             Maximum IO base address 0x0388
#             IO base alignment 1 bytes
#             Number of IO addresses required: 4
# (IO 2 (SIZE 4) (BASE 0x0388))

#       Start dependent functions: priority acceptable
#       IRQ 5, 7, 9 or 10.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0, 1 or 3.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 0))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0280
#             IO base alignment 32 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0300
#             Maximum IO base address 0x0330
#             IO base alignment 48 bytes
#             Number of IO addresses required: 2
# (IO 1 (SIZE 2) (BASE 0x0300))

#       Start dependent functions: priority acceptable
#       IRQ 5, 7, 9 or 10.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0, 1 or 3.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 0))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0280
#             IO base alignment 32 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))

#       Start dependent functions: priority functional
#       IRQ 5, 7, 9 or 10.
#             High true, edge sensitive interrupt (by default)
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0, 1 or 3.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 0 (CHANNEL 0))
#       Next DMA channel 5, 6 or 7.
#             16 bit DMA only
#             Logical device is not a bus master
#             DMA may not execute in count by byte mode
#             DMA may execute in count by word mode
#             DMA channel speed in compatible mode
# (DMA 1 (CHANNEL 5))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0280
#             IO base alignment 32 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0300
#             Maximum IO base address 0x0330
#             IO base alignment 16 bytes
#             Number of IO addresses required: 2
# (IO 1 (SIZE 2) (BASE 0x0300))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0388
#             Maximum IO base address 0x0394
#             IO base alignment 4 bytes
#             Number of IO addresses required: 4
# (IO 2 (SIZE 4) (BASE 0x0388))
 (NAME "CTL009d/268469855[0]{Audio               }")

#     End dependent functions
# (ACT Y)
))

Som det kan ses er der masser af beskrivelser, men næsten for mange muligheder. Det letteste er derfor at notere hvilke indstillinger kortet har under Windows, hvis man kører med det (i så fald *bør* man bruge Windows indstillingerne under Linux også for den mest gnidningsfrie opsætning). Har man disse ved hånden kan man blot sætte dem ind i det første eksempel og fjerne resten. Det kunne nok have hjulpet lidt, hvis man simpelthen fik en oversigt over IRQ'er, hukommelses-områder og DMA kanaler kortet understøttede og så tjekkede dem man havde fri. Stadig med en anbefalet værdi, naturligvis. Det har åbenbart ikke været så ligetil, så ovenstående lidt forvirrende smøre er og bliver standard-metoden til at konfigurere ISA PnP på. Det er værd at bemærke af ALSA (Advanced Linux Sound System) har forsøgt at lette Plug and Play byrden for lydkort med deres egen måde at detektere disse på. Nogle gange virker det, andre ikke, men det er også stadig under udvikling. ALSA er i øvrigt også på vej imod inklusion i kernen i stedet for OSS/Free, men om det med i 2.4 kernen er dog lidt tvivlsomt. Når man skal tjekke de ressourcer andre enheder optager nu under Linux gøres det på følgende vis:

cat /proc/interrupts
           CPU0       
  0:     400642          XT-PIC  timer
  1:       7118          XT-PIC  keyboard
  2:          0          XT-PIC  cascade
  8:          0          XT-PIC  rtc
 11:     222380          XT-PIC  bttv, eth0
 13:          1          XT-PIC  fpu
 14:     240952          XT-PIC  ide0
 15:         38          XT-PIC  ide1
NMI:          0

Her kan vi se, at irq 3,4,5,6,7,9,10 og 12 stadig kan benyttes. Ydermere kan det ses, at maskinens TV-kort og netkort deler IRQ 11 uden konflikter. Tallene yderst til venstre er selve IRQ numrene. Lige efter har vi antallet af interrupts, der er blevet genereret i den tid Linux har været kørende. Disse værdier kan blive endog MEGET store. Til sidst har vi så hvilke enheder IRQ'erne er tildelt; rtc = Real Time Clock, fpu = Floating Point Unit, etc.
cat /proc/ioports:
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
02f8-02ff : serial(auto)
0376-0376 : ide1
0378-037a : parport0
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(auto)
0778-077a : parport0
ff00-ff3f : eth0
ffa0-ffa7 : ide0
ffa8-ffaf : ide1

Vi kan her se, at standard områderne for Soundblaster lydkort (0x220, 0x388 og for AWE64's vedkommende, 0x620, 0xA20 og 0xE20) er ledige, så vi behøver ikke gøre nogen krumspring her heller. Bemærk dog, at pnpdump kun finder adressen 0x620 og at man altså selv må indsætte 0xA20 og 0xE20, som vist i starten af denne artikel. Dette kan også gælde for andre kort. Som ved IRQ'erne ses her først adresse-området og dernæst hvilken enhed, der benytter dette. De fleste værdier en rimelig lette at gætte, men mange vil nok have lettere ved at overskue dem, når de grafiske frontends i KDE m.v. bliver færdige.

cat /proc/dma
 4: cascade

Der er heller ikke nogen problemer med DMA indstillingerne. DMA 1 og 5 er begge ledige. Vi kan derfor uden videre afkommentere de relevante linier i Start dependent functions: priority preferred sektionen og slette acceptable og functional delene. Det, det gælder om, er altså at tjekke hvilke af de værdier, der er angivet for IO, DMA, og INT ovenfor er ledige, hvor de øverste værdier er foretrukne af kortet fremfor dem længere nede i listen.

Ud fra disse oplysninger skulle det være muligt at konfigurere de fleste ISA PnP kort med kun et minimum af besvær. Flere oplysninger kan findes i : Plug-and-Play-HOWTO, samt med man isapnp.conf, man isapnp og man pnpdump.

Yderligere information finder du her
Seneste revision af isapnp :
http://www.roestock.demon.co.uk/isapnptools/
Seneste HOWTO:
http://howto.linuxberg.com/ptHOWTO/Plug-and-Play-HOWTO
The Wonderful World of Linux 2.4 :
http://linuxtoday.com/story.php3?sn=10698

Original til denne artikel kan findes her

 
 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified Monday, 08-Mar-2004 11:22:53 CET
This page is maintained by Frank Damgaard .