There are two soundmodem drivers for Linux. Linux 2.2 and 2.4 contain a kernel mode driver which requieres a soundblaster compatible soundcard and the soundcard driver will conflict with the soundmodem driver. Also it needs to do digital signal processing - something which is better done in an application than by a kernel driver. For these reasons the kernel soundmodem driver was removed for Linux 2.5.50. No matter what the kernel version the user space driver is prefered. However for completeness sake this article describes the kernel driver as well.
Configuring the user-mode soundmodem driver
Kernel Compile Options: not applicable
Thomas Sailer has written a sound modem driver that runs in user-mode using the kernel sound drivers, so it should work with any sound card supported under Linux.
The driver is implemented as the user-mode program soundmodem. The graphical soundmodemconfig program allows configuring and testing the soundmodem driver. As well as kernel sound support you need the kernel AX.25 mkiss driver.
Detailed instructions and example configurations for debian can be found at http://www.qbjnet.com/packet.html
Configuring the kernel soundmodem driver
This section only applies to Linux 2.2 and 2.4.
Kernel Compile Options:
Amateur Radio support ---> [*] Amateur Radio support --- Packet Radio protocols <*> Amateur Radio AX.25 Level 2 protocol ... AX.25 network device drivers ---> --- AX.25 network device drivers ... <*> Soundcard modem driver [?] soundmodem support for Soundblaster and compatible cards [?] soundmodem support for WSS and Crystal cards [?] soundmodem support for 1200 baud AFSK modulation [?] soundmodem support for 2400 baud AFSK modulation (7.3728MHz crystal) [?] soundmodem support for 2400 baud AFSK modulation (8MHz crystal) [?] soundmodem support for 2666 baud AFSK modulation [?] soundmodem support for 4800 baud HAPN-1 modulation [?] soundmodem support for 4800 baud PSK modulation [?] soundmodem support for 9600 baud FSK G3RUH modulation ...
Thomas Sailer has built a driver for the kernel that allows you to use your soundcard as a modem. Connect your radio directly to your soundcard to play packet! Thomas recommends at least a 486DX2/66 if you want to use this software as all of the digital signal processing is done by the main CPU.
The driver currently emulates 1200 bps AFSK, 4800 HAPN and 9600 FSK (G3RUH compatible) modem types. The only sound cards currently supported are SoundBlaster and Windows Sound System Compatible models. If you have a sound card of another type, you can try the user-mode soundmodem described later in this document.
The sound cards require some circuitry to help them drive the Push-To-Talk circuitry, and information on this is available from Thomas's Soundmodem PTT circuit web page. There are quite a few possible options, they are: detect the sound output from the soundcard, or use output from a parallel port, serial port or MIDI port. Circuit examples for each of these are on Thomas's site.
The Soundmodem driver creates network devices called: sm0, sm1, sm2 etc when it is configured.
The Soundmodem driver competes for the same resources as the Linux sound driver, so if you wish to use the Soundmodem driver you must ensure that the Linux sound driver is not installed. You can, of course, compile them both as modules and insert and remove them as you wish.
Configuring the sound card
The Soundmodem driver does not initialize the sound card. The ax25-utils package includes a utility to do this called `setcrystal' that may be used for sound cards based on the Crystal chip set. If you have some other card then you will have to use some other software to initialize it. Its syntax is fairly straightforward:
setcrystal [-w wssio] [-s sbio] [-f synthio] [-i irq] [-d dma] [-c dma2]
So, for example, if you wished to configure a SoundBlaster card at i/o base address 0x388, irq 10 and DMA 1 you would use:
# setcrystal -s 0x388 -i 10 -d 1
To configure a Window Sound System card at i/o base address 0x534, irq 5, DMA 3 you would use:
# setcrystal -w 0x534 -i 5 -d 3
The [-f synthio] parameter is the set the synthesizer address, and the [-c dma2] parameter is to set the second DMA channel to allow full duplex operation.
Configuring the Soundmodem driver
When you have configured the soundcard you need to configure the driver telling it where the sound card is located and what sort of modem you wish it to emulate.
The sethdlc utility allows you to configure the driver with these parameters, or, if you have only one soundcard installed you may specify the parameters on the insmod command line when you load the Soundmodem module.
For example, a simple configuration, with one SoundBlaster soundcard configured as described above emulating a 1200 bps modem:
# insmod hdlcdrv # insmod soundmodem mode="sbc:afsk1200" iobase=0x220 irq=5 dma=1
This is not really the preferred way to do it. The sethdlc utility works just as easily with one device as with many.
The sethdlc man page has the full details, but a couple of examples will illustrate the most important aspects of this configuration. The following examples assume you have already loaded the Soundmodem modules using:
# insmod hdlcdrv # insmod soundmodem
or that you compiled the kernel with the driver inbuilt.
Configure the driver to support the Windows Sound System card we configured above to emulate a G3RUH 9600 compatible modem as device sm0 using a parallel port at 0x378 to key the Push-To-Talk:
# sethdlc -p -i sm0 mode wss:fsk9600 io 0x534 irq 5 dma 3 pario 0x378
Configure the driver to support the SoundBlaster card we configured above to emulate a 4800 bps HAPN modem as device sm1 using the serial port located at 0x2f8 to key the Push-To-Talk:
# sethdlc -p -i sm1 mode sbc:hapn4800 io 0x388 irq 10 dma 1 serio 0x2f8
Configure the driver to support the SoundBlaster card we configured above to emulate a 1200 bps AFSK modem as device sm1 using the serial port located at 0x2f8 to key the Push-To-Talk:
# sethdlc -p -i sm1 mode sbc:afsk1200 io 0x388 irq 10 dma 1 serio 0x2f8
Configuring the AX.25 channel access parameters
The AX.25 channel access parameters are the equivalent of the KISS ppersist, txdelay and slottime type parameters. You use the sethdlc utility for this as well.
Again the sethdlc man page is the source of the most complete information but another example of two won't hurt:
Configure the sm0 device with TxDelay of 100 mS, SlotTime of 50mS, PPersist of 128 and full duplex:
# sethdlc -i sm0 -a txd 100 slot 50 ppersist 128 full
Note that the timing values are in milliseconds.
Setting the audio levels and tuning the driver
It is very important that the audio levels be set correctly for any radio based modem to work. This is equally true of the Soundmodem. Thomas has developed some utility programs that make this task easier. They are called smdiag and smmixer.
- provides two types of display, either an oscilloscope type display or an eye pattern type display.
- smmixer : allows you to actually adjust the transmit and receive audio levels.
To start the smdiag utility in 'eye' mode for the Soundmodem device sm0 you would use:
# smdiag -i sm0 -e
To start the smmixer utility for the Soundmodem device sm0 you would use:
# smmixer -i sm0
Configuring the Kernel AX.25 to use the Soundmodem
The Soundmodem driver creates standard network devices that the AX.25 Kernel code can use. Configuration is much the same as that for a PI or PacketTwin card.
The first step is to configure the device with an AX.25 callsign. The ifconfig utility may be used to perform this.
# /sbin/ifconfig sm0 hw ax25 VK2KTJ-15 up
will assign the Soundmodem device sm0 the AX.25 callsign VK2KTJ-15. Alternatively you can use the axparms command, but you still need the ifconfig utility to bring the device up:
# ifconfig sm0 up # axparms -setcall sm0 vk2ktj-15
The next step is to create an entry in the /etc/ax25/axports file as you would for any other device. The entry in the axports file is associated with the network device you've configured by the callsign you configure. The entry in the axports file that has the callsign that you configured the Soundmodem device with is the one that will be used to refer to it.
You may then treat the new AX.25 device as you would any other. You can configure it for TCP/IP, add it to ax25d and run NET/ROM or ROSE over it as you please.