[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Come trovare i driver per l'hardware (era Re: musica)



Filippo Dal Bosco - wrote:

Per linux manda ad sito di ALSA ma nel sito di ALSA non riesco a trovare ADI 1988.

ti riporto qui sotto una spiegazione dettagliata con un esempio di quello che devi fare per sapere quali driver servono per far funzionare una parte hardware, verificare se sono attivi o già attivabili o come fare per attivarli.

Esegui (riporta sotto i comandi quello che vedi a video così si può capire se hai fatto tutti i passi correttamente)
$ lspci

ritorna una riga relativa alla tua scheda audio (sempre che la tua scheda audio non sia USB e quindi devi usare il comando lsusb)

avrai una riga simile a questa:
00:0a.0 Multimedia audio controller: Creative Labs SB Live! EMU10k1 (rev 08)

Quello che ci interessa è il codice di inizio riga, nell'esempio è: 00:0a.0

ora esegui, sostituendo il tuo codice a quello d'esempio

$ cat /sys/bus/pci/devices/0000\:00\:0a.0/vendor

0x1102

$ cat /sys/bus/pci/devices/0000\:00\:0a.0/device

0x0002

quindi nell'esempio si ha che:
* vendor = 0x1102
* device = 0x0002

Ora servirebbero i sorgenti di Linux ... se non li hai installati e non li vuoi installare, allora ti possiamo fornire i risultati dei passi successivi noi (ricordati che devi sempre sostituire i tuoi valori con quelli dell'esempio).

Per installare i sorgenti:

1) recupera il pacchetto con i sorgenti

# linux-source-`uname -r | sed "s/-.*//"`

2) scompatta i sorgenti

$ cd /usr/src
$ tar -jxvf linux-source-`uname -r | sed "s/-.*//"`.tar.bz2

3) crea il link simbolico

$ ln -s /usr/src/linux-source-`uname -r | sed "s/-.*//"` /usr/src/linux

Poi continua con quanto riportato qui sotto

$ grep -i 0x1102 /usr/src/linux/include/linux/pci_ids.h | sort

#define PCI_DEVICE_ID_SUN_RIO_1394      0x1102
#define PCI_VENDOR_ID_CREATIVE          0x1102 /* duplicate: ECTIVA */
#define PCI_VENDOR_ID_ECTIVA            0x1102 /* duplicate: CREATIVE */


$ grep -i 0x0002 /usr/src/linux/include/linux/pci_ids.h | sort

#define PCI_DEVICE_ID_3DFX_VOODOO2      0x0002
#define PCI_DEVICE_ID_APPLICOM_PCI2000IBS_CAN 0x0002
#define PCI_DEVICE_ID_AUREAL_VORTEX_2   0x0002
#define PCI_DEVICE_ID_BCM1250_HT        0x0002
#define PCI_DEVICE_ID_CREATIVE_EMU10K1  0x0002
#define PCI_DEVICE_ID_CYRIX_5520        0x0002
#define PCI_DEVICE_ID_DCI_PCCOM8        0x0002
#define PCI_DEVICE_ID_DEC_TULIP         0x0002
#define PCI_DEVICE_ID_EF_ATM_ASIC       0x0002
#define PCI_DEVICE_ID_MADGE_MK2         0x0002
#define PCI_DEVICE_ID_MOTOROLA_MPC106   0x0002
#define PCI_DEVICE_ID_MYLEX_DAC960_PD   0x0002
#define PCI_DEVICE_ID_NCR_53C820        0x0002
#define PCI_DEVICE_ID_NEC_LOCAL         0x0002 /* Local Bridge */
#define PCI_DEVICE_ID_NS_87415          0x0002
#define PCI_DEVICE_ID_RP8INTF           0x0002
#define PCI_DEVICE_ID_SI_6202           0x0002
#define PCI_DEVICE_ID_TIGERJET_100      0x0002
#define PCI_DEVICE_ID_V3_V351           0x0002
#define PCI_DEVICE_ID_VORTEX_GDT6x10    0x0002
#define PCI_DEVICE_ID_ZEITNET_1225      0x0002
#define PCI_SUBDEVICE_ID_COMPUTONE_PG8  0x0002
#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232           0x0002

come si può vedere PCI_VENDOR_ID_CREATIVE è l'unico che corrisponde sia per il codice vendor che per il codice device, quindi la nostra scheda è identificata da PCI_VENDOR_ID_CREATIVE e PCI_DEVICE_ID_CREATIVE_EMU10K1

$ grep -Rl PCI_VENDOR_ID_CREATIVE /usr/src/linux/sound/*

/usr/src/linux/sound/oss/emu10k1/main.c

ora per ogni file trovato (in questo caso solo 1) bisogna cercare all'interno una struttura che contiene il nostro identificativo (PCI_VENDOR_ID_CREATIVE).

ad esempio si può usare less

$ less /usr/src/linux/sound/oss/emu10k1/main.c

[...]
static struct pci_device_id emu10k1_pci_tbl[] = {
        {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1,
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1},
        {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_AUDIGY,
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, AUDIGY},
        {0,}
};
[...]

e in tale struttura bisogna trovare sia il codice vendor che il device.
Infatti qui troviamo sia PCI_VENDOR_ID_CREATIVE che PCI_DEVICE_ID_CREATIVE_EMU10K1 trovati sopra con i due grep terminanti con un sort.

Quindi è questo il driver che va bene per la nostra scheda audio: EMU10K1 (come si può leggere al termine della riga contenente i due codici ricercati).

Ora bisogna cercare l'opzione da attivare nella configurazione di Linux, eseguiamo il seguente comando scrivendo il nome del driver in minuscolo così troviamo meno risultati che non ci interessano

$ find /usr/src/linux/ -type f -name Makefile | xargs grep emu10k1 \
  | grep CONFIG_ | sed "s/\/usr\/src\/linux\///"

drivers/input/gameport/Makefile:obj-$(CONFIG_GAMEPORT_EMU10K1) += emu10k1-gp.o
sound/oss/Makefile:obj-$(CONFIG_SOUND_EMU10K1)  += emu10k1/
sound/oss/emu10k1/Makefile:obj-$(CONFIG_SOUND_EMU10K1) += emu10k1.o
sound/pci/emu10k1/Makefile:obj-$(CONFIG_SND_EMU10K1) += snd-emu10k1.o
sound/pci/emu10k1/Makefile:obj-$(call sequencer,$(CONFIG_SND_EMU10K1)) += snd-emu10k1-synth.o
sound/pci/emu10k1/Makefile:obj-$(CONFIG_SND_EMU10K1X) += snd-emu10k1x.o

Il primo risultato può essere omesso (stiamo cercando la scheda sonora e non la gameport). Negli altri è indicato il parametro che serve per la nostra scheda audio che è uno o più dei seguenti: CONFIG_SOUND_EMU10K1, CONFIG_SND_EMU10K1, CONFIG_SND_EMU10K1X

Per vedere se il driver è presente già compilato sul nostro sistema, basta prendere una parte della stringa comune a tutti o farli passare uno alla volta:

$ grep EMU10K1 /boot/config-`uname -r`

CONFIG_GAMEPORT_EMU10K1=m
CONFIG_SND_EMU10K1=m
CONFIG_SND_EMU10K1X=m

Dove si vede che i due driver sono già compilati come moduli.

Per vedere se sono anche caricati in memoria (devi prendere i .o per i CONFIG_ trovati che sono: snd-emu10k1.o, snd-emu10k1-synth.o, snd-emu10k1x.o; togliere i .o e sostituire i - con i _):

$ lsmod | grep "^snd_emu10k1\|^snd_emu10k1_synth\|^snd_emu10k1x"

snd_emu10k1_synth       7296  0
snd_emu10k1           102912  3 snd_emu10k1_synth

quindi si vede che è caricato e funzionante:
snd_emu10k1       <- scheda audio
snd_emu10k1_synth <- sintetizzatore (attivato da snd_emu10k1)

Se invece non sono in memoria (o non sono tutti in memoria come nell'esempio) occorre caricarli con:

# modprobe snd_emu10k1x

Dopodiché dovrebbe funzionare l'audio.

Se invece si trova che i driver non sono stati compilati né in Linux, né come moduli:

$ grep EMU10K1 /boot/config-`uname -r`

#CONFIG_GAMEPORT_EMU10K1
#CONFIG_SND_EMU10K1
#CONFIG_SND_EMU10K1X

allora occorre abilitarli nella configurazione di Linux

$ cd /usr/src/linux
$ make menuconfig

ricercare la stringa (premere /) e ricercare le configurazioni non attivate (bisogna però eliminare la parte iniziale CONFIG_ e quindi ricercare SND_EMU10K1 SND_EMU10K1X)

Nota: in questo caso vengono ritrovati entrambi poiché la prima stringa è contenuta nella seconda (riporto per brevità solo la prima)

Il risultato è il seguente:

Symbol: SND_EMU10K1 [=m] Prompt: Emu10k1 (SB Live!, Audigy, E-mu APS) Defined at sound/pci/Kconfig:373 Depends on: !M68K && SOUND!=n && PCI && SND
    Location:
    -> Device Drivers
     -> Sound
      -> Advanced Linux Sound Architecture
       -> Advanced Linux Sound Architecture (SND [=m])
        -> PCI devices
Selects: SND_HWDEP && SND_RAWMIDI && SND_AC97_CODEC

Quasi tutto quello qui riportato l'ho appreso dal libro "Linux Kernel in a Nutshell"[0] (disponibile anche una traduzione parziale in italiano[1]). Consiglio la lettura a tutti; sono indicate inoltre molte altre cose interessanti.

Ciao
Davide

[0]
http://www.kroah.com/lkn

[1]
http://guide.debianizzati.org/index.php/Linux_Kernel_in_a_Nutshell

--
Dizionari: http://linguistico.sourceforge.net/wiki
Petizione per avere supporto hardware per GNU/Linux:
http://f2s2.org/f2s2.php?lang=it&page=supporto_firma
Non autorizzo la memorizzazione del mio indirizzo su outlook



Reply to: