Micro2440-SDK

Una nuova generazione di interfacce grafiche touchscreen “human friendly” è ora facilmente realizzabile utilizzando microcontrollori ARM, il S.O. Linux Embedded e le librerie grafiche Qt. Pannelli di comando e controllo grafici touchscreen possono sostituire le vecchie interfacce di controllo per tutta una serie di elettrodomestici, quali frigoriferi, lavatrici, caldaie, etc. Nonché macchine industriali e utensili, finora dotati di semplici display (o addirittura segnalazioni a led) e tastierine personalizzate. Come anche cruscotti per auto e sviariate altre applicazioni embedded. Il loro programma può essere sviluppato con strumenti più moderni e veloci, e risiedere in memory card facilmente rimovibili.

In questo blog vedremo come prendere confidenza con il microcontrollore S3C2440 tramite la scheda di sviluppo FriendlyARM Micro2440-SDK, come sostituire il kernel Linux nativo con una versione superiore, come installare le librerie Qt per ARM, sviluppare applicazioni grafiche e configurare il bootstrap del sistema da SD memory card.



Era da un pezzo che volevo smanettare un po’ con un microcontrollore ARM, così ho cercato un po’ su ebay fino a quando ho trovato una scheda di sviluppo a basso costo, che ho acquistato, pagando con Paypal.

Per chi già non lo sapesse, ARM (Advanced RISC Machine) è un’architettura di microprocessori RISC a 32 bit commercializzati da diversi produttori, che attualmente domina il mercato mondiale dei microprocessori 32-bit per applicazioni embedded.

In particolare, il microcontrollore della scheda che ho acquistato è un Samsung S3C2440 (ARM9). La scheda è una FriendlyARM Micro2440-SDK, pagata circa 135 euro (più le spese di spedizione) ad un rivenditore di Hong Kong.

Nell’attesa della consegna mi sono dato da fare. Considerato che dispongo di un paio di portatili - un Dell più recente e un Asus più datato, entrambi con S.O. Windows, rispettivamente 7 e XP - come prima cosa mi occorreva una Virtual Machine, per l'ambiente Linux dove sviluppare le applicazioni per la FriendlyARM.

Una Virtual Machine è un software che crea un ambiente virtuale che emula il comportamento di una macchina fisica, in cui alcune applicazioni possono essere eseguite come se interagissero con tale macchina. Dopo qualche ricerca, ho quindi scelto Oracle VM VirtualBox, perché è open source ed ha anche la versione in italiano.

Contestualmente, navigando in rete, ho cercato di reperire quante più informazioni possibili sulla FriendlyARM, per capire tra l’altro quale distribuzione di Linux si adattasse meglio per lo sviluppo. Alla fine ho deciso di provarne due, Ubuntu e Fedora.

L’installazione di VirtualBox non richiede particolari conoscenze, basta avere l’accortezza di configurare una giusta dimensione del disco virtuale. Non avendo problemi di spazio, io ho dedicato 20 Giga per ciascuna macchina virtuale.


L’installazione di Linux si esegue dalla VirtualBox, dopo aver creato e configurato una nuova macchina virtuale (VM). Tra le impostazioni occorre definire la Ram e le CPU a disposizione della VM. VirtualBox vi assiste egregiamente segnalandovi eventuali impostazioni non corrette. Scaricata l’immagine disco della distribuzione Linux dalla rete, si potrà creare il CD d’installazione che verrà usato dalla VM una volta avviata. Può risultare utile installare le Guest Additions di VirtualBox, per la gestione di dispositivi USB o per condividere cartelle con l'ambiente Windows. Su Fedora ci sono alcuni accorgimenti da seguire per la loro installazione.

Ancora due cose occorrono per completare la preparazione, un toolkit per lo sviluppo di applicazioni embedded, e un ambiente di compilazione per ARM, la toolchain di compilazione arm-linux-gcc-4.3.2.tgz, si può scaricare da code.google.com. Per istallarla è sufficiente copiarla in una directory, ad esempio:
# /home/user/compiler
e lanciare il comando tar:

# tar xvzf arm-linux-gcc-4.3.2.tgz
questo creerà la directory:

# /home/user/usr/local/arm/4.3.2/
quindi va esportata la path dell’ambiente di compilazione ARM:

# export PATH=$PATH:/home/user/compiler/usr/local/arm/4.3.2/bin
Per provare se l'installazione è stata eseguita correttamente basta lanciare il compilatore con l'opzione -v, e dovrà apparire qualcosa del genere:


Come toolkit ho optato per Qt, che è un ambiente di sviluppo software di Nokia basato su un insieme di librerie multipiattaforma e multipourpose, con interfaccia grafica e uso di widget, poichè la scheda Micro2440-SDK ha già intallate le sue librerie. Qt Creator è l’IDE che può essere scaricato e installato sia da solo che integrato nel SDK di Qt. 


L’approfondimento sull’utilizzo di Qt esula dallo scopo di questo post, comunque si possono trovare svariati tutorial in rete sull’argomento. Quello che occorre per sviluppare applicazioni embedded con Qt, è il Qt Creator installato su una macchina host, ovvero nell’ambiente Linux (Ubuntu o Fedora) che gira sulla VM.

Ho scaricato, compilato (con molta pazienza, perché richiede più di un ora) e installato Qt for Open Source development C++ on Embedded Linux, seguendo le istruzioni che si trovano sul sito di Qt Italia. Con una piccola nota a riguardo: se voglio provare le applicazioni sviluppate con Qt in locale sul mio PC prima di passarle sulla scheda FriendlyARM, ho bisogno che Qt sia configurato anche per l’ambiente desktop, a tale scopo è necessario aver creato un ulteriore ambiente Qt, riconfigurando e ricompilando Qt, con i seguenti comandi:
# gmake confclean
# ./configure -prefix /usr/local/Qt
# gmake
# gmake install
Alla fine, nella directory /usr/local/Qt ci saranno i due ambienti:
# ls /usr/local/Qt/
# Qt-4.8.2  QtEmbedded-4.8.2-arm
Rispettivamente per la compilazione in locale e per quella embedded.

A questo punto non resta che provare a compilare uno dei tanti esempi inclusi in Qt Creator, previo aver configurato il progetto per Desktop, lanciarlo e vedere se "gira" sul PC, dopodiché si cambia target (Embedded Linux, toolchain: arm linux gcc), per generare l’eseguibile per ARM.




In realtà bisogna cancellare il file .pro.user e riconfigurare il progetto, specificando Embedded Linux in Configure Project e Qt 4.8.2 (qt-everywhere-opensource-src-4.8.2) release nel Compile Output pane. Ma come ho già detto, una divulgazione approfondita di Qt esula da questo post, per cui studiatevi la documentazione e i tutorial.




La scheda

Dopo 2 settimane dall’ordine, mi è finalmente arrivato il pacco contenente la scheda Micro2440-SDK con il kernel Linux 2.6.32.2 già installato, il touchscreen TFT LCD da 7 pollici, l'adattatore parallelo per l’emulatore JTAG, i cavi USB, seriale e cross-ethernet, l’alimentatore 5V (con spina americana, procurarsi un adattatore) e un DVD con il software e la documentazione (parte in cinese).

Sulla Micro2440 è presente Qtopia, una GUI per ambienti Linux, sviluppata per palmari e cellulari, che viene lanciata automaticamente dal kernel all'avvio. Questa permette di riconfigurare facilmente alcuni parametri, quali la data e l’ora e l’indirizzo IP, mentre per riconfigurare la timezone ho dovuto reinstallare la rootfs, ma andiamo con ordine.

La cosa interessante di questo kit di sviluppo è lo Stamp Core Module, ovvero la piccola schedina che contiene il microprocessore Samsung S3C2440 e le memorie RAM e FLASH, che si innesta sulla piastra base della SDK tramite 3 strip-pin bifilari – passo 2,54 mm - da 54 contatti, per un totale di 162 pin. Le dimensioni dello Stamp Core Module sono estremamente ridotte (63 x 52 mm) e il suo prezzo sul mercato cinese si aggira sui 50 USD per pezzo singolo. Considerando che il microcontrollore è un 289 pin FBGA (Fine-Pitch Ball Grid Array), questo modulo può essere una buona alternativa alla masterizzazione personalizzata per piccole produzioni.
Il mio Stamp Core Module dispone di 64 MB di SRAM, 1 GB di Nand Flash e 2 MB di Nor Flash, ma esistono versioni con tagli più piccoli di Nand Flash. Il bootstrap può essere effettuato sia dalla Nand Flash che dalla Nor Flash, giacché su entrambe è presente il Supervivi bootoader, ma il kernel linux e il rootfs risiedono nella Nand Flash. Tramite lo switch S2 si seleziona una delle due flash per l’avvio. Sulla scheda base SDK è presente un’ulteriore  memoria EEPROM da 1024 bytes.

Per il dettaglio delle caratteristiche e delle funzionalità del Microcontrollore Samsung S3C2440, si rimanda al suo manuale. Un sommario elenco di queste è il seguente:
  • Around 1.2V internal, 1.8V/2.5V/3.3V memory, 3.3V external I/O microprocessor with 16KB I-Cache/16KB DCache
  • MMU
  • External memory controller (SDRAM Control and Chip Select logic)
  • LCD controller (up to 4K color STN and 256K color TFT) with LCD-dedicated DMA
  • 4-ch DMA controllers with external request pins
  • 3-ch UARTs (IrDA1.0, 64-Byte Tx FIFO, and 64-Byte Rx FIFO)
  • 2-ch SPls
  • IIC bus interface (multi-master support)
  • IIS Audio CODEC interface
  • AC’97 CODEC interface
  • SD Host interface version 1.0 & MMC Protocol version 2.11 compatible
  • 2-ch USB Host controller / 1-ch USB Device controller (ver 1.1)
  • 4-ch PWM timers / 1-ch Internal timer / Watch Dog Timer
  • 8-ch 10-bit ADC and Touch screen interface
  • RTC with calendar function
  • Camera interface (Max. 4096 x 4096 pixels input support. 2048 x 2048 pixel input support for scaling)
  • 130 General Purpose I/O ports / 24-ch external interrupt source
  • Power control: Normal, Slow, Idle and Sleep mode
  • On-chip clock generator with PLL
Mentre il suo diagramma a blocchi, ripreso dal manuale è:


Il sommario delle caratteristiche della scheda SDK è il seguente:
  • Dimensioni: 180 x 130 mm
  • EEPROM: 1024 Byte (I2C)
  • Ext. Memory: SD-Card socket
  • Serial Ports: 3x DB9 connector (RS232)
  • USB: 4x USB-A Host 1.1, 1x USB-B Device 1.1
  • Audio Output: 3.5 mm stereo jack
  • Audio Input: 3.5mm jack (mono) + Condenser microphone
  • Ethernet: RJ-45 10/100M (DM9000)
  • RTC: Real Time Clock with battery (CR1220)
  • Beeper: PWM buzzer
  • Camera: 20 pin Camera interface (2.0 mm)
  • LCD: 41 pin connector for FriendlyARM Displays and VGA Board
  • Touch Panel: 4 pin (resistive)
  • User Inputs: 6x push buttons and 1x A/D pot
  • Expansion headers (2.0 mm)
  • Power: regulated 5V (DC-Plug: 1.35mm inner x 3.5mm outer diameter)

Per collegarsi alla Micro2440-SDK da ambiente Windows si può utilizzare un terminale Hyperterminal, mentre con Linux si può usare minicom. Qualora non fossero presenti porte seriali RS232 sul PC, come nel mio caso, occorre procurarsi un adattatore USB-RS232, collegato tramite il cavo seriale in dotazione alla scheda. I parametri sono 115200 baud, 8 bit, no parity, no flow control. La porta serial0 (per intenderci, quella seriale sul lato corto della scheda vicino all'ingresso dell'alimentazione) è il Superterminal, sul quale viene visualizzata la log di avvio di Linux.

Sono anche possibili connessioni su rete, sia collegando il PC direttamente alla Micro2440, utilizzando il cavo ethernet incrociato di dotazione (in questo caso il PC dovrà avere un IP fisso della stessa subnet della scheda), sia tramite un hub o un router, con un cavo ethernet normale. Alla Micro2440 andrà assegnato un indirizzo IP statico della subnet del router, e impostati i relativi parametri di rete – subnet, gateway, DNS.

Il collegamento con la rete può essere sfruttato anche per provare il browser Konqueror, incluso in Qtopia. Per collegare la scheda al PC host tramite la rete, si possono usare i programmi telnet (per le funzionalità di terminale) e ftp (per le funzionalità di trasferimento file). Ovviamente questi devono essere presenti nell'ambiente Linux del PC host, in caso contrario possono essere installate tramite le relative utilities.


(to be continued)