Pavouk logo

AT32UC3A3256 USB na I2S (kompatibilní s AudioWidget)

AT32UC3A3256 dolní strana

Menu

Úvod

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.

Popis zapojení

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.

Schéma zapojení

Schéma zapojení

Osazování

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ří.

Osazovací plán

Horní strana

Osazovací plán shora

Spodní strana

Osazovací plán zdola

Plošný spoj

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.

Horní strana

Plošný spoj shora

Spodní strana

Plošný spoj zdola

Kompletní deska

Fotografie

Pohled na horní stranu. Horní strana Pohled na spodní stranu. Dolní strana

Součástky

Součástky lze koupit např. u firmy Farnell. Nejvíce problematické jsou oscilátory, které byly pouze v pouzdře 2.5x2mm.

Seznam součástek
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

Firmware

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ší.

Firmware upgrade

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:

  1. Stáhnul jsem upravený dfu-programmer z této stránky: https://code.google.com/p/sdr-widget/downloads/list
  2. Nainstaloval jsem balíček avr-binutils, nebo binutils-avr podle distribuce.
  3. Vytvořil jsem podle návodu skript program-widget.
  4. V /etc/udev/rules.d/ jsem vytvořil podle návodu soubor 99-avrtools.rules. V mém případě byla důležitá tato sekce:
    # Add support AT32UC3A3256
    SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb", ATTRS{idVendor}=="03eb",
    ATTRS{idProduct}=="2ff1", MODE:="0666"
    
  5. Restartoval jsem počítač, aby se potřebná udev pravidla projevila.
  6. Po přípojení jsem zkontroloval pomocí dmesg, jestli se objeví procesor na USB sběrnici:
    [ 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.

  7. Nyní jsem v adresáři s programátorem a firmwarem spustil příkaz ./program-widget widget.elf V mém případě vypadal výsledek takto:
    [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 ------
    
  8. Nakonec jsem stisknul tlačítko RESET a v dmesg jsem viděl toto:
    [ 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.

Ovládání

Ovládání tlačítky

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.

Ovládání počítačem

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.

Kompilace widget-control

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í.

Použití widget-control

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

Ovladače

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.

Odkazy

Závěr

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.