\section{Štruktúra firmwaru} \label{sec:struktura_firmwaru}
Firmware je rozdelený do logických celkov, ktoré si medzi sebou v prípade potreby predávajú informácie. Na obr. \ref{pic:SPU_schema_firmware} je znázornená štruktúra firmwaru v zjednodušenej podobe formou navzájom previazaných blokov.

\begin{figure}[hbtp]
	\centering
		\includegraphics[width=\columnwidth]{../blokova_schema/blokova_schema_firmware}
	\caption{Bloková schéma firmwaru SPU}
	\label{pic:SPU_schema_firmware}
\end{figure}

Hlavný blok pre príjem a spracovanie zvukového signálu je na obr. \ref{pic:SPU_schema_firmware} znázornený modrou farbou. Pozostáva z dvoch vláken, jedno pre spracovanie signálu z S/PDIF prevodníka a druhé pre spracovanie signálu z AD prevodníka.

Blok pre príjem a spracovanie audia je riadený z infračerveného ovládača alebo pomocou softwaru v PC. V PC sa zobrazujú aj servisné informácie a aktuálne nastavenia (napríklad pri zmene hlasitosti pomocou IrDA ovládania, sa automaticky aktualizuje ukazovateľ hlasitosti v PC). O komunikáciu s PC sa stará vlákno nazvané \emph{pcCommThread}.

Audio dáta sa posielajú pomocou UDP datagramov. Na začiatku každého paketu je 16 bajtová hlavička, v ktorej sa prenáša identifikačné číslo input streamu, output streamu, sériové číslo slave jednotky, pre ktorú je paket určený a časová známka. Viac informácii o štruktúre UDP paketu je v kapitole \ref{cha:komunikacny_protokol} \emph{Komunikačný protokol}, na strane \pageref{cha:komunikacny_protokol}.

\subsection{Audio vlákna}
Na obr. \ref{pic:diagram_audiothread} je znázornený obecný vývojový diagram pre obidve vlákna spracovávajúce audio. 

V procese \emph{Vytvorenie UDP spojenia} sa vlákno uspí, pokiaľ nie je input stream pripojený k nejakej slave jednotke. V nekonečnej slučke sa čaká na naplnenie zásobníka zo vzorkami. Zásobník má 1360 bajtov, 16 bajtov zaberá hlavička, takže na vzorky ostáva 1344 bajtov. Keďže sú vzorky spracovávané a odosielané vo formáte s plá\-va\-jú\-cou desatinnou čiarkou (veľkosť 4 bajty), tak sa do jedného paketu zmestí 336 vzoriek audio signálu. I$^2$S periféria pracuje v tzv. \emph{double buffer móde}, ktorý procesor podporuje na hardwarovej úrovni. Pre vzorky sú vytvorené dve polia a periféria zapisuje raz do jedného, raz do druhého pola. Ešte je dobré spomenúť, že zapisovanie prebieha cez DMA (Direct Memory Access), takže jadro procesora sa môže venovať iným úlohám.
\begin{figure}[hbtp]
	\centering
		\includegraphics[height=0.9\textheight]{../diagramy/AudioThread}
	\caption{Vývojový diagram pre audio vlákno}
	\label{pic:diagram_audiothread}
\end{figure}

Po naplnení pola je vlákno prebudené (s využitím synchronizačného mechanizmu \emph{semafor}). Ako prvé sa v procese \emph{Obsluha eventov} skontroluje, či nie sú aktívne nejaké udalosti (eventy), ako napr. zmena hlasitosti, zmena pripojenia input streamu k output streamu, zmena pripojenia device k inej slave jednotke, zmena v nastavení ekvalizéru, atď. Ak nejaká zmena nastala tak sa v tomto procese zrealizuje.

V procesu \emph{Obsluha mailboxov} sa zisťuje, či si ovládací software vypýtal, prípadne zrušil, zasielanie streamov pre grafické zobrazenie. To sa vyhodnocuje ďalej v programe. V prípade, že je potrebné zaslať stream, tak sa pošle ako broadcast.

Podľa I$^2$S štandardu sa vzorky pre ľavý a pravý kanál striedajú. V SPU jednotke sa pracuje s kanálmi samostatne. Preto je potrebné tieto vzorky rozdeliť. O to sa stará proces \emph{Spracovanie vzoriek z I2S periférie}. Okrem toho sa vzorky posúvajú a upravujú do rozsahu $\langle -1,1 \rangle$ a násobia sa ziskom nastaviteľným v ovládacom software. Nastavenie zisku slúži na vyrovnanie hlasitosti zvuku pre rôzne vstupy.

\subsection{Ekvalizér}
Súčasťou zariadenia je digitálny sedem-pásmový ekvalizér nastaviteľný v rozsahu $\langle -15, 15\rangle$ dB. Ekvalizér je realizovaný sadou siedmych filtrov zaradených v sérii, každý pre jedno pásmo. Na začiatku pásma je \emph{low shelving} filter, nastavený na medznú frekvenciu 100 Hz. Potom nasleduje 5 \emph{peak} filtrov postupne nastavených na frekvencie 150 Hz, 400 Hz, 1 kHz, 2.4 kHz a 6 kHz. Na konci pásma sa nachádza \emph{high shelving} filter s medznou frekvenciou 12 kHz.

Filtre sú typu IIR 2. radu. Koeficienty filtrov sú normované, takže pre každý filter je potrebné uložiť 5 koeficientov. Keďže má každý filter 31 nastaviteľných ziskov, je potrebné vygenerovať 217 sád koeficientov. To je dohromady 1085 koeficientov. Koeficienty sú uložené v poli typu float a pri zmene ekvalizéru sa filter inicializuje vhodnými koeficientami. Výpočet koeficientov filtru, vrátane vytvorenia súboru s koeficientami, je realizovaný v Matlabe.

Na obr. \ref{pic:ekv_vsetkypasma} sú grafy modulov frekvenčných charakteristík pre všetky použité filtre.

Vzťahy pre výpočet koeficientov filtru sú uvedené v sekcii \ref{subsec:ekv} \emph{IIR filtre pre realizáciu digitálneho ekvalizéra} na strane \pageref{subsec:ekv}.

Pre vyššiu kvalitu ekvalizéru by bolo vhodné použiť filtre 4. radu. Filter 4. radu je realizovaný sériovým zapojením dvoch filtrov druhého radu. Tým sa zvýši výpočtová náročnosť na dvojnásobok. Na použitom procesore nebolo možné realizovať takýto systém v reálnom čase.

\begin{figure}[H]
	\centering
		\includegraphics[width=\columnwidth]{../obrazky/firmware/ekv_vsetkypasma}
	\caption{Modul frekvenčných charakteristík filtrov sedem-pásmového ekvalizéru}
	\label{pic:ekv_vsetkypasma}
\end{figure}

\subsection{pcComm vlákno}
Na obr. \ref{pic:diagram_pccommthread} vidíme vývojový diagram pre vlákno realizujúce komunikáciu s PC. V časti B je rozkreslený proces \emph{Obsluha spojenia}. Interakcia s ostatnými vláknami je realizovaná pomocou udalostí (\emph{events}). Podľa zmeny, ktorá sa má zrealizovať sa pošle všetkým počúvajúcim vláknam špecifický príznak, ktorý sa potom v cieľových vláknach vyhodnotí a zmena sa zrealizuje. Výhodou eventov je, že sa dajú použiť na synchrónne predávanie správ viacerým vláknam, čo napríklad pomocou mailboxov alebo správ (\emph{messages}) nie je možné.

\begin{figure}[hbtp]
	\centering
		\includegraphics[width=\columnwidth]{../diagramy/pcCommThread}
	\caption{Vývojový diagram pre pcComm vlákno}
	\label{pic:diagram_pccommthread}
\end{figure}

Tu je treba podotknúť, že na začiatku každého príkazu z PC (a podobne aj odpovedi z SPU) sú vyhradené dva bajty, v ktorých je uložená veľkosť príkazu. To je potrebné, pretože Ethernet nezaručuje priatie, alebo vyslanie správy v jednom celku. V prípade že príkaz neprišiel celý, tak sa čaká na prijatie ďalšieho paketu.

\subsection{Ostatné vlákna}
V programe sa používajú ešte nasledujúce vlákna:
\begin{enumerate}
	\item[-] \emph{main}: v main je realizovaná inicializácia operačného systému, načítanie nastavení z flash pamäte, vytvorenie vláken a v prípade potreby zápis nastavení do flash.
	\item[-] \emph{ledThread}: v led vlákne sú realizované dve funkcie. Jedná sa o blikanie LED diódou s periódou 500 ms a detekciu stlačenia užívateľského tlačítka na kite STM32F4Discovery. Po stlačení tlačítka sa nastaví zariadenie do defaultných nastavení a mikrokontrolér sa resetuje. Toto vlákno existuje v projektu pre debugovacie účely.
	\item[-] \emph{lcdThread}: v lcd vlákne je realizované vykreslenie bitmapy na displej a jeho pohasnutie po 15 s (pokles jasu na 30 \%, riadené PWM) a úplné zhasnutie po 60 s.
	\item[-] \emph{irdaThread}: irda vlákno obsluhuje príkazy prijaté z infračerveného ovládania. Takisto sa tu nachádza dekódovanie prijatých príkazov.
\end{enumerate}
Vývojové diagramy k všetkým vláknam nájdeme v prílohe \ref{app:diagramy} \emph{Vývojové diagramy} na strane \pageref{app:diagramy}.