soodan sivut

arkisto

237 kirjotelmaa.

avainsanat

ELL-i järkkäsi äskettäin Bare Metal Hackathonin ARM Cortex-M-mikrokontrollerivehkeisiin tutustumiseen. Menin toki mukaan, koska rauta on paras ja sularijutut; kuka jotain käyttöjärjestelmää muka tarvitsee. Motivaattorina koodaamaan oli tarjolla Saleaen uusimpia vasta markkinoille tulossa olevia logiikka-analysaattoreita, mutta itse menin lähinnä pitämään hauskaa (satuin kuitenkin voittamaan ykköspalkinnon); päädyin koodaamaan softasynan erään vanhan toisen projektin pohjalta. Tämä dokumentti dokumentoi noiden kahden vuorokauden aikaansaannokset; softa saattaa evolvata jälkeenpäin toisenlaiseksi.

Hackathon

Paikalla jaettiin devauslautoja, erinäisiä tutoriaaleja/esityksiä perusasioista joista useimmat skippasin, sekä sponssattua ruokaa. Ell-i itse hoitaa internet of things -juttuja ja tapahtuman teemaksi mainostettiin smart spaces and entry-level smart energy gadgets -koodaamista, mutta harvat projekteista osuivat loppujen lopuksi täsmälleen tähän. Kokoonnuttiin noin viiden hengen radiokerho/elepaja-porukalla vääntämään ja valikoitiin testailuksi erilaisia lautoja.

Tarjolla oli muutamaa erilaista devauslautaa, joista valkkasin ST:n STM32F4Discoveryn siksi, että olin aiemmin kuullut siitä eniten suhteessa muihin (mm. Atmel SAMD20 Xplained, NXP LPCXpresso) ja tiesin että sen kai voi ainakin jotenkin saada toimimaan Linuxissa. Koska häkkäystä oli vajaan kahden vuorokauden ajaksi, nopeasti pystytettävä devausympäristö oli plussaa. Ei se silti ihan helppoa ollutkaan.

ST (ja ~kaikki muutkin arm-chippivalmistajat) tuntuvat olettavan, että jos jollain on varaa ostaa tuotteitaan, niin samoin kykenee hankkimaan jonkun proprietaryn Windows-only IDEn. Komentorivi ja GNU-työkaluthan on jotain ihan antiikkista, vai?

Käännösympäristö

Otin ARMin ylläpitämän GNU-toolchainin kääntämiseen (vaihtoehtoina esim. codesourcery) ja githubista texanen stlinkin joilla saa käännettyä ja flashattua tuolle Discoverylle softaa sekä debugattua livenä. Toinen vaihtoehto flashaukseen olisi tuo ehkä tunnetumpi openocd, mutta satuin törmäämään stlinkiin ensin. Tuo on tosiaan hämäävästi samanniminen kuin tuo devauslaudalla oleva stlink-hardisprogrammeripulikka.

Käännetty softa menee linkkerille, joka veivaa koodit ja datat sopiviin muistialueisiin linkkeriskriptin ohjeistamana, ja tämä kaikki sit stripataan binääriksi joka ladataan armille sopivaan osoitteeseen ja se on menoa sit. Stlinkin mukana tulee ihan järkevät ohjeet sen käyttämiseen ja gdb-integraatioon: flashaus muotoa st-flash write softa.bin 0x8000000 ja debuggaus gdb:ssä target extended-remote :4242.

Discoveryn käyttämiseksi löytyy myös vanhoja ja vanhempia ohjeita mistä moniin ei kehdannut luottaa. Suurin osa esimerkeistä näyttää aika hirveältä ja puhuu kaikenlaisista vanhentuneista asioista sitä sun tätä turhaa.

Sitten tietty löytyy myös ST:n uudemmalle Nucleo-laudalle mbed-settiä josta voisi yrittää irroittaa tarpeellisen osan, mutta mbed on myös aika syöpää.

Helloworld?

