22.1.2022 Loni vydala organizace Raspberry Pi Foundation novou malou levnou destičku Raspberry Pi Pico, která se velmi podobá různým Arduino / BluePill destičkám s STM32, srovnání zde. Je osazena novým MCU RP2040 (navrženým přímo organizací) s 2 jádry ARM Cortex-M0+ na 133 MHz, 264 kB SRAM, 2x UART, 2x SPI, 2x I2C, 16x PWM, 4x 12b ADC 0,5 MS/s, DMA. Zajímavé jsou programovatelné jednotky PIO bloků (nezávisle běžící stavová mašina - max. 32 instrukcí v ASM). Destička dále obsahuje externí 2MB QuadSPI FlashROM (na čipu je pouze malá ROM s USB bootloaderem), krystalový oscilátor, USB konektor (podporuje USB 1.1 device i host) a 40 pinů ve tvaru pouzdra obvodu DIL. Napájecí napětí je 1,8 – 5,5 V. GPIO nejsou 5 V tolerantní, max. 3,3 V a dají proud kolem 12 mA, max. jen 50 mA na všechny GPIO. U nás se dá Pico koupit za 109 Kč (v Praze ho má i GM Electronic za 149 Kč), či ještě menší destička s více GPIO, případně i samotný MCU RP2040 za pouhých 29 Kč (a v dnešní době nedostatku čipů jsou kupodivu skladem).
Dozvěděl jsem se o něm z vlákna na OldCompu, kde si s ním začal hrát Panda (samozřejmě že né v Pythónu, ale pěkně low-level) a naprogramoval pěknou OpenSource C-čkovou grafickou knihovnu PicoVGA, resp. zjednodušené verze Pico16VGA a PicoQVGA, s kterou lze s pomocí pár odporů zobrazovat grafiku na běžném VGA monitoru nebo LCD s paralelním RGB interfacem. Zde je podobný projekt pro generování obrazu na kompozitní výstup s jednoduchým odporovým R-2R DACem a experimentální projekt digitálního výstupu PicoDVI se silně přetaktovaným MCU. Spolehlivě prý běží cca do 250 MHz (jako první začne chybovat SPI FlashROM, ale zjistilo se, jak zvýšit děličku SPI hodin pro flešku a pak se dá dostat v pohodě přes 300 MHz), utilita pro nastavení PLL je zde. Panda také připravil minimalistické RaspPicoSDK včetně popisu pro začátečníky, které se obejde bez dalšího bloatware a vystačí si jen s ARM-GCC (použité binárky neběží na Windows XP, ale dají se nahradit těmito ze SourceForge). Věnoval se též assembleru a měření doby zpracování instrukcí.
28.1.2022 mi z RPiShopu dorazily 2 Pico destičky a 1 samostatný čip RP2040. Dále jsem se dozvěděl o další větší OpenHW destičce VGA, SD Card & Audio Demo board for Raspberry Pi Pico aka Pimoroni Pico VGA Demo Base. Ta obsahuje VGA konektor s odporovým DACem RGB555, audiokodek PCM5101 s výstupem na stereo jack, slot na microSD kartu, microUSB host konektor, 3 tlačítka a ladicí pin header. PCB Layout a schéma v KiCADu je zde a zdrojáky demo programů jsou na GitHubu. Za jednu neosazenou destičku děkuju vanthomasovi z OldComp fóra. Chtěl bych na ní zkusit rozjet Pandovu knihovnu PicoVGA, která používá méně barevný výstup RGB332 mapovaný na jiné GPIO a také sloučený signál SYNC místo HSYNC a VSYNC. Snad to půjde přizpůsobit úpravou souboru vga_config.h. Nechal jsem si také vyrobit u JLCPCB 5 destiček PicoDVI.
5.2.2022 Od Pandy jsem se dozvěděl, že výstupy pro RGB DAC na výše zmíněné destičce bohužel přemapovat nepůjdou, protože program pro PIO blok prochází popořadě za sebou jednotlivé GPIO, což zde není splněno, neboť GPIO5 je použit pro hodiny microSD karty. Také nepotěší, že použité footprinty pro tyto SMD odpory jsou zcela zbytečně velikosti 0402, když by se tam v pohodě vešly 0603. Vyřešil jsem to jednoduše přelepením dané oblasti na desce proužkem kaptonové pásky a připájením 0603 odpůrků podle Pandova zapojení přímo k vývodům Pico modulu. Na druhé konce odpůrků jsem připájel drátky a propojil je v odpovídajícími R, G, B piny VGA konektoru. Panda šetří GPIO a používá smíšenou synchronizaci zavedenou na pin HSYNC (13) místo původních HSYNC a VSYNC.
Po prvním připojení Pica do PC přes USB se mi detekovalo složené USB zařízení se zařízením třídy mass storage a neznámé zařízení "RP2 Boot" s USB PID: 0003h, k němuž není pro Windows žádný ovladač, ale není pro naprogramování potřeba. Raspberry Pi Foundation používá USB VID: 2E8Ah a zde je seznam všech jejich PIDů. Některé programy dále používají virtuální sériový port (CDC), pro který stačí nainstalovat tento INF soubor. Jak jsem zjistil, zařízení "RP2 Boot" využívá utilita picotool (zdrojáky zde) ke komunikaci s bootloaderem přes knihovnu libusb. Zařízení je třeba ručně zaregistrovat k WinUSB/libusb driveru pomocí utility Zadig, viz obrázek níže. Jediná binárka picotool.exe 1.1.0, kterou jsem našel, bohužel neběží pod Windows XP a pod Windows 10 mi při pokusu o spojení s Picem opakovaně spadla. Nakonec se mi podařilo zkompilovat vlastní build verze 1.1.0 [422 kB], který funguje i pod Windows XP. Umožňuje nahrávat a verifikovat programy pro Pico do/z SPI FlashROM, restartovat z boot módu do aplikačního módu (obráceně mi to nefungovalo) a vypsat nějaké informace, viz níže.
C:\RaspPicoSDK\_exe>picotool.exe info -a Program Information name: pico web site: https://github.com/raspberrypi/pico-examples features: USB stdin / stdout binary start: 0x10000000 binary end: 0x10055bc0 Fixed Pin Information none Build Information sdk version: 1.0.1 pico_board: pico build date: Jun 6 2021 build attributes: Release Device Information flash size: 2048K ROM version: 2
Zkusil jsem do Pica nahrát program Vlak (Train), který je portem stejnojmenné staré DOSové hry od Golem Software. Naprogramování (pokud už bylo do Pica dříve něco nahráno, je třeba zmáčknout tlačítko BOOTSEL a RUN/RESET#, pak se jednoduše zkopíruje zkompilovaný .UF2 soubor na virtuální disk Pica) a start programu proběhl bez problémů a na monitoru se objevil starý známý Vlak, který jsem mohl ovládat klávesama přes Putty (115200 baud) skrz virtuální sériák (lze překonfigurovat i na UART na GPIO). Obraz běžel rychle a stabilně bez jakýchkoliv rušivých jevů. UPDATE: Na Pico byla portována i legendární střílečka Doom. Zdrojáky jsou k dispozici na GitHubu a ukázkové video je zde. Sharewarová epizoda Doomu se díky kompresi vešla do standardní 2MB SPI FlashROM a obraz se generuje odporovým DACem na VGA v 16-bitových barvách RGB565. Za zmínku stojí také projekt emulátoru Pico-ZXspectrum, který využívá výše zmíněnou knihovnu PicoDVI.
30.3.2022 Tak mi konečně s várkou plošňáků z JLCPCB dorazily 4-vrstvé destičky na PicoDVI zmíněné výše, mírně upravené pro jiný footprint HDMI konektoru. Mám navíc 5 ks, takže případným zájemcům můžu z tohoto přebytku nabídnout. Zatím jsem osadil MCU RP2040 v QFN pouzdru a 12MHz krystal, ale chybí mi pasiva velikosti 0402, která budu muset někde koupit (toto smetí běžně nevedu).
PicoDVI PCB top PicoDVI PCB bottom
20.4.2022 Před 2 týdny jsem sehnal součástky a doosadil destičku, ale nevyzkoušel ji, protože jsem nikde nenašel zkompilovanou binárku s nějakým demem pro správnou konfiguraci pinů (našel jsem akorát zkompilované binárky, které byly určené pro Wrenův adaptér DVI Sock s jiným zapojením TMDS párů). Nyní jsem konečně překonal nechuť a odhodlal se rozběhnout toolchain s CMake. Kompilace se samozřejmě (na Windows) neobešla bez problémů. Použil jsem poslední verzi CMake 3.23.1, Python 3.10.4 (vyžadovaný nějakými build skripty) a ARM-GCC 9.3.1 toolchain. Dále je potřeba mít někde staženou a rozbalenou originální verzi PicoSDK 1.3.0 (ne tu upravenou Pandovu verzi). Pustil jsem CMD a nastavil cesty k ARM-GCC, MinGW, CMake, Pythonu a nastavil proměnnou PICO_SDK_PATH do adresáře s rozbaleným PicoSDK. V top-level adresáři zdrojáků PicoDVI jsem v souboru CMakeLists.txt změnil řádek s konfigurací pinů z set(DVI_DEFAULT_SERIAL_CONFIG "pico_sock_cfg" CACHE STRING na set(DVI_DEFAULT_SERIAL_CONFIG "picodvi_dvi_cfg" CACHE STRING (příp. lze předat jako parametr CMake -DDVI_DEFAULT_SERIAL_CONFIG=picodvi_dvi_cfg). Vytvořil jsem podadresář build, vstoupil do něj a spustil cmake -G "MinGW Makefiles" -DPICO_COPY_TO_RAM=1 .., měl by vzniknout soubor Makefile a mělo by stačit už jen zavolat make. Ale protože mi nějak selhala kompilace utilit pioasm a elf2uf2 z PicoSDK, tak jsem nakopíroval staženou binárku pioasm.exe do build\pioasm\ a elf2uf2.exe do build\elf2uf2\. Pak jsem musel zavolat make -i, aby se ignorovaly errory během kompilace, protože CMake se pokoušel pomocí ARM-GCC zkompilovat nějaký testovací soubor pro Windows s neznámým linker parametrem --major-image-version, ale to nemá vliv na kompilaci ARMového kódu a nakonec se mi přeložily všechny dema. Pro test zde přikládám zkompilovaný image dema christmas_snowflakes.uf2 [114 kB], které je vidět na fotce níže. Vyzkoušel jsem všechny dema a zobrazení bylo v pořádku, až na 1 demo vista-palette, které mi negenerovalo žádný obraz.
PicoDVI top PicoDVI bottom Christmas snowflakes Pico-ZXspectrum
Povedlo se mi též zkompilovat emulátor Pico-ZXspectrum, který využívá knihovnu PicoDVI. Pro jeho kompilaci je třeba navíc stáhnout balíčky (nejlépe přes GIT dle popisu v odstavci Build) no-OS-FatFS-SD-SPI-RPi-Pico, pico-dvi-menu, pico-emu-utils a upravenou knihovnu TinyUSB, kterou nahradíme starší verzi v PicoSDK (nezapomenout na git checkout hid_micro_parser). Konfigurace pinů pro HDMI výstup se použije dle konfigurační proměnné DVI_DEFAULT_SERIAL_CONFIG z nadřazeného CMakeLists.txt z PicoDVI knihovny, pak už jen stačí přeložit make -i zxspectrum. Emulátor podporuje funkci USB host a lze ho ovládat USB HID zařízeními (klávesnice a joysticky), které lze připojit i přes USB hub. Zatím ale nemám připájený konektor pro microSD kartu.
30.6.2022 Raspberry Pi Foundation představilo novou verzi Raspberry Pi Pico W za 6$, která ke stávajícímu MCU RP2040 přidává WiFi modul založený na čipu Infineon CYW43439. Ten podporuje též Bluetooth 5.2, ale tato funkcionalita zatím není na Pico W k dispozici (v budoucnu možná bude). Softwarová podpora založená na síťovém stacku lwIP je zahrnutá v Pico SDK. Rozměrově a pinově je nové Pico kompatabilní s předchozí verzí.
12.1.2023 Raspberry Pi Pico lze také použít jako levný logický analyzátor s 21 digitálními kanály s vzorkováním do 120 MHz a 3 analogovými kanály s vzorkováním do 500 KHz. Viz též diplomová práce z ČVUT: Vít Vaněček - Logický analyzátor s Raspberry Pi Pico. Zásadní omezení je úzké hrdlo v podobě pomalého USB, nicméně kratší záznamy se vejdou do interní RAM (lze samplovat rychle na limitu přenosu GPIO-DMA) a u signálů s málo změnami v čase může pomoci RLE komprese. Uživatel Pico-coder na svém GitHubu dal k dispozici OpenSource firmware pro Pico včetně zkompilovaného UF2 souboru, napsal driver do knihovny libsigrok (zatím se nedostal do oficiální větve), kterou využívá populární aplikace PulseView - zde je třeba použít speciální build se zakompilovaným driverem (může vyžadovat knihovnu mscvr100.dll, pokud ji už nemáte v systému). Firmware Pica komunikuje s libsigrok přes virtuální sériový port (CDC). Po připojení se objeví jako USB zařízení s VID, PID: 2E8A:000A:00 - Board CDC (Interface 0) a je pro něj třeba nainstalovat INF soubor zmíněný výše. Číslo sériového portu zjistíme ve Správci zařízení a v PulseView v menu "Connect to Device" vybereme driver "raspberrypi-pico" a příslušný Serial Port (bitovou rychlost není třeba u CDC zadávat). Pozor na to, že GPIO na Pico jsou nechráněné a snadno by se mohly odprásknout větším napětím než 3,3 V, takže doporučuji přidat alespoň nějaké sériové odpory pár set ohmů.
9.2.2023 Raspberry Pi Pico bylo použito jako základ OpenHW/FW emulátoru PicoGUS historické zvukové karty Gravis Ultrasound (podporuje též AdLib/OPL2 a MPU-401 MIDI v provedení 8-bitové ISA karty). Zatím není zdaleka 100% kompatabilní, ale s novějším FW se to postupně zlepšuje, viz compatibility list. Nová verze firmware 1.2.0 přidává podporu emulace Sound Blaster 2.0.
11.2.2024 Další využití Raspberry Pi Pico jako experimentální analyzátor LPC sběrnice přináší projekt Pico TPMSniffer. Využívá k tomu rychlé PIO (modul lpc_sniffer.pio), výstup je na sériový port.
Raspberry Pi Pico 2
8.8.2024 představila organizace Raspberry Pi Foundation novou verzi destičky Raspberry Pi Pico 2 s novým MCU RP2350. Jeho největší zajímavostí je, že obsahuje 2 páry jader různých architektur a instrukčních sad: ARM Cortex-M33 a RISC-V Hazard3. Nejde však o 4-jádro, lze si to představit tak, že vnitřně jsou k dispozici 2 CPU "sockety" a každý může mít nezávisle připojeno buď jádro ARM nebo RISC-V podle nastavení konfiguračních registrů, přičemž druhé neaktivní jádro je drženo v resetu a s vypnutými hodinami. Hodnoty těchto konfiguračních registrů se čtou pouze při resetu MCU (ten lze vyvolat i programově přes watchdog). ROMkový bootloader je schopen podle familyID v UF2 image sám poznat, pro kterou architekturu je nahraný kód ve FlashROM a podle toho aktivuje příslušná jádra. Též je možné zápisem do OTP paměti trvale vypnout RISC-V jádra, zřejmě z bezpečnostního důvodu, že bootloader pro RISC-V neimplementuje Secure Boot. RP2350 přinesl nejlevnější způsob, jak si platformu RISC-V osahat.
Mezi další novinky a vylepšení patří zvýšení frekvence jader na 150 MHz, zvětšení interní SRAM na 520 kB, externí FlashROM by měla být 4MB QSPI, rozšíření na 12 jednotek PIO, přibyl rychlý serializér HSTX s HW TMDS enkodérem (podpora DVI / HDMI), SHA-256 akcelerátor, ARM TrustZone, bylo vylepšeno DMA a další. USB periferie zůstává u verze 1.1. Zde jsou postřehy uživatele Dmitry.GR, který měl možnost během vývoje nový MCU rok testovat. Uživatel Wren6991 už portoval na RP2350 svůj projekt PicoDVI (libdvi) s využitím nového TMDS enkodéru a též ve verzi pro RISC-V. U nás je už nové Pico 2 k dostání na RPishopu za 135 Kč, což je pořád dosti lidová cena.