Jiří Plachý

Software

Zesilovač 4x 130 W

(dodatek k článku uveřejněném v PE Aradio 6, 7, 8 / 2004)

Pohled na zesilovač

Modul spínání z PC (Software)

  1. Linux
  2. Windows
  3. Download

1. Linux

1.1. Staré řešení (user-space tools amp-0.1)

Při pravidelném čtení www.root.cz jsem našel zapojení teploměru, napájeného ze dvou kontrolních PINů portu LPT1 (1 a 14 spojených dohromady). Inspirace pro účely tohoto modulu byla okamžitá. Při počítání R1 je třeba počínat si opatrně. Na PINech LPT1 není totiž udávaných 5V, ale jen asi 3,8V.

Pro ovládání napětí na PINech jsem použil zdrojové kódy z www.root.cz patřičně zjednodušené, aby plnily svůj účel. Výsledkem jsou dva programy (pod Linux), přičemž jeden z nich po spuštění nastaví PINy LPT na "1" (3,8V), a tedy zapne zesilovač, zatímco ten druhý zesilovač vypne tím, že na port pošle nulu. Zdrojový kód programu zapínající zesilovač je zde (soubor se jmenuje zon.c):

#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>

#define DATA	0x378
#define STATUS	DATA+1
#define CONTROL	DATA+2

int main (void)
{
	if (setuid (0) < 0) {
		printf ("Program musi byt spusten rootem\n");
		exit (1);
     	}
	if (ioperm (STATUS, 3, 1)) {
		printf ("Program musi byt spusten rootem\n");
		exit (1);
	}
	if (ioperm (CONTROL, 3, 1)) {
		printf ("Neni pristup na port\n");
      		exit (1);
	}

	outb (52, CONTROL);

	return (0);
}

A zdrojový kód programu vypínající zesilovač je tady (soubor se jmenuje zoff.c):

#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>

#define DATA 	0x378
#define STATUS 	DATA+1
#define CONTROL	DATA+2

int main (void)
{
	if (setuid (0) < 0) {
		printf ("Program musi byt spusten rootem\n");
		exit (1);
     	}
	if (ioperm (STATUS, 3, 1)) {
		printf ("Program musi byt spusten rootem\n");
		exit (1);
	}
	if (ioperm (CONTROL, 3, 1)) {
		printf ("Neni pristup na port\n");
      		exit (1);
	}

	outb (55, CONTROL);

	return (0);
}

Programy zkompilujeme pod prostředím Linuxu například takhle:

$ gcc -o zon zon.c

kde zon je spustitelného souboru a zon.c je název zdrojového kódu. Podmínkou pro kompilaci a dobrou funkčnost je kernel <=2.4.22. Pro kernely > 2.4.22 doporučuji pouľít nové řešení (amp-0.3). Po zkompilování lze pustit program příkazem:

$ ./zon

Je však třeba pouštět program jako root, protože běžný uživatel nemůže zapisovat na LPT1. Pokud však chceme program zkopírovat do nějakého veřejného adresáře (např. /usr/local/bin) a chtít ho zpřístupnit pro některé uživatele nemající rootovská práva, lze upravit práva souboru tak, aby se pouštěl s privilegii roota:

$ chmod 750 zon
$ chmod +s zon

Dobré je vytvořit si speciální skupinu a jen do ní přidělit uživatele s přístupem k programům zon a zoff. Těmto programům je pak ještě třeba změnit grupového vlastníka. Kdyby toto opatření nebylo provedeno, zesilovač by mohl vypnout a zapnout každý přihlášený uživatel (např. přes ssh). Další softwarové úpravy už záleží jen na čtenáři. Lze třeba vytvořit ikony na ploše grafického rozhraní, jednu pro zapnutí a jednu pro vypnutí zesilovače atd.