Okei, laudalla on valmiina paketista purettaessa esimerkki joka välkyttää ledejä; miten sitten teen oman alusta loppuun? Baremetal-tyyliin laitteiden alustus hoituu touhuamalla taikatemppuja taikarekistereiden kanssa, mihin löytyi enemmän kuin tarpeeksi esimerkkikoodia. Sopivan setupin löytäminen olikin aikamoisessa suossa uiskentelua.

ST tarjoaa erinäisiä paketteja hal-/firmiskirjastoksi helpottamaan taikarekistereille puhumista ja raudan alustamista ja käyttöä: STM32CubeF4, Discovery-paketti, DSP+standardperipheral-paketti. Kaksi jälkimmäistä ovat ST:n mukaan nykyään osana tuota Cubea ja deprekoitu, mutta niissä silti on jotain mitä Cubessa ei (mm. erilaisia esimerkkejä). Ota nyt sit tästä selvää? Tietenkään noissa ei ollut minkäänlaisia makefilejä eikä järkevää käyttöohjetta vaan tosiaan oletetaan joku muu IDE.

"Onneksi" netti on täynnä huonoja ja huonompia yrityksiä käyttää softaa Linuxilla, joista saa kahlata jonkun toimivan. Noista ST:n omista tai vastaavasta on myös monia makefiletettyjä yritelmiä githubissa ja muualla. Audiostakin on pienehkö esimerkki mutta siitä puuttuu mm. kääntöohjeet. Etsin vain minimaalista makefileä ja pointteria sopivaan linkkeriskriptiin ja ehkä jotain jopa järkevää firmistä/kirjastoa raudan käyttämiseen ettei tarvitsisi toistaa 1800-sivuisen referencemanualin rekisterialustussadetansseja. (Osoittautui, että on se ST:n firmikselläkin aika temppuilua.) Eclipseä en aio hyväksyä, vaikka sille on jotain ohjeita.

Toinen mahis jota koitettiin ST:n virallisen firmispaskeen ja siihen pohjautuvien stripattujen asioiden lisäksi oli libopencm3 esimerkkeineen mutta jätettiin sikseen, sillä senkin koodi on aika karseaa ja implementaatio on puutteellinen ja dokumentaatio epäsynkassa. Hooray for open source jne?

Sopiva pohjakoodi

Pikaisella hakemisella helpoiten toimiva setti josta pääsi eteenpäin oli eräs MP3-soitin (ja saman devaajan usbhost-tuellinen usbitikulta lukeva); toimi about ihan suoraan ja sain musiikkia laudan kuulokeliitännästä ulos tietämättä vielä, miten se toimii.

Tämä projekti on tiedostorakenteeltaan pitkälti samanlainen kuin ST:n esimerkit; mukana on lisäksi toimiva makefile, aww yiss:

Itse mp3-soitinprojektin omakeksimää hauskaa on mm. usartin defaulttialustus niin, että stdout menee kätsysti usarttiin, sekä muutamat stubifunktiot syscalleista sitä tukemaan. Mukana oleva Audio.c joka setuppaa Discoveryllä olevan Cirrus Logicin CS43L22-kuulokevahvaimen päälle ja armin DMA-enginen syöttämään sille I2S:llä dataa jota täyttää tuplabufferoidusti keskeytyksellä löytyy muutamasta muustakin paikasta.

Tähän on sikäli helppoa pultata lisätavaraa pohjalle, että rakenne on sama kuin ST:n esimerkeissä. Hackathon-tyylin mukaista copypastea esimerkeistä ja sopivien rivien muokkaus omaan tarpeeseen ja sit poistetaan turhat kunnes ei enää toimi ja otetaan vähän takapakkia, juhuu.

Baremetal-koodin toiminta

Sitten päästään siihen varsinaiseen softaan. Mitä tapahtuu kun vehje boottaa:

Ja yhden subsystemin alustaminen tarkoittaa sitä, että pitää muistaa nuo gpio:t, subsystemin enablointi, sen parametrien konffaus ja mm. sen kellon alustus.

Kun rauta on kunnossa, niin päästään ns. mainlooppiin.

Audio pyörii tosiaan DMA:lla, joka vaatii suht vähän alustusta ja pyörittää SPI-raudalle lisää sampleja DACille annettavaksi. Keskeytys huutelee, että nyt tarvittaisiin lisää dataa, ja synaengine täyttää seuraavan bufferin.

Nappia ja ADC:tä (potikoita) pollataan tylsästi, koska sillä ei ole väliä eikä ehtinyt debugata ADC:n DMA:ta toimimaan. Potikoilla säädetään synan muutaman instrumentin parametreja siksi, että realtimenä säätäminen on hauskaa. Kiihtyvyysanturi säätää mastervolumea. Nappi togglaa äänekkäämmän tai hiljaisemman moodin itse audiopiirille.

Usartilla eli sarjaportilla on keskeytyshandleri, joka kuuntelee vastaanotettuja tavuja pc:n puolelta. Ei se muuta tee kuin ajaa synan nuotti päälle ja pois -käskyjä. Protokollassa on kaksi eri moodia, toinen näppistestailuun ja toinen binäärimmälle datalle.

Lisäksi löytyy naurettavan yksinkertainen sekvensseri, joka nauhoittaa kvantisoiduissa aikasloteissa nuottieventit ja soittaa ne uusiksi loopilla. Sekvensseri menee näppisinputtimoodissa päälle ja pois välilyönnistä.

Audiopiirihän on tuollainen Cirrus Logicin CS43L22, eli DAC kaikenlaisella mukavalla kuten kuulokevahvistimella. Piirin komennot menevät I2C-väylässä ja audiodata I2S:ssä.

Itse synan rakenne

Varsinainen softasynaengine on suht perinteinen destruktiivinen äänisynteesi polyfonisena, ja sen koodi on suunnilleen portattu eräästä DSP-kurssin harkkatyöstä, jossa koodasin veljen kanssa softasynan assylla Freescalen DSP:lle pohjautuvaan Chameleon-nimiseen räkkilaitteeseen. Syna toimii instrumenteilla, joista soi jokin määrä päällä olevia nuotteja eri kanavissa (ts. voiceissa) samaan aikaan. Kun nuotti päälle tällä instrumentilla -eventti tulee, allokoidaan uusi kanava soittamaan ko. nuottia ko. instrumentilla. Nuotti pois -eventti kytkee äänen hiljenemään, ja se menee pois päältä kun on hiljentynyt nollille.

Syna toimii sisäisesti instrumenteilla, kanavilla, oskillaattoreilla, filttereillä ja ADSR:illä. Koko synth.c:ssä on koodia vajaat 600 riviä, ja se tosiaan on häksitty kasaan about vuorokaudessa. Kukin instrumentti sisältää initfunktion, oskillaattorifunktion, filtterifunktion ja erinäisiä taikalukuja, jotka säätävät mm. filtterin parametreja (esim. lowpassin cutofftaajuus). Oskillaattorin ulostulo menee filtterille, filtterin ulostulo kerrotaan ASDR-envelopella. Kullakin kanavalla on sisäinen tila oskulle, filtterille ja adsr:lle, mutta instrumenttien kertoimet jaetaan jokaisen kanavan kesken jossa kyseinen instrumentti soi.

Alkuperäinen koodi sisälsi massiivisen määrän kommentteja ja sen mukana tuli harkkatyön suunnitelma ja loppuraportti, ja siitä sitten sai juuri ja juuri selvää. Tämä c-koodi on ns. itsedokumentoivaa.

Oskillaattoreissa on muutamia temppuja, joilla niistä saadaan pois ikäviä harmonisia, jotka johtuvat ideaalisen kolmio- ja kanttikäppyrän terävistä reunoista. Noin teräviä reunoja ei oikeasti pysty saavuttamaan tällä (eikä millään) sampleratella, joten käppyröitä pyöristetään vähäsen. Kolmioaalto lasketaan kahden erillisen triviaalin kolmioaallon samplen neliöiden erotuksesta (differentiated parabolic waveform, kuten Välimäki ja Huovilainen kutsuvat sitä). Kantti on kahden vaihe-erollisen kolmioaallon erotus.

Devauslaudan kontrollerissa (STM32F407) on mm. hardisfloatit, ja syna käyttääkin floatteja eikä esim. fixedpointteja. Tuli vähän likainen olo käyttää jotain niinkin bloattia kuin floattilaskuja noin "pienellä" laitteella.

PC-puolen midi

Purkkaa, purkkaa.

Simppelein tapa on syöttää /dev/ttyUSB0:sta laitteelle näppikseltä keyup- ja keydown-eventtejä. Toinen tapa on reitittää midilaite samaiseen sarjaporttiin. Kolmas tapa on dumpata .mid-tiedoston nuotit sinne. Näppismoodi ja nuo muut eroavat siten, että softa tarvitsee yhen #ifdef-muutoksen usartin irqhandleriin ja pitää kääntää uusiksi.

Nappimoodi vaihtaa instrumenttia numerolla, laittaa nuotin päälle isolla kirjaimella ja pois pienellä. A vastaa midinuottia 42, B nuottia 43 ja niin edespäin.

Midimoodiin on miditiedostondumppaussofta, joka ei toistaiseksi osaa kuin yhden tiedoston johon olen törmännyt, jolla sitä testasin silloin vuosia sitten kun devasin jonkun muun laitteen kanssa. Dumpperiin on purkattu mukaan tuo sarjaporttiprotokolla. Tästä kirjoittanen myöhemmin lisää.

Hackathonissa lainasin kaverilta usb-midikeyboardia, joka tuottaa ihan normaaleja midieventtejä. Purkkasin sen käyttöön niin, että yhdistin sen qjackctl:lla klikkailemalla pythonpätkään (rec.py), joka kuuntelee midieventtejä ja dumppaa sopivat sarjaporttiin.

Jatkossa

Tuli tutustuttua noihin armisiruihin ja tehtyä suht hyvin toimiva pikatunkkaussoftasyntikka; järjestelmä kokonaisuutena on aika kasa purkkaa, mutta jatkokehitettävissä. Tuo tukee niin montaa yhtäaikaista soitinta kun vaan konffaa ja rauta ehtii laskea; jos tosissaan tekisi, niin täytyis etsiä pullonkaulat. Koodissa on mukana gpio-vemputteluja aikojen mittaamiseksi skoopilla, mutta mitään kummempaa analyysiä en sitten tehnytkään. Mitään jälkiefektejä (esim. viiveitä tai vääristymiä) ei vielä löydy, mutta sellaisten lisääminen olisi simppeliä.

Chibios on kuulemma oikein jepa tuolla discoverylaudalla, ja hyvältä näyttääkin kun näin jälkikäteen tutustuu. Olisi voinut löytää/tajuta tuon vaikka hackathonin alussa niin olisi helpottanut tunkkausta, mutta tulipa baremetalloitua oikein kunnolla ja opittua vähän enemmän. Seuraaviin tämän alustan projekteihin voisi harkita tuota.

Hackathon-koodattu syna sisältää kaikenlaista hackia, ja siitä myös puuttuu sitä sun tätä. Jos nappokerrointa riittää, niin täytyy touhuta tuosta oikeasti käytettävä versio ja ehkä hankkia jostain midiä tai usbia puhuva koskettimisto ja koodata tuki sille niin, että saa pc:n pois yhtälöstä (discoveryn piiri osaa mm. usb-hostin). En toisaalta ymmärrä musiikista tippaakaan, mutta kai tuo kannattaisi opetella ihan uuden oppimisen vuoksi. Myös pc-puolen softia tarttisi jatkokehittää, etenkin tuo miditiedostoparseri tarvitsisi rakkautta.

Koodia on githubissa ja partyversiosta on oma tagi.

0 kommenttia

Oma kommenttisi

Mielipide tämän sivun asiasta? Kirjoita toki. Älä raapusta kuitenkaan ihan asiattomia juttuja.

Jos on yksityisempää asiaa, tarkkaa kysyttävää tai aihetta pidemmälle keskustelulle, käytä yhteydenottolomaketta kommentoinnin sijaan.

Hölmöt kommentit saatetaan moderoida pois jälkikäteen.

Nimimerkki:

Spammibottiesto: Mikä on kahden ja kuuden summa? (vastaus numeroina)