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