Po nainstalování programů zon a zoff je dobré udělat si startovací skript, který zajistí zapnutí zesilovače při startu systému a jeho vypnutí při vypínání systémových služeb. To je přesně to, co potřebujete, abychom se vyhnuli kritickým okamžikům, kdy se na výstupu zvukové karty objeví pulsy. Příklad startovacího skriptu pro Mandrake (Mandrivu), který zkopírujete do /etc/init.d je zde (soubor se jmenuje zesilovac):

#!/bin/sh

# chkconfig: 23 10 10
# description: Starts and stops zesilovac...

# Source function library.
if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi


case "$1" in
	start)
		action "Starting amplifier: " /usr/local/bin/zon
		touch /var/lock/subsys/zesilovac
		;;
	stop)
		action "Shutting down amplifier: " /usr/local/bin/zoff
		rm -f /var/lock/subsys/zesilovac
		;;
	restart)
		$0 stop
		$0 start
		;;
esac

Potom už stačí jen nastavit správně práva a přidat skript do seznamu startovaných služeb:

$ chmod 750 /etc/init.d/zesilovac
$ chkconfig --add zesilovac

Nyní už je vše nakonfigurováno a mělo by to bez problémů fungovat. Pokud Vám náhodou utility zon a zoff nefungují, ujistěte se, že máte v kernelu zakompilovánu základní podporu LPT (Parallel port support a PC-style hardware). Zdrojové kódy i se zkompilovanými ELFy najdete v sekci download.

1.2. Nové řešení (kernel driver amp-0.3/0.4)

Starší řešení (amp-0.1) fungovalo hezky na kernelech řady 2.4 až do verze 2.4.22. Novější kernely řady 2.4 z nějakého důvodu odmítaly s user-space utilitami spolupracovat. Proto jsem vytvořil kernelový driver a user-space utility volají pouze ioctl() na kernelový driver (/dev/amp). Zdrojovky jsou pro řadu 2.4 i pro řadu 2.6. Zdrojové kódy (amp-0.3/0.4) včetně startovacího (init.d) skriptu pro Mandrake Linux najdete v sekci download. Balíček obsahuje:

amp.o (amp.ko pro kernel 2.6)kernelový driver
zon (ampon)utilitka pro zapínání zesilovače
zoff (ampoff)utilitka pro vypínání zesilovače
zswitch (ampswitch)utilitka pro změnu stavu zesilovače (když je vypnutý, zapne se a naopak)
ampstartovací skript

Po stažení balíčku provedete rozbalení například příkazem (příklad na balíčku amp-0.3):

$ tar xvzf amp-0.3.tar.gz

Přepnete se do adresáře amp-0.3 a spustíte překlad pomocí make:

$ cd amp-0.3
$ make

Pokud kompilace proběhla v pořádku, spusťte instalaci (nainstaluje za Vás utilitky, startovací skript, kernelový driver):

$ make install

Pozor: instalace je odzkoušena pouze na Mandrake Linuxu, na ostatních distribucích je pravděpodobně nutná modifikace! (Minimálně modifikace startovacího skriptu.) Po instalaci by se měl sám zapnout zesilovač (pokud vše proběhlo v pořádku). Pokud ne, zkuste jestli je v kernelu načten modul amp.o (pomocí utility lsmod) a taky si ověřte, zda máte zakompilovanou podporu LPT (Parallel port support a PC-style hardware) v kernelu. Stav zesilovače lze zjistit pomocí příkazu:

$ cat /proc/amp
Amplifier controller (amp)
version 0.3
major:  254
minor:  0
status: ON
uptime: 0 days 00:46:07

2. Windows

2.1. Staré řešení (TVicLPT)

V první verzi programu jsem použil demoverzi driveru TVicLPT umožňujícího zápis na jednotlivé PINy LPT portu. Lze jej stáhnout na adrese http://entechtaiwan.net/dev/lpt/index.shtm. Pak už stačí jen použít některé programovací prostředí pro Windows a udělat malý program pro ovládání portu. Část zdrojového kódu pro Borland C++ Builder realizující zapnutí zesilovače je zde:

LPT->Active = 1;
if (LPT->Active == 0)
    ShowMessage("ERROR");
LPT->CurrentLPT = 1;
LPT->ReadMode = 0;
LPT->CurrentLptMode = LPT_FAST_CENTRONIX;
LPT->Pin[1] = 1;
LPT->Pin[14] = 1;

Tento kód je možné dát třeba do funkce obsluhující událost kliknutí na button. Aby vše dobře fungovalo, musíme do formuláře vložit komponentu VicLPT a pojmenovat ji LPT. Podobně vypadá kód pro vypínání zesilovače:

LPT->Active = 1;
if (LPT->Active == 0)
    ShowMessage("ERROR");
LPT->CurrentLPT = 1;
LPT->ReadMode = 0;
LPT->CurrentLptMode = LPT_FAST_CENTRONIX;
LPT->Pin[1] = 0;
LPT->Pin[14] = 0;
LPT->Active = 0;

Ovládání zesilovače s použitím výše uvedeného driveru jsem testoval na Windows 2000 a Windows XP. V současné době doporučuji použití nového řešení. Důvod je jasný: výše zmiňovaný driver je jen demoverze (otravující hláškou při každém startu Windows) a navíc je vesměs vázán na C++ Builder.

2.2. Nové řešení (kernelový driver + software Zesilovač)

Balíček v sekci download obsahuje driver (odzkoušený zatím jen na Windows XP), program zesilovac.exe (pro ovládání zesilovače a zjišťování informací) a program zswitch.exe (užitečný pro jednoduchou změnu stavu zesilovače - třeba aplikací Girder pro dálkové ovládání počítače). Po spuštění programu zesilovac.exe se zapne zesilovač a objeví se zelená kulatá ikonka v systémové liště. Dvojkliknutím na ikonku lze provést změnu stavu zesilovače (zapnuto na vypnuto a naopak). Pokud na ikonku klikneme pravým tlačítkem objeví se menu. Možnost Status... zobrazí okno s informacemi o zesiovači. Moľnost Konec ukončí program a vypne zesilovač. Ostatní položky menu snad ani není třeba komentovat. Ukázky programu jsou vpravo na obrázcích.

Instalace (pro Windows XP):

  1. Rozbalíme balíček zesilovac.zip. Spustíme soubor ZesilovacSetup.exe a nainstalujeme.
  2. Přidáme zástupce na zesilovac.exe do nabídky Start - Po spuštění, abychom zajistili start programu a zapnutí zesilovače při zapnutí Windows.
  3. Spustíme dialog Vlastnosti Systému (pomocí WIN+Break) a odtud Správce Zařízení.
  4. Vybereme Port LPT1 a po kliknutí pravým tlačítkem na LPT1 vybereme vlastnosti.
  5. V záložce Ovladač zvolíme Aktualizovat ovladač.
  6. Zvolíme možnost Instalovat ze seznamu či daného umístění a potvrdíme.
  7. Zvolíme možnost Nevyhledávat, zvolím ovladač k instalaci a potvrdíme.
  8. Klikneme na tlačítko Z diskety... a nalistujeme náš driver. Potvrdíme tlačítkem Další. Následně potvrdíme několik varovných hlášení.
  9. Driver je nainstalován, bude potřeba restartovat počítač.
  10. Doporučuji nastavit v BIOSu mód paralelního portu na ECP.

Program zesilovac - stavové okno

 

Program Zesilovač - systémová lišta

 

Program Zesilovač - systémová lišta

Poznámka pro zájemce o problematiku paralelního portu: Při programování driveru bylo důležité přepnout čip portu LPT do správného módu (Fast Centronics), jinak by driver nefungoval. Informace jak přepnout LPT do různých módů a vůbec cokoliv, co potřebujete vědět o LPT portu, najdete zde.

© Jiří Plachý 2004 - 2019