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