| 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 |  | 
| Lucas De Marchi | 970e248 | 2012-03-30 13:37:16 -0700 | [diff] [blame] | 29 |  Then, add to your /etc/modprobe.d/oss.conf something like: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| Lucas De Marchi | 78286cd | 2012-03-30 13:37:20 -0700 | [diff] [blame] | 39 | softdep sb post: adlib_card | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| Lucas De Marchi | 970e248 | 2012-03-30 13:37:16 -0700 | [diff] [blame] | 69 | with /etc/modprobe.d/*.conf or with command-line args to modprobe, e.g. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 70 |  | 
 | 71 | modprobe sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330 | 
 | 72 | modprobe adlib_card io=0x388 | 
 | 73 |  | 
| Lucas De Marchi | 970e248 | 2012-03-30 13:37:16 -0700 | [diff] [blame] | 74 |  recommend using /etc/modprobe.d/*.conf. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| Lucas De Marchi | 970e248 | 2012-03-30 13:37:16 -0700 | [diff] [blame] | 92 | in /etc/modprobe.d/*.conf files like so: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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. |