Avtor: dr. Simon Vavpotič
2019_277_41
ARMove 32-bitne mikroarhitekture prinašajo v svet mikrokontrolerjev veliko zmogljivost in nešteto novih možnosti uporabe. Kaj so pametni mikrokontrolerji, kaj zmorejo in kako jih uporabljamo?
Nemalokrat se sprašujemo, zakaj lahko pametni telefoni, ki so pogosto manjši od prenekatere mikrokontrolerske preizkusne ploščice, poganjajo sodobne operacijske sisteme in izvajajo skoraj toliko procesov in aplikacij kot klasični namizni računalniki, povprečen 8-bitni ali 32-bitni mikrokontroler pa po zmogljivosti še vedno primerjamo s hišnimi računalniki s konca osemdesetih in začetka devetdesetih let preteklega stoletja. Odgovor na to vprašanje dajejo ARM procesorska jedra, katerih dizajn je mogoče licencirati in ga vgraditi v lastne dizajne procesorskih ali mikrokontrolerskih čipov, s katerimi se da na eni silicijevi rezini združiti vrhunsko periferijo in (sorazmerno) velike pomnilnike z zmogljivim procesorskim RISC jedrom (ali jedri), kakršna so uporabljena tudi v pametnih telefonih. V prejšnjem delu članka smo se lotili podrobnejšega raziskovanja ATSAMV71 Xplained Ultra razvojne plošče, ki na eni tiskanini združuje, ne samo SAMV71 mikrokontroler, temveč veliko zunanjih perifernih enot, s katerimi lahko dobro preverimo svoje dizajne svoje vgrajene programske opreme. Natančno smo analizirali napajalni del, krmilili vhodno-izhodne priključke, povezali SAMV71 mikrokontroler preko PC terminalskega okna in uporabili uro realnega časa.
Ta vsebina je samo za naročnike
ATSAMV71 Xplained Ultra razvojna plošča in ASF programska knjižnica programerju omogočata lahek dostop do funkcionalnosti mikrokontrolerja in vgrajene periferije. Tokrat bomo spoznali, da lahko ATSAMV71 deluje tudi kot pogon za masovno hrambo podatkov (MSD, angl. massive storage device) pri čemer bomo za razhroščevanje uporabili terminal preko navideznih COM vrat, ki jih bomo vzpostavili s pomočjo CDC gonilnika in programatorja na ATSAMV71 Xplained Ultra razvojni plošči.
Pogoni za masovno hrambo podatkov
Ker smo Microchip ASF predstavili že v preteklem nadaljevanju, povejmo le, da se lahko celovite gradnje MSD naučimo iz primera USB Device MSC Example, ki je zasnovan tako, da osnovna različica podpira le en MSD LUN (angl. massive storage device logical unit number), podprt v neizrabljenem delu RAMa SAMV71, vendar omogoča enostavno dodajanje LUNov. Povejmo še, da LUN v svetu velikih diskovnih sistemov pomeni ne samo številko logične enote, temveč tudi logični podatkovni pogon, iz katerega lahko beremo ali nanj zapisujemo datoteke ter tvorimo hierarhijo datotečnih map. Programska implementacija LUN temelji na C++ovskem razredu MSC (angl. massive storage class). Z ustrezno predelavo primera USB Device MSC Example lahko kot MSD LUNe na PCju predstavimo prav vse sicer neizrabljene dele pomnilnikov ATSAMV71 Xplained Ultra razvojne plošče.
Ker je lahko razvojna plošča uporabna tudi kot priročni bralnik SD/MMC kartic za namizni PC, ki nima ustrezne vtičnice, bomo najprej dodali podporo za predstavitev SD/MMC kartice, ki jo vtaknemo v SD/MMC vtičnico ATSAMV71 Xplained Ultra razvojne plošče, kot dodatnega MSD LUNa.
Najprej dodamo ustrezne programske knjižnice, nato pa v programski kodi spremenimo nastavitve konstant za Atmel Studio GNU C++ prevajalnik. Opcije za gradnjo MSD LUNov si lahko ogledamo v datoteki conf_access.h, ki je v Solution Exploerju v mapi src/config. Progam 1 prikazuje del programske kode, v katerem lahko izberemo katere pomnilnike ATSAMV71 Xplained Ultra razvojne plošče bomo PC predstavili kot ločene LUNe, glej program 1.
Čeprav se nepoučenemu programerju zdi, da nov LUN dodamo tako, da ustrezen DISABLE spremenimo v ENABLE in ponovno prevedemo programsko kodo, to še zdaleč ni dovolj. Z ASF Wizardom moramo za novi LUN v programsko kodo vgraditi tudi dodatne programske knjižnice; v našem primeru za podporo delovanju kartic SD/MMC.
Najprej v Atmel Studiu poiščemo ASF meni, nato pa v njem izberemo ASF Wizard opcijo. V naslednjem koraku moramo dobro premisliti, katere dodatne programske knjižnice dejansko potrebujemo in kako jih moramo nastaviti za pravilno delovanje. Pri tem si lahko izdatno pomagamo tudi z drugimi ASF primeri. Tokrat pride prav SD/MMC/SDIO Card FatFs Example, v katerem sta High Speed Multimedia Card Interface (HSMCI) gonilnik in komponenta SD/MMC sklad že nameščena. Opazimo, da ima komponenta SD/MMC sklad izbrano nastavitev MCI, ki zagotavlja povezavo s HSMCI vmesnikom. Zato moramo z ASF Wizardom v USB Device MSC Example najprej dodati gonilnik HSMCI, nato pa še SD/MMC sklad, pri katerem izberemo opcijo MCI.
V naslednjem koraku dopolnimo konfiguracijo ATSAMV71 Xplained Ultra razvojne plošče, ki jo najdemo v datoteki conf_board.h v projektnem imeniku src/config. Spremembe nastavitev so v programu 2 označene z rdečo. Omogočiti moramo tudi samodejno izvedbo nastavitev HSMCI (za razvojno ploščo) vmesnika ter nastavitve ustreznega kanala a XDMAC krmilnik za podporo delovanju HSMCI. Dodatno omogočimo tudi nastavitev in zagon XDMAC krmilnika zunanjih dinamičnih pomnilnikov, ki ga bomo potrebovali v nadaljevanju za razširitev zmogljivosti prvotnega pomnilniškega MSD., glej program 2.
Naslednji korak je prevajanje programske kode in njen zagon v SAMV71, ki mora tokrat v vlogi MSD podpreti dva LUNa, ki jih v operacijskem sistemu PCja vidimo kot dodatna podatkovna pogona. Pomnilniški LUN je velikosti 24 kB, medtem kot je SD/MMC LUN velikosti SD/MMC kartice, ki jo vstavimo v MCI vtičnico na ATSAMV71 Xplained Ultra razvojni plošči.
Zdaj lahko namesto SAMV71 RAMa uporabimo 2 MB velik SDRAM na ATSAMV71 Xplained Ultra razvojni plošči, kar omogoča bistveno večji MSD LUN, hkrati pa uporabljamo mikrokontrolerjev RAM za druge namene. A predpogoj je, da SDRAM prej zagotovimo pravilno osveževanje, za katerega poskrbimo z ustrezno nastavitvijo SAMV71 SDRAM kontrolerja za zunanje pomnilnike (SAM V71 SDRAMC). Nastavitve lahko prekopiramo iz primera SDRAM Example for Micron IS42S16100E v datoteki srcASFsamcomponentsmemorysdramis42s16100eis42s16100e.h. Od tu moramo v datoteko main.c prekopirati še podatkovno strukturo const sdramc_memory_dev_t SDRAM_ISSI_IS42S16100E, v kateri sta opis, dostopni časi in časi osveževanja omenjenega pomnilniškega čipa. SDRAMC tako ob zagonu SAMV71 dobi vse podatke za izvajanje osveževanja. Obenem moramo v glavno programsko zanko (main) dodati še inicializacijska stavka: sdramc_init((sdramc_memory_dev_t *)&SDRAM_ISSI_IS42S16100E,sysclk_get_cpu_hz()); in sdram_enable_unaligned_support();. Z ASF Wizardom dodamo še SAM SDRAMC gonilnik, vendar ne tudi SDRAMDAC configutation for IS42S16100E komponente, saj v nasprotnem programske kode zaradi večkratnega pojavljanja IS42S16100E definicije ne bomo mogli prevesti.
Uporaba SDRAM je za programerja enostavna, saj je dostopen preko zaporednih pomnilniških naslovov, od naslova BOARD_SDRAM_ADDR(0x70000000) naprej. Za njegovo predstavitev kot MSD LUN zadošča že, da v datoteko srcconfigconf_virtual_mem.h pred #endif dodamo definiciji: #define VMEM_NB_SECTOR 4000 in #define VMEM_ADDRESS BOARD_SDRAM_ADDR. Tako začetni naslov navideznega pomnilnika nastavimo na začetni naslov zunanjega SDRAM. Obenem 100-krat povečamo tudi število MSD sektorjev (iz 40 na 4000), tako da ima MSD po formatiranju namesto le 4 kB kar 1,92 MB uporabnega pomnilnika. Pri tem SAMV71 ohrani ves svoj notranji pomnilnik.
Kot pomnilniški medij za gradnjo MSD bi lahko uporabimo tudi trajni programski pomnilnik SAMV71 (2 MB velik vgrajeni Flash RAM) ali na razvojno ploščo vgrajeni 2 MB EEPROM s 4-bitnim zaporednim dostopom (QSPI, angl. quad SPI). Vendar moramo v ta namen, poleg dodajanja ustreznih ASF programskih knjižnic, sami pripraviti podporo za povezavo izbranega pomnilnika s programsko logiko za podporo delovanju MSD LUNov preko USB vmesnika.
Podpora delovanju MSD
Nekoliko podrobnejši pregled programske kode za vzpostavitev MSD razkrije programske funkcije, ki jih moramo implementirati, da bi tovrstni podatkovni pogon lahko deloval. Naslovi funkcij so zapisani v strukturi LUN opisnika (angl. logical unit number descriptor) posameznega MSD, glej program 3.
Način implementacije in delovanje LUN funkcij najlažje razberemo iz pomnilniško podprtega MSD LUN (VIRTUAL_MEM), ki kot pomnilni medij uporablja navidezni pomnilnik, sestavljen iz enega ali več kosov pomnilnikov, do katerih lahko dostopa SAMV71 mikrokontroler. Pri tem moramo od množice LUN funkcij, ki so konceptualno dobro znane poznavalcem jeder operacijskih sistemov (npr. Atari TOS, OS/2, Unix, Linux, Windows,…): Unit Ready, Read Capacity, Unload, Write Protect, Removal, USB Read, USB Write, Memory to RAM in RAM to Memory, obvezno implementirati le tiste za branje in pisanje podatkov, druge glede na naše potrebe. Denimo, pri MSD LUN, ki ne uporabljajo predpomnjenja datotek (npr. pri MSD LUN v navideznem pomnilniku), ni potrebno podpreti funkcije Unload, ki omogoča takojšnjo izpraznitev vsebine predpomnilnikov in zapis njihove vsebine na MSD LUN podatkovni medij. Opozorimo še na to, da so omenjena poimenovanja funkcij splošna, saj mora imeti vsak LUN lastno implementacijo vsake izmed njih, ki se nekoliko razlikuje od implementacije za druge LUNe. Zanimivo je, da so avtorji primera USB Device MSC Example že upoštevali tudi možnost druge vtičnice za SD/MMC kartice, zato so razvili dva nabora funkcij, ki se razlikujeta po številkah 0 in 1 na koncu imena funkcije. Tako lahko sorazmerno enostavno vzpostavimo tudi LUN za drugo SD/MMC kartico.
Poglejmo konceptualno delovanje funkcij za podporo delovanju MSD LUNov. Podrobnosti in primere implementacij lahko najdete v ASF primerih: Unit Ready funkcija vrne eno izmed mogočih MSD LUN stanj: CTRL_GOOD (v redu, pripravljen za sprejem ukazov), CTRL_NO_PRESENT (ni prisoten, npr. SD kartica ni vstavljena v SD/MMC vrata), CTRL_BUSY (LUN še ni pripravljen za uporabo) in CTRL_FAIL (prišlo je do napake). Stanje mora ustrezati dejanskemu stanju strojne opreme.
Read Capacity funkcija vrne kapaciteto MSD LUN. Njena implementacije je pri MSD LUNih v pomnilniku, ki imajo konstantno velikost, enostavna, saj vrača le vrednost konstante, ki določa velikost LUN v sektorjih minus 1, oziroma vrednost 7, če je LUN manjši od 8 sektorjev. Velikost sektorja je določena v datoteki virtual_mem.h s konstanto VMEM_SECTOR_SIZE, ki ima prednastavljeno vrednost 512 bajtov, po potrebi pa jo lahko tudi spremenimo.
Unload funkcijo smo že omenili. Implementirati jo moramo skladno s strojno opremo, tako da njen klic dejansko proži izpraznitev predpomnilnikov na podatkovni medij MSD LUNa.
Write Protect funkcija omogoča implementacijo strojne zaščite pred pisanjem. Implementiramo jo tako, da vrača vrednost tipala, ki zaznava zaščitenost podatkovnega medija (npr. SD/MMC kartice). 0 (false) pomeni, da je medij nezaščiten, -1 (true) pa da je zaščiten pred pisanjem.
Removal funkcija pove, ali je MSD LUN podatkovni medij mogoče odstraniti. Na primer, če je medij pomnilnik, vedno vrne vrednost 0 (false), če pa je medij SD/MMC kartica pa vedno vrednost -1 (true).
USB Read in USB Write funkciji moramo obvezno podpreti, saj skrbita za prenos enega ali več podatkovnih sektorjev med MSD LUN pomnilnim medijem in PC preko USB vmesnika. Obe funkciji sta v ASF programski knjižnici podprti z dvosmerno funkcijo virtual_usb_trans(uint32_t addr, uint16_t nb_sector,bool b_read), ki prenaša podatke med RAMom in USB enoto s pomočjo DMA krmilnika, XDMAC. Pri tem uporablja podporni funkciji hugemem_read_block in hugemem_write_block, ki neposredno prožita XDMAC prenose. USB Read in USB Write funkciji vračata enake odgovore kot Unit Ready funkcija. Odgovori imajo tudi enak pomen.
Memory to RAM in RAM to Memory funkcija sta namenjeni podatkovnim prenosom posamičnih sektorjev med pomnilnim medijem MSD LUNa in SAMV71 RAMom ali drugim (S)(D)RAM pomnilnikom na razvojni plošči. Memory to RAM in RAM to Memory funkciji vračata enake odgovore kot Unit Ready funkcija. Odgovori imajo tudi enak pomen.
Dodatni LUN in razvoj funkcij zanj
Čeprav razvoj lastnih funkcij ni ravno enostaven in jih je treba pred produkcijsko uporabo dobro preizkusiti, se lahko lotimo preprostejšega primera, tako da podvojimo LUN funkcije za delo s pomnilniškimi mediji. Na ta način lahko hkrati vzpostavimo MSD LUNa s pomnilniškima medijema SDRAM in RAM. Vendar moramo pri tem paziti, da podvojimo tudi ustrezne pomnilniške podatkovne strukture, saj v nasprotnem LUNa ne bosta delovala pravilno, ko bo PC izpraznil svoje bralne izravnalnike zanju. Slednje se zgodi, če denimo odklopimo kabel USB in ga ponovno priklopimo. To je tudi sicer način za testiranje pravilnosti delovanja MSD. Vseeno pri testiranju ne smemo pozabiti, da LUNi v RAM ne morejo obstati, če istočasno ne ohranimo napajanja ATSAMV71 Xplained Ultra razvojne plošče. K sreči se ta lahko napaja iz obeh USB priključkov in še dodatnega napajalnega konektorja.
Poglejmo, katere datoteke moramo spremeniti, da ustvarimo podporo za dodatni pomnilniški LUN. Definicija navideznopomnilniških LUNov je v datotekah virtual_mem.h, virtual_mem.c, conf_virtual_mem.h in conf_access.h. Ker podvajamo funkcionalnosti pomnilniškega LUN, lahko datoteki virtual_mem.h in virtual_mem.c le dopolnimo, sicer pa bi bilo pravilneje izdelati nov par datotek, namenjen podpori izključni enega tipa podatkovnega medija za gradnjo LUN. Več kot očitno je tudi, da pri Atmelu niso kaj dosti razmišljali o tem, da bil lahko gradnjo LUN podprli z objektnim programiranjem, saj bi bila tako mogoča gradnja podobnih LUNov brez podvajanja in malenkostnega spreminjanja programskih struktur in programske kode. Kakorkoli, v omenjeni programski datoteki sem za podporo delovanju dodatnega pomnilniškega LUN (LUN_3) izdelal še funkcije, prikazane v programu 4, glej program 4.
Kot vidimo, je večji del LUN_3 opisnika spremenjen in kaže na nove funkcije. Vseeno sem lahko tri manj pomembne funkcije ohranil, saj načeloma lahko veljajo za vse (S)(D)RAM pomnilnike hkrati. Je pa tudi res, da bi lahko, denimo s podvojeno funkcijo virtual_wr_protect, ločeno zaščitili pisalni dostop do različnih pomnilnikov. Ker pa te funkcionalnosti ne uporabljamo pri nobenem od pogonov, lahko pri obeh pustimo enako funkcijo. Pomembna funkcija je tudi virtual_read_capacity_2, ki vrne kapaciteto MSD LUN_3 pomnilnega medija, ki vsekakor ni nujno enaka MSD LUN_0 kapaciteti.
Od drugih sprememb velja poudariti potrebo po dodatnem vmesnem pomnilniškem polju, vmem_data2, ki ga moramo pravilno dodati, tako da GNU C/C++ prevajalnik pravilno prevede programsko kodo pri vsakršnih robnih pogojih. Najlažje je, če celotno definicijo, skupaj s stavki za pogojno prevajanje programske kode, ki se začno z znakom # (npr. #if), prekopiramo in v njej spremenimo naslednja imena spremenljivk: vmem_data v vmem_data2, VMEM_ADDRESS v VMEM_ADDRESS2 in VMEM_NB_SECTOR v VMEM_NB_SECTOR2. Obenem moramo vrednosti VMEM_ADDRESS2 in VMEM_NB_SECTOR2 določiti/dodati tudi v datoteki conf_virtual_mem.h. Pri tem nam VMEM_ADDRESS2, tako kot VMEM_ADDRESS, ni potrebno določiti, če kot drugi RAM pomnilnik uporabljamo interni SAMV71 RAM. Z definicijo VMEM_NB_SECTOR2 določimo število (512 bajtnih) sektorjev MSD LUN_3, pri čemer moramo paziti, da ne presežemo kapacitete razpoložljivega pomnilnika. Na splošno velja, da morda prekoračitve kapacitete pri manjših LUN na PC ne bomo takoj opazili, dokler ne bomo fizično prekinili USB povezave z ATSAMV71 Xplained Ultra razvojno ploščo in jo ponovno vzpostavili. V primeru napačno določene velikosti LUN podatki na njem ne bodo več berljivi.
Sestavljene USB naprave
HIDS_CDC_MSC primer združuje več različnih funkcionalnosti USB naprav, ki jih lahko povežemo s PC: navidezni spojnik (hub), navidezni COM vmesnik, napravo za interakcijo s človekom (HID) in pogon za masovno hrambo podatkov. Slednjega originalni SAMV71 ASF USB Composite Device Example … primeri vzpostavijo kar v prostem delu SAMV71 RAM, vendar lahko vsak primer nadgradimo z dodatnimi MSD LUNi v kateremkoli pomnilniku na ATSAMV71 Xplained Ultra razvojni plošči.
Ker MSD LUNe zdaj že poznamo, nas zanimajo še možnosti različnih integracij. Priznati je treba, da teh ni malo, obenem pa je ASF zbirka primerov zastavljena dokaj racionalno, tako da primeri prikazujejo predvsem najtežje izvedljive kombinacije funkcionalnosti, podrobnosti pa lahko preizkusimo z vklapljanjem in izklapljanjem programskih stikal ob hkratnem dodajanju ustreznih ASF programskih knjižnic.
Denimo, HID vmesnik, ki je v USB Composite Device Example … primerih dodan MSC vmesniku za tvorbo MSD, je od slednjega preprostejši in omogoča določitev USB funkcij, preko katerih PC neposredno komunicira z USB napravo. Vendar je tak način komunikacije predviden le za prenos majhnih količin podatkov na enkrat, denimo komunikacijo s procesnimi mikrokontrolerji, ki krmilijo mehaniko zunanje naprave (denimo relejskega krmilnika velikih gospodinjskih električnih porabnikov). Med HID vmesnike lahko uvrstimo tudi nekoliko specifični podpori za USB računalniško miško in USB tipkovnico. Kljub temu se USB opisnika in načina implementacije USB funkcij miške in tipkovnice razlikujeta predvsem po obveznih USB funkcijah in USB identifikacijskih znakih. Pri kombiniranju različnih navideznih USB vmesnikov preko enega fizičnega USB vmesnika moramo uporabiti tudi funkcionalnost navideznega USB spojnika, ki je prav tako del omenjenih ASF primerov.
USB MSD in CDC vmesnik
Podrobneje poglejmo še preprost primer združevanja dveh USB funkcionalnosti, pri katerem lahko poleg MSD z enim ali več LUNi vzpostavimo še zaporedno terminalsko komunikacijo po RS232 standardu preko navideznih COM vrat po CDC protokolu. V ta namen moramo izdelati USB napravo z navideznim USB spojnikom ter dvema navideznima USB napravama, MSD in CDC. PC za komunikacijo z MSD in CDC uporablja različna gonilnika, saj gre za popolnima različni funkcionalnosti. USB Device gonilnik je napisan tako, da lahko že v ASF WIzardu izberemo možnost Composite (sestavljena naprava) in nato vsako od ponujenih podrednih naprav posamično omogočimo. ASF Wizard nato glede na izbrane nastavitve prenese vse potrebne programske knjižnice.
Najlažje je začeti kar s primerom USB Composite Device Example CDC and MSC, ki je prednastavljen tako, da podpira en LUN v SAMV71 RAMu in ena navidezna COM vrata s hitrostjo 115200 bps, z 8 podatkovnimi, brez paritete in enim stop bitom. Pri tem lahko dodajamo LUNe in navidezna COM vrata. Ker postopek dodajanja LUNov že poznamo, poglejmo še, kako delujejo in kako uporabljamo navidezna COM vrata ter koliko jih lahko hkrati podpremo premo USB vmesnika. Povejmo še, da primer USB Composite Device Example CDC and MSC vključuje tudi uporabo USART1, s katerim je SAMV71 mikrokontroler povezan s svojim programatorjem, ta pa naprej na navidezni COM vmesnik v PCju (zato ga lahko uporabljamo tudi kot sistemsko konzolo). V našem primeru je namesto tega USART1 uporabljen le za dvosmerno terminalsko komunikacijo z drugim navideznim COM vmesnikom v PCju, ki ga ustvarimo s SAMV71 s pomočjo USB CDC protokola. Za preverjanje delovanja komunikacije moramo imeti v PC nameščeno terminalsko aplikacijo, kot je Tera Term. Primer je zasnovan tako, da če tipkamo v eno terminalsko okno, se besedilo izpisuje v drugo in obratno.
Pogled v programsko kodo razkrije funkciji za branje in pisanje podatkov iz in v navidezni COM vmesnik: udi_cdc_getc() in udi_cdc_putc(<vrednost>), medtem ko za branje in pisanje podatkov na USART pa uporabljamo funkcij: usart_read(<naslov izbranega USARTa>, &<vrednosti>) in usart_write(<naslov izbranega USARTa>,<vrednost>). Pri tem opozorimo, da moramo pri USART komunikaciji paziti na statusne zastavice.
Podobno kot MSD programska koda, je tudi CDC programska koda napisana dovolj splošno, da je dodajanje navideznih COM vrat v SAMV71 sorazmerno enostavno. Preko USB CDC vmesnika lahko ustvarimo lahko do 7 navideznih COM vrat. Vendar moramo za nova COM vrata dodati tudi ustrezne programske strukture. O tem pa več prihodnjič.
Prihodnjič
Tokrat smo spoznali, kako delujejo MSD pogoni, kako jih vzpostavimo in kako združujemo različne USB funkcionalnosti. Lotili smo se tudi CDC komunikacij in ugotovili, kako komuniciramo preko COM vmesnikov. Obenem smo uporabili tudi USART, ki je fizični vmesnik za zaporedno komunikacijo po RS232 protokolu. Prihodnjič se lotimo še dodajanja USB COM vmesnikov po protokolu CDC ter ostalih USB protokolov. Vsekakor bomo ustvarili tudi lastni HID vmesnik, s katerim bomo iz PC neposredno dostopali do funkcionalnosti ATSAMV71 razvojne plošče…
https://svet-el.si
Program 1: Izbira aktivnih logičnih enot oz. MSD, ki jih vidi PC
#define LUN_0 ENABLE //!< On-Chip Virtual Memory. #define LUN_1 DISABLE //!< AT45DBX Data Flash. #define LUN_2 ENABLE //!< SD/MMC Card over HSMCI Slot 0 #define LUN_3 DISABLE //!< Spare #define LUN_4 DISABLE //!< NAND #define LUN_5 DISABLE //!< Spare #define LUN_6 DISABLE //!< Spare #define LUN_7 DISABLE //!< Spare #define LUN_USB DISABLE //!< Host Mass-Storage Memory.
Program 2: Spremenjene nastavitve v datoteki conf_board.h
#ifndef CONF_BOARD_H_INCLUDED #define CONF_BOARD_H_INCLUDED #define CONF_BOARD_USB_PORT #define CONF_BOARD_ENABLE_CACHE_AT_INIT #define CONF_BOARD_CONFIG_MPU_AT_INIT #define CONF_BOARD_SD_MMC_HSMCI #define CONF_HSMCI_XDMAC_CHANNEL XDMAC_CHANNEL_HWID_HSMCI #define CONF_BOARD_SDRAMC #endif /* CONF_BOARD_H_INCLUDED */
Program 3: LUN 0 opisnik za LUN v RAMu SAMV71 ali drugem pomnilniku na razvojni plošči
#define VIRTUAL_MEM LUN_0
#define LUN_ID_VIRTUAL_MEM LUN_ID_0
#define LUN_0_INCLUDE “virtual_mem.h”
#define Lun_0_test_unit_ready virtual_test_unit_ready
#define Lun_0_read_capacity virtual_read_capacity
#define Lun_0_unload NULL /* Can not be unloaded */
#define Lun_0_wr_protect virtual_wr_protect
#define Lun_0_removal virtual_removal
#define Lun_0_usb_read_10 virtual_usb_read_10
#define Lun_0_usb_write_10 virtual_usb_write_10
#define Lun_0_mem_2_ram virtual_mem_2_ram
#define Lun_0_ram_2_mem virtual_ram_2_mem
#define LUN_0_NAME “”On-Chip Virtual Memory””
Program 4: LUN 3 opisnik za dodatni LUN v SAMV71 RAMu ali drugem (S)(D)RAM pomnilniku na razvojni plošči
#define VIRTUAL_MEM2 LUN_3 #define LUN_ID_VIRTUAL_MEM2 LUN_ID_3 #define LUN_3_INCLUDE "virtual_mem.h" #define Lun_3_test_unit_ready virtual_test_unit_ready #define Lun_3_read_capacity virtual_read_capacity_2 #define Lun_3_unload NULL /* Can not be unloaded */ #define Lun_3_wr_protect virtual_wr_protect #define Lun_3_removal virtual_removal #define Lun_3_usb_read_10 virtual_usb_read_10_2 #define Lun_3_usb_write_10 virtual_usb_write_10_2 #define Lun_3_mem_2_ram virtual_mem_2_ram_2 #define Lun_3_ram_2_mem virtual_ram_2_mem_2 #define LUN_3_NAME ""On-Chip Virtual Memory 2""