rev |
line source |
pankso@22
|
1 #!/bin/ash
|
pankso@7
|
2 #
|
pankso@7
|
3 # ALSA Configurator - Modified for SliTaz GNU/Linux
|
pankso@7
|
4 # Last modif : 20071202
|
pankso@7
|
5 #
|
pankso@7
|
6 # Copyright (c) 1999-2002 SuSE GmbH
|
pankso@7
|
7 # Jan ONDREJ
|
pankso@7
|
8 #
|
pankso@7
|
9 # written by Takashi Iwai <tiwai@suse.de>
|
pankso@7
|
10 # Bernd Kaindl <bk@suse.de>
|
pankso@7
|
11 # Jan ONDREJ (SAL) <ondrejj@salstar.sk>
|
pankso@7
|
12 #
|
pankso@7
|
13 # based on the original version of Jan ONDREJ's alsaconf for ALSA 0.4.
|
pankso@7
|
14 #
|
pankso@7
|
15 # This program is free software; you can redistribute it and/or modify
|
pankso@7
|
16 # it under the terms of the GNU General Public License as published by
|
pankso@7
|
17 # the Free Software Foundation; either version 2 of the License, or
|
pankso@7
|
18 # (at your option) any later version.
|
pankso@7
|
19 #
|
pankso@7
|
20 . /etc/init.d/rc.functions
|
pankso@7
|
21
|
pankso@7
|
22 export TEXTDOMAIN=alsaconf
|
pankso@7
|
23
|
pankso@7
|
24 prefix=/usr
|
pankso@7
|
25 exec_prefix=${prefix}
|
pankso@7
|
26 bindir=${exec_prefix}/bin
|
pankso@7
|
27 sbindir=${exec_prefix}/sbin
|
pankso@7
|
28 version=1.0.15
|
pankso@7
|
29 USE_NLS=no
|
pankso@7
|
30
|
pankso@7
|
31 # Useful for debugging
|
pankso@7
|
32 PROCFS="/proc"
|
pankso@7
|
33 SYSFS="/sys"
|
pankso@7
|
34
|
pankso@7
|
35 # i18n stuff
|
pankso@7
|
36 xecho() {
|
pankso@7
|
37 echo "$*"
|
pankso@7
|
38 }
|
pankso@7
|
39 gettext() {
|
pankso@7
|
40 echo -n "$*"
|
pankso@7
|
41 }
|
pankso@22
|
42
|
pankso@7
|
43 xmsg() {
|
pankso@7
|
44 msg=$(gettext "$1")
|
pankso@7
|
45 shift
|
pankso@7
|
46 printf "$msg" $*
|
pankso@7
|
47 }
|
pankso@7
|
48
|
pankso@7
|
49 distribution="unknown"
|
pankso@7
|
50
|
pankso@7
|
51 for prog in lspci lsmod; do
|
pankso@7
|
52 for path in /sbin /usr/sbin /bin /usr/bin;do
|
pankso@7
|
53 test -x $path/$prog && eval $prog=$path/$prog
|
pankso@7
|
54 done
|
pankso@7
|
55 done
|
pankso@7
|
56 unset prog path
|
pankso@7
|
57
|
pankso@7
|
58 usage() {
|
pankso@7
|
59 xecho "ALSA configurator (modified for SliTaz GNU/Linux)"
|
pankso@7
|
60 echo " version $version"
|
pankso@7
|
61 xecho "usage: alsaconf [options]
|
pankso@7
|
62 -l|--legacy check only legacy non-isapnp cards
|
pankso@7
|
63 -m|--modinfo read module descriptions instead of reading card db
|
pankso@7
|
64 -s|--sound wav-file
|
pankso@7
|
65 use the specified wav file as a test sound
|
pankso@7
|
66 -u|--uid uid set the uid for the ALSA devices (default = 0) [obsoleted]
|
pankso@7
|
67 -g|--gid gid set the gid for the ALSA devices (default = 0) [obsoleted]
|
pankso@7
|
68 -d|--devmode mode
|
pankso@7
|
69 set the permission for ALSA devices (default = 0666) [obs.]
|
pankso@7
|
70 -r|--strict set strict device mode (equiv. with -g 17 -d 0660) [obsoleted]
|
pankso@7
|
71 -L|--log file logging on the specified file (for debugging purpose only)
|
pankso@7
|
72 -p|--probe card-name
|
pankso@7
|
73 probe a legacy non-isapnp card and print module options
|
pankso@7
|
74 -P|--listprobe list the supported legacy card modules
|
pankso@7
|
75 -c|--config file
|
pankso@7
|
76 specify the module config file
|
pankso@7
|
77 -R|--resources list available DMA and IRQ resources with debug for legacy
|
pankso@7
|
78 -h|--help what you're reading"
|
pankso@7
|
79 }
|
pankso@7
|
80
|
pankso@7
|
81 OPTS=`getopt -o lmL:hp:Pu:g:d:rs:c:R --long legacy,modinfo,log:,help,probe:,listprobe,uid:,gid:,devmode:,strict,sound:,config:,resources -n alsaconf -- "$@"` || exit 1
|
pankso@7
|
82 eval set -- "$OPTS"
|
pankso@7
|
83
|
pankso@7
|
84 do_legacy_only=0
|
pankso@7
|
85 use_modinfo_db=0
|
pankso@7
|
86 alsa_uid=0
|
pankso@7
|
87 alsa_gid=0
|
pankso@7
|
88 alsa_mode=0666
|
pankso@7
|
89 legacy_probe_card=""
|
pankso@7
|
90 LOGFILE=""
|
pankso@7
|
91 TESTSOUND="/usr/share/sounds/alsa/test.wav"
|
pankso@7
|
92 try_all_combination=0
|
pankso@7
|
93 resources="false"
|
pankso@7
|
94
|
pankso@7
|
95 # legacy support
|
pankso@7
|
96 LEGACY_CARDS="opl3sa2 cs4236 cs4232 cs4231 es18xx es1688 sb16 sb8"
|
pankso@7
|
97
|
pankso@7
|
98 while true ; do
|
pankso@7
|
99 case "$1" in
|
pankso@7
|
100 -l|--legacy)
|
pankso@7
|
101 do_legacy_only=1; shift ;;
|
pankso@7
|
102 -m|--modinfo)
|
pankso@7
|
103 use_modinfo_db=1; shift ;;
|
pankso@7
|
104 -s|--sound)
|
pankso@7
|
105 TESTSOUND=$2; shift 2;;
|
pankso@7
|
106 -h|--help)
|
pankso@7
|
107 usage; exit 0 ;;
|
pankso@7
|
108 -L|--log)
|
pankso@7
|
109 LOGFILE="$2"; shift 2;;
|
pankso@7
|
110 -p|--probe)
|
pankso@7
|
111 legacy_probe_card="$2"; shift 2;;
|
pankso@7
|
112 -P|--listprobe)
|
pankso@7
|
113 echo "$LEGACY_CARDS"; exit 0;;
|
pankso@7
|
114 -u|--uid)
|
pankso@7
|
115 alsa_uid="$2"; shift 2;;
|
pankso@7
|
116 -g|--gid)
|
pankso@7
|
117 alsa_gid="$2"; shift 2;;
|
pankso@7
|
118 -d|--devmode)
|
pankso@7
|
119 alsa_mode="$2"; shift 2;;
|
pankso@7
|
120 -r|--strict)
|
pankso@7
|
121 alsa_uid=0; alsa_gid=17; alsa_mode=0660; shift;;
|
pankso@7
|
122 -c|--config)
|
pankso@7
|
123 cfgfile="$2"; shift 2;;
|
pankso@7
|
124 -R|--resources)
|
pankso@7
|
125 resources="true"; shift;;
|
pankso@7
|
126 --) shift ; break ;;
|
pankso@7
|
127 *) usage ; exit 1 ;;
|
pankso@7
|
128 esac
|
pankso@7
|
129 done
|
pankso@7
|
130
|
pankso@7
|
131 #
|
pankso@7
|
132 # probe legacy ISA cards
|
pankso@7
|
133 #
|
pankso@7
|
134
|
pankso@7
|
135 check_dma_avail () {
|
pankso@7
|
136 list=""
|
pankso@7
|
137 if [ -d $SYSFS/bus/pnp/devices ]; then
|
pankso@7
|
138 for dma in $*; do
|
pankso@7
|
139 ok="true"
|
pankso@7
|
140 for i in $SYSFS/bus/pnp/devices/??:* ; do
|
pankso@7
|
141 if grep -q "state = active" $i/resources ; then
|
pankso@7
|
142 if grep -q '^dma '$dma'$' $i/resources; then
|
pankso@7
|
143 ok="false"
|
pankso@7
|
144 fi
|
pankso@7
|
145 fi
|
pankso@7
|
146 done
|
pankso@7
|
147 if [ -r $PROCFS/dma ]; then
|
pankso@7
|
148 if grep -q '^ *'$dma': ' $PROCFS/dma ; then
|
pankso@7
|
149 ok="false"
|
pankso@7
|
150 fi
|
pankso@7
|
151 fi
|
pankso@7
|
152 if [ "$ok" = "true" ]; then
|
pankso@7
|
153 list="$list $dma"
|
pankso@7
|
154 fi
|
pankso@7
|
155 done
|
pankso@7
|
156 else
|
pankso@7
|
157 if [ -r $PROCFS/dma ]; then
|
pankso@7
|
158 for dma in $*; do
|
pankso@7
|
159 grep -q '^ *'$dma': ' $PROCFS/dma || list="$list $dma"
|
pankso@7
|
160 done
|
pankso@7
|
161 fi
|
pankso@7
|
162 fi
|
pankso@7
|
163 if [ ! -z "$list" ]; then
|
pankso@7
|
164 echo $list
|
pankso@7
|
165 fi
|
pankso@7
|
166 }
|
pankso@7
|
167
|
pankso@7
|
168 check_irq_avail () {
|
pankso@7
|
169 list=""
|
pankso@7
|
170 if [ -d $SYSFS/bus/pnp/devices ]; then
|
pankso@7
|
171 for irq in $*; do
|
pankso@7
|
172 ok="true"
|
pankso@7
|
173 for i in $SYSFS/bus/pnp/devices/??:* ; do
|
pankso@7
|
174 if grep -q "state = active" $i/resources ; then
|
pankso@7
|
175 if grep -q '^irq '$irq'$' $i/resources; then
|
pankso@7
|
176 ok="false"
|
pankso@7
|
177 fi
|
pankso@7
|
178 fi
|
pankso@7
|
179 done
|
pankso@7
|
180 if [ -r $PROCFS/interrupts ]; then
|
pankso@7
|
181 if grep -q '^ *'$irq': ' $PROCFS/interrupts ; then
|
pankso@7
|
182 ok="false"
|
pankso@7
|
183 fi
|
pankso@7
|
184 fi
|
pankso@7
|
185 if [ "$ok" = "true" ]; then
|
pankso@7
|
186 list="$list $irq"
|
pankso@7
|
187 fi
|
pankso@7
|
188 done
|
pankso@7
|
189 else
|
pankso@7
|
190 if [ -r $PROCFS/interrupts ]; then
|
pankso@7
|
191 for irq in $*; do
|
pankso@7
|
192 grep -q '^ *'$irq': ' $PROCFS/interrupts || list="$list $irq"
|
pankso@7
|
193 done
|
pankso@7
|
194 fi
|
pankso@7
|
195 fi
|
pankso@7
|
196 if [ ! -z "$list" ]; then
|
pankso@7
|
197 echo $list
|
pankso@7
|
198 fi
|
pankso@7
|
199 }
|
pankso@7
|
200
|
pankso@7
|
201 #
|
pankso@7
|
202 #
|
pankso@7
|
203 #
|
pankso@7
|
204
|
pankso@7
|
205 if [ "$resources" = "true" ]; then
|
pankso@7
|
206 if [ -d $SYSFS/bus/pnp/devices ]; then
|
pankso@7
|
207 for i in $SYSFS/bus/pnp/devices/??:* ; do
|
pankso@7
|
208 if [ "$resources" = "true" ]; then
|
pankso@7
|
209 echo ">>>>> PnP file: $i/resources"
|
pankso@7
|
210 cat $i/resources
|
pankso@7
|
211 fi
|
pankso@7
|
212 done
|
pankso@7
|
213 fi
|
pankso@7
|
214 if [ -r $PROCFS/dma ]; then
|
pankso@7
|
215 echo ">>>>> Allocated dma channels:"
|
pankso@7
|
216 cat $PROCFS/dma
|
pankso@7
|
217 fi
|
pankso@7
|
218 if [ -r $PROCFS/interrupts ]; then
|
pankso@7
|
219 echo ">>>>> Allocated interrupt channels:"
|
pankso@7
|
220 cat $PROCFS/interrupts
|
pankso@7
|
221 fi
|
pankso@7
|
222 echo -n "Valid DMA channels: "
|
pankso@7
|
223 check_dma_avail 0 1 2 3 4 5 6 7
|
pankso@7
|
224 echo -n "Valid IRQ channels: "
|
pankso@7
|
225 check_irq_avail 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
pankso@7
|
226 exit 0
|
pankso@7
|
227 fi
|
pankso@7
|
228
|
pankso@7
|
229 # Check for root privileges
|
pankso@7
|
230 if [ `id -u` -ne 0 ]; then
|
pankso@7
|
231 xecho "You must be root to use this script."
|
pankso@7
|
232 exit 1
|
pankso@7
|
233 fi
|
pankso@7
|
234
|
pankso@7
|
235 #
|
pankso@7
|
236 # check the snd_ prefix for ALSA module options
|
pankso@7
|
237 # snd_ prefix is obsoleted since 0.9.0rc4.
|
pankso@7
|
238 #
|
pankso@7
|
239 if /sbin/modinfo -p snd | grep -q snd_ ; then
|
pankso@7
|
240 mpfx="snd_"
|
pankso@7
|
241 else
|
pankso@7
|
242 mpfx=""
|
pankso@7
|
243 fi
|
pankso@7
|
244
|
pankso@7
|
245 alsa_device_opts=""
|
pankso@7
|
246 if /sbin/modinfo -p snd | grep -q uid ; then
|
pankso@7
|
247 if [ x"$alsa_uid" != x0 ]; then
|
pankso@7
|
248 alsa_device_opts="$alsa_device_opts ${mpfx}device_uid=$alsa_uid"
|
pankso@7
|
249 fi
|
pankso@7
|
250 if [ x"$alsa_gid" != x0 ]; then
|
pankso@7
|
251 alsa_device_opts="$alsa_device_opts ${mpfx}device_gid=$alsa_gid"
|
pankso@7
|
252 fi
|
pankso@7
|
253 fi
|
pankso@7
|
254 if /sbin/modinfo -p snd | grep -q device_mode ; then
|
pankso@7
|
255 if [ x"$alsa_mode" != x0 ]; then
|
pankso@7
|
256 alsa_device_opts="$alsa_device_opts ${mpfx}device_mode=$alsa_mode"
|
pankso@7
|
257 fi
|
pankso@7
|
258 fi
|
pankso@7
|
259
|
pankso@7
|
260 case `uname -r` in
|
pankso@7
|
261 2.6.*)
|
pankso@7
|
262 kernel="new"
|
pankso@7
|
263 ;;
|
pankso@7
|
264 *)
|
pankso@7
|
265 kernel="old"
|
pankso@7
|
266 ;;
|
pankso@7
|
267 esac
|
pankso@7
|
268
|
pankso@7
|
269 # cfgfile = base config file to remove/update the sound setting
|
pankso@7
|
270 cfgfile="/etc/modprobe.conf"
|
pankso@7
|
271
|
pankso@7
|
272 # Check for dialog
|
pankso@7
|
273 if which dialog > /dev/null; then
|
pankso@7
|
274 DIALOG=dialog
|
pankso@7
|
275 else
|
pankso@7
|
276 xecho "Error, dialog or whiptail not found."
|
pankso@7
|
277 exit 1
|
pankso@7
|
278 fi
|
pankso@7
|
279
|
pankso@7
|
280 #
|
pankso@7
|
281 # remove the previous configuration by alsaconf
|
pankso@7
|
282 #
|
pankso@7
|
283 remove_ac_block() {
|
pankso@7
|
284 awk '/^'"$ACB"'$/,/^'"$ACE"'$/ { next } { print }'
|
pankso@7
|
285 }
|
pankso@7
|
286
|
pankso@7
|
287 #
|
pankso@7
|
288 # set default mixer volumes
|
pankso@7
|
289 #
|
pankso@7
|
290 set_mixers() {
|
pankso@7
|
291 amixer -s -q <<EOF
|
pankso@7
|
292 set Master 75% unmute
|
pankso@7
|
293 set Master -12dB
|
pankso@7
|
294 set 'Master Mono' 75% unmute
|
pankso@7
|
295 set 'Master Mono' -12dB
|
pankso@7
|
296 set Front 75% unmute
|
pankso@7
|
297 set Front -12dB
|
pankso@7
|
298 set PCM 90% unmute
|
pankso@7
|
299 set PCM 0dB
|
pankso@7
|
300 mixer Synth 90% unmute
|
pankso@7
|
301 mixer Synth 0dB
|
pankso@7
|
302 mixer CD 90% unmute
|
pankso@7
|
303 mixer CD 0dB
|
pankso@7
|
304 # mute mic
|
pankso@7
|
305 set Mic 0% mute
|
pankso@7
|
306 # ESS 1969 chipset has 2 PCM channels
|
pankso@7
|
307 set PCM,1 90% unmute
|
pankso@7
|
308 set PCM,1 0dB
|
pankso@7
|
309 # Trident/YMFPCI/emu10k1
|
pankso@7
|
310 set Wave 100% unmute
|
pankso@7
|
311 set Music 100% unmute
|
pankso@7
|
312 set AC97 100% unmute
|
pankso@7
|
313 # CS4237B chipset:
|
pankso@7
|
314 set 'Master Digital' 75% unmute
|
pankso@7
|
315 # Envy24 chips with analog outs
|
pankso@7
|
316 set DAC 90% unmute
|
pankso@7
|
317 set DAC -12dB
|
pankso@7
|
318 set DAC,0 90% unmute
|
pankso@7
|
319 set DAC,0 -12dB
|
pankso@7
|
320 set DAC,1 90% unmute
|
pankso@7
|
321 set DAC,1 -12dB
|
pankso@7
|
322 # some notebooks use headphone instead of master
|
pankso@7
|
323 set Headphone 75% unmute
|
pankso@7
|
324 set Headphone -12dB
|
pankso@7
|
325 set Playback 100% unmute
|
pankso@7
|
326 # turn off digital switches
|
pankso@7
|
327 set "SB Live Analog/Digital Output Jack" off
|
pankso@7
|
328 set "Audigy Analog/Digital Output Jack" off
|
pankso@7
|
329 EOF
|
pankso@7
|
330 }
|
pankso@7
|
331
|
pankso@7
|
332 # FAREWELL
|
pankso@7
|
333 farewell() {
|
pankso@7
|
334 local msg=$(gettext "
|
pankso@7
|
335
|
pankso@7
|
336 OK, sound driver is configured.
|
pankso@7
|
337
|
pankso@7
|
338 ALSA CONFIGURATOR
|
pankso@7
|
339
|
pankso@7
|
340 will prepare the card for playing now.
|
pankso@7
|
341
|
pankso@7
|
342 Now I'll run alsasound init script, then I'll use
|
pankso@7
|
343 amixer to raise the default volumes.
|
pankso@7
|
344 You can change the volume later via a mixer
|
pankso@7
|
345 program such as alsamixer or gamix.
|
pankso@7
|
346
|
pankso@7
|
347 ")
|
pankso@7
|
348 $DIALOG --msgbox "$msg" 17 60 || acex 0
|
pankso@7
|
349 }
|
pankso@7
|
350
|
pankso@7
|
351 # Exit function
|
pankso@7
|
352 acex() {
|
pankso@7
|
353 cleanup
|
pankso@7
|
354 clear
|
pankso@7
|
355 exit $1
|
pankso@7
|
356 }
|
pankso@7
|
357
|
pankso@7
|
358 #
|
pankso@7
|
359 # alsasound init script
|
pankso@7
|
360 #
|
pankso@7
|
361
|
pankso@7
|
362 #rcalsasound=/etc/init.d/alsa
|
pankso@7
|
363 rcalsasound=rcalsasound
|
pankso@7
|
364
|
pankso@7
|
365 # MAIN
|
pankso@7
|
366 if [ -d $PROCFS/asound ]; then
|
pankso@7
|
367 $rcalsasound stop >/dev/null 2>&1
|
pankso@7
|
368 $rcalsasound unload >/dev/null 2>&1
|
pankso@7
|
369 /sbin/rmmod dmasound dmasound_awacs 2>/dev/null
|
pankso@7
|
370 fi
|
pankso@7
|
371
|
pankso@7
|
372
|
pankso@7
|
373 cleanup () {
|
pankso@7
|
374 killall -9 aplay arecord >/dev/null 2>&1
|
pankso@7
|
375 /sbin/modprobe -r isapnp >/dev/null 2>&1
|
pankso@7
|
376 /sbin/modprobe -r isa-pnp >/dev/null 2>&1
|
pankso@7
|
377 rm -f "$TMP" "$addcfg" "$FOUND" "$DUMP"
|
pankso@7
|
378 }
|
pankso@7
|
379 trap cleanup 0
|
pankso@7
|
380
|
pankso@7
|
381 TMP=`mktemp -q /tmp/alsaconf.XXXXXX`
|
pankso@7
|
382 if [ $? -ne 0 ]; then
|
pankso@7
|
383 xecho "Can't create temp file, exiting..."
|
pankso@7
|
384 exit 1
|
pankso@7
|
385 fi
|
pankso@7
|
386 addcfg=`mktemp -q /tmp/alsaconf.XXXXXX`
|
pankso@7
|
387 if [ $? -ne 0 ]; then
|
pankso@7
|
388 xecho "Can't create temp file, exiting..."
|
pankso@7
|
389 exit 1
|
pankso@7
|
390 fi
|
pankso@7
|
391 FOUND=`mktemp -q /tmp/alsaconf.XXXXXX`
|
pankso@7
|
392 if [ $? -ne 0 ]; then
|
pankso@7
|
393 xecho "Can't create temp file, exiting..."
|
pankso@7
|
394 exit 1
|
pankso@7
|
395 fi
|
pankso@7
|
396 DUMP=`mktemp -q /tmp/alsaconf.XXXXXX`
|
pankso@7
|
397 if [ $? -ne 0 ]; then
|
pankso@7
|
398 xecho "Can't create temp file, exiting..."
|
pankso@7
|
399 exit 1
|
pankso@7
|
400 fi
|
pankso@7
|
401
|
pankso@7
|
402 # convert ISA PnP id number to string 'ABC'
|
pankso@7
|
403 convert_isapnp_id () {
|
pankso@7
|
404 if [ -z "$1" ]; then
|
pankso@7
|
405 echo "XXXX"
|
pankso@7
|
406 return
|
pankso@7
|
407 fi
|
pankso@7
|
408 let a='('$1'>>2) & 0x3f'
|
pankso@7
|
409 let b='(('$1' & 0x03) << 3) | (('$1' >> 13) & 0x07)'
|
pankso@7
|
410 let c='('$1'>> 8) & 0x1f'
|
pankso@7
|
411 strs='@ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
pankso@22
|
412 echo $strs | awk "{ printf \"%s%s%s\n\", \
|
pankso@22
|
413 substr(\$0,$a+1,1),substr(\$0,$b+1,1),substr(\$0,$c+1,1) }"
|
pankso@7
|
414 }
|
pankso@7
|
415
|
pankso@7
|
416 # swap high & low bytes
|
pankso@7
|
417 swap_number () {
|
pankso@7
|
418 if [ -z "$1" ]; then
|
pankso@7
|
419 echo "0000"
|
pankso@7
|
420 return
|
pankso@7
|
421 fi
|
pankso@7
|
422 let v='(('$1'>>8)&0xff)|(('$1'&0xff)<<8)'
|
pankso@7
|
423 printf "%04x" $v
|
pankso@7
|
424 }
|
pankso@7
|
425
|
pankso@7
|
426 # build card database
|
pankso@7
|
427 # build_card_db filename
|
pankso@7
|
428 build_card_db () {
|
pankso@7
|
429 MODDIR=/lib/modules/`uname -r`
|
pankso@7
|
430 last_driver=""
|
pankso@7
|
431 echo -n > $1
|
pankso@7
|
432
|
pankso@7
|
433 # list pci cards
|
pankso@7
|
434 while read driver vendor device dummy; do
|
pankso@7
|
435 if expr $driver : 'snd-.*' >/dev/null ; then
|
pankso@7
|
436 if [ "$last_driver" != "$driver" ]; then
|
pankso@7
|
437 echo $driver.o
|
pankso@7
|
438 last_driver=$driver
|
pankso@7
|
439 fi
|
pankso@7
|
440 id1=`printf '0x%04x' $vendor`
|
pankso@7
|
441 id2=`printf '0x%04x' $device`
|
pankso@7
|
442 echo "PCI: $id1=$id2"
|
pankso@7
|
443 fi
|
pankso@7
|
444 done < $MODDIR/modules.pcimap >> $1
|
pankso@7
|
445
|
pankso@7
|
446 # list isapnp cards
|
pankso@7
|
447 while read driver cardvendor carddevice data vendor func; do
|
pankso@7
|
448 if expr $driver : 'snd-.*' >/dev/null ; then
|
pankso@7
|
449 if [ "$last_driver" != "$driver" ]; then
|
pankso@7
|
450 echo $driver.o
|
pankso@7
|
451 last_driver=$driver
|
pankso@7
|
452 fi
|
pankso@7
|
453 id1=`convert_isapnp_id $cardvendor`
|
pankso@7
|
454 dev1=`swap_number $carddevice`
|
pankso@7
|
455 id2=`convert_isapnp_id $vendor`
|
pankso@7
|
456 dev2=`swap_number $func`
|
pankso@7
|
457 echo "ISAPNP: $id1$dev1=$id2$dev2"
|
pankso@7
|
458 fi
|
pankso@7
|
459 done < $MODDIR/modules.isapnpmap >> $1
|
pankso@7
|
460 }
|
pankso@7
|
461
|
pankso@7
|
462 #
|
pankso@7
|
463 # probe cards
|
pankso@7
|
464 #
|
pankso@7
|
465 probe_cards () {
|
pankso@7
|
466 found="0"
|
pankso@7
|
467 test -r $PROCFS/isapnp || /sbin/modprobe isapnp >/dev/null 2>&1
|
pankso@7
|
468 test -r $PROCFS/isapnp || /sbin/modprobe isa-pnp >/dev/null 2>&1
|
pankso@7
|
469 if [ -r $PROCFS/isapnp ]; then
|
pankso@7
|
470 cat $PROCFS/isapnp >"$DUMP"
|
pankso@7
|
471 found="1"
|
pankso@7
|
472 elif [ -d $SYSFS/bus/pnp/devices ]; then
|
pankso@7
|
473 # use 2.6 kernel's sysfs output
|
pankso@7
|
474 # fake the isapnp dump
|
pankso@7
|
475 index=0
|
pankso@7
|
476 bindex=0
|
pankso@7
|
477 for d1 in $SYSFS/devices/pnp* ; do
|
pankso@7
|
478 for d2 in $d1/*:* ; do
|
pankso@7
|
479 if [ -r $d2/card_id ]; then
|
pankso@7
|
480 id=`cat $d2/card_id`
|
pankso@7
|
481 name=`cat $d2/name`
|
pankso@7
|
482 echo "Card $index '$id:$name' " >> "$DUMP"
|
pankso@7
|
483 index=$[$index+1]
|
pankso@7
|
484 found="1"
|
pankso@7
|
485 else if [ -r $d2/id ]; then
|
pankso@7
|
486 # FIXME: multiple id might be present (separated with new-line)
|
pankso@7
|
487 id=`head -n 1 $d2/id`
|
pankso@7
|
488 echo "BIOS $bindex '$id' " >> "$DUMP"
|
pankso@7
|
489 bindex=$[$bindex+1]
|
pankso@7
|
490 found="1"
|
pankso@7
|
491 fi
|
pankso@7
|
492 fi
|
pankso@7
|
493 done
|
pankso@7
|
494 done
|
pankso@7
|
495 fi
|
pankso@7
|
496 if [ "$found" = "0" ]; then
|
pankso@7
|
497 echo -n >"$DUMP"
|
pankso@7
|
498 fi
|
pankso@7
|
499 CARDID_DB=/var/tmp/alsaconf.cards
|
pankso@7
|
500 if [ ! -r $CARDID_DB ]; then
|
pankso@7
|
501 use_modinfo_db=1
|
pankso@7
|
502 fi
|
pankso@7
|
503 if [ $use_modinfo_db != 1 ]; then
|
pankso@7
|
504 if [ $CARDID_DB -ot /lib/modules/`uname -r`/modules.dep ]; then
|
pankso@7
|
505 use_modinfo_db=1
|
pankso@7
|
506 fi
|
pankso@7
|
507 fi
|
pankso@7
|
508 if [ $use_modinfo_db = 1 ]; then
|
pankso@7
|
509 xecho "Building card database.."
|
pankso@7
|
510 build_card_db $CARDID_DB
|
pankso@7
|
511 fi
|
pankso@7
|
512 if [ ! -r $CARDID_DB ]; then
|
pankso@7
|
513 xecho "No card database is found.."
|
pankso@7
|
514 exit 1
|
pankso@7
|
515 fi
|
pankso@7
|
516 ncards=`grep '^snd-.*\.o$' $CARDID_DB | wc -w`
|
pankso@7
|
517
|
pankso@7
|
518 msg=$(gettext "Searching sound cards")
|
pankso@7
|
519 awk '
|
pankso@7
|
520 BEGIN {
|
pankso@7
|
521 format="%-40s %s\n";
|
pankso@7
|
522 ncards='"$ncards"';
|
pankso@7
|
523 idx=0;
|
pankso@7
|
524 }
|
pankso@7
|
525 /^snd-.*\.o$/{
|
pankso@7
|
526 sub(/.o$/, "");
|
pankso@7
|
527 driver=$0;
|
pankso@7
|
528 perc=(idx * 100) / (ncards + 1);
|
pankso@7
|
529 print int(perc);
|
pankso@7
|
530 idx++;
|
pankso@7
|
531 }
|
pankso@7
|
532 /^[<literal space><literal tab>]*PCI: /{
|
pankso@7
|
533 gsub(/0x/, "");
|
pankso@7
|
534 gsub(/=/, ":");
|
pankso@7
|
535 x = sprintf ("'$lspci' -n 2>/dev/null| grep '"' 04..: '"' | grep %s", $2);
|
pankso@7
|
536 if (system (x) == 0)
|
pankso@7
|
537 printf "%s %s\n", $2, driver >>"'"$FOUND"'"
|
pankso@7
|
538 }
|
pankso@7
|
539 /^[<literal space><literal tab>]*ISAPNP: /{
|
pankso@7
|
540 id2 = substr($0, index($0, "=")+1);
|
pankso@7
|
541 gsub(/=.*/, "");
|
pankso@7
|
542 x = sprintf ("grep '\''^Card [0-9] .%s:'\'' '"$DUMP"'", $2);
|
pankso@7
|
543 if (system (x) == 0)
|
pankso@7
|
544 printf "%s %s\n", $2, driver >>"'"$FOUND"'"
|
pankso@7
|
545 else if (index($2, "ffff") > 0) {
|
pankso@7
|
546 x = sprintf ("grep '\''^BIOS [0-9]* .%s.'\'' '"$DUMP"'", id2);
|
pankso@7
|
547 if (system (x) == 0)
|
pankso@7
|
548 printf "%s %s\n", id2, driver >>"'"$FOUND"'"
|
pankso@7
|
549 }
|
pankso@7
|
550 }' < $CARDID_DB |\
|
pankso@92
|
551 $DIALOG --gauge "$msg" 15 70 5
|
pankso@7
|
552
|
pankso@7
|
553 #
|
pankso@7
|
554 # PowerMac
|
pankso@7
|
555 #
|
pankso@7
|
556 if grep -q MacRISC $PROCFS/cpuinfo; then
|
pankso@7
|
557 MODDIR=/lib/modules/`uname -r`
|
pankso@7
|
558 find $MODDIR -name 'snd-powermac*' -print | \
|
pankso@7
|
559 while read i; do
|
pankso@7
|
560 i=${i##*/}
|
pankso@7
|
561 i=${i%%.o}
|
pankso@7
|
562 i=${i%%.ko}
|
pankso@7
|
563 echo "PowerMac $i" >> $FOUND
|
pankso@7
|
564 done
|
pankso@7
|
565 fi
|
pankso@7
|
566
|
pankso@7
|
567 #
|
pankso@7
|
568 # Sparc
|
pankso@7
|
569 #
|
pankso@7
|
570 if grep -q Sparc $PROCFS/cpuinfo; then
|
pankso@7
|
571 test -r $PROCFS/openprom/name || /bin/mount -t openpromfs none $PROCFS/openprom >/dev/null 2>&1
|
pankso@7
|
572 # Check for an "audio" device
|
pankso@7
|
573 audio=
|
pankso@7
|
574 compat=
|
pankso@7
|
575 if test -r $PROCFS/openprom; then
|
pankso@7
|
576 audio=`find $PROCFS/openprom -follow -type d -name "audio*" -print`
|
pankso@7
|
577 fi
|
pankso@7
|
578 if test -n "$audio"; then
|
pankso@7
|
579 compat=`cat $audio/compatible`
|
pankso@7
|
580 compat=${compat#\'}
|
pankso@7
|
581 compat=${compat%\'}
|
pankso@7
|
582 compat=${compat#SUNW,}
|
pankso@7
|
583 fi
|
pankso@7
|
584 # Go through all cards we have
|
pankso@7
|
585 MODDIR=/lib/modules/`uname -r`
|
pankso@7
|
586 find $MODDIR -name 'snd-sun-*' -print | \
|
pankso@7
|
587 while read i; do
|
pankso@7
|
588 i=${i##*/}
|
pankso@7
|
589 i=${i%%.o}
|
pankso@7
|
590 i=${i%%.ko}
|
pankso@7
|
591 sdev=`echo ${i#snd-sun-} | tr "[a-z]" "[A-Z]"`
|
pankso@7
|
592
|
pankso@7
|
593 if test "$sdev" = "$compat"; then
|
pankso@7
|
594 echo "$sdev $i" >> $FOUND
|
pankso@7
|
595 elif test -r $PROCFS/openprom; then
|
pankso@7
|
596 find $PROCFS/openprom -follow -type d -name "SUNW,${sdev}*" \
|
pankso@7
|
597 -exec echo "$sdev $i" \; 2>/dev/null >> $FOUND
|
pankso@7
|
598 else
|
pankso@7
|
599 echo "$sdev $i" >> $FOUND
|
pankso@7
|
600 fi
|
pankso@7
|
601 done
|
pankso@7
|
602 fi
|
pankso@7
|
603 }
|
pankso@7
|
604
|
pankso@7
|
605 #
|
pankso@7
|
606 # look for a descriptive device name from the given device id
|
pankso@7
|
607 #
|
pankso@7
|
608 find_device_name () {
|
pankso@7
|
609 if expr "$1" : '[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then
|
pankso@7
|
610 $lspci -d $1 2>/dev/null| sed -e 's/^.*:..\.. [^:]*: //g'
|
pankso@7
|
611 return
|
pankso@7
|
612 elif expr "$1" : '[A-Z@][A-Z@][A-Z@][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then
|
pankso@7
|
613 cardname=`grep '^Card [0-9]\+ .'$1':' $DUMP | head -n 1 | sed -e 's/^Card [0-9]\+ '\''.*:\(.*\)'\'' .*$/\1/'`
|
pankso@7
|
614 echo $cardname
|
pankso@7
|
615 else
|
pankso@7
|
616 echo $1
|
pankso@7
|
617 fi
|
pankso@7
|
618 }
|
pankso@7
|
619
|
pankso@7
|
620 # get hwcfg file type from the given driver name
|
pankso@7
|
621 get_hwcfg_type () {
|
pankso@7
|
622 while read dev driver; do
|
pankso@7
|
623 if [ "$driver" = "$1" ]; then
|
pankso@7
|
624 case "$dev" in
|
pankso@7
|
625 *:*)
|
pankso@7
|
626 # FIXME: need to look around /sys/bus/pci/* (or use vpid-* ?)
|
pankso@7
|
627 devid=`$lspci -d "$dev" | head -n 1 | sed -e 's/ .*$//'`
|
pankso@7
|
628 case "$devid" in
|
pankso@7
|
629 *:*:*.*) ;;
|
pankso@7
|
630 *) devid="0000:$devid" ;;
|
pankso@7
|
631 esac
|
pankso@7
|
632 echo bus-pci-$devid
|
pankso@7
|
633 ;;
|
pankso@7
|
634 *)
|
pankso@7
|
635 echo $driver
|
pankso@7
|
636 ;;
|
pankso@7
|
637 esac
|
pankso@7
|
638 break
|
pankso@7
|
639 fi
|
pankso@7
|
640 done
|
pankso@7
|
641 }
|
pankso@7
|
642
|
pankso@7
|
643 # clean up all hwcfg-* files containing ALSA modules
|
pankso@7
|
644 # alsaconf sets up exclusively
|
pankso@7
|
645 cleanup_hwcfg () {
|
pankso@7
|
646 for i in /etc/sysconfig/hardware/hwcfg-*; do
|
pankso@7
|
647 grep -q "MODULE='snd-" $i && rm -f $i
|
pankso@7
|
648 done
|
pankso@7
|
649 }
|
pankso@7
|
650
|
pankso@7
|
651 #
|
pankso@7
|
652 # set up /etc/sysconfig/hardware/hwcfg-* stuff
|
pankso@7
|
653 #
|
pankso@7
|
654 setup_hwcfg () {
|
pankso@7
|
655 card=$1
|
pankso@7
|
656 cleanup_hwcfg
|
pankso@7
|
657 cfg=`echo "$devs_olist" | get_hwcfg_type $card`
|
pankso@7
|
658 echo "MODULE='$card'" > /etc/sysconfig/hardware/hwcfg-$cfg
|
pankso@7
|
659 echo "STARTMODE='auto'" >> /etc/sysconfig/hardware/hwcfg-$cfg
|
pankso@7
|
660 }
|
pankso@7
|
661
|
pankso@7
|
662
|
pankso@7
|
663 #
|
pankso@7
|
664 # Configure sound card and set mixer for SliTaz Live mode
|
pankso@7
|
665 #
|
pankso@7
|
666 ac_config_card () {
|
pankso@7
|
667
|
pankso@7
|
668 CARD_DRIVER=snd-$1
|
pankso@22
|
669 shift; CARD_OPTS="$*"
|
pankso@7
|
670 SOUND_CORE="snd"
|
pankso@7
|
671
|
pankso@7
|
672 # Keep card driver name in /var/lib to be used by boot scripts.
|
pankso@7
|
673 echo $CARD_DRIVER > /var/lib/sound-card-driver
|
pankso@7
|
674
|
pankso@97
|
675 modprobe $CARD_DRIVER >/dev/null 2>&1
|
pankso@7
|
676
|
pankso@7
|
677 # Sed /etc/rcS.conf to add driver in LOAD_MODULES
|
pankso@7
|
678 . /etc/rcS.conf
|
pankso@7
|
679 modules=`echo "$LOAD_MODULES" | sed s/$CARD_DRIVER//`
|
pankso@7
|
680 newmods="$modules $CARD_DRIVER"
|
pankso@7
|
681 sed -i s/"LOAD_MODULES=\"$LOAD_MODULES\""/"LOAD_MODULES=\"$newmods\""/ \
|
pankso@7
|
682 /etc/rcS.conf
|
pankso@7
|
683
|
pankso@7
|
684 # Set default mixer volumes
|
pankso@7
|
685 set_mixers
|
pankso@7
|
686
|
pankso@7
|
687 # Store
|
pankso@7
|
688 alsactl store
|
pankso@7
|
689 }
|
pankso@7
|
690
|
pankso@7
|
691 # check playback
|
pankso@7
|
692 # return 0 - OK, 1 - NG, 2 - not working (irq/dma problem)
|
pankso@7
|
693 ac_try_load () {
|
pankso@22
|
694 local p1=$1
|
pankso@22
|
695 shift
|
pankso@22
|
696 test -n "$LOGFILE" && echo "$p1 $*" >> "$LOGFILE"
|
pankso@22
|
697 /sbin/modprobe snd-$p1 $* >/dev/null 2>&1
|
pankso@22
|
698 if $lsmod | grep -q -E '^(snd-|snd_)'$p1' '; then
|
pankso@7
|
699 : ;
|
pankso@7
|
700 else
|
pankso@22
|
701 /sbin/modprobe -r snd-$p1 >/dev/null 2>&1
|
pankso@7
|
702 return 1
|
pankso@7
|
703 fi
|
pankso@7
|
704
|
pankso@7
|
705 # mute mixers
|
pankso@7
|
706 amixer set Master 0% mute >/dev/null 2>&1
|
pankso@7
|
707 amixer set PCM 0% mute >/dev/null 2>&1
|
pankso@7
|
708
|
pankso@7
|
709 # output 0.5 sec
|
pankso@7
|
710 head -c 4000 < /dev/zero | aplay -N -r8000 -fS16_LE -traw -c1 > /dev/null 2>&1 &
|
pankso@7
|
711 # remember pid
|
pankso@7
|
712 pp=$!
|
pankso@7
|
713 # sleep for 2 seconds (to be sure -- 1 sec would be enough)
|
pankso@7
|
714 sleep 2
|
pankso@7
|
715 # kill the child process if still exists.
|
pankso@7
|
716 kill -9 $pp > /dev/null 2>&1
|
pankso@7
|
717 st=$?
|
pankso@7
|
718 ac_cardname=`head -n 1 $PROCFS/asound/cards | sed -e 's/^[0-9].* - \(.*\)$/\1/'`
|
pankso@22
|
719 /sbin/modprobe -r snd-$p1 >/dev/null 2>&1
|
pankso@7
|
720 if [ $st = 0 ]; then
|
pankso@7
|
721 # irq problem?
|
pankso@7
|
722 test -n "$LOGFILE" && echo "no playback return" >> "$LOGFILE"
|
pankso@7
|
723 return 2
|
pankso@7
|
724 else
|
pankso@7
|
725 # seems ok!
|
pankso@7
|
726 test -n "$LOGFILE" && echo "playback OK" >> "$LOGFILE"
|
pankso@7
|
727 return 0
|
pankso@7
|
728 fi
|
pankso@7
|
729 }
|
pankso@7
|
730
|
pankso@7
|
731 # check capture
|
pankso@7
|
732 # return 0 - OK, 1 - NG, 2 - not working (irq/dma problem)
|
pankso@7
|
733 # ac_try_capture card duplex opts
|
pankso@7
|
734 ac_try_capture () {
|
pankso@22
|
735 local p1=$1
|
pankso@22
|
736 local p2=$2
|
pankso@22
|
737 shift 2
|
pankso@22
|
738 test -n "$LOGFILE" && echo "$p1 $p2 $*" >> "$LOGFILE"
|
pankso@22
|
739 /sbin/modprobe snd-$p1 $* >/dev/null 2>&1
|
pankso@22
|
740 if $lsmod | grep -q -E '^(snd-|snd_)'$p1' '; then
|
pankso@7
|
741 : ;
|
pankso@7
|
742 else
|
pankso@22
|
743 /sbin/modprobe -r snd-$p1 >/dev/null 2>&1
|
pankso@7
|
744 return 1
|
pankso@7
|
745 fi
|
pankso@7
|
746
|
pankso@7
|
747 # mute mixers
|
pankso@7
|
748 amixer set Master 0% mute >/dev/null 2>&1
|
pankso@7
|
749 amixer set PCM 0% mute >/dev/null 2>&1
|
pankso@7
|
750
|
pankso@7
|
751 play_pid=0
|
pankso@22
|
752 if [ $p2 = yes ]; then
|
pankso@7
|
753 # try duplex - start dummy playing
|
pankso@7
|
754 aplay -N -r8000 -fS16_LE -traw -c1 < /dev/zero > /dev/null 2>&1 &
|
pankso@7
|
755 play_pid=$!
|
pankso@7
|
756 fi
|
pankso@7
|
757 # record 1sec
|
pankso@7
|
758 arecord -N -d1 > /dev/null 2>&1 &
|
pankso@7
|
759 # remember pid
|
pankso@7
|
760 pp=$!
|
pankso@7
|
761 # sleep for 2 seconds
|
pankso@7
|
762 sleep 2
|
pankso@7
|
763 # kill the child process if still exists.
|
pankso@7
|
764 kill -9 $pp > /dev/null 2>&1
|
pankso@7
|
765 st=$?
|
pankso@7
|
766 # kill playback process if any
|
pankso@7
|
767 test $play_pid != 0 && kill -9 $play_pid
|
pankso@22
|
768 /sbin/modprobe -r snd-$p1 >/dev/null 2>&1
|
pankso@7
|
769 if [ $st = 0 ]; then
|
pankso@7
|
770 test -n "$LOGFILE" && echo "capture no return" >> "$LOGFILE"
|
pankso@7
|
771 return 2
|
pankso@7
|
772 else
|
pankso@7
|
773 test -n "$LOGFILE" && echo "capture OK" >> "$LOGFILE"
|
pankso@7
|
774 return 0
|
pankso@7
|
775 fi
|
pankso@7
|
776 }
|
pankso@7
|
777
|
pankso@7
|
778 get_dma_pair () {
|
pankso@7
|
779 case $1 in
|
pankso@7
|
780 0)
|
pankso@7
|
781 echo 1 3 5;;
|
pankso@7
|
782 1)
|
pankso@7
|
783 echo 0 3 5;;
|
pankso@7
|
784 3)
|
pankso@7
|
785 echo 1 0 5;;
|
pankso@7
|
786 5)
|
pankso@7
|
787 echo 3 1 0;;
|
pankso@7
|
788 esac
|
pankso@7
|
789 }
|
pankso@7
|
790
|
pankso@7
|
791 #
|
pankso@7
|
792 # check playback on specified irqs
|
pankso@7
|
793 #
|
pankso@7
|
794 # ac_try_irq card opts irqs...
|
pankso@7
|
795 # return 0 - OK, 1 - NG, 2 - not working (dma problem?)
|
pankso@7
|
796 #
|
pankso@7
|
797 ac_try_irq () {
|
pankso@22
|
798 local p2=$2
|
pankso@7
|
799 card=$1
|
pankso@7
|
800 opts="$2 ${mpfx}irq=$3"
|
pankso@7
|
801 ac_try_load $card $opts >/dev/null 2>&1
|
pankso@7
|
802 result=$?
|
pankso@7
|
803 case $result in
|
pankso@7
|
804 0)
|
pankso@7
|
805 ac_opts="$opts"
|
pankso@7
|
806 return 0
|
pankso@7
|
807 ;;
|
pankso@7
|
808 2)
|
pankso@22
|
809 shift 3
|
pankso@22
|
810 for irq in $*; do
|
pankso@22
|
811 opts="$p2 ${mpfx}irq=$irq"
|
pankso@7
|
812 ac_try_load $card $opts >/dev/null 2>&1
|
pankso@7
|
813 if [ $? = 0 ]; then
|
pankso@7
|
814 ac_opts="$opts"
|
pankso@7
|
815 return 0
|
pankso@7
|
816 fi
|
pankso@7
|
817 done
|
pankso@7
|
818 return 2
|
pankso@7
|
819 ;;
|
pankso@7
|
820 esac
|
pankso@7
|
821 return 1
|
pankso@7
|
822 }
|
pankso@7
|
823
|
pankso@7
|
824 #
|
pankso@7
|
825 # check playback/capture on dma1 & dma2 & specified irqs
|
pankso@7
|
826 #
|
pankso@7
|
827 # ac_try_dmas card opts irqs...
|
pankso@7
|
828 # return 0 - OK, 1 - NG
|
pankso@7
|
829 #
|
pankso@7
|
830 ac_try_dmas () {
|
pankso@22
|
831 local p1=$1
|
pankso@22
|
832 local p2=$2
|
pankso@22
|
833 shift 2
|
pankso@7
|
834 dma_list=`check_dma_avail 1 0 3 5`
|
pankso@22
|
835 for irq in $*; do
|
pankso@7
|
836 for dma1 in $dma_list; do
|
pankso@7
|
837 for dma2 in `get_dma_pair $dma1`; do
|
pankso@22
|
838 opts="$p2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq"
|
pankso@22
|
839 ac_try_load $p1 $opts >/dev/null 2>&1
|
pankso@7
|
840 result=$?
|
pankso@7
|
841 if [ $result = 1 ]; then
|
pankso@7
|
842 if [ $try_all_combination = 1 ]; then
|
pankso@7
|
843 continue
|
pankso@7
|
844 else
|
pankso@7
|
845 return 1
|
pankso@7
|
846 fi
|
pankso@7
|
847 elif [ $result = 0 ]; then
|
pankso@7
|
848 test -n "$LOGFILE" && echo "Now checking capture..." >> "$LOGFILE"
|
pankso@7
|
849 ac_opts="$opts"
|
pankso@22
|
850 ac_try_capture $p1 yes $opts >/dev/null 2>&1 && return 0
|
pankso@7
|
851 for d in yes no; do
|
pankso@7
|
852 for dma2 in $dma_list; do
|
pankso@7
|
853 if [ $dma1 != $dma2 ]; then
|
pankso@22
|
854 opts="$p2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq"
|
pankso@7
|
855 ac_opts="$opts"
|
pankso@22
|
856 ac_try_capture $p1 $d $opts >/dev/null 2>&1 && return 0
|
pankso@7
|
857 fi
|
pankso@7
|
858 done
|
pankso@7
|
859 done
|
pankso@7
|
860 return 0
|
pankso@7
|
861 fi
|
pankso@7
|
862 done
|
pankso@7
|
863 done
|
pankso@7
|
864 done
|
pankso@7
|
865 return 1
|
pankso@7
|
866 }
|
pankso@7
|
867
|
pankso@7
|
868 # check if the option $2 exists in card $1: set value $3
|
pankso@7
|
869 ac_check_option () {
|
pankso@7
|
870 if /sbin/modinfo -p snd-$1 | grep -q $2; then
|
pankso@7
|
871 echo "$2=$3"
|
pankso@7
|
872 fi
|
pankso@7
|
873 }
|
pankso@7
|
874
|
pankso@7
|
875 ac_try_card_sb8 () {
|
pankso@7
|
876 card=sb8
|
pankso@7
|
877 irq_list=`check_irq_avail 5 3 9 10 7`
|
pankso@7
|
878 for dma8 in `check_dma_avail 1 3`; do
|
pankso@7
|
879 opts="${mpfx}dma8=$dma8"
|
pankso@7
|
880 ac_try_irq $card "$opts" $irq_list && return 0
|
pankso@7
|
881 done
|
pankso@7
|
882 return 1
|
pankso@7
|
883 }
|
pankso@7
|
884
|
pankso@7
|
885 ac_try_card_sb16 () {
|
pankso@7
|
886 card=sb16
|
pankso@7
|
887 isapnp=`ac_check_option $card ${mpfx}isapnp 0`
|
pankso@7
|
888 opts="$isapnp"
|
pankso@7
|
889 irq_list=`check_irq_avail 5 9 10 7 3`
|
pankso@7
|
890 dma_list=`check_dma_avail 0 1 3`
|
pankso@7
|
891 dma16_list=`check_dma_avail 5 6 7`
|
pankso@7
|
892 # at first try auto-probing by driver itself
|
pankso@7
|
893 ac_try_load $card $opts >/dev/null 2>&1
|
pankso@7
|
894 result=$?
|
pankso@7
|
895 case $result in
|
pankso@7
|
896 0)
|
pankso@7
|
897 ac_opts="$opts"
|
pankso@7
|
898 ac_try_capture $card yes $opts >/dev/null 2>&1 && return 0
|
pankso@7
|
899 for d in yes no; do
|
pankso@7
|
900 for dma8 in $dma_list; do
|
pankso@7
|
901 for irq in $irq_list; do
|
pankso@7
|
902 opts="${mpfx}dma8=$dma8 ${mpfx}irq=$irq $isapnp"
|
pankso@7
|
903 ac_try_capture $card $d $opts >/dev/null 2>&1 && return 0
|
pankso@7
|
904 done
|
pankso@7
|
905 done
|
pankso@7
|
906 done
|
pankso@7
|
907 return 0
|
pankso@7
|
908 ;;
|
pankso@7
|
909 2)
|
pankso@7
|
910 for dma16 in $dma16_list; do
|
pankso@7
|
911 opts="${mpfx}dma16=$dma16 $isapnp"
|
pankso@7
|
912 if ac_try_irq $card "$opts" $irq_list ; then
|
pankso@7
|
913 ac_try_capture $card yes $ac_opts >/dev/null 2>&1 && return 0
|
pankso@7
|
914 ac_opts_saved="$ac_opts"
|
pankso@7
|
915 for d in yes no; do
|
pankso@7
|
916 for dma8 in $dma_list; do
|
pankso@7
|
917 ac_opts="$ac_opts_saved ${mpfx}dma8=$dma8"
|
pankso@7
|
918 ac_try_capture $card $d $ac_opts >/dev/null 2>&1 && return 0
|
pankso@7
|
919 done
|
pankso@7
|
920 done
|
pankso@7
|
921 # return anyway here..
|
pankso@7
|
922 return 0
|
pankso@7
|
923 fi
|
pankso@7
|
924 done
|
pankso@7
|
925 ;;
|
pankso@7
|
926 esac
|
pankso@7
|
927 return 1
|
pankso@7
|
928 }
|
pankso@7
|
929
|
pankso@7
|
930 ac_try_card_es1688 () {
|
pankso@7
|
931 card=es1688
|
pankso@7
|
932 opts=""
|
pankso@7
|
933 irq_list=`check_irq_avail 5 9 10 7`
|
pankso@7
|
934 for dma8 in `check_dma_avail 1 3 0`; do
|
pankso@7
|
935 opts="${mpfx}dma8=$dma8 ${mpfx}mpu_irq=-1"
|
pankso@7
|
936 ac_try_irq $card "$opts" $irq_list && return 0
|
pankso@7
|
937 done
|
pankso@7
|
938 return 1
|
pankso@7
|
939 }
|
pankso@7
|
940
|
pankso@7
|
941 ac_try_card_es18xx () {
|
pankso@7
|
942 card=es18xx
|
pankso@7
|
943 opts=`ac_check_option $card ${mpfx}isapnp 0`
|
pankso@7
|
944 ac_try_dmas $card "$opts" `check_irq_avail 5 9 10 7` && return 0
|
pankso@7
|
945 return 1
|
pankso@7
|
946 }
|
pankso@7
|
947
|
pankso@7
|
948 ac_try_card_cs4236 () {
|
pankso@7
|
949 card=cs4236
|
pankso@7
|
950 irq_list=`check_irq_avail 5 7 9 11 12 15`
|
pankso@7
|
951 isapnp=`ac_check_option $card ${mpfx}isapnp 0`
|
pankso@7
|
952 for cport in 0x538 0x210 0xf00; do
|
pankso@7
|
953 for port in 0x530 0x534; do
|
pankso@7
|
954 opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp"
|
pankso@7
|
955 ac_try_dmas $card "$opts" $irq_list && return 0
|
pankso@7
|
956 done
|
pankso@7
|
957 done
|
pankso@7
|
958 return 1
|
pankso@7
|
959 }
|
pankso@7
|
960
|
pankso@7
|
961 ac_try_card_cs4232 () {
|
pankso@7
|
962 card=cs4232
|
pankso@7
|
963 irq_list=`check_irq_avail 5 7 9 11 12 15`
|
pankso@7
|
964 isapnp=`ac_check_option $card ${mpfx}isapnp 0`
|
pankso@7
|
965 for cport in 0x538 0x210 0xf00; do
|
pankso@7
|
966 for port in 0x530 0x534; do
|
pankso@7
|
967 opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp"
|
pankso@7
|
968 ac_try_dmas $card "$opts" $irq_list && return 0
|
pankso@7
|
969 done
|
pankso@7
|
970 done
|
pankso@7
|
971 return 1
|
pankso@7
|
972 }
|
pankso@7
|
973
|
pankso@7
|
974 ac_try_card_cs4231 () {
|
pankso@7
|
975 card=cs4231
|
pankso@7
|
976 irq_list=`check_irq_avail 5 7 9 11 12 15`
|
pankso@7
|
977 for port in 0x530 0x534; do
|
pankso@7
|
978 opts="${mpfx}port=$port"
|
pankso@7
|
979 ac_try_dmas $card "$opts" $irq_list && return 0
|
pankso@7
|
980 done
|
pankso@7
|
981 return 1
|
pankso@7
|
982 }
|
pankso@7
|
983
|
pankso@7
|
984 ac_try_card_opl3sa2 () {
|
pankso@7
|
985 card=opl3sa2
|
pankso@7
|
986 irq_list=`check_irq_avail 5 9 3 1 11 12 15 0`
|
pankso@7
|
987 isapnp=`ac_check_option $card ${mpfx}isapnp 0`
|
pankso@7
|
988 for port in 0x370 0x538 0xf86 0x100; do
|
pankso@7
|
989 for wss_port in 0x530 0xe80 0xf40 0x604; do
|
pankso@7
|
990 opts="${mpfx}fm_port=-1 ${mpfx}midi_port=-1 ${mpfx}port=$port ${mpfx}wss_port=$wss_port $isapnp"
|
pankso@7
|
991 ac_try_dmas $card "$opts" $irq_list && return 0
|
pankso@7
|
992 done
|
pankso@7
|
993 done
|
pankso@7
|
994 return 1
|
pankso@7
|
995 }
|
pankso@7
|
996
|
pankso@7
|
997 ac_config_legacy () {
|
pankso@7
|
998 title=$(gettext "WARNING")
|
pankso@7
|
999 msg=$(gettext "
|
pankso@7
|
1000 Probing legacy ISA cards might make
|
pankso@7
|
1001 your system unstable.
|
pankso@7
|
1002
|
pankso@7
|
1003 Do you want to proceed?
|
pankso@7
|
1004
|
pankso@7
|
1005 ")
|
pankso@7
|
1006 $DIALOG --title "$title" --yesno "$msg" 10 50 || acex 0
|
pankso@7
|
1007
|
pankso@7
|
1008 if [ x"$1" = x ]; then
|
pankso@7
|
1009 probe_list="$LEGACY_CARDS"
|
pankso@7
|
1010 else
|
pankso@7
|
1011 probe_list=$*
|
pankso@7
|
1012 fi
|
pankso@22
|
1013 menu_args=""
|
pankso@7
|
1014
|
pankso@7
|
1015 for card in $probe_list; do
|
pankso@7
|
1016 cardname=`/sbin/modinfo -d snd-$card | sed -e 's/^\"\(.*\)\"$/\1/g'`
|
pankso@7
|
1017 if [ x"$cardname" != x ]; then
|
pankso@22
|
1018 menu_args="$menu_args \"$card\" \"$cardname\" on"
|
pankso@7
|
1019 fi
|
pankso@7
|
1020 done
|
pankso@22
|
1021 if [ "$menu_args" = "" ]; then
|
pankso@7
|
1022 msg=$(gettext "No legacy drivers are available
|
pankso@7
|
1023 for your machine")
|
pankso@7
|
1024 $DIALOG --msgbox "$msg" 5 50
|
pankso@7
|
1025 return 1
|
pankso@7
|
1026 fi
|
pankso@7
|
1027 title=$(gettext "Driver Selection")
|
pankso@7
|
1028 msg=$(gettext " Probing legacy ISA cards
|
pankso@7
|
1029
|
pankso@7
|
1030 Please select the drivers to probe:")
|
pankso@92
|
1031 eval $DIALOG --title \"$title\" --checklist \"$msg\" 15 70 5 $menu_args 2> $FOUND || acex 0
|
pankso@7
|
1032
|
pankso@7
|
1033 if [ $try_all_combination != 1 ]; then
|
pankso@7
|
1034 msg=$(gettext "
|
pankso@7
|
1035 Shall I try all possible DMA and IRQ combinations?
|
pankso@7
|
1036 With this option, some unconventional configuration
|
pankso@7
|
1037 might be found, but it will take much longer time.")
|
pascal@110
|
1038 if $DIALOG --yesno "$msg" 15 70
|
pankso@7
|
1039 then
|
pankso@7
|
1040 try_all_combination=1
|
pankso@7
|
1041 fi
|
pankso@7
|
1042 fi
|
pankso@7
|
1043
|
pankso@7
|
1044 xecho "Probing legacy cards.. This may take a few minutes.."
|
pankso@7
|
1045 echo -n $(gettext "Probing: ")
|
pankso@7
|
1046 cards=`cat $FOUND | tr -d \"`
|
pankso@7
|
1047 for card in $cards; do
|
pankso@7
|
1048 echo -n " $card"
|
pankso@7
|
1049 ac_opts=""
|
pankso@7
|
1050 if eval ac_try_card_$card ; then
|
pankso@7
|
1051 xecho " : FOUND!!"
|
pankso@7
|
1052 ac_config_card $card $ac_opts
|
pankso@7
|
1053 return 0
|
pankso@7
|
1054 fi
|
pankso@7
|
1055 done
|
pankso@7
|
1056 echo
|
pankso@7
|
1057 title=$(gettext "Result")
|
pankso@7
|
1058 msg=$(gettext "No legacy cards found")
|
pankso@92
|
1059 $DIALOG --title "$title" --msgbox "$msg" 15 70 5
|
pankso@7
|
1060 return 1
|
pankso@7
|
1061 }
|
pankso@7
|
1062
|
pankso@7
|
1063 #
|
pankso@7
|
1064 # main part continued..
|
pankso@7
|
1065 #
|
pankso@7
|
1066
|
pankso@7
|
1067 if test -n "$LOGFILE" ; then
|
pankso@7
|
1068 touch "$LOGFILE"
|
pankso@7
|
1069 echo -n "Starting alsaconf: " >> "$LOGFILE"
|
pankso@7
|
1070 date >> "$LOGFILE"
|
pankso@7
|
1071 fi
|
pankso@7
|
1072
|
pankso@7
|
1073 if [ x"$legacy_probe_card" != x ]; then
|
pankso@7
|
1074 ac_opts=""
|
pankso@7
|
1075 if eval ac_try_card_$legacy_probe_card >/dev/null 2>&1; then
|
pankso@7
|
1076 echo "$ac_opts"
|
pankso@7
|
1077 echo "$ac_cardname"
|
pankso@7
|
1078 exit 0
|
pankso@7
|
1079 else
|
pankso@7
|
1080 echo "FAILED"
|
pankso@7
|
1081 exit 1
|
pankso@7
|
1082 fi
|
pankso@7
|
1083 fi
|
pankso@7
|
1084
|
pankso@7
|
1085
|
pankso@7
|
1086 if [ $do_legacy_only = 1 ]; then
|
pankso@7
|
1087 ac_config_legacy
|
pankso@7
|
1088 exit 0
|
pankso@7
|
1089 fi
|
pankso@7
|
1090
|
pankso@7
|
1091 probe_cards
|
pankso@7
|
1092
|
pankso@22
|
1093 devs_found=""
|
pankso@7
|
1094 devs_olist=""
|
pankso@7
|
1095
|
pankso@7
|
1096 if [ -s "$FOUND" ]; then
|
pankso@7
|
1097 while read dev card ; do
|
pankso@7
|
1098 MODDIR=/lib/modules/`uname -r`
|
pankso@7
|
1099 find $MODDIR -type f | grep -q -E $card'\.(o|ko)' || continue
|
pankso@7
|
1100 cardname=`find_device_name $dev | cut -c 1-64`
|
pankso@7
|
1101 if [ -z "$cardname" ]; then
|
pankso@7
|
1102 cardname="$card"
|
pankso@7
|
1103 fi
|
pankso@7
|
1104 card=${card##snd-}
|
pankso@22
|
1105 devs_found="$devs_found $card \"$cardname\""
|
pankso@22
|
1106 #devs_devs=("${devs_devs[@]}" "$card" "$dev")
|
pankso@7
|
1107 done <"$FOUND"
|
pankso@7
|
1108 devs_olist=`cat $FOUND`
|
pankso@7
|
1109 fi
|
pankso@22
|
1110 if [ "$devs_found" != "" ]; then
|
pankso@7
|
1111 #
|
pankso@7
|
1112 # check for TP600E
|
pankso@7
|
1113 #
|
pankso@22
|
1114 if [ "${devs_found%% *}" = "cs46xx" ]; then
|
pankso@7
|
1115 if $lspci -nv 2>/dev/null| grep -q "Subsystem: 1014:1010"; then
|
pankso@7
|
1116 msg=$(gettext "
|
pankso@7
|
1117 Looks like you having a Thinkpad 600E or 770 notebook.
|
pankso@7
|
1118 On this notebook, CS4236 driver should be used
|
pankso@7
|
1119 although CS46xx chip is detected.
|
pankso@7
|
1120
|
pankso@7
|
1121 Shall I try to snd-cs4236 driver and probe
|
pankso@7
|
1122 the legacy ISA configuration?")
|
pankso@7
|
1123 if $DIALOG --yesno "$msg" 13 60
|
pankso@7
|
1124 then
|
pankso@7
|
1125 try_all_combination=1
|
pankso@7
|
1126 ac_config_legacy cs4236
|
pankso@7
|
1127 exit 0
|
pankso@7
|
1128 fi
|
pankso@7
|
1129 elif $lspci -nv 2>/dev/null| grep -q "Subsystem: 8086:8080"; then
|
pankso@7
|
1130 msg=$(gettext "
|
pankso@7
|
1131 Looks like you having a Dell Dimension machine.
|
pankso@7
|
1132 On this machine, CS4232 driver should be used
|
pankso@7
|
1133 although CS46xx chip is detected.
|
pankso@7
|
1134
|
pankso@7
|
1135 Shall I try to snd-cs4232 driver and probe
|
pankso@7
|
1136 the legacy ISA configuration?")
|
pankso@7
|
1137 if $DIALOG --yesno "$msg" 13 60
|
pankso@7
|
1138 then
|
pankso@7
|
1139 try_all_combination=1
|
pankso@7
|
1140 ac_config_legacy cs4232
|
pankso@7
|
1141 exit 0
|
pankso@7
|
1142 fi
|
pankso@7
|
1143 fi
|
pankso@7
|
1144 fi
|
pankso@7
|
1145
|
pankso@22
|
1146 devs_found="$devs_found legacy 'Probe legacy ISA (non-PnP) chips'"
|
pankso@7
|
1147 title=$(gettext "Soundcard Selection")
|
pankso@7
|
1148 msg=$(gettext "
|
pankso@7
|
1149 Following card(s) are found on your system.
|
pankso@7
|
1150 Please skip or choose a soundcard to configure :
|
pankso@7
|
1151 ")
|
pankso@92
|
1152 eval $DIALOG --title \"$title\" --menu \"$msg\" 15 70 5 $devs_found 2> $FOUND || acex 0
|
pankso@7
|
1153 card=`head -n 1 $FOUND`
|
pankso@7
|
1154 if [ "$card" = "legacy" ]; then
|
pankso@7
|
1155 ac_config_legacy
|
pankso@7
|
1156 else
|
pankso@7
|
1157 ac_config_card "$card"
|
pankso@7
|
1158 fi
|
pankso@7
|
1159 exit 0
|
pankso@7
|
1160 else
|
pankso@7
|
1161 msg=$(gettext "
|
pankso@7
|
1162 No supported PnP or PCI card found.
|
pankso@7
|
1163
|
pankso@7
|
1164 Would you like to probe legacy ISA sound cards/chips?
|
pankso@7
|
1165
|
pankso@7
|
1166 ")
|
pascal@110
|
1167 if $DIALOG --yesno "$msg" 15 70 ; then
|
pankso@7
|
1168 ac_config_legacy
|
pankso@7
|
1169 exit 0
|
pankso@7
|
1170 fi
|
pankso@7
|
1171 fi
|
pankso@7
|
1172
|
pankso@7
|
1173 rm -f "$FOUND" "$DUMP"
|
pankso@7
|
1174 exit 0
|