Už několik let jsem chtěl postavit USB zvukovou kartu, která by zvládala vzorkování 192kHz/24bit. V současné době se vyrábí jednoduché čipy, které se na USB sběrnici tváří jako zvuková karta. Příkladem je PCM2706. Bohužel zvládá vzorkování maximálně 48kHz/16bit. Další možnost byla čip Tenor TE7022, který ovšem umí pouze 96kHz, je již zastaralý a není k němu volně k dispozici dokumentace. Dále je dost používané řešení s procesorem od firmy XMOS. Příkladem je špičkový modul WaveIO, který zvládá až 384kHz. Další skvělý převodník nese název Amanero a je založen na čipu ATSAM3U1CA. Můj projekt je založen na projektu Audio-Widget, který je součástí projektu SDR-Widget. Používá identické zapojení s drobnými změnami tak, aby bylo kompatibilní s originálním firmwarem. Software podporuje oba režimy UAC (USB Audio Class) 1 i 2. Režim UAC1 je nutný kvůli Windows, která standardně neobsahují podporu vyšších vzorkovacích frekvencí. Pro ně je potřeba nainstalovat speciální ovladač, aby uměly UAC2. V Linuxu a na Macu není s podporou UAC2 problém.
Procesor AT32UC3A3256 je připojen na USB sběrnici. Zvládá režimy full-speed a high-speed na což má samostatné piny. Na datové vodiče USB vstupu je také připojena součástka chránící procesor před napěťovými špičkami. Procesor a všechny ostatní součástky jsou napájené napětím 3.3V ze stabilizátoru IC5. Na všech napájecích vývodech jsou umístěny blokovací kondenzátory. Krystalové oscilátory jsou navíc připojené přes feritovou trubičku. Krystalové oscilátory Q2 a Q3 slouží ke generování přesné MCLK frekvence pro D/A převodník na hlavní desce. Přes děličku dvěma IC3 je signál zaveden zpět do procesoru, kde jsou s ním synchronizovány signály BCK, DATA a LRCK. Díky tomu, že procesor používá na USB asynchronní režim, tak je generovaná frekvence do převodníku velice přesná a s minimálním jitterem. Procesor si sám počítači říká, jestli má počítač zpomalit, nebo zrychlit. Procesor také pomocí pinu 32 přepíná, který oscilátor je aktivní. Oscilátor Q2 slouží pro násobky vzorkovací frekvence 44.1kHz a Q3 pro násobky 48kHz. Všechny signály pro D/A převodník jdou do izolátoru IC4, který je galvanicky odděluje od zbytku převodníku. Jeho sekundární strana je napájená z převodníku. Dále je z procesoru vyvedena sběrnice JTAG pro případné programování, pokud by se nám podařilo vyškodit vestavěný bootloader. Pro debugování je také vyveden jeden UART, který lze přes napěťový převodník připojit na RS232. Na desce jsou osazeny dvě SMD LED, které při přehrávání ukazují požadavky pro zrychlení (LED2), nebo zpomalení (LED1) dodávky dat. Na zadní panel je vyvedena dvoubarevná LED3, která svítí zeleně v režimu UAC1 a červeně v režimu UAC2. Pro konfiguraci a programování jsou vyvedená tlačítka PROG a RESET.
Osazování této desky byla noční můra. Hlavní procesor má 144 nožiček a bohužel jsou opravdu hodně blízko sebe. Osadil jsem ho jako první, abych měl okolo dost místa. Čip jsem chytil za dvě protilehlé krajní nožičky, na desku jsem dal dostatek gelového tavidla a nabral jsem na hrot trochu cínu a přejel celou jednu stranu. Nevypadalo to špatně, ale několik vývodů se mi spojilo. Použil jsem oblíbenou odsávací licnu a z hrůzou jsem zjistil, že skoro nefunguje. Vývody jsou tak blízko sebe, že kapilární efekt licny nechce fungovat. Nakonec jsem se uchýlil k metodě nahřátí a bouchání o stůl. Na ostatní strany čipu jsem byl již opatrnější, používal jsem méně cínu a snažil se žádné další vývody nespojit.
Jako další jsem se snažil připájet krystal a krystalové oscilátory. To byla další noční můra :-) Součástky mají keramické pouzdro a vývody zespodu v rozích. Trvalo mi, než jsem přišel na to, že po stranách v rozích je jemný kousek plošky, ke kterému když se přiblížím s páječkou a cínem, tak se chytí a kapilárním efektem nasaje cín pod sebe. Ještě horší bylo pájet oscilátory, protože jsem na trhu objevil pouze o velikosti 2.5x2mm, což už je opravdu hodně malé. Výše popsaným postupem jsem je ale úspěšně připájel, ale je to na hranici možností. Vývod číslo 1 je označen skosenou ploškou. Následně jsem připájel stabilizátory a ostatní SMD součástky z horní strany desky. Proti předchozí zkušenosti bylo pájení SMD součástek velikosti 0603 úplná hračka. Po osazení všech SMD součástek z horní strany desky, jsem pokračoval ze spodní strany. Úplně nakonec jsem osadil konektory. Dával jsem pozor, ze které strany patří.
Podařilo se mi navrhnout dvoustranný plošný spoj o rozměrech 5x5cm. Vyžadovalo to ale SMD součástky o velikosti 0603. Součástky jsou umístěny z obou stran. Snažil jsem se rozmístit součástky tak, aby se snadno pájely. Místa na popisky moc nebylo, ale nakonec se to docela podařilo. Plošný spoj jsem si nechal vyrobit u firmy Seeed Studio. Požadované Gerber a Excellon soubory je možné vygenerovat ve Free verzi programu Eagle z podkladů, které jsou zde k dispozici.
Pohled na horní stranu. Pohled na spodní stranu.
Součástky lze koupit např. u firmy Farnell. Nejvíce problematické jsou oscilátory, které byly pouze v pouzdře 2.5x2mm.
označení | hodnota a typ | počet |
---|---|---|
C1 | 10uF SMD0603 keramický | 1ks |
C2 | 4u7 SMD0603 keramický | 1ks |
C3, C4 | 2u2 SMD0603 keramický | 2ks |
C5-C20 | 100nF SMD0603 keramický | 16ks |
C21 | 10nF SMD0603 keramický | 1ks |
C22 | 4n7 SMD0603 keramický | 1ks |
C23 | 1nF SMD0603 keramický | 1ks |
C24 | 470pF SMD0603 keramický | 1ks |
C25, C26 | 18pF SMD0603 keramický | 2ks |
C27 | 10pF SMD0603 keramický | 1ks |
IC1 | AT32UC3A3256 LQFP144 | 1ks |
IC2 | 74LVC1G00DCK SC70-5 | 1ks |
IC3 | 74LVC1G80DCK SC70-5 | 1ks |
IC4 | ISO7240C | 1ks |
IC5 | LP2992AIM5-3.3/NOPB SOT23-DBV | 1ks |
IC6 | TPD2E009DBZR SOT-23 | 1ks |
L1-L3 | Ferrite bead 0.03ohm 3A SMD0805 | 3ks |
LED1 | LED červená SMD0603 | 1ks |
LED2 | LED zelená SMD0603 | 1ks |
LED3 | LED dvoubarevná 2-3mm | 1ks |
Q1 | Krystal 12MHz SMD 6x3.5mm (ABRACON ABMM2) | 1ks |
Q2 | Oscilátor 22.5792MHz SMD 2.5x2mm (EPSON SG-210STF) | 1ks |
Q3 | Oscilátor 24.576MHz SMD 2.5x2mm (EPSON SG-210STF) | 1ks |
R1-R8 | 39R SMD0603 | 8ks |
R9-R12 | 470 SMD0603 | 4ks |
R13-R18 | 4k7 SMD0603 | 6ks |
R19 | 6k8 SMD0603 | 1ks |
R20, R21 | 1M SMD0603 | 2ks |
S1, S2 | SMD spínač KSR221G | 2ks |
SV1 | Dutinková lišta 6 pinů 10mm | 1ks |
SV2 | Jumper lišta 2x5 pinů | 1ks |
SV3 | Jumper lišta 1x3 piny | 1ks |
X1 | USB typ B do DPS 90° | 1ks |
Protože nejsem programátor, použil jsem již hotový firmware. Použil jsem firmware Audio-Widget Henry Audio USB DAC 128 mkII, nebo také QNKTC AB-1.2. Vzhledem k tomu, že se dané zapojení vyskytuje nejméně v 10 variantách, tak je také k dispozici mnoho verzí firmware. Já jsem použil pravděpodobně tu nejnovější.
Většina důležitých informací k rozběhnutí modulu je v tomto originálním dokumentu: AW_readme.txt. Popíšu jen stručně, jak jsem prováděl upgrade firmware pod Linuxem:
# Add support AT32UC3A3256 SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff1", MODE:="0666"
[ 5577.057130] usb 1-2.2: new full-speed USB device number 4 using ehci-pci [ 5577.133868] usb 1-2.2: New USB device found, idVendor=03eb, idProduct=2ff1 [ 5577.133876] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 5577.133882] usb 1-2.2: Product: AT32UC3A DFU [ 5577.133888] usb 1-2.2: Manufacturer: ATMEL [ 5577.133893] usb 1-2.2: SerialNumber: 1.0.3
V lsusb je vidět toto:
Bus 001 Device 004: ID 03eb:2ff1 Atmel Corp.
Pokud už byl čip naprogramovaný, můžeme jeho vestavěný bootloader vyvolat pomocí stisknutí tlačítka PROG, následným stisknutím a uvolněním tlačítka RESET a nakonec uvolněním tlačítka PROG.
[pavouk@home audiowidget]$ ./program-widget awx_20140918_mkII_RC03.elf program-widget with awx_20140918_mkII_RC03.elf target: at32uc3a3256 chip_id: 0x2ff1 vendor_id: 0x03eb command: erase quiet: false debug: 6 device_type: AVR32 ------ command specific below ------ validate: true target: at32uc3a3256 chip_id: 0x2ff1 vendor_id: 0x03eb command: flash quiet: false debug: 6 device_type: AVR32 ------ command specific below ------ validate: true hex file: /tmp/awx_20140918_mkII_RC03.hex Validating... 117024 bytes used (46.08%) target: at32uc3a3256 chip_id: 0x2ff1 vendor_id: 0x03eb command: reset quiet: false debug: 4 device_type: AVR32 ------ command specific below ------
[ 6253.845114] usb 1-2.2: new high-speed USB device number 5 using ehci-pci [ 6253.920489] usb 1-2.2: New USB device found, idVendor=16d0, idProduct=075d [ 6253.920501] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 6253.920508] usb 1-2.2: Product: Henry Audio USB DAC 128 mkII [ 6253.920514] usb 1-2.2: Manufacturer: Audio-Widget [ 6253.920519] usb 1-2.2: SerialNumber: 2014091800BSB [ 6253.929288] input: Audio-Widget Henry Audio USB DAC 128 mkII as /devices/pci0000:00/0000:00:13.5/usb1/1-2/1-2.2/1-2.2:1.3/0003:16D0:075D.0002/input/input9 [ 6253.929634] hid-generic 0003:16D0:075D.0002: input,hidraw0: USB HID v1.11 Device [Audio-Widget Henry Audio USB DAC 128 mkII] on usb-0000:00:13.5-2.2/input3
V lsusb je vidět toto:
Bus 001 Device 005: ID 16d0:075d MCS AB-1.x UAC2 [Audio Widget]
Nyní je USB-I2S převodník přihlášen do systému jako USB zvuková karta v režimu UAC2.
Modul má na sobě pouze dvě tlačítka. Stisknutím tlačítka RESET dojde ke zresetování celého obvodu.
Podržením tlačítka PROG po dobu asi 10 sekund, dokud nezhasne zadní LED, dojde k přepnutí z jednoho režimu UAC do druhého. Následně po stisknutí tlačítka RESET dojde k zresetování a k přihlášení již v novém režimu. Procesor si zapíše nastavení do vnitřní paměti a při dalším připojení nabíhá vždy ve stejném režimu. V mém případě vypadá DMESG takto:
[ 1106.752943] usb 1-2.2: USB disconnect, device number 3 [ 1107.444194] usb 1-2.2: new full-speed USB device number 4 using ehci-pci [ 1107.526434] usb 1-2.2: New USB device found, idVendor=16d0, idProduct=075c [ 1107.526443] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1107.526449] usb 1-2.2: Product: Henry Audio USB DAC 128 mkII [ 1107.526455] usb 1-2.2: Manufacturer: Audio-Widget [ 1107.526459] usb 1-2.2: SerialNumber: 2014091800BSB [ 1107.533491] input: Audio-Widget Henry Audio USB DAC 128 mkII as /devices/pci0000:00/0000:00:13.5/usb1/1-2/1-2.2/1-2.2:1.1/0003:16D0:075C.0002/input/input9 [ 1107.533840] hid-generic 0003:16D0:075C.0002: input,hidraw0: USB HID v1.11 Device [Audio-Widget Henry Audio USB DAC 128 mkII] on usb-0000:00:13.5-2.2/input1 [ 1107.549307] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.661315] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.671331] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.681313] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.691317] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.701326] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.711319] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.721317] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.731319] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.741324] ALSA sound/usb/mixer.c:936 18:2: cannot get min/max values for control 2 (id 18) [ 1107.751312] ALSA sound/usb/mixer.c:417 cannot get current value for control 2 ch 1: err = -22 [ 1107.769321] ALSA sound/usb/mixer.c:417 cannot get current value for control 2 ch 1: err = -22 [ 1107.780329] ALSA sound/usb/mixer.c:417 cannot get current value for control 1 ch 0: err = -22 [ 1107.810456] ALSA sound/usb/mixer.c:417 cannot get current value for control 1 ch 0: err = -22 [ 1107.946462] ALSA sound/usb/mixer.c:417 cannot get current value for control 1 ch 0: err = -22 [ 1108.064485] ALSA sound/usb/mixer.c:417 cannot get current value for control 1 ch 0: err = -22
V lsusb je vidět toto:
Bus 001 Device 004: ID 16d0:075c MCS AB-1.x UAC1 [Audio Widget]
Jsou tam vidět nějaké chyby, které mohou být způsobeny chybou ve firmware, nebo v kernelu Linuxu. Zatím jsem to do hloubky neřešil.
Vlastnosti modulu lze ovládat také pomocí software. Existují 3 verze programu Widget Control. Je verze pro Windows a verze pro linux v Pythonu a v C.
Stáhnul jsem zdrojový kód widget-control.c. K němu je také potřeba soubor src/features.h. Ten jsem nahrál do vytvořeného podadresáře src. Je také potřeba mít nainstalovaný vývojářský balíček libusb-devel. Následně jsem spustil:
gcc -o widget-control widget-control.c -lusb-1.0
Pokud vše dopadne dobře, tak se objeví binární soubor widget-control. Stačí mu již jen nastavit práva pro spuštění.
Takto se vypíšou všechny připojené převodníky, které program našel:
[root@home audiowidget]# ./widget-control -a 16d0:075d 2014091800BSB
Výpis features z nvram:
[root@home audiowidget]# ./widget-control -g 12 44 usbi2s uac2_audio normal normal none generic hd44780 500ms fir quirk_none
Příkaz pro rekonfiguraci do UAC1 režimu.
./widget-control -s 12 44 usbi2s uac1_audio normal normal none generic hd44780 500ms fir quirk_none
Příkaz pro rekonfiguraci do UAC2 režimu.
./widget-control -s 12 44 usbi2s uac2_audio normal normal none generic hd44780 500ms fir quirk_none
Příkaz pro reset.
./widget-control -r
Pro Linux a Mac nejsou potřeba žádné ovladače pro plné využití modulu, protože jsou součástí jádra systému. Windows obsahují pouze podporu režimu UAC1 a pro plné využití je potřeba stáhnout ovladač z originálních stránek. Je potřeba stáhnout ovladač, který bude znát příslušné ID karty dle použitého firmware.
V Linuxu jsem narazil na problém, že mi v Alsa režimu nefunguje přehrávání v programu XMMS. Pokud použiju OSS emulaci, tak přehrávání funguje perfektně v režimu UAC2. V jiných přehrávačích jsem na tento problém nenarazil a s jiným USB-I2S převodníkem jsem také neměl žádný problém. V režimu UAC1 je situace ještě trochu horší. V OSS režimu to sice přehrává, ale špatně. Hudba poskakuje a trhá se. Nedokážu říct, jestli je problém ve firmware, nebo v přehrávači, nebo v ovladači.
Výpis při přehrávání CD nahrávky:
[root@home audiowidget]# cat /proc/asound/card2/stream0 Audio-Widget Henry Audio USB DAC 128 mkII at usb-0000:00:13.5-2.2, high speed : USB Audio Playback: Status: Running Interface = 2 Altset = 1 Packet Size = 126 Momentary freq = 44100 Hz (0x5.8333) Feedback Format = 15.17 Interface 2 Altset 1 Format: S32_LE Channels: 2 Endpoint: 2 OUT (ASYNC) Rates: 44100, 88200, 132300, 176400, 48000, 96000, 144000, 192000 Data packet interval: 250 us
Výpis při přehrávání 192kHz/24bit skladby:
[root@home audiowidget]# cat /proc/asound/card2/stream0 Audio-Widget Henry Audio USB DAC 128 mkII at usb-0000:00:13.5-2.2, high speed : USB Audio Playback: Status: Running Interface = 2 Altset = 1 Packet Size = 392 Momentary freq = 192000 Hz (0x18.0000) Feedback Format = 15.17 Interface 2 Altset 1 Format: S32_LE Channels: 2 Endpoint: 2 OUT (ASYNC) Rates: 44100, 88200, 132300, 176400, 48000, 96000, 144000, 192000 Data packet interval: 250 us
Z výpisů je vidět, že přehrávač přepnul vzorkovací frekvenci a přenos dat probíhá v asynchronním režimu. Některé přehrávače provádí převzorkování skladeb do 48kHz. Pro jistotu jsem to ověřoval osciloskopem přímo na datových signálech.
U tohoto projektu jsem si nebyl jistý výsledkem, protože původní zapojení je sice známé, ale zapojení oscilátorů bylo uděláno jinak. Oscilátory byly součástí D/A převodníku, kdežto já je umístil přímo k procesoru. Původní schéma bylo pro mne dost nepřehledné. Dost složité bylo také navrhnout plošný spoj. Dal jsem si za cíl velikost 5x5cm, což se podařilo, ale vynutilo si to použití menších součástek, což následně komplikuje osazování. Po prvním připojení se sice procesor na USB sběrnici objevil, ale při mechanickém namáhání desky zmizel. Musel jsem tedy znovu opatrně prohřát všechny piny procesoru, abych odstranil studené spoje. To se podařilo, takže nyní deska funguje spolehlivě. Nelíbí se mi softwarové problémy s přehráváním a chybová hlášení od kernelu v UAC1 režimu. Tím se budu zabývat později, až po přeinstalování systému, které mám v plánu. Jsem rád, že se mi podařilo projekt realizovat. Díky tomu jsem úspěšně otestoval desky D/A převodníků až do 192kHz/24bit. Chtěl bych poděkovat všem původním autorům projektu SDR-Widget a Audio-Widget za jejich skvělou práci, která mi umožnila realizovat můj projekt.