Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Building a modular sound driver |
| 2 | ================================ |
| 3 | |
| 4 | The following information is current as of linux-2.1.85. Check the other |
| 5 | readme files, especially README.OSS, for information not specific to |
| 6 | making sound modular. |
| 7 | |
| 8 | First, configure your kernel. This is an idea of what you should be |
| 9 | setting in the sound section: |
| 10 | |
| 11 | <M> Sound card support |
| 12 | |
| 13 | <M> 100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support |
| 14 | |
| 15 | I have SoundBlaster. Select your card from the list. |
| 16 | |
| 17 | <M> Generic OPL2/OPL3 FM synthesizer support |
| 18 | <M> FM synthesizer (YM3812/OPL-3) support |
| 19 | |
| 20 | If you don't set these, you will probably find you can play .wav files |
| 21 | but not .midi. As the help for them says, set them unless you know your |
| 22 | card does not use one of these chips for FM support. |
| 23 | |
| 24 | Once you are configured, make zlilo, modules, modules_install; reboot. |
| 25 | Note that it is no longer necessary or possible to configure sound in the |
| 26 | drivers/sound dir. Now one simply configures and makes one's kernel and |
| 27 | modules in the usual way. |
| 28 | |
| 29 | Then, add to your /etc/modprobe.conf something like: |
| 30 | |
| 31 | alias char-major-14-* sb |
| 32 | install sb /sbin/modprobe -i sb && /sbin/modprobe adlib_card |
| 33 | options sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330 |
| 34 | options adlib_card io=0x388 # FM synthesizer |
| 35 | |
| 36 | Alternatively, if you have compiled in kernel level ISAPnP support: |
| 37 | |
| 38 | alias char-major-14 sb |
| 39 | post-install sb /sbin/modprobe "-k" "adlib_card" |
| 40 | options adlib_card io=0x388 |
| 41 | |
| 42 | The effect of this is that the sound driver and all necessary bits and |
| 43 | pieces autoload on demand, assuming you use kerneld (a sound choice) and |
| 44 | autoclean when not in use. Also, options for the device drivers are |
| 45 | set. They will not work without them. Change as appropriate for your card. |
| 46 | If you are not yet using the very cool kerneld, you will have to "modprobe |
| 47 | -k sb" yourself to get things going. Eventually things may be fixed so |
| 48 | that this kludgery is not necessary; for the time being, it seems to work |
| 49 | well. |
| 50 | |
| 51 | Replace 'sb' with the driver for your card, and give it the right |
| 52 | options. To find the filename of the driver, look in |
| 53 | /lib/modules/<kernel-version>/misc. Mine looks like: |
| 54 | |
| 55 | adlib_card.o # This is the generic OPLx driver |
| 56 | opl3.o # The OPL3 driver |
| 57 | sb.o # <<The SoundBlaster driver. Yours may differ.>> |
| 58 | sound.o # The sound driver |
| 59 | uart401.o # Used by sb, maybe other cards |
| 60 | |
| 61 | Whichever card you have, try feeding it the options that would be the |
| 62 | default if you were making the driver wired, not as modules. You can |
| 63 | look at function referred to by module_init() for the card to see what |
| 64 | args are expected. |
| 65 | |
| 66 | Note that at present there is no way to configure the io, irq and other |
| 67 | parameters for the modular drivers as one does for the wired drivers.. One |
| 68 | needs to pass the modules the necessary parameters as arguments, either |
| 69 | with /etc/modprobe.conf or with command-line args to modprobe, e.g. |
| 70 | |
| 71 | modprobe sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330 |
| 72 | modprobe adlib_card io=0x388 |
| 73 | |
| 74 | recommend using /etc/modprobe.conf. |
| 75 | |
| 76 | Persistent DMA Buffers: |
| 77 | |
| 78 | The sound modules normally allocate DMA buffers during open() and |
| 79 | deallocate them during close(). Linux can often have problems allocating |
| 80 | DMA buffers for ISA cards on machines with more than 16MB RAM. This is |
| 81 | because ISA DMA buffers must exist below the 16MB boundary and it is quite |
| 82 | possible that we can't find a large enough free block in this region after |
| 83 | the machine has been running for any amount of time. The way to avoid this |
| 84 | problem is to allocate the DMA buffers during module load and deallocate |
| 85 | them when the module is unloaded. For this to be effective we need to load |
| 86 | the sound modules right after the kernel boots, either manually or by an |
| 87 | init script, and keep them around until we shut down. This is a little |
| 88 | wasteful of RAM, but it guarantees that sound always works. |
| 89 | |
| 90 | To make the sound driver use persistent DMA buffers we need to pass the |
| 91 | sound.o module a "dmabuf=1" command-line argument. This is normally done |
| 92 | in /etc/modprobe.conf like so: |
| 93 | |
| 94 | options sound dmabuf=1 |
| 95 | |
| 96 | If you have 16MB or less RAM or a PCI sound card, this is wasteful and |
| 97 | unnecessary. It is possible that machine with 16MB or less RAM will find |
| 98 | this option useful, but if your machine is so memory-starved that it |
| 99 | cannot find a 64K block free, you will be wasting even more RAM by keeping |
| 100 | the sound modules loaded and the DMA buffers allocated when they are not |
| 101 | needed. The proper solution is to upgrade your RAM. But you do also have |
| 102 | this improper solution as well. Use it wisely. |
| 103 | |
| 104 | I'm afraid I know nothing about anything but my setup, being more of a |
| 105 | text-mode guy anyway. If you have options for other cards or other helpful |
| 106 | hints, send them to me, Jim Bray, jb@as220.org, http://as220.org/jb. |