Guia d’aprenentatge de sobre Embedded

Abstract

El projecte consisteix en realitzar una guia que permeti l’ús de les llibreries QT’s sobre la plataforma ARES21.

Aquesta plataforma consta d’un processador ARM9 ( i.MX21), sobre la qual es realitzaran diferents proves i tests, amb l’objectiu d’aprendre de la manera més ràpida possible l’ús correcte de les QT’s i la seva interacció amb la plataforma ARES21.

Per la realització d’aquesta guia, ha estat necessari el coneixement tant del hardware com dels drivers que aquest utilitza, que s’ha anat adquirint de l’experiència de treballar en diversos projectes.

Departament d’electrònica

Guia d’aprenentatge de QT sobre Linux Embedded

RESUM

L’objectiu del projecte és una guia per a que qualsevol tècnic o estudiant que es vulgui endinsar en la matèria tant de Linux embeddeds, com de llibreries gràfiques QT’s, trobi un lloc on aprendre de la manera més ràpida possible, tant el domini bàsic de les llibreries QT’s, com de la plataforma ARES21.

Per la realització d’aquest projecte, s’iniciarà explicant el hardware sobre el qual treballem per tal de conèixer les seves limitacions, com també les seves possibilitats.

Un cop realitzat un estudi del hardware, es passarà a explicar detalladament la instal∙lació i els primers exemples de les llibreries QT’s sobre el PC, per posteriorment realitzar la instal∙lació corresponent sobre la plataforma ARES21.

Finalment, es realitzaran i s’explicaran aplicacions i exemples avançats per poder aprofitar la major part del hardware que la nostra plataforma té i d’aquesta manera treure’n el major profit possible

Departament d’electrònica

Guia d’aprenentatge de QT sobre Linux Embedded

1 Introducció ...... 7 1.1 Introducció al hardware ...... 7 1.1.1 Processador ...... 8 1.1.2 Ports per a les comunicacions ...... 8

1.1.3 Altres dispositius ...... 9 1.2 Introducció al software ...... 9 1.2.1 Sistema operatiu ...... 9 1.2.2 Drivers ...... 9 1.2.3 Les llibreries QT ...... 10 2 Hardware del Sistema ...... 11 2.1 Plataforma Ares21 ...... 11 3 Firmware ...... 15 3.1 Linux ...... 15 3.2 Linux ARM ...... 16 3.3 Procés d’instal∙lació de la placa ...... 18 3.4 Device Driver ...... 23 4 Plataforma QT ...... 29 4.1 Introducció al paquet QT ...... 29 4.2 QT3‐ QT4, diferències entre elles...... 34 4.3 Funcionament intern de les QT ...... 37 5 Instal∙lació de les QT’s ...... 39 5.1 QT’s per PC Linux i Windows ...... 39 5.2 QT’s per ARM ...... 41 5.3 Programes que ens ajuden a treballar amb QT’s...... 42 6 Programació amb QT’s ...... 47 6.1 Llenguatges de programació que permeten programar les QT’s...... 47 6.2 Introducció a ++...... 47 6.3 llibreries QT’s...... 50 6.4 Primers passos amb ...... 53

Departament d’electrònica 3

Guia d’aprenentatge de QT sobre Linux Embedded

6.4.1 Les finestres ...... 54 7 Aplicacions QT...... 80 7.1 Creació del driver ...... 80 7.2 Creació de l’aplicació ...... 86 8 Durada estimada del projecte...... 95 9 Conclusions i línees de futur ...... 96 10 Bibliografia ...... 97 10.1 Llibres consultats ...... 97 10.2 Pàgines web consultades ...... 97

Departament d’electrònica 4

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 1 ...... 11 Figura 2 ...... 12 Figura 3 ...... 12 Figura 4 ...... 13 Figura 5 ...... 19 Figura 6 ...... 20 Figura 7 ...... 24 Figura 8 ...... 29 Figura 9 ...... 30 Figura 10 ...... 31 Figura 11 ...... 32 Figura 12 ...... 32 Figura 13 ...... 33 Figura 14 ...... 34 Figura 15 ...... 38 Figura 16 ...... 40 Figura 17 ...... 41 Figura 18 ...... 43 Figura 19 ...... 44 Figura 20 ...... 44 Figura 21 ...... 45 Figura 22 ...... 46 Figura 23 ...... 53 Figura 24 ...... 54 Figura 25 ...... 56 Figura 26 ...... 60 Figura 27 ...... 61 Figura 28 ...... 62 Figura 29 ...... 63 Figura 30 ...... 63 Figura 31 ...... 64 Figura 32 ...... 64 Figura 33 ...... 65 Figura 34 ...... 66 Figura 35 ...... 67 Figura 36 ...... 67 Figura 37 ...... 69 Figura 38 ...... 70 Figura 39 ...... 70 Figura 40 ...... 71 Figura 41 ...... 72 Figura 42 ...... 74 Figura 43 ...... 74

Departament d’electrònica 5

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 44 ...... 75 Figura 45 ...... 76 Figura 46 ...... 76 Figura 47 ...... 77 Figura 48 ...... 77 Figura 49 ...... 78 Figura 50 ...... 78 Figura 51 ...... 86 Figura 52 ...... 87 Figura 53 ...... 88

Departament d’electrònica 6

Guia d’aprenentatge de QT sobre Linux Embedded

1 Introducció

En aquest projecte el que es pretén és realitzar una guia pràctica d’aprenentatge tant de la plataforma ARES21, com sobretot la implementació de les llibreries QT’s sobre aquesta plataforma.

L’objectiu d’aquesta guia és que a través d’uns conceptes bàsics per la implementació d’aplicacions, l’usuari sigui capaç per ell mateix d’anar ampliant els seus coneixements sense necessitat d’haver de buscar ens altres guies o documents. Es vol resoldre sobretot els problemes que solen sorgir inicialment quan es començar a utilitzar un llenguatge, sistema operatiu o hardware que anterior no s’ha utilitzat.

Per aconseguir‐ho, es realitzarà una primera introducció de tot el hardware que disposem a la plataforma ARES21, ja que si es vol realitzar aplicacions gràfiques per una plataforma tant específica, si no es té en compte les seves limitacions podem tenir problemes ja que no funcionarà com es desitja. També es farà un breu comentari sobre els ordinadors clàssics, X86, o x64, ja que sobre ells és on instal∙larem les nostres llibreries i les compilarem, i per tant necessitarem un mínim de requeriments i programes a instal∙lar perquè funcioni correctament i podem, un cop realitzada l’aplicació, poder‐la carregar a la plataforma, sense cap tipus de problemes

Seguidament, es passarà a explicar tot els software que haurem d’instal∙lar tant al nostre PC com a la nostra plataforma per a poder fer us de les llibreries QT’s, així com la seva programació, instal∙lació, i finalment l’execució.

Tots aquest procediments s’aniran explicant a mode d’exemple perquè sigui el més fàcil possible seguir per l’usuari, i d’aquesta manera poder assolir els coneixements bàsics i la posta en marxa tant de la plataforma ARES21 com de les llibreries QT’s, el més ràpidament possible

1.1 Introducció al hardware

Sempre que parlem del hardware, estarem fent referència a la nostra plataforma ARES21, si en algun cas es volgués explicar quelcom sobre el PC, x86, es faria referència específica.

El hardware de la nostra plataforma, es dividirà bàsicament en tres parts:

• El nucli que estarà format per processador, flash i RAM. • Les principals comunicacions internes que serviran bàsicament per comunicar‐ nos amb els nostres perifèrics que tenim connectats. Alguns d’aquests, podrien ser, comunicació I2C, sèrie, paral∙lel, DMA o altres protocols.

Departament d’electrònica 7

Guia d’aprenentatge de QT sobre Linux Embedded

• I les comunicacions amb l’usuari com podrien ser una pantalla, un touch panell, uns altaveus, connexió ethernet, infraroig, entrada i sortida d’àudio, altaveus, USB,etc.

1.1.1 Processador

El cor del dispositiu és un processador MX21 de Motorola, al qual afegirem 64 Mbytes de RAM dinàmica i 64 MBytes de memòria Flash. Amb aquesta capacitat de memòria RAM i Flash no hi haurà cap problema en incorporar al dispositiu una distribució de Linux adaptada al processador com les llibreries gràfiques QT’s perquè funcionin correctament.

El cor d’aquest processador és un ARM926EJ‐S de 32 bits, especialment dissenyat per al mínim consum i molt bones prestacions.

Cal destacar, entre les enormes possibilitats que ofereix el processador, el seu nucli de seguretat nativa i la acceleració Jazelle per a , el controlador LCD, la interfície per a sensors CCD 1 i els ports USB.

En un nivell d’importància inferior, es podria esmentar també els diversos i eficaços modes de baix consum, així com el rellotge de temps real, que permetran economitzar energia als períodes de no utilització del dispositiu per part de l’usuari. Es proposa que el dispositiu s’apagui després d’un cert temps d’inactivitat, i que sigui capaç de recuperar el seu estat amb la simple pulsació d’una tecla.

1.1.2 Ports per a les comunicacions

Destacarem els més importants i necessaris alhora de realitzar una primera posta en marxa tant de la plataforma Ares21 com de les QT’s. Més endavant s’explicarà amb més deteniment altres tipus de comunicacions.

- Port USB tipus A, on es connecta un stick de memòria USB, per així poder passar informació de tipus música o fotografia. - Port USB tipus mini‐B que s’utilitzarà per a connectar el dispositiu a un ordinador personal mitjançant un cable USB adient. - Un port sèrie asíncron de 115 Kbps.

1 Utilitzat per a càmeres digitals i de vídeo.

Departament d’electrònica 8

Guia d’aprenentatge de QT sobre Linux Embedded

1.1.3 Altres dispositius

Altres dispositius que es volen anomenar són aquells que un cop realitzat l’aplicació, tindran la principal interacció amb l’usuari, i per tant considerem que l’usuari ha de tenir presents quins són.

- Pantalles LCD’s. - Audio: altaveus, micròfon - Touch panel. - Ethernet.

1.2 Introducció al software

Anteriorment en ela introducció s’ha comentat que treballem amb el Linux i les llibreries QT com a punt de partida del software. També cal esmentar els drivers, són els que permeten comunicar el nostre software amb el hardware.

1.2.1 Sistema operatiu

El Linux és el sistema operatiu utilitzat. En realitat es un S.O. embedded, és a dir un Linux molt reduït que ocupa molt poca memòria i només amb les implementacions que la nostre placa pot donar, ja que la resta d’opcions només faria que ocupar la nostre memòria. El fet d’utilitzar el Linux i no altres sistemes operatius que també podem trobar de forma embedded, com per exemple QNX, LynxOS, Windows CE, Windows NT Embedded, Palm OS, és que el software és lliure, i per tant podem tocar en tots els aspectes el nostre sistema operatiu.

Uns altres dels avantatges de Linux és que no tenim costos per drets, es madur i estable ja que porta més de 10 anys utilitzant‐ne. La alta capacitat de configuració del nucli de Linux és un altre avantatge significatiu per al nostre disseny. Un cop analitzats els components necessaris, és senzill compilar un kernel a mida adequat al sistema. El kernel creat ocuparà poc espai a memòria i serà molt ràpid, ja que conté només aquells components i mòduls essencials per a funcionar correctament.

1.2.2 Drivers

EL driver és un programa informàtic on la seva funció es permetre al sistema operatiu interactuar amb els perifèrics.

En el nucli d’un sistema operatiu trobem totes les eines per poder accedir al nostre hardware de forma fàcil i segura. A vegades però, no ens convé que per defecte tinguem un controlador activat. És per aquest motiu que Linux permet la inserció de mòduls o device drivers en qualsevol moment de la vida del sistema. A part, pot passar

Departament d’electrònica 9

Guia d’aprenentatge de QT sobre Linux Embedded que el nostre dispositiu no sigui reconegut pel Kernel i que ens haguem de fer un driver completament a mida, ja que el fet d’incorporar‐lo a la compilació del nucli seria molt complicat.

1.2.3 Les llibreries QT

Qt és un framework per a el desenvolupament d’aplicacions multi plataforma.

Alguna de les seves característiques més importants són les següents.

Algunes de les seves característiques són:

● Compatibilitat multi plataforma amb un sol codi font ● Performance de C++ ● Disponibilitats del codi font ● Excel∙lent documentació ● Fàcilment internacionabilizable ● Arquitectura preparada per a plugins

Departament d’electrònica 10

Guia d’aprenentatge de QT sobre Linux Embedded

2 Hardware del Sistema

Per posar en pràctica tots els conceptes que s’explicaran, ho farem a través de la plataforma Ares21, ja que té un gran nombre de perifèrics i per tant ens ofereix totes les opcions possibles alhora de programar les nostres aplicacions.

Sinó disposéssim d’aquesta plataforma, però en tinguéssim alguna altre amb el MX21 i els seus principals perifèrics, també podríem utilitzar‐la. Tot així nosaltres ens centrarem amb la plataforma Ares21.

2.1 Plataforma Ares21

ARES21 és una plataforma que aprofita les prestacions que ofereix el microprocessador i.MX21 de Freesscale. i.MX21 és un processador dissenyat per aplicacions multimèdia. Incorpora elements hardware dedicats, fet que permet treballar amb diferents mòduls sense sobrecarregar el microprocessador.

Figura 1

La plataforma Ares21 consta de varies plaques, formant un sistema modular. Depenent de les necessitats que es tinguin, es pot escollir diferents configuracions. La placa core, reuneix els elements necessaris per instal∙lar el S.O., i comunicar‐se amb els diferents perifèrics.

Departament d’electrònica 11

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 2

A continuació es poden observar diferents mòduls que formen el microprocessador:

Figura 3

Departament d’electrònica 12

Guia d’aprenentatge de QT sobre Linux Embedded

La principals característiques de les placa Mare són les següents:

Placa Mare ARES21: • Processador MC932821 (i.MX21) de 32 bits d'arquitectura ARM9 [3.4] • Nucli de tot el sistema, capaç de fer funcionar un Sistema Operatiu (SO). • Memòria Flash 32MB • Magatzem del bootloader, el SO i el sistema de fitxers. • Memòria SDRAM (2 x 32MB = 64MB) • Memòria volàtil del sistema, utilitzada també en la telecàrrega. • Integrat Transceptor USB amb connector miniUSB • Mitjà per carregar el software a la placa. • Controlador de targeta SD • Utilitzat per tal de carregar petites parts de software sense haver de recórrer a la telecàrrega, de manera que es treballa més ràpidament. • Connectors d’Expansió (Comunicacions, Multimèdia, • PCMCIA,TFT+Touch+Àudio)

Figura 4

Enllacen amb els perifèrics emprats de la placa d'expansió.

Placa Expansió ARES21: • Port sèrie RS‐232 amb connector DB9

Proporcionen la manera de comunicar‐se amb l'ARES21 mitjançant una terminal de Linux. • Connexió amb placa mare ARES21 • Unió amb els seus homònims de la placa mare. • Connexió amb displays LCD de 3.5”, 5.7” i 7”. • Donen accés als displays configurats pel driver. • Transceptor i controlador de Bus CAN amb interfície SPI [3.8]

Departament d’electrònica 13

Guia d’aprenentatge de QT sobre Linux Embedded

Dispositiu a controlar per l'altre device driver treballat. 2 ordinadors: • Un d'ells amb una distribució de Linux i connector port sèrie RS‐232. Plataforma de desenvolupament i proves del software. • L'altre amb Windows i un connector USB. Mitjà per tal de permetre la telecàrrega.

En quant al software es pot destacar: • El bootloader, que es el programa que prepara el processador i un mínim de perifèrics per tal de que un SO hi pugui funcionar a sobre. El primer cop que es carrega cal fer‐ho pel port sèrie, amb un programa especialitzat que s'anomena HAB Toolkit.

• Kernel de Linux‐2.4.20, amb un patch de Freescale, per tal d'adaptar‐lo a la seva pròpia placa d'avaluació i amb petits canvis per tal de que s'adapti a l'ARES21. S'ha fet servir aquesta versió del kernel, tot i ser antiga, ja que Freescale no dóna suport per les versions 2.6.x.

Conjunt de device drivers. Tot i formar part del kernel, el fet de que siguin modulars i bastant independents, a més de que es poden carregar i descarregar sense parar el sistema, fan que es puguin considerar com un conjunt a part.

• El sistema de fitxers, que serà el que li falti a la placa un cop carregats els tres paquets anteriors, on tindrem els programes de l'espai d'usuari (des d'on s'han de provar els drivers), que s'ha de gravar en un format condicionat per les configuracions del kernel i l'espai i estructura de fitxers assignada pel bootloader. En concret, es gravarà un sistema de fitxers en format jffs2 [3.15] i seguint l'estàndard FHS [3.12], amb un conjunt d'aplicacions reduït degut a les exigències d'espai (com per exemple BusyBox [3.13]).

• El cross‐compiler (compilador creuat), anomenat arm‐linux‐gcc. Es fa servir aquesta mena de compilador, pel fet de que es treballa sobre una arquitectura x86 (la d'un pc de sobretaula normal), però el software que desenvolupem ha de funcionar sota una diferent, en aquest cas ARM9 (la del i.MX21).

• Com a eina de desenvolupament s’ha fet servir el gedit, editor de text de GNU i per tal d’establir comunicació via el port sèrie amb la placa, es fa servir un programa anomenat minicom, de lliure distribució i que fa les mateixes funcions que l'HyperTerminal de Windows.

• En cas de ser necessaris més detalls sobre el hardware cal referenciar‐se al Projecte Final de Carrera d'en Marc Jorge Font (2008), ja ressenyat a la bibliografia, doncs parlar‐ne més aquí seria redundant i sortiria de les tasques desenvolupades en aquest treball.

Departament d’electrònica 14

Guia d’aprenentatge de QT sobre Linux Embedded

3 Firmware

Ja hem comentat anteriorment que la plataforma ARES21 porta el sistema operatiu Linux. Un dels problemes d’utilitzar Linux és que provoca que no tinguem un entorn gràfic sinó que l’haguem d’instal∙lar apart. Aquí és on apareixen les QT com a entorn gràfic, tot i que no són les úniques. Tot i que les QT puguin proporcionar un entorn gràfic, no vol dir que un cop instal∙lades les llibreries, ja el tinguem, sinó que a més l’haurem de programar.

3.1 Linux

El sistema operatiu Linux va ser creat al inici dels anys 90 per Linux Torvalds com una versió compatible de Unix, amb una gran estabilitat i alta configurabilitat. Els principals avantatges d’aquest sistema operatiu respecte Unix són la possibilitat de disposar del codi font sencer i el fet que sigui gratuït.

Linux va ser ideat en un principi per a treballar sobre ordinadors personals compatibles amb l’arquitectura x86. No obstant, des de fa pocs anys s’estan fent molts esforços per adaptar el nucli del sistema a altres arquitectures, ja siguin enormes clusters de processadors Alpha o bé petits microcontroladors amb memòria limitada.

En el segment dels embedded PC cal fer una distinció important, que afecta a la versió de sistema operatiu a usar. Aquest segment pot ser classificat en dos branques: processadors que incorporen MMU2 i aquells que no la incorporen. Per als processadors sense MMU existeix una versió reduïda del sistema operatiu anomenada uCLinux, adaptada a les difícils condicions de treball. En canvi, aquells processadors amb unitat de gestió de memòria, com el MX21, poden utilitzar qualsevol distribució que trobin convenient.

El processador MX21 està dissenyat per a treballar amb sistema operatiu, ja sigui Windows CE, Linux, ThreadX o d’altres. Entre les múltiples opcions que disposem, Linux és sens dubte la millor elecció.

El disseny del nostre sistema és totalment personalitzat, no segueix cap estàndard ni disposa de BIOS per ajudar al sistema operatiu. Per tant, és molt útil disposar del codi font del sistema operatiu, per a fer modificacions i adaptacions dels drivers existents que ens permetin aprofitar tota la potència del MX21.

2 Unitat de Gestió de Memòria

Departament d’electrònica 15

Guia d’aprenentatge de QT sobre Linux Embedded

La alta capacitat de configuració del nucli de Linux és un altre avantatge significatiu per al nostre disseny. Un cop analitzats els components necessaris, és senzill compilar un kernel a mida adequat al sistema. El kernel creat ocuparà poc espai a memòria i serà molt ràpid, ja que conté només aquells components i mòduls essencials per a funcionar correctament.

Finalment, la gratuïtat del sistema el fa ideal per a dispositius de baix cost, ja que s’evita haver de pagar un preu important per llicències de software.

3.2 Linux ARM

El Linux que nosaltres utilitzem no pertany a la família x86 sinó a la ARM9, això vol dir que sempre que vulguem de utilitzar informació programada al PC (x86), l’haurem de cross‐complilar perquè sigui útil pel sistema dissenyat amb MX21.

La cross‐compilacio (compilació creuada), és la que permet que la informació generada en un x86, pugui ser utilitzada en un ARM, hem de deixar clar que en el moment que està cross‐compilat, ja no és útil en un x86. Nosaltres utilitzarem un cross‐compilador que ens dóna el mateix fabricant del MX21, Freescale.

Per carregar les dades al nostre nucli i programar‐lo, hem de realitzar tres passos, carregar el bootloader, el kernel, i el sistema de fitxers.

Bootloader

El bootloader és un software petit que s’executa al encendre’s el nostre micro.

Si parléssim del nostre PC de sobretaula, aquest petit programa resideix en el MBR (Master Boot Record) del disc dur, i s’executa un cop la BIOS del PC ha inicialitzat tot el sistema. El bootloader aleshores passa la informació del sistema al Kernel , és a dir, la partició del disc dur on es muntarà la root y finalment s’executarà el propi Kernel.

Però quan parlem de sistemes embeddeds, o encastats, és més complicat, ja que aquest sistemes no tenen BIOS que inicialitzi el sistema, i la inicialització del microprocessador, dels controladors de memòria, i en definitiva de tot el hardware de la placa, ha de fer‐ho un programa del boot abans de que s’executi el Kernel del sistema.

Com a mínim el bootloader ha de inicialitzar el hardware, especialment els controladors de memòria i arrencar el sistema operatiu amb els paràmetres adequats, encara que també pot tenir altres funcions, com la lectura i escriptura en memòria i totes aquelles funcions que permetin actualitzar el firmware a la memòria flash del equip via sèrie o ethernet.

Departament d’electrònica 16

Guia d’aprenentatge de QT sobre Linux Embedded

El Kernel

El kernel és el nucli del sistema operatiu. És la part més propera al processador i al maquinari. És un fitxer executable que es llegeix quan el sistema s'arrenca. El nom d'aquest fitxer és vmlinuz.

Un cop el nucli queda carregat en la memòria, realitza les funcions següents:

• La gestió de memòria El mòdul de gestió de memòria s'encarrega de controlar quins processos estan carregats en la memòria principal en cada instant. Si en un moment determinat no hi ha prou memòria principal per a tots els processos que en demanen, el gestor de memòria ha de recórrer a mecanismes d'intercanvi (swapping) perquè tots tinguin dret a un temps mínim d'ocupació de la memòria i es puguin executar.

• La planificació de processos i la comunicació entre processos El planificador de tasques (scheduler) s'encarrega de gestionar el temps de processador que té assignat cada procés. El planificador entra en execució cada cert temps i decideix si el procés actual té dret a seguir executant‐se (d'acord amb la seva prioritat i els seus privilegis) o ha de commutar‐se de context (assignar el processador a un altre procés). Molts dels processos que s'estan executant en el sistema han de col∙laborar entre si. Perquè aquesta comunicació entre processos sigui possible, el nucli aporta uns mecanismes. Entre els més importants tenim els senyals, la memòria compartida, els semàfors i les cues de missatges.

• La gestió dels dispositius de maquinari El mòdul de control del maquinari és la part del nucli encarregada de la gestió de les interrupcions i de la comunicació amb la màquina. Els dispositius poden interrompre el processador mentre s'està executant un procés. Si això s'esdevé, el nucli ha de reprendre l'execució del procés després d'haver atès la interrupció. Les interrupcions no són ateses per processos sinó per funcions especials codificades en el nucli, que són invocades durant l'execució de qualsevol procés.

El Kernel és la part fonamental del sistema operatiu, el nucli del sistema. És el responsable de la gestió de recursos y de les comunicacions entre el hardware i el software, proporcionant una manera segura d’accedir a la memòria. També és el responsable del control de les interrupcions y de totes les operacions de E/S (Entrada/Sortida).

Duran la fase prèvia de compilació, haurem d’escollir només aquells components necessaris per al sistema, evitant seleccionar‐ne de superflus per no augmentar l’espai ocupat i reduir la velocitat de processament.

Departament d’electrònica 17

Guia d’aprenentatge de QT sobre Linux Embedded

Aquest components són els anomenats mòduls, que són petits programes que són carregats per el kernel del sistema en funció de les necessitats. Per exemple, un driver del dispositiu, el podem veure com un mòdul del kernel, el qual permet al kernel accedir al hardware connectat al sistema. Si no hi haguessin els mòduls, s’hauria d’implementar en el propi kernel i seria molt llarg i dificultós. D’aquesta manera quan es modifica un mòdul, no es necessari re‐compilar tot el kernel de nou.

El Root Disk o Sistema de Fitxers.

El Sistema de Fitxers és un conjunt de programes i estructures de dades que permeten executar diferents tasques a l’usuari del S.O.Linux. Hi ha diferent formats de sistemes de fitxers, nosaltres utilitzem el jffs2 ja que està específicament per a funcionar sobre memòries flash, i és el que millor rendiment aconsegueix en l’entorn que treballem.

Sobre el sistema de fitxers, posarem tots els binaris i les llibreries necessàries per a les nostres aplicacions. S’ha de tenir en compte de que l’espai que disposem és limitat, per tant, segons quines llibreries o programes que ocupin molt no es podran introduir en el sistema de fitxers.

3.3 Procés d’instal∙lació de la placa

Abans de procedir a explicar els processos per carregar al MX21 el bootloader, el kernel, i el sistema de fitxers, hem de tenir el nostre PC preparat amb una sèrie de programes per poder‐ho realitzar.

Carregar el Bootloader

El Bootloader és un fitxer binari que permet configurar el hardware de la placa correctament perquè estigui llesta per a que posteriorment li introduïm el Kernel i el Sistema de fitxers.

En el cas del Bootloader, es produeixen dues situacions diferenciades. La primera és quan no existeix (o no funciona) cap Bootloader carregada al MX21, i la segona és quan es desitja carregar un nou Bootloader havent‐hi un altre al MX21 que funciona correctament.

En el primer cas:

• Connectem el port sèrie ATX d’un PC Windows a un cable sèrie RS‐232 que anirà connectat al connector de canal sèrie de la nostre placa.

• Posarem el Jumper J1 en mode BOOT.

Departament d’electrònica 18

Guia d’aprenentatge de QT sobre Linux Embedded

• Obrim el programa HABToolKits i el configurem de la següent manera:

Figura 5

• Un cop tenim configurat el programa tal i com es pot observar en la il∙lustració, havent carregat el fitxer “Bootloader.bin” que ens interessa, premem el botó de Reset de la placa i a continuació premem a “Execute” en el programa. D’aquesta manera haurem carregat el Bootloader a la nostra placa a través del port RS‐232. Cal mencionar que aquets programa no serveix per a telecarregar ni el Kernel ni el Sistema de Fitxers.

• Ara, per veure si la placa arranca correctament tancarem el programa HABToolkits i obrirem el Hyperterminal configurant‐lo de la següent manera (Port COM1, 115200 bps, 8 bits de dades, sense paritat, 1 stop bit, sense control de flux).

• Abans de prémer “Aceptar” posarem el Jumper J1 de la placa en mode FLASH.

Departament d’electrònica 19

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 6 • Després de prémer “Aceptar” en la configuració del Hyperterminal polsarem el botó de Reset (SW2) de la placa ARES‐21, fet que farà que veiem com apareix un determinat text per pantalla del Hyperterminal, dintre del qual llegirem una compta enrere de 3 a 0. Deixem que acabi aquesta compta enrere i veurem per l’Hyperterminal com arranca correctament la placa ARES‐21.

En el segon cas:

• Connectem el cable RS‐232 de la manera anterior de tal forma que vagi del PC a la nostre placa.

• Posarem el Jumper J1 en mode FLASH.

• Connexió USB entre PC i placa a través del connector USB tipus A/mini usb.

• La configuració del PC Windows serà com la explicada anteriorment (Port COM1, 115200 bps, 8 bits de dades, sense paritat, 1 stop bit, sense control de flux), i premem “Aceptar”.

• Premem Reset de la placa i aleshores per l’Hyperterminal observem que hem de pitjar una tecla per entrar al menú de configuració. Escollim la número 0, que correspon al Bootloader.

• Se’ns apareix una finestra, al PC, corresponent a la placa. Aquesta connexió és la que es produeix a través d’USB.

Departament d’electrònica 20

Guia d’aprenentatge de QT sobre Linux Embedded

• Copiem l’arxiu Bootloader (“bootloader.bin”) que volem carregar en aquesta finestra, i a continuació expulsem la unitat corresponent a la placa. D’aquesta manera veurem, per l’Hyperterminal, com s’està realitzant la còpia del Bootloader a la Flash de la placa.

• Un cop finalitza, se’ns demana que premem Reset. Ho fem i, abans que la nova compta enrere finalitzi, pitgem alguna tecla del PC.

• Ara podrem escollir l’opció de carregar el Kernel.

Carregar el Kernel.

Abans de poder carregar el kernel a la nostre placa, hem de haver‐lo instal∙lat en el nostre PC i configurat.

Per tal de compilar el nucli, descomprimirem l’arxiu que ens hem descarregat corresponent a la BSP, i buscarem dins la carpeta Kernel, i descomprimirem dins d’ella el fitxer del nucli. Un cop descomprimit, hi entrarem, i aplicarem algun fitxer de patch si és necessari, que justament és qui ens actualitza a la versió que ens hem descarregat.

Un cop fet això, caldrà copiar el fitxer de configuració d’origen anomenat mx2.config i triarem com a destí el fitxer ocult anomenat .config. Tot seguit executarem algunes comandes de configuració i compilació:

• make menuconfig: Aquesta comanda ens mostra un senzill menú de configuració, per tal d’afegir i treure funcionalitats al nucli. Tot i que poguem treure algun element, sempre el podrem acabar afegint com a device driver, o recompilant el nucli posteriorment. Cal dir que no qualsevol paquet de Linux que ens descarreguem disposa d’aquesta configuració en forma de menú, i que moltes vegades serà més complicat de realitzar.

• make dep: Ens crea i actualitza les dependències entre fitxers, i cal fer‐ho per seguretat tot i que és estrictament necessari quan es mouen fitxers de la seva ubicació original, pel tema dels include cap a altres fitxers.

• make clean: Neteja la compilació existent, esborrant la imatge del nucli i tots els binaris intermitjos que s’havien creat en el procés. Quan tenim un nucli mal compilat que no es refà per si sol quan recompilem, cal executar aquesta instrucció per fer net i compilar des de zero

Departament d’electrònica 21

Guia d’aprenentatge de QT sobre Linux Embedded

• make zImage: Compila el nucli i el comprimeix en un fitxer anomenat zImage, que és un binari comprimit preparat per ser executat en la nostra màquina iMX21 i descomprimir‐se a si mateix mentre es va executant. Cal general aquest nucli comprimit perquè d’altra manera no quedaria espai lliure a la memòria per guardar‐lo, i el procés de càrrega es faria molt més llarg.

Carregar el sistema de Fitxers

Es pot definir el sistema de fitxers com l’arbre de directoris que formarà el contingut emmagatzemat a la memòria Flash del sistema. Hem preparat una capacitat de 30 MB útils per a carregar‐hi el sistema de fitxers, per poder emmagatzemar dades i llibreries d’ús general tranquil∙lament.

Per tal d’obtenir un sistema de fitxers base per poder carregar a la placa, el que farem serà partir del que Freescale proporciona. Dins el paquet BSP que es pot baixar de la pàgina web, trobarem una carpeta anomenada Binary/266Image, amb un fitxer que es diu root.cramfs. Aquest fitxer és un sistema de fitxers de tipus cramfs ja preparat per posar a la placa. Ens trobem però, que de cara a tenir un sistema de fitxers fiable, ens és més òptim treballar amb sistemes de fitxers de tipus JFFS2. Així doncs, partirem del root.cramfs i passarem fins al root.jffs2, explicant els passos necessaris:

• Primer de tot, ens creem una carpeta provisional allà mateix on disposem del fitxer de tipus CramFS. Li podem dir disk.

• El següent pas és “muntar” el fitxer CramFS dins de disk, que és el que fa la placa en arrencar, però nosaltres ho farem dins la carpeta a l’ordinador. Cal executar:

mount –t cramfs –o loop root.cramfs disk/

• Com que això que hem fet no és res més que “obrir” el fitxer CramFS dins de la carpeta disk, aquest procés s’esborrarà el pròxim cop que iniciem sessió, i és per això que fem una copia a memòria no volàtil:

cp – disk newdisk

• Ara disposem dins de newdisk del sistema de fitxers base que necessita el iMX21 per funcionar. Cal dir que és un sistema de fitxers que ocupa al voltant de 20 MB, i que trigarà molt a carregar.

• Ara afegirem els fitxers que ens calen per tal de fer funcionar la nostra aplicació sense problemes, com per exemple els drivers, i els programes que voles executar.

Departament d’electrònica 22

Guia d’aprenentatge de QT sobre Linux Embedded

3.4 Device Driver

Els drivers són uns programes informàtics que permeten al nostre sistema operatiu poder‐nos comunicar amb el hardware. Excepte el driver de la pantalla, els altres s’hauran de copiar a la carpeta /drivers i un cop a dins al nostre sistema operatiu utilitzar‐la funció ‘insmod driver.o’ per activar el driver que volem utilitzar.

A continuació destacarem els més importants.

• Mx2ads_digi: s’encarrega de controlar el conversor que ens dóna les dades de posició del touchscren. • Mx21_ac97: s’encarrega de agafar i donar les dades referents al àudio, i el micròfon. • Usbdcore, usb‐mxotg, storage_fd: quan els tres mòduls estan carregats, permeten que podem connectar un usb extern i transferir dades. • Dbmx21fb‐virtual: és el driver de la pantalla LCD que s’ha hagut de modificar algunes característiques per adaptar‐lo a la nostre pantalla.

Els device drivers es mouen entre l’espai d’usuari i l’espai del kernel, degut a que han de prestar un servei a l’usuari i fer crides de sistema. Aquesta distinció es pot apreciar en mirar les funcions bàsiques que componen un mòdul, és a dir, algunes pertanyen a l’espai d’usuari i d’altres a l’espai del kernel.

És fàcil distingir‐les, ja que les d’usuari es poden cridar des de qualsevol lloc i no fan res més que executar les que estan encabides a l’espai del kernel. Per exemple, en el cas de voler instal∙lar un mòdul, en l’espai d’usuari tindrem la comanda insmod i en l’espai de kernel la funció init_module. En haver vist totes aquestes crides i funcions normalitzades, es farà un quadre resum.

Quan s’escriuen device drivers, és important fer la distinció entre l’espai d’usuari i l’espai del kernel, ja que si es confonen, el driver no funcionarà i es pot comprometre l’estabilitat del sistema.

Espai de kernel. Linux (que és un kernel) administra el hardware de la màquina de manera simple i eficient, oferint a l’usuari una interfície de programació simple i uniforme. De la mateixa manera, els device drivers d’aquest kernel, formen un pont entre l’usuari final/programador i el hardware. Qualsevol subrutina o funció que forma part del kernel (mòduls, per exemple) són considerats part de l’espai del kernel. A continuació es mostra un esquema per poder situarde forma general la organització de Linux.

Departament d’electrònica 23

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 7

Espai d’usuari. Els programes d’usuari final, com l’intèrpret de comandes de UNIX o aplicacions gràfiques, formen part de l’espai d’usuari. Òbviament, aquestes aplicacions, necessiten interactuar amb el hardware del sistema. Tot i així no ho poden fer directament, sinó un conjunt més o menys reduït i controlat de crides al sistema suportades pel kernel.

Funcions bàsiques Un mòdul del nucli (i com a tal un device driver) ha de tenir com a mínim dues funcions: init_module que es crida en insertar el mòdul al nucli, i cleanup_module que es crida just abans d’ésser extret.

Típicament init_module pot fer dues tasques ben diferenciades: o bé registra un controlador per alguna cosa que tingui a veure amb el nucli, o reemplaça alguna de les funcions del nucli amb el seu propi codi (codi que normalment fa quelcom i després crida la funció original). La funció cleanup_module es suposa que desfà els canvis fets a init_module, de manera que el mòdul es pot descarregar de manera segura.

Un mòdul que consti d’aquestes dues funcions i estigui compilat en un arxiu objecte (*.o), ja es pot començar a fer servir, per tal de carregar‐lo al nucli, s’ha de fer servir la comanda insmod seguida del nom del mòdul en qüestió. En fer la comanda, si no hi ha cap error, s’executarà la funció init_module i el mòdul quedarà registrat al fitxer /proc/modules.

Per tal d’executar la funció cleanup_module i descarregar‐lo es fa servir la comanda rmmod seguida del seu nom. Això provoca la eliminació de la seva entrada al fitxer /proc/modules.

Dispositius de caràcter Aquesta classe de dispositiu és la que més s’escau als dispositius hardware més simples i és la que és més fàcil d’entendre. Un dispositiu de caràcter és aquell del que

Departament d’electrònica 24

Guia d’aprenentatge de QT sobre Linux Embedded se’n pot fer l’abstracció a una cadena de caràcters; és a dir, per tal d’accedir‐hi s’hi graven o se’n llegeixen caràcters (tot i que normalment es treballa amb estructures de dades una mica més complexes).

L’abstracció que acaba implementant el sistema es basa en mostrar un fitxer que es pot obrir, tancar, llegir, escriure com si fos un fitxer normal però que en realitat permetrà manipular el hardware mitjançant crides estandarditzades del sistema.

Els dispositius de caràcter són accedits mitjançant el sistema de fitxers. Els fitxers de dispositiu, fitxers especials o simplement nodes (que implementen l’abstracció abans anomenada) es poden localitzar al directori /dev. Aquests fitxers especials per dispositius de caràcter s’identifiquen per una “c” a la primera columna de la sortida en executar la comanda ls ‐ l. D’altres dispositius com els de bloc (“b”) també apareixen al /dev.

En la sortida de la comanda ls ‐l, també es poden apreciar dos números separats per una coma en les entrades de cadascun dels nodes, just abans de la data de la última modificació, on en un fitxer normal hi apareixeria la seva extensió. Aquests números son el major i el minor (respectivament) de cada dispositiu.

El número major identifica el driver associat amb el dispositiu, per exemple, /dev/null i /dev/zero són controlats pel driver amb major 1, mentre que les consoles virtuals i les terminals sèrie són controlades pel driver 4. El kernel fa servir el major en el moment d’obertura del fitxer per dispensar l’execució al driver que correspongui.

El minor s’utilitza internament per part del driver designat pel major; la resta de parts del kernel no el fan servir per res i simplement és un argument que li arriba al device driver corresponent. És una decisió de disseny fer‐lo servir o no. Normalment, si s’utilitza es per tal de diferenciar els diferents dispositius que pot controlar el device driver.

El sistema de fitxers de dispositiu Des de la versió 2.4.x del kernel (que és justament la que es fa servir a l’ARES21) s’ha introduït una nova opció, el devfs (device file system). En cas de que es faci servir aquest sistema de fitxers, el tractament dels nodes o fitxers de dispositius canvia molt i es simplifica notablement. Cal esmentar que no és compatible amb revisions anteriors del nucli de Linux.

Les principals avantatges del devfs són:

• Els punts d’entrada al dispositiu a /dev són creats en inicialitzar‐lo i esborrats quan es treu del sistema. • El device driver pot especificar noms de dispositiu, bits de propietat i permisos, però ara també es poden canviar els permisos des de l’espai d’usuari (el nom del fitxer no). • No cal assignar un major ni tractar amb els minor.

Departament d’electrònica 25

Guia d’aprenentatge de QT sobre Linux Embedded

És a dir, abans per carregar i descarregar un mòdul calia fer un script que generés el node amb el dispositiu i l’eliminés posteriorment i ara ja no, ja que el device driver controla els seus nodes de manera autònoma.

Per tal de crear i esborrar dispositius, el driver ha de cridar les següents funcions:

• devfs_register per tal de registrar el dispositiu i demanar l’assignació d’un major dinàmicament o forçar‐ne un. • devfs_unregister per desfer el que fa l’anterior funció.

Els nombres major El major es un enter petit que serveix d’índex per una array estàtica de drivers de caràcter, des del kernel 2.2.x es suporten 254 números diferents, és a dir, 254 drivers potencials.

Els minor també son números de 8 bits. Hi ha moltes pressions per part de la comunitat per tal d’augmentar el número de possibles dispositius suportats pel kernel incrementant els nombres de dispositius fins a 16 bits i en teoria, és un objectiu de la branca 2.5.x de desenvolupament.

Un cop que es té el driver registrat a la taula del kernel, les seves operacions, s’associen amb el seu major. En qualsevol moment que una operació és executada en un dispositiu de caràcter associat amb un major determinat, el kernel busca i invoca la funció adequada de les registrades a l’estructura de les file_operations. Per aquesta raó en registrar el driver se li ha de passar un punter a una estructura global del driver que reculli totes les operacions que permetrem dintre del driver i no una de local dintre de la funció module_init.

Per tal de que els programes tinguin a algú a qui dirigir‐se, en registrar el dispositiu, se li subministrarà un nom que quedarà reflectit al directori /dev i associat al major i al minor del dispositiu. Aquest serà el punt d’accés al dispositiu des de l’espai d’usuari.

Per drivers d’ús privat es recomana que s’utilitzi la ubicació dinàmica de majors, en comptes d’escollir un número dels que queden lliures. Per contra, si el device driver està pensat per que sigui útil per tota la comunitat i en futur sigui inclòs en les branques oficials del kernel, s’ha de demanar l’assignació d’un major d’ús exclusiu als desenvolupadors i hackers del kernel.

Es pot veure l’actual assignació de majors al fitxer /proc/devices.

Operacions de fitxer

Un dispositiu obert s’identifica internament amb una estructura de fitxer i el kernel usa l’estructura de file_operations per tal d’accedir a les funcions del driver. Aquest estructura està definida al fitxer /linux/fs.h, és una array de punters a funcions. Cada fitxer és associat amb el seu propi conjunt de funcions (mitjançant la inclusió d’un camp anomenat f_op que apunta a una estructura de file_operations). Les operacions

Departament d’electrònica 26

Guia d’aprenentatge de QT sobre Linux Embedded s’encarreguen sobretot d’implementar les crides a sistema, com open, read, write, ... Es pot considerar al fitxer com a un “objecte” i les funcions que operen sobre ell com als seus “mètodes”, parlant en termes de programació orientada a objectes.

Normalment, l’estructura de file_operations o un punter que n’apunti una es sol dir fops (o alguna altra variant semblant); aquest punter és el que passem a la funció devfs_register en el moment de registrar el nostre driver. Cada camp de l’estructura ha d’apuntar a una funció en el driver que implementi una operació específica, o igualat a NULL per les operacions no suportades. El comportament exacte del kernel en trobar‐ se un punter nul, és diferent per cadacrida.

L’estructura file_operations s’ha anat fent gran a poc a poc al temps que noves funcionalitats eren afegides al kernel. L’afegiment de noves operacions pot comportar problemes de compatibilitat cap enrere en els device drivers. Degut a això, els programadors del kernel han optat per un format d’inicialització etiquetada que permet que s’inicialitzin diferents camps de l’estructura mitjançant el seu nom. Aquesta inicialització no és C estàndard, però és una extensió útil al compilador de GNU.

La llista següent presenta totes les operacions que una aplicació pot invocar sobre un dispositiu, des de la versió 2.4.x del kernel, en l’ordre en que apareixen. Si no s’especifica el contrari, per marcar l’èxit en la operació es retorna un zero i si per contra es vol notificar un fracàs un codi negatiu d’error. loff_t (*llseek) (struct file *, loff_t, int); El mètode llseek es fa servir per canviar la posició actual de lectura/escriptura en un arxiu, i la nova posició es retorna com un valor (positiu). L’argument loff_t es un offset llarg de com a mínim 64 bits (fins i tot en plataformes de 32 bits). Els errors s’assenyalen mitjançant el retorn d’un valor negatiu. Si la funció no ve especificada pel driver, una cerca relativa al final del fitxer falla sempre, mentre que la resta de cerques funcionen modificant el comptador de posició en l’estructura del fitxer de dispositiu. ssize_t (*read) (struct file *, char *, size_t, loff_t *); S’utilitza per recuperar dades des del dispositiu. Un punter a NULL, causa que la crida de sistema a read falli retornant –EINVAL (Argument invàlid). Un valor de retorn positiu o igual a zero, representa el nombre de bits llegits amb èxit (el valor de retorn és del tipus “signed size”, que normalment correspon a la tamany nadiu d’enter per la plataforma contra la que s’ha compilat). ssize_t (*write) (struct file *, const char *, size_t, loff_t *); Envia dades al dispositiu. Si falta, es retorna –EINVAL al programa que hagi fet la crida. El valor de retorn, en cas de no ser negatiu, representa el número de bytes escrits amb èxit. int (*readdir) (struct file *, void *, filldir_t); Aquest camp hauria de valer NULL pels fitxers de dispositiu; s’utilitza per llegir directoris i per tant només és útil pels sistemes de fitxers.

Departament d’electrònica 27

Guia d’aprenentatge de QT sobre Linux Embedded

unsigned int (*poll) (struct file *, struct poll_table_struct *); El mètode de poll és el que s’acaba cridant quan l’usuari fa una petició de poll o de select, ambdues utilitzades per saber si un dispositiu es pot escriure, llegir o es troba en un estat especial. Qualsevol crida al sistema pot bloquejar el dispositiu fins que aquest es pugui tornar a escriure o a llegir. Si un driver no implementa el mètode de poll, s’assumeix que el dispositiu és de lectura i d’escriptura i que no es troba en cap estat especial. El valor de retorn correspon a una màscara de bits que descriu l’estat del dispositiu. int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); La crida al sistema que s’anomena ioctl, proporciona una manera específica del dispositiu per adreçar comandes (com ara formatar una pista d’un disquet, que ni és una escriptura ni és una lectura). Addicionalment, unes poques comandes de ioctl són reconegudes pel kernel sense haver de referenciar‐se a la taula de les operacions de fitxer. Si el dispositiu no ofereix punts d’entrada per les ioctl, la crida de sistema retorna un error per qualsevol petició que no hagi estat predefinida (‐ENOTTY, No existeix tal ioctl per aquest dispositiu). Si el mètode retorna un valor no negatiu, el mateix valor es passa cap a la funció que ha fet la crida per indicar una finalització satisfactòria de la rutina.

Departament d’electrònica 28

Guia d’aprenentatge de QT sobre Linux Embedded

4 Plataforma QT

4.1 Introducció al paquet QT

Breu història de Qt

El framework Qt va veure la llum de forma pública per primera vegada l'any 1995. Va ser desenvolupat per dos enginyers noruecs, Haavard Nord (futurCEO de Trolltech) i Eirik Chanble‐Eng (futur president de Trolltech), com a resposta a la necessitat de disposar d'un GUI per a una aplicació C++ multi plataforma orientat a objectes. Dins de la paraula "Qt", la lletra "Q" va ser escollida a causa de la seva bellesa en l'editor de Haavard, i la lletra " t " es va afegir per a significar "toolkit" (de manera similar a Xt, XToolkit). La companyia es va fundar en 1994 com a Quasar Technologies, i va anar evolucionant fins a convertir‐se en Trolltech.

Figura 8

Evolució del logotip Qt al llarg del temps.

Trolltech va començar a oferir Qt amb la llicència GPL a partir de l'any 2000, sent aquesta gratuïta per a el desenvolupament de programari lliure, però de pagament per al desenvolupament de programari privatiu (constituïa una font d'ingressos per a Trolltech). Actualment, i arran de la compra de Trolltechper part de Nokia a començaments de l'any 2009, s'ha anunciat que Qt s'oferirà amb llicència LGPL. Amb això es pretén popularitzar i estendre Qt a base de permetre el seu ús en programes privatius, ja que no serà necessari pagar cap llicència pel seu ús. En l'última dècada, Qt ha passat de ser un producte usat per uns quants desenvolupadors especialitzats, a un producte usat per milers de desenvolupadors open source a tot el món, per la qual cosa el futur d'aquesta tecnologia és avui dia molt prometedor.

Departament d’electrònica 29

Guia d’aprenentatge de QT sobre Linux Embedded

Qt i els seus components principals

Qt és un framework open source amb llicència GPL concebut per al desenvolupament d'aplicacions i interfícies multi plataforma. El paquet Qt integra eines de desenvolupament i suport als com a QtDesigner i QtAssistant, així com llibreries de classes auxiliars a Qt. També inclou el compilador Gcc MinGW.

QtDesigner

QtDesigner és una eina de desenvolupament que ens permet crear interfícies gràfiques d’usuari. Ens proporciona un conjunt de components estàndard i un mecanisme de connexió cridat signal‐slot, explicat al capítol 3 de la guia d’usuari, amb el que connectarem esdeveniments de la interfície amb la lògica de programa que han de suportar.

Figura 9

Pantalla principal de QtDesigner per al disseny de GUI

QtAssistant

QtAssistant és un component de Qt que ens permet navegar per la documentació, en forma de pàgines HTML, i implementa opcions de recerca i d'extensió.

Departament d’electrònica 30

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 10

Pantalla principal de QtAssistant.

MinGW

MinGW és una implementació del compilador Gcc per a la plataforma Windows, que a més inclou un conjunt de l'API de Win32, permetent un desenvolupament d'aplicacions natives per a aquesta plataforma i podent generar tant executables com|com a llibreries usant l'API de Windows.

L'evolució de QtDesigner

Qt ha superat actualment la seva quarta versió des dels seus inicis. A continuació mostrarem breument com ha anat evolucionant el patró de desenvolupament d'aplicacions fins a la versió actual, i quins canvis ho han fet possible. En la versió 1.0 i 2.2 de Qt, es creaven els diàlegs (dissenys de les finestres) mitjançant QtDesigner, i aquests que es convertien a codi mitjançant la utilitat UIC (User Interface Compiler). En aquesta versió ja es donava suport al mecanisme estrella de Qt (signals islots): el UIC generava els slots (virtuals) i aquests s'implementaven amb codi mitjançant herència.

Departament d’electrònica 31

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 11

Esquema de desenvolupament a Qt 1.0

En la versió 3.0 de Qt, es va incorporar el mecanisme de l'"arxiu|arxivament ui.h", que permetia implementar slots sense necessitat d'herència, i que era inclòs automàticament pel codi font generat per UIC. QtDesigner tenia un editor de codi integrat per poder editar l'arxiu|arxivament ui.h, i una funcionalitat (anomenada source) per afegir variables i includes. També disposava de capacitat de càrrega de plugins per donar suport aCustom Widgets (fent que fossin visibles en QtDesigner) i fins tot un paquet d'arxius project.pro. Addicionalment, es podien realitzar connexions a Bases de Dades i veure el contingut de les seves taules|posts. Per això, era possible construir‐ne una aplicació completa usant únicament QtDesigner.

Figura 12

Departament d’electrònica 32

Guia d’aprenentatge de QT sobre Linux Embedded

Esquema de desenvolupament a Qt 3.0

Tanmateix, aquesta aproximació d'edició "centralitzada" mitjançant QtDesigner tenia una sèrie de manques, i eren els següents: • L'editor de codi de QtDesigner no disposava de funcions bàsiques (com per exemple, anar a una determinada línia). • Existien problemes de sincronització en editar l'arxiu|arxivament ui.h externament QtDesigner. • No era possible la seva integració amb IDEs existents, per això desenvolupadors acostumats a altres IDEs havien d'utilitzar per força QtDesigner per programar a Qt.

En la versió 4.0 de Qt s'han corregit totes aquestes manques. De fet, el canvi més important ha estat la possibilitat d'integració de QtDesigner amb IDEs existents (per exemple, Eclipsi) el que va derivar en la desaparició de l'editor de text bàsic del que feia gal∙la QtDesigner en la seva versió 3.0. A més, QtDesigner genera l'arxiu.ui amb la interfície, i l'UIC genera el codi per a aquesta (similar al comportament de les versions 1.0 i 2.2, però generant únicament un fitcher.h). Ara, l'herència es realitza de la classe principal de la interfície i de la interfície d'objectes de usuari (classes QObject i QDialog), sent tot aquest codi generat automàticament.

Figura 13

Esquema de desenvolupament a Qt 4.0.

Qt i empreses que l’utilitzen

Qt és una tecnologia molt present en l'actualitat: moltes aplicacions open source hi han apostat per Qt a l'hora de desenvolupar els seus GUIs. Tanmateix, moltes companyies privades també han decidit adoptar Qt en productes comercials,

Departament d’electrònica 33

Guia d’aprenentatge de QT sobre Linux Embedded

especialment per la seva actual llicència LGPL. A continuació, se citen|esmenten algunes de les seves aplicacions més famoses: ƒ Google Earth, VLC, etc.…: Moltes aplicacions d'escriptori s'han desenvolupat gràcies a Qt. ƒ Telèfons Skype: Els terminals Wi‐fi Skype de Netgear han comptat amb Qt per a les seves interfícies d'usuari. ƒ Volvo: El fabricant d'automòbils ha optat perQt per al GUI de l'ordinador d'a bord dels seus cotxes.

Figura 14

Volvo, Netgear i Google han confiat en Qt per als seus productes.

4.2 QT3‐ QT4, diferències entre elles.

Podem trobar diverses versions de les llibreries QT’s. A dia d’avui hi ha la versió 4.6, però alguna vegada s’ha treballat amb la versió 3.3. Això és un inconvenient ja que no són compatibles amb elles i si es vol portar la versió antiga a la nova s’ha de tenir presents les següents indicacions perquè el que s’havia programat amb la versió 3, funcionin amb la versió 4. Els programes compilats per Qt 3 han de ser re compilats per treballar amb Qt 4. Qt 4 tampoc és completament compatible amb la font 3. Qt 4 inclou moltes característiques addicionals.

La nova versió de Qt inclou noves funcionalitats i en millora de ja existents respecte a la versió 3:

¾ Internament, Qt4 inclou noves tecnologies per ampliar les prestacions:

• Tulip: Un nou conjunt de plantilles de classes contenidores. • Intervie: Una arquitectura model/vista per vistes d'ítems. • Arthur: El framework de pintat de Qt4. • Scribe: Renderitzador de textos Unicode.

Departament d’electrònica 34

Guia d’aprenentatge de QT sobre Linux Embedded

• Pantalla principal: Una pantalla principal basada en accions .

A més a més, inclou una nova interfície del programa Designer.

¾ Qt4 no és, com en les anteriors versions, una única llibreria, sinó que internament es divideix en varies llibreries, les quals permeten separar funcionalitats d'aplicacions amb interfície gràfica per usuari de les que no posseeixen aquest tipus d'interfície, i possibilita la programació d'aplicacions a la banda de servidor, tot separant les parts de que no necessiten interfície gràfica i possibilitant que a la màquina destí no precisi disposar de les llibreries gràfiques en qüestió. Aquesta divisió es pot dur a terme a l'hora de compilar l'aplicació, afegint la línia QT ‐=gui al fitxer .pro. Així mateix, afegint la línia QT += network opengl sql qt3support podem activar múltiples llibreries, en aquest cas s'haurien activat les relatives a xarxa, openGL i SQL, a més de la compatibilitat per a codi provinent de Qt3.

¾ Nova sintaxi d'inclusió de classes Qt: Abans: #include Ara: #include

De totes maneres, la sintaxis vella segueix funcionant. Tot i això és recomanable utilitzar la nova nomenclatura, ja que permet enllaçar totes les classes que pertanyen a una mateixa subllibreria de Qt4, enllaçant la nova llibreria directament amb la nova nomenclatura.

¾ En Qt4, la classe “Qt” ha esdevingut un espai de noms. Això el que permet és referenciar constants que formen part de la llibreria Qt, per dues vies:

• Amb la directiva using namespace Qt afegida amb els includes de la classe, amb el que es pot accedir a la variable en qüestió directament, sense prefixos. • Posant el prefix Qt:: abans de la variable a la que volem citar.

¾ Constructors de widgets i objects simplificats i més eficients.

• Proporciona una funció de conversió de tipus dinàmica, qobject_cast<>() basada en meta‐informació per les subclasses de Qobject.

¾ Aquesta versió inclou una classe Qpointer que ens proporciona un punter T (Heretant de QObject) a un QObject. El punter es posa automàticament a 0 si l'objecte referenciat es destruït. A la versió anterior hi havia un punter similar, el QguardedPtr, amb la seva corresponent classe, però amb una implementació molt més lleugera. Compatibilitat amb aplicacions creades a partir de Qt3 a partir d'una biblioteca de suport. Per afegir la compatibilitat, només cal afegir la línia Qt += qt3support al fitxer .pro

Departament d’electrònica 35

Guia d’aprenentatge de QT sobre Linux Embedded

Per portar codi de Qt 3 a Qt 4 es recomana realitzar les accions següents:

• Assegureu‐vos que el codi es compila i s'executa bé en totes les seves plataformes de destinació amb Qt 3.

• Afegiu la línia QT + = qt3support al vostre fitxer. pro si utilitza qmake, en cas contrari, editeu el makefile o arxiu de projecte per enllaçar amb la biblioteca Qt3Support i afegiu DQT3_SUPPORT al vostre compilador. També pot ser que necessitis especificar altres biblioteques.

• Executeu l'eina de portar qt3to4. L'eina passarà a través del seu codi font i l’adaptarà a Qt4.

• Seguiu les instruccions de l’arxiu Porting.ui Files to QT4 a la pàgina de suport de Qt Designer.

• Torneu a compilar amb Qt 4. Per cada error, busca els identificadors connexos (per exemple, noms de funcions, noms de classes).

L'eina qt3to4 substitueix les aparicions de les classes Qt 3 que ja no existeixen en Qt 4, amb la corresponent classe de Qt 3 de suport, per exemple, es converteix en QListBox Q3ListBox.

En algun moment, és possible que es vulgui deixar de vincular amb la biblioteca Qt de suport 3 (Qt3Support) i prendre avantatge de Qt 4 i les seves noves funcionalitats.

A més de les classes Qt3Support (com Q3Action, Q3ListBox i Q3ValueList), Qt 4 estableix les funcions de compatibilitat quan és possible, per a que una API vella pugui conviure amb la nova. Per exemple, proporciona un QString QString:: simplifyWhiteSpace () la funció de compatibilitat que s'implementi en línia i que simplement demana QString:: simplificació (). Les funcions de compatibilitat no estan documentats aquí, sinó que es presenten a la classe. es té la línia de qt3support QT + = a l'arxiu .pro , automàticament es definirà al qmake el símbol QT3_SUPPORT, girant sobre el suport de compatibilitat de funcions. També es pot definir el símbol manualment (per exemple, si no es desitja vincular amb la biblioteca Qt3Support), o es pot definir QT3_SUPPORT_WARNINGS, dient que el compilador emeti una advertència de compatibilitat quan una funció es diu d’aquesta manera. (Això només funciona amb GCC 03/02 + i MSVC 7.)

Departament d’electrònica 36

Guia d’aprenentatge de QT sobre Linux Embedded

4.3 Funcionament intern de les QT

Una interfície gràfica, es dissenya utilitzant la programació dirigida per avens. Això vol dir que controla el flux del programa no és el programador sinó l’usuari. El flux del programa dependrà dels event que succeeixin al sistema.

• El nostre event és cridat quan es produeix un event interessat i ha de retornar lo abans possible.

• No s’ha de bloquejar, ja que del contrari la interfície deixarà de respondre.

• Una interfície gràfica, està composta per diferents elements anomenats widgets, com per exemple: Botton , combobox, anteriorment comentats.

• Cada widget pot generar diferents events segons quin tipus de widget sigui i reaccionar a altre events (per exemple: pulsacions de teclat o retoli, el touch, etc).

• El nostre programa atendrà als event produïts per widgets o pel sistema.

• Per afegir interactivitat, les QT utilitza el mecanisme de senyals i Slots. Vol dir que els widgets com les pròpies classes poden emetre senyals i al mateix temps tenir diferents Slots.

• Quan un widget vol avisar d’un succés, emet un senyal incloent els paràmetres adients. Altres widgets o classes poden contindre slots, que són els mètodes que realitzen les accions adequades, i les senyals es connecten als slots adequats.

• Quan l’usuari prem un botó, s’emet el senyal polsat però no succeeix res, perquè no està connectat a cap slot. Una opció és connectar el senyal polsat del botó al slot ‘tancar’ de la finestra. Ara doncs, quan s’emeti el senyal polsat arribarà al slot tancar, i es tancarà la finestra.

Departament d’electrònica 37

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 15

• Els senyals poden incloure paràmetres i automàticament els slots els rebran. Es pot connectar slots amb molts paràmetres a slots que reben menys paràmetres sempre que els dos tipus siguin compatibles. Els paràmetres de més s’ignoren.

• A més a més, és possible connectar una senyal o varis slots, així com connectar varies senyals a un mateix slots. També és possible connectar un senyal a un altre senyal de manera que a l’emetre el primer senyal, emet el segon automàticament.

• Com a últim dir que el mecanisme de senyals i slots resolt problemes que altres no poden resoldre, com per exemple, que el tipus de dades que inclouen les senyals emeses sempre estaran clarament definides, i que els mètodes no necessiten conèixer d’altres classes per informar de successos, tant sols han d’emetre el senyal, fet que facilita la estructuració del programa.

Departament d’electrònica 38

Guia d’aprenentatge de QT sobre Linux Embedded

5 Instal∙lació de les QT’s

A partir d’aquí es pretén que l’usuari posi en pràctica els coneixements bàsics esmentats, i que de forma pràctica s’iniciï en el món de les llibreries QT’s. Per fer‐ho, abans s’hauran d’instal∙lar els programes necessaris per a que sigui possible. Primerament s’explicarà com instal∙lar les llibreries tant en Windows com en Linux, centrant‐nos en aquest últim ja que utilitzem aquest sistema operatiu per treballar, i després explicarem com instal∙lar les llibreries QT, a la plataforma ARES21.

5.1 QT’s per PC Linux i Windows

Com ja s'ha dit, aquest manual està enfocat a la versió de Qt de lliure distribució per a distribucions Linux, i aquest és pràcticament l'únic requeriment que té Qt4, el sistema operatiu Linux amb interfície gràfica instal∙lada . Dit això i disposant d'aquest requisit, per instal∙lar‐lo cal obrir un terminal i senzillament escriure la comanda següent:

>(sudo)* apt‐get install qt4‐designer

S'accedeix a la consola a través del menú del Linux. S'escriu la comanda indicada per iniciar la instal∙lació.

Amb aquesta sola comanda, i després de fer les confirmacions corresponents, s’instal∙larà tot el programa. També és una opció interessant descarregar‐se la documentació del programa, amb la mateixa comanda:

>(sudo)* apt‐get install qt4‐doc

La documentació pot ajudar amb dubtes sobre el funcionament de l'extensa llibreria que és Qt4 i la seva interfície de creació, encara que espero que amb aquest manual sigui una eina secundària en aquest sentit :) , així com la API de programació de les funcions de la llibreria, un recurs imprescindible. Per accedir‐hi, només cal posar a la línia de comandes:

>firefox /usr/share/qt4/doc/html/index.html

Aquesta comanda permetrà l'accés a la documentació.

Una altre opció és descarregar‐se el fiter d’instal∙lació de la pagina oficial : http://qt.nokia.com/downloads

Aquí es pot trobar totes les últimes versions que es poden descarregar. Hi ha el QT SDK, que porta les llibreries QT’s, QT Creator IDE i QT development tools. Per un altre

Departament d’electrònica 39

Guia d’aprenentatge de QT sobre Linux Embedded banda hi ha QT: Framework Only. Cadascun d’aquest es troba tant per Linux com per Windows en les seves múltiples versions.

Per executar el programa Qt4 , podem fer‐ho o bé escrivint a la consola:

>designer &

O bé des del menú d'Aplicacions de la barra d'eines de Linux (Imatge específica generada amb Ubuntu 8.04).

Figura 16

Tant bon punt s'obri l'aplicació, apareixerà el conjunt de finestres més la inicial, que configuren la interfície de Qt4.

Departament d’electrònica 40

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 17

Més endavant, s'explicaran detalladament tots els elements que es poden apreciar en a captura, amb exemples pràctics a resoldre si s'escau.

5.2 QT’s per ARM

Per poder cross‐compilar les QT’s per la nostra plataforma, ens hem de descarregar la versió concreta de Qt libraries 4.6.2 for embedded Linux (160 MB), (és la última ara mateix),ja que es treballa sobre un embedded i per tant és la única que funcionaria correctament. Cal tenir en compte, però, i és molt important que el Linux que porta la nostra plataforma és la 2.4, i aquest fet impedirà que algunes de les llibreries de les QT’s funcionin correctament ja que estan només preparades per la versió de Linux 2.6 o superiors.

També s’ha de tenir instal∙lat els compiladors en c, per poder compilar el programa i generar el executable que es carregarà al Sitema de Fitxers. Els PC’s ja solen portar algun compilador que funciona correctament. Però no en porta cap preparat per la nostra estructura. És també per aquest motiu que en apartats anteriors d’aquesta memòria s’ha explicat com instal∙lar la BSP a la nostra placa i al PC. Ja que aquesta ens permetrà cross‐compilar tot tipus de programes per la plataforma que s’està utilitzant.

També s’ha comentat que l’objectiu és tenir les llibreries QT’s al MX21, per fer‐ho hem de cross‐compilar les llibreries ja que s’està treballant sobre un ARM. Abans

Departament d’electrònica 41

Guia d’aprenentatge de QT sobre Linux Embedded d’instal∙lar‐les les hem de configurar pel nostre hardware, per fer‐ho s’escriu la següent instrucció en el cas de cross‐compilar les qt3:

./configure ‐prefix /home/carlos/qt‐embedded‐free‐3.3.4‐arm/install ‐xplatform qws/linux‐ipaq‐g++ ‐embedded arch ‐qt‐mouse‐linuxtp ‐no‐kbd‐ls5000 ‐no‐kbd‐ tty ‐nokbd‐ usb ‐no‐kbd‐yopi ‐no‐kbd‐vr41xx ‐no‐mouse‐pc ‐no‐mouse‐bus ‐no‐mouse‐yopi ‐ no‐mouse‐vr41xx

Si es fa amb les QT4, la instrucció seria molt semblant canviant bàsicament la versió de les llibreries i si es vol fer algun tipos de configuració específica:

./configure ‐prefix /home/carlos/qt‐embedded‐free4.6.2‐arm/install ‐xplatform qws/linux‐ipaq‐g++ ‐embedded arch.

A continuació ja es poden compilar i instal∙lar:

/make install

Un cop ha acabat, dins de qt3‐arm/install, es copien totes les carpetes menys el doc i es posen al sistema de fitxers dins el MX21/sistema_fitxers/qt.

També s'han de copiar les fonts dins de qt3‐arm/lib i copiar‐les a MX21/sistama_fitxers/qt/lib

5.3 Programes que ens ajuden a treballar amb QT’s.

Tot i que s’ha parlat i instal∙lat el programa qtDesigner per realitzar les aplicacions QT’s, hi han altres programes que també ens podran ser útils per a la realització d’aplicacions i a continuació s’esmenten alguns que serviran tant per a Windows com a Linux.

QDevelop QDevelop és un entorn de desenvolupament amb llicència GPL desenvolupat per Jean Luc iord (un usuari de la comunitat Qtfr.org). Disponible per a Windows i Linux, una de les característiques més interessants de QDevelop és el fet d'admetre plugins externs, com per exemple el depurador GDB i el suggeriment automàtic via . QDevelop no integra Designer dins de la seva interfície, però pot invocar‐lo externament.

Departament d’electrònica 42

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 18

Pantalla principal de QDevelop

QDev / Edyuk QDev és un editor nascut de la mà d'un conegut usuari del fòrum de QtCentre (http://Qtcentre.org), una de les majors comunitats online de Qt. El projecte va ser actiu fins a Febrer de 2006, a partir de llavors el creador va decidir continuar el seu desenvolupament baix el nom d'Edyuk. Aquest últim té característiques molt atractives, com per exemple capacitats d'integració per a Designer.

Departament d’electrònica 43

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 19

Pantalla principal de QDev

Figura 20

Designer integrat a Edyuk

Departament d’electrònica 44

Guia d’aprenentatge de QT sobre Linux Embedded

Cobres Cobras és un IDE per a Qt simple i prematur, capaç d'interactuar amb arxius.pro de qmake i activar les llibreries resultants. Malgrat ser exclusiu a Windows i encara tenir un explorador de classes no funcional, els usuaris coincideixen que es tracta d'un IDE molt estable.

Code::Blocks

Code::Blocks (CB) és un IDE multiplataforma open‐source per a C++ desenvolupat mitjançant WxWorks. Es pot integrar amb Qt mitjançant un plugin.

Figura 21

Pantalla de depuració de CB

Eclipse és potser un dels IDEs més famosos i coneguts amb suport per a múltiples plataformes i llenguatges, per això Qt ha llançat recentment un mòdul amb què és possible integrar Qt a Eclipse. Inclou opcions integrades de depuració, integració amb

Departament d’electrònica 45

Guia d’aprenentatge de QT sobre Linux Embedded

Designer, editor d’arxius de projecte i fins i tot un editor de recursos. La integració de Qt amb aquest IDE funciona molt bé, tanmateix el gran consum de recursos necessaris per a seu correcte funcionament és el seu major punt negatiu.

Figura 22

Pantalla de Designer en Eclipse

Eines externes: Ctags i GDB

Existeixen eines potencialment útils que es poden manejar de forma centralitzada des de un IDE a Qt: dues de les més conegudes són CTags i GDB. La primera, Ctags, és una senzilla eina que ens permet generar un tagfile, un diccionari de tots els objectes trobats en un codi font per a una ràpida posterior localització de aquests mitjançant un editor textual (en el nostre cas QDevelop). Dins de QDevelop, també ens permetrà activar funcions tan interessants com l’auto completat de codi.

La segona, GDB, és la versió per a Windows del depurador estàndard de sistemes operatius GNU. Ve distribuït sota llicència GPL, i funciona per a diversos llenguatges de programació.

Departament d’electrònica 46

Guia d’aprenentatge de QT sobre Linux Embedded

6 Programació amb QT’s

6.1 Llenguatges de programació que permeten programar les QT’s.

Com hem comentat amb anterioritat utilitzarem el programador QT designer, però que és?

Qt4 Designer és una aplicació basada en una biblioteca multi plataforma (Qt) desenvolupada per la companyia Qt Software (anteriorment TrollTech) que ens proporciona un conjunt d'eines per elaborar interfícies d'usuari gràfiques (GUI) usant el llenguatge C++ i la seva pròpia interfície gràfica.

Encara que nativament el programa usi C++, existeixen bindings o adaptacions de la biblioteca per a poder usar‐lo amb C, Phyton (PyQt) , Java (QtJambi), Perl (PerlQt), (gb.qt) , Ruby (QtRuby), PHP (PHP – Qt), entre d'altres.

Esta totalment orientat a objectes, és fàcilment extensible i posseeix una API amb funcions de múltiples facetes, com mètodes per accedir a bases de dades mitjançant SQL, ús de documents XML, maneig d'estructures de dades convencionals, etc.

6.2 Introducció a C++.

Amb aquesta breu introducció simplement es pretén donar un mínim de coneixements de les característiques de C++, com d’algunes de les instruccions que són més utilitzades quan es treballa sobre hardware tant directament i que són interessants conèixer‐les o recordar‐les.

C++ és considerat un C més gran i potent. La sintaxi de C++ és una extensió de C, al qual s'han afegit nombroses propietats, fonamentalment orientada a objectes. ANSI C ja va adoptar nombroses característiques de C++, pel qual la migració de C a C++ no sol ser difícil.

En aquest apèndix es mostren les regles de sintaxi de l'estàndard clàssic de C++ recollides en a l'Annotated Manual (ARM) de Stroustrup i Ellis, així com les últimes propostes incorporades al nou esborrany de C++ ANSI, que s'inclou en les versions 3 (actual) i 4 (futura de AT&T C++).

• Identificadors Els identificadors (noms de variables, constants...) han de començar amb una lletra de l'alfabet (majúscula o minúscula) o amb un caràcter subratllat, i poden tenir un o més caràcters. Els caràcters segon i posteriors poden ser: lletres, dígits o un subratllat, no permetent‐se caràcters no alfanumèrics ni espais.

Departament d’electrònica 47

Guia d’aprenentatge de QT sobre Linux Embedded

tescprueba // legal Xl23 // legal multi_palabra // legal var25 // legal l5var // no legal

C++ és sensible a les majúscules. Paga_mes és un identificador diferent a paga_mes.

Una bona pràctica de programació aconsella utilitzar identificadors significatius que ajuden a documentar un programa.

anomeni cognoms salari precio_neto

• Paraules reservades Les paraules reservades o claus no s'han d'utilitzar com a identificadors, a causa del seu significat estricte en C++; tampoc es han de re definir. A la següent Taula es numeren les paraules reservades de C++ segons el ARM(Sigles del llibre de BJARNE STROUSTRUP en el qual es defineixen les regles de sintaxi del llenguatge C++ estàndard).

∗ Aquestes paraules no existeixen en ANSCI C

• Tipus de dades

Els tipus de dades simples en C++ es divideixen en dos grans grups: integrals dades senceres) i de coma flotant (dades reals). A continuació es mostra els diferents tipus de dades en C++,

Departament d’electrònica 48

Guia d’aprenentatge de QT sobre Linux Embedded

• Operadors lògics

Els operadors lògics i relacionals són els blocs de construcció bàsics per a constructors de presa de decisió en un llenguatge de programació.

Taula d’Operadors lògics

• Operacions de manipulacions de bits

C++ proporciona operadors de manipulació de bits, així com operadors d'assignació de manipulació de bits.

Operadors de manipulació de bits (bitwise)

Operadors de assignació de manipulació de bits

• El operador sizeoff

Departament d’electrònica 49

Guia d’aprenentatge de QT sobre Linux Embedded

L'operador sizeof proporciona la mida en bytes d'un tipus de dada o variable sizeof pren l'argument corresponent (tipus escalar, array, record, etc.). La sintaxi de l'operador és:

sizeof (nom de la variable)

Algun exemple:

int m , n[12] sizeof(m) // proporciona 4, en maquines de 32 bits sizeof(n) // proporciona 48 sizeof (15) // proporciona 4 sizeof (int) //dona la mida en memòria de un int(generalment 32 bits)

6.3 llibreries QT’s.

A continuació es mostra la classes de QT més utilitzades, per veure‐les de forma completa s’ha d’anar a la ajuda de Qtdesigner, i dir‐li que te les mostri totes (http://doc.qt.nokia.com/4.6/)

Departament d’electrònica 50

Guia d’aprenentatge de QT sobre Linux Embedded

Una altre manera d’ordenar les QT és en grups de diferents classes que s’assemblen, A continuació es mostra els diferents grups que es poden agrupar i amb la seva descripció corresponent.

Abstract Widgets: Abstract widget és una classe que s’utilitza a través de les subclasses.

Advanced Widgets :Avançada GUI widgets Serveix per a veure llistes i barres de progrés.

Basic Widgets:Bàsica GUI widgets such per a botons, caixes, barres de desplaçament.

Database Classe relacionada per exemple per bases de dades SQL.

Departament d’electrònica 51

Guia d’aprenentatge de QT sobre Linux Embedded

Date and Time Classes per a controlar el temps i la data.

Drag and Drop Classes que tracten de codificar i descodificar diferents tipus d’arxius.

Environment Classes que proporcionen diversos serveis globals com poder fer ajustos del sistema.

Events Classes utilitzades per crear i generar events.

Utility Classes És una classe que permet utilitzar una pila, string, long o altres funcions sense la necessitat d’utilitzar la classe QAplication

Graphics and Printing Classes permeten pintar i dibuixar primitives, incloent OpenGL. (Mirar a Image Processing and Multimedia)

Help System: Classes utilitzades per obtenir informació via l’ajuda online per aplicacions.

Image Processing: Codificació de imatge digital, es descriu i es manipula. (Mirar també la part gràfica i manipulació multimèdia)

Layout Management: Classes que permet redimensionar formes de forma automàtica per poder generar diàlegs complexos

Implicitly and Explicitly Shared Classes: Classes that use reference counting for fast copying.

Input/Output and Networking: Classes que permeten introduir i treure arxius a través d’un directori o xarxa.

MainWindow and Related Classes: Cada cosa que es necessita per el típic menú d’una aplicació amb finestres, incloent‐hi menús, llocs de treball, etc.

Miscellaneous: Altres classes que es solen utilitzar.

Multimedia: Classes que dona suport per a gràfics, sons, animació,etc. (Mirar Graphics and Printing i Imatge Processing)

Object Model: The Qt GUI toolkit's underlying object model.

Organizers: Utilitza una interfície per organitzar com splitters, barres tab, grups de botons, etc.

Plugin Classes: Pluguin relacionat amb classes.

Standard Dialogs: Preparat per a diàlegs, un arxiu, font, color i més.

Departament d’electrònica 52

Guia d’aprenentatge de QT sobre Linux Embedded

Template Library: Qt's template library és un contenidor de classes.

Text Related Classes: Classes per processat de text (Més a XML Classes).

Threading Classes: Classes que donen suport de threading.

Widget Appearance: Permeten modificar l’aparença amb diferents estils, fonts, colors etc.

XML Classes: Classes que suporten XML, via, per exemple DOM i SAX.

6.4 Primers passos amb QT creator.

Per explicar de la manera més pràctica possible com funciona el QT creator i les seves principals característiques es procedirà a explicar en forma d’exemple.

Partirem de la captura inicial quan obrim el programa:

Figura 23

Departament d’electrònica 53

Guia d’aprenentatge de QT sobre Linux Embedded

6.4.1 Les finestres

En aquest apartat del manual es tractaran les funcions de cadascuna de les finestres internes del programa.

™ La finestra new form

Figura 24

Aquesta finestra s'obre en iniciar el programa i mostra un menú que permet:

¾ Seleccionar entre un conjunt de plantilles prefabricades o bé creades per l'usuari (A l'esquerra), amb la corresponent previsualització de la pròpia plantilla (A la dreta), per si n'hi ha alguna que s'adapti al projecte a realitzar. Com a opcions figuren:

• Dialog with buttons bottom :Per crear un quadre de diàleg amb els botonsd'acceptar o cancel∙lar a la part de baix a la dreta de la finestra.

• Dialog with buttons right: El mateix tipus de finestra que l'anterior, però ara amb els botons d'acceptar i cancel∙lar a la part de dalt a la dreta.

• Dialog without buttons: Finestra de diàleg sense botons.

Departament d’electrònica 54

Guia d’aprenentatge de QT sobre Linux Embedded

• Main: Per crear una finestra principal del programa. La plantilla proporciona una interfície buida amb una barra d'eines per omplir i parametritzar.

• Widget: Proporciona un widget buit (Veure apartat de widgets per a més informació sobre els mateixos).

¾ Sota Aquestes plantilles apareix la opció per si es vol que aquesta finestra aparegui sempre en iniciar el programa. Si es desmarca, només apareixerà quan creem algun element nou (Veure apartat del Menú File).

¾ A La part de sota de la finestra, tenim una sèrie de botons dels quals tot seguit es detalla la funció:

• Open : Permet obrir un arxiu d'interfície existent.

¾ Recent: Mostra una llista d'arxius d'interfície creats recentment. Compta amb la única sub opció de buidar la llista.

• Close: Tanca la finestra New Form.

• Create: Confirma la selecció de la plantilla que sigui i crea la interfície corresponent per poder començar a dissenyar‐la.

™ La finestra Qt Designer (Principal)

Departament d’electrònica 55

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 25

Aquesta és la finestra principal de l'aplicació, i per extensió la més complexa i la que reuneix més funcionalitats del programa. Quan es tanca aquesta finestra es tanca el programa, la qual cosa no passa amb cap de les altres. A dins es troben (Per ordre descendent en pantalla):

¾ El menú principal: Bàsic per al maneig de l'aplicació. Podeu trobar la seva explicació detallada al corresponent apartat del manual. ¾ La barra d'eines: També bàsica en l'ús del programa, trobareu la seva explicació a l'apartat corresponent del manual. ¾ Un catàleg que conté widgets estàndards facilitats per a la creació d'interfícies i elements contenidors i d'organització per tal d'aconseguir unes interfícies degudament equilibrades. També s'hi afegiran els custom widgets creats pel

Departament d’electrònica 56

Guia d’aprenentatge de QT sobre Linux Embedded

propi usuari. Poden trobar‐se exemples resolts que usen varis d'aquests elements a l'apartat d'exemples d'aquest manual.

Aquest últim punt és el que es desenvolupa de manera més extensa en aquesta part del manual i pretén donar una orientació sobre l'ús de cada element d'aquest submenú. Cal remarcar que aquests elements quan els inserim són “inerts”, és a dir, no fan cap acció per si sols, cal que els connectem a altres elements o amb el formulari en general mitjançant signals i slots si cal amb l'ajuda de l'API de cada element a la llibreria. Per ordre d'aparició descendent, es troben:

¾ Layouts (Organitzadors) :

Els layouts són elements que permeten agrupar els diferents elements distribuïts per la interfície per tal d'assegurar la seva correcta visualització en pantalla. Poden combinar‐se per aquesta finalitat amb els spacers (Al punt següent es veuran). Els layouts un cop creats permetran que els elements que en formin part actuïn com una unitat a l'hora de col∙locar‐los i fixar‐ne la mida, estaran completament sota la gestió del layout (La qual cosa pot anul∙lar‐se ràpidament fent Ctrl + 0 per trencar el layout).

Existeixen 3 tipus diferents de layouts, verticals (Per elements alineats verticalment) , horitzontals (Per elements alineats horitzontalment) i en graella (Forma matricial), els quals poden combinar‐se de diverses maneres i fins i tot auto contenir‐se per tal d'organitzar la interfície.

¾ Spacers: Els spacers són elements delimitadors d'espai que serveixen per mantenir una correcta distribució tant dins d'un layout com entre ells. N'hi ha de dos tipus, horitzontals i verticals. Els dos tipus tenen les mateixes característiques i el fet de triar‐ne un tipus o un altre depèn de la situació en que volem utilitzar‐los.

¾ Buttons: Són elements que s'activen per interacció de l'usuari i permeten activar accions o perfilar opcions. Tenim els següents tipus:

• Push Buttons: Botons tipus acceptar o cancel∙lar.

• Tool Buttons: Botons parametritzables que permeten invocar accions del programa.

• Radio Buttons: Són botons que solen presentar‐se en grups de dos o més per adquirir el seu sentit i permeten triar entre varies opcions , la selecció de les quals és excloent (Només n'hi pot haver una de seleccionada a la vegada).

• Check Boxes: Podríem dir que són caselles de confirmació, que permeten seleccionar o no una opció. A diferència dels radio buttons,

Departament d’electrònica 57

Guia d’aprenentatge de QT sobre Linux Embedded

no cal ni que es presentin amb grup ni que una per força hagi d'estar seleccionada, perquè mostren opcions en principi completament independents.

• Button Box: Possibiliten una conjunt per defecte de botons d'acceptar i cancel∙lar.

¾ Item Views (Model‐Based): Serveixen per mostrar i modificar informació relacionada amb models. El seu ús és molt específic i va lligat a l'ús d'un framework de Qt, el Model/View.

¾ Item Widgets (Item‐Based): Serveixen per mostrar i modificar informació relacionada amb ítems d'un model. El seu ús és molt específic i va lligat a l'ús d'un framework de Qt, el Model/View.

¾ Containers: Són elements purament d'organització i agrupació d'altres elements dins les interfícies, obeint a criteris semàntics. Tenim els següents tipus:

• Group Box: Delimita un marc on agrupar elements.

• Tool Box: Determina l'organització d'elements a partir de pestanyes verticals o pàgines.

• Tab Widget: Proporciona un marc amb pestanyes per separar els elements.

• Stacked Widget: S'assembla molt al Group Box, però en aquest cas compta amb unes fletxes a la part de dalt a la dreta que permeten canviar d'un a l'altre, com si fossin diferents pestanyes.

• Frame: S'usen per incloure i agrupar widgets. La seva raó de ser és que estan pensats per ser usats en contenidors més complexos, com a base d'aquests. Poden incloure el seu propi layout.

• Widget: Contenidor per a widgets.

• Dock Widget: Funcionalment fan el mateix que el Widget, però ofereixen la possibilitat de tancar i restablir, la qual cosa optimitza l'espai del formulari.

¾ Input Widgets:

Aquest apartat és un dels més interessants, ja que proporciona widgets ja implementats els quals només cal interconnectar amb altres elements i que recullen dades d'entrada al sistema a través de l'interfície. Trobem:

Departament d’electrònica 58

Guia d’aprenentatge de QT sobre Linux Embedded

• Combo Box: Permet configurar un desplegable amb opcions alternatives i completament personalitzables (Fent dos clics sobre la Combo Box inserida al formulari accedim al menú d'edició de la mateixa, en la qual podem afegir opcions o bé incloure, per cadascuna d'elles, una imatge).

• Font Combo Box: És una Combo Box que mostra diversos tipus de fonts .

• Line edit: Proporciona una línia de text on es poden introduir caràcters.

• Text Edit: Serveix també per introduir caràcters , però en aquest cas en més quantitat, paràgrafs si es vol.

• Spin Box: Permet incloure un número natural.

• Double Spin Box: Serveix per introduir un nombre real positiu, amb un nombre de decimals predeterminat.

• Date Edit: Proporciona un quadre per fixar una data determinada.

• Time Edit: Proporciona un quadre per fixar una hora determinada.

• Date/Time Edit: Proporciona un quadre per fixar una data i una hora determinades.

• Dial: És una espècie de potenciòmetre que permet regular el que convingui segons a què estigui connectat.

• Horitzontal Scroll Bar: Barra d'scroll horitzontal parametritzable.

• Vertical Scroll Bar: Barra d'scroll vertical parametritzable.

• Horitzontal Slider: Barra d'slide horitzontal.

• Vertical Slider: Barra d'slide vertical.

¾ Display Widgets:

En aquest apartat també es proporcionen widgets ja implementats, però en aquest cas estan destinats a mostrar informació per pantalla no modificable per part de l'usuari. Hi trobem:

• Text Label: És l'equivalent no modificable a Line Edit . Proporciona una línia de text.

Departament d’electrònica 59

Guia d’aprenentatge de QT sobre Linux Embedded

• Text Browser: És un quadre de text.

• Graphics View: Nova funcionalitat de Qt4 per a la visualització de gràfics interactius. És el successor natural del Canvas.

• Calendar: És una aplicació de calendari.

• LCD Number: Panell de números tipus digital.

• Progress Bar: Barra de progrés, com una barra de càrrega d'aplicació, per exemple.

• Horitzontal Line: Línia horitzontal de separació de continguts.

• Vertical Line: Línia vertical de separació de continguts.

¾ Arthur Widgets (Demo):

Són un conjunt de widgets de demostració, ben treballats i implementats, els quals donen una idea bàsica de les possibilitats que ofereix Qt4.

¾ Display Widgets (Examples):

Exemples implementats de widgets de visualització.

¾ Qt3 Support:

Aquí trobem múltiples elements que o bé no eren a la versió 3 del programa o bé la seva implementació ha variat en la versió 4. Serveixen perquè el programa que s'efectuï en aquesta versió , si usa aquest conjunt de widgets, pugui ser compilat per la versió 3, augmentant la portabilitat i la compatibilitat.

™ La finestra signals & slots

Figura 26

Departament d’electrònica 60

Guia d’aprenentatge de QT sobre Linux Embedded

Aquesta finestra s'encarrega de la gestió dels signals i slots de l'aplicació. Al requadre principal apareixeran les connexions principals entre els elements del programa, molt important els conceptes que representen cada columna: • Sender: Element d'origen de la relació, qui detona l'acció. • Signal: Event que provoca o desencadena l'acció. • Receiver: Element que es veu afectat per l'acció detonant al sender. • Slot: Efecte que produeix l'acció a l'element destí (Receiver).

A baix a la dreta de la finestra tenim dos botons.

• : Serveix per afegir una nova connexió a la interfície.

• :Elimina la connexió seleccionada.

A l'apartat de Signals i Slots es tracta en profunditat aquest aspecte del programa, que és fonamental en la creació d'interfícies, ja que és la pedra angular per dotar‐les de funcionalitat.

™ La finestra de propietats

Figura 27

Departament d’electrònica 61

Guia d’aprenentatge de QT sobre Linux Embedded

Aquesta és la finestra que per a cada element de la interfície ofereix una visualització de les seves propietats i dóna la possibilitat de modificar‐les. Per poder veure les propietats d'un objecte de la interfície en aquesta finestra, només cal fer‐hi clic a la finestra d'edició. Cada element té unes propietats comunes i unes de particulars. Les comunes, com el nom de l'element, són aquelles que tenen tots els elements, i les particulars són les pròpies d'aquell tipus d'element. És evident que una Label Text no tindrà les mateixes propietats particulars que un Dial. Les propietats principals comunes i particulars es veuran en els exemples en diferents contextos pràctics i fent referència a diferents alternatives interessants sobre els seus valors.

™ La finestra de recursos

Figura 28

El resource editor és una finestra encarregada de gestionar els fitxers de recursos(.qrc) que podem gestionar amb Qt4. Podem crear‐ne de nous pel projecte actual o agregar‐ ne de ja existents. A més, dins el fitxer de recursos obert, podem afegir‐hi o treure elements.

• : Afegir un nou element a l'arxiu de recursos

• : Treure una entrada del fitxer de recursos.

• : Afegir un nou arxiu a la nostra llista de recursos.

El funcionament dels arxius de recursos està explicat a l'apartat de Compilació i fitxers destacats d'una aplicació Qt4.

Departament d’electrònica 62

Guia d’aprenentatge de QT sobre Linux Embedded

™ A.2.1.6 – La finestra object inspector

Figura 29

La finestra Object Inspector és útil per saber en cada moment quins elements existeixen al formulari en edició. Ho mostra de manera jeràrquica. Fent clic sobre qualsevol element aquest es selecciona dins l'edició del formulari.

Aquesta finestra és particularment útil per a projectes grans, en que cada finestra té molts elements, i a l'hora de fer‐hi les connexions es vol saber quin element és quin.

™ La finestra de gestió d'accions

Figura 30

Aquesta finestra és la que serveix per gestionar accions creades en la interfície de Qt4 Designer Permet:

• : Crear una nova acció. Obre la següent pantalla:

Departament d’electrònica 63

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 31

Aquesta finestra permet donar un nom a l'acció, la qual cosa genera un nom d'objecte per defecte, i proporcionar‐li una icona, bé des d'arxiu d'imatge directament o des d'un fitxer de recursos prèviament configurat, malgrat que és opcional.

• : Esborra l'acció seleccionada.

• : Aquest camp és de cerca. Fa un filtre segons el qual només mostra les accions que contenen el text introduït.

™ El menú principal

Figura 32

En aquest apartat del manual es tractarà el menú de la finestra principal, així com les seves opcions i subopcions. Si s'hi fa una ullada, es podran veure els següents apartats a considerar.

Menú Accés ràpid per teclat File Alt+F Edit Alt+E Form Alt+O Tools Alt+T

Departament d’electrònica 64

Guia d’aprenentatge de QT sobre Linux Embedded

Window Alt+W Help Alt+H

¾ File (Arxiu):

Figura 33

Aquesta opció conté controls bàsics sobre la pròpia aplicació: • New form: ¾ Opció per crear un nou formulari o part d'interfície gràfica. La seva selecció obre la finestra de New form.

¾ Accés ràpid per teclat: Ctrl+N des del programa principal o Alt+ N des del menú File.

• Open Form:

¾ Obre un formulari existent (Fitxer .ui).

¾ Accés ràpid per teclat: Ctrl+O des del programa principal o Alt+O des del menú File.

• Recent Forms:

¾ Mostra els últims formularis editats per poder‐los obrir de manera més còmode i ràpida. ¾ Accés ràpid per teclat: Alt+R des del menú File.

• Save Form:

Departament d’electrònica 65

Guia d’aprenentatge de QT sobre Linux Embedded

¾ Guarda les modificacions efectuades al projecte en curs.

¾ Accés ràpid per teclat: Ctrl+S des del programa principal o Alt+S des del menú File.

• Save Form As... :

¾ Obre una finestra en que se'ns demana el nom que volem donar a l'arxiu .ui i on el volem desar. ¾ Accés ràpid per teclat: Alt+A des del menú File.

• Save All Forms :

¾ Si estem treballant amb més d'un formulari a la vegada, permet guardar les modificacions fetes a tots ells de cop. ¾ Accés ràpid per teclat: Ctrl+Shift+S des del programa principal o Alt+L des del menú File.

• Save Form As Template:

¾ Permet guardar el formulari que estem dissenyant com a plantilla, és a dir, que ens aparegui en el menú New Form per tal que el poguem seleccionar per defecte. Si hi cliquem apareix la pantalla següent, en la que li hem de donar un nom i una ubicació, que per defecte és la del directori de motlles del programa.

Figura 34

Després, si cliquem a New form , veurem que ens apareix a la llista.

Departament d’electrònica 66

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 35

¾ Accés ràpid per teclat: Alt+T des del menú File.

• Close Form:

¾ Tanca un formulari, però no el programa ¾ Accés ràpid per teclat: Ctrl+W des del programa principal o Alt+C des del menú File.

• Quit:

¾ Surt de l'aplicació. ¾ Accés ràpid per teclat: Crtl+Q des del programa principal o Alt+Q des del menú File.

Edit :

Figura 36

Departament d’electrònica 67

Guia d’aprenentatge de QT sobre Linux Embedded

Aquest apartat conté majoritàriament opcions que incideixen en l'edició dels formularis. Trobem: • Undo:

¾ Desfà l'última acció efectuada en l'edició del formulari. ¾ Accés ràpid per teclat: Ctrl+Z des del programa principal.

• Redo:

¾ Refà l'última acció que havíem desfet. ¾ Accés ràpid per teclat: Ctrl+Shift+Z des del programa principal.

• Cut:

¾ Treu l'element seleccionat del formulari i el posa al porta papers per tal que es pugui posar a un altre lloc i més d'una vegada, si així es desitja. Ull! Si es tallen dues coses per separat, només la segona es guardarà al porta papers, ja que aquest només guarda un element o un conjunt d'elements seleccionats alhora. ¾ Accés ràpid per teclat: Ctrl+X des del programa principal o bé Alt+T des del menú Edit.

• Copy:

¾ Si s'efectua aquesta operació sobre un element, aquest queda al mateix lloc on és, però se'n guarda una copia idèntica (Amb les mateixes propietats i connexions) al porta papers. Ull! Recordar que només es pot copiar un o un conjunt d'elements seleccionats alhora, per les propietats del porta papers. Si hi ha un element o conjunt d'elements tallat al porta papers i copiem alguna cosa, desapareixerà. ¾ Accés ràpid per teclat: Ctrl+C des del programa principal o bé Alt+C des del menú Edit.

• Paste:

¾ Enganxa al formulari el contingut del porta papers. ¾ Accés ràpid per teclat: Ctrl+V des del programa principal o bé Alt+P des del menú Edit.

• Delete:

¾ Elimina l'element seleccionat. ¾ Accés ràpid per teclat: Tecla Supr des del programa principal o bé Alt+D des del menú Edit.

• Select All:

Departament d’electrònica 68

Guia d’aprenentatge de QT sobre Linux Embedded

¾ Selecciona tots els elements del formulari que s'estigui editant en aquell moment. ¾ Accés ràpid per teclat: Ctrl+A des del programa principal o bé Alt+A des del menú Edit.

• Send To Back:

¾ Endarrereix vers l'espectador (Envia cap enrere) l'element en l'ordre de mostra dels diferents elements del formulari. ¾ Accés ràpid per teclat: Ctrl+K des del programa principal o bé Alt+B des del menú Edit.

• Send to Front:

¾ Apropa cap a l'espectador (Superposa) l'element seleccionat del formulari. ¾ Accés ràpid per teclat: Ctrl+L des del programa principal o bé Alt+F des del menú Edit.

• Edit Widgets:

¾ Mode de visualització de formularis estàndard de l'aplicació. La vista d'un formulari concret seria, per exemple, la següent:

Figura 37

¾ Accés ràpid per teclat: F3

• Edit Signals/Slots:

¾ Mode de visualització que ens dóna informació sobre els signals i slots del formulari en edició. Seguint l'exemple anterior, seria aquesta vista:

Departament d’electrònica 69

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 38

¾ Accés ràpid per teclat: F4

• Edit Buddies:

¾ Mode d'edició de buddies. ELs buddies són relacions entre una etiqueta i un camp que pugui rebre dades, com un LineText. En el cas d'exemple, com que no hi ha cap Label no s'hi pot establir cap buddie.

• Edit Tab Order:

¾ Mostra l'ordre dels elements d'entrada de dades per teclat dins el formulari i permet modificar‐lo, fent clic sobre el propi ordre mostrat. Seguint l'exemple, la captura seria així:

Figura 39

• Preferences...:

¾ Obre la finestra de preferències per l'edició d'interfícies,que és el següent:

Departament d’electrònica 70

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 40

Podem retocar múltiples aspectes de l'editor, en ordre descendent: • Si volem que el programa estigui composat per finestres independents (Multiple top‐level windows) o bé un bloc de totes les finestres, una vista més estàndard (Docked Windows). • La font per defecte que usa l'editor per als formularis. • La mida de la quadrícula que apareix de fons als formularis per alinear elements o eliminar‐la. (A la part dreta) Afegir nous directoris de plantilles de formularis per defecte).

¾ Form:

Departament d’electrònica 71

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 41

A l'apartat Form hi trobarem opcions d'edició generals del formulari en edició, així com de la seva visualització:

• Lay Out Horitzontally:

¾ Estableix pel formulari actual un layout horitzontal automàticament a tots els elements del formulari en edició. ¾ Accés ràpid per teclat: Ctrl+1 des del programa principal o bé Alt+H des del menú Form. ¾ • Lay Out Vertically:

¾ Estableix pel formulari actual un layout vertical automàticament a tots els elements del formulari en edició. ¾ Accés ràpid per teclat: Ctrl+2 des del programa principal o bé Alt+V des del menú Form. ¾ • Lay Out Horitzontally in Splitter:

¾ Estableix un layout horitzontal amb separadors mòbils. ¾ Accés ràpid per teclat: Ctrl+3 des del programa principal o bé Alt+P ¾ des del menú Form.

• Lay Out Vertically in Splitter:

¾ Estableix un layout verticals amb separadors mòbils. ¾ Accés ràpid per teclat: Ctrl+4 des del programa principal o bé Alt+L des del menú Form.

Departament d’electrònica 72

Guia d’aprenentatge de QT sobre Linux Embedded

• Lay Out in Grid:

¾ Estableix automàticament per tots els elements del formulari en edició un a Grid Layout . ¾ Accés ràpid per teclat: Ctrl+5 des del programa principal o bé Alt+G des del menú Form.

• Break Layout:

¾ Trenca el layout seleccionat o bé el general que s'hagi creat anteriorment. ¾ Accés ràpid per teclat: Ctrl+0 des del programa principal o bé Alt+B des del menú Form.

• Adjust Size:

¾ Ajusta de manera automàtica la mida del formulari en edició. ¾ Accés ràpid per teclat: Ctrl+J des del programa principal o bé Alt+S des del menú Form.

• Preview In:

¾ Permet retocar les preferències de visualització de la interfície en edició, i fa una previsualització del formulari en el format seleccionat.

• Preview:

¾ Permet fer una previsualització del formulari en edició per veure com quedarà un cop acabada i en funcionament. ¾ Accés ràpid per teclat: Ctrl+R des del programa principal o bé Alt+Pr des del menu Form.

• Form Settings...:

Departament d’electrònica 73

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 42

¾ En aquest menú s'hi pot introduir el nom de l'autor, jugar amb la graella de punts orientativa que hi ha al fons del formulari en edició, etc.

¾ Tools:

Figura 43

L'apartat de Tools permet retocar les preferències en quant a la interfície del programa d'edició, sobre quines finestres es volen tenir a la vista (Les marcades amb la confirmació) i les que no. A part, a l'apartat Toolbars podem fer el mateix però en aquest cas per les barres d'eines.

¾ Window:

Departament d’electrònica 74

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 44

Aquesta pestanya fa referència a la visualització de la pròpia aplicació. S'hi pot observar:

• Minimize:

¾ Minimitza el formulari en edició. ¾ Accés ràpid per teclat: Ctrl+M des del programa principal o bé Alt+M des del menú Form.

• Bring All To The Front:

¾ Posa totes les finestres del programa a la vista de l'usuari, molt útil si s'està treballant en mode Multiple top‐level windows (Menú Edit > Preferences...)

• Relació de formularis oberts:

¾ És una llista dels formularis oberts en aquell moment. Seleccionant‐ne un s'aconseguirà que passi a primer nivell en pantalla, és a dir, davant de tot.

¾ Help:

Departament d’electrònica 75

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 45

L'últim dels apartats del menú conté informació sobre el producte i l'accés al manual d'ajuda. Cal remarcar l'apartat About Plugins, que resultarà bàsic a l'hora d'inserir custom widgets a l'aplicació. Per a més informació, consultar l'apartat de widgets i custom widgets. No s'explicarà cap altre dels subapartats en aquest manual, doncs són de comprensió immediata i no aporten res sobre l'edició de formularis.

™ La barra d'eines

Figura 46

La barra d'eines es troba, per defecte, just sota el menú principal del programa. Aquesta barra ens permet seleccionar opcions que ja estan explicades a l'apartat del menú, són accessos directes a aquestes opcions. A més, per tal d'augmentar la funcionalitat, la barra d'eines no és un conjunt indivisible, sinó que està formada per 4 components, els quals es poden mostrar o no (Menú Tools > Toolbars) i es poden canviar de lloc a la finestra per separat arrossegant‐los a partir del botó de la dreta de cadascun d'ells, marcat en la captura següent per una rodona vermella. A continuació es detallarà, component per component, el que fa cada botó:

Departament d’electrònica 76

Guia d’aprenentatge de QT sobre Linux Embedded

¾ Barra de File:

Figura 47

• New form:

• Open Form:

• Save Form:

¾ Barra d'Edit: ¾

Figura 48

• Cut:

• Copy:

• Paste:

Departament d’electrònica 77

Guia d’aprenentatge de QT sobre Linux Embedded

• Send to back:

• Bring To Front:

¾ Barra de Tools (Realment conté opcions del menú Edit):

Figura 49

• Edit Widgets:

• Edit Signals/Slots:

• Edit Buddies:

• Edit Tab Order:

¾ Barra de Form:

Figura 50

Departament d’electrònica 78

Guia d’aprenentatge de QT sobre Linux Embedded

• Lay Out Horitzontally:

• Lay Out Vertically:

• Lay Out Horitzontally in Splitter:

• Lay Out Vertically in Splitter:

• Lay Out in Grid:

• Break Layout:

• Adjust Size:

Departament d’electrònica 79

Guia d’aprenentatge de QT sobre Linux Embedded

7 Aplicacions QT.

En aquest punt realitzarem un exemple pràctic on es realitzarà un petit driver de control que instal∙larem a la nostra plataforma Ares21, i a continuació es realitzarà una aplicació QT la qual interaccionarà amb aquest driver.

Amb aquest exemple senzill, intentarem que el usuari pugui entendre i posar en pràctica de la manera més ràpida, com des de la capa més externa, arribar directament al hardware de la nostra plataforma.

7.1 Creació del driver

Per crear el driver, generem tres fitxers:

• El makefile • Driver.C • Driver.h

Makefile

Aquest fitxer indica, on s’han d’anar a buscar les instruccions per poder compilar el driver. A continuació es mostra el codi que hem posat en el Makefile:

CC=arm‐linux‐gcc //Compilador

LD=arm‐linux‐ld //Llibreries que necessita

KER_INC := /home/carlos/BSP_32/Kernel/linux‐2.4.20/include //On hi és

LIB_INC := /usr/local/arm/lib/gcc‐lib/arm‐linux/3.2.3/include

CFLAGS := ‐O ‐s ‐Wall ‐D__GNUC__=3 ‐DMODULE ‐D__KERNEL__ ‐march=armv4 ‐ nostdinc ‐I‐ ‐I. ‐I$(KER_INC) ‐idirafter $(LIB_INC) all: clean step_up //step_up ésel nom del driver step_up:step_up.c //el *.c que compilarem $(CC) $(CFLAGS) ‐c step_up.c clean: rm ‐f *.o //quan fem un make clean, realitzarà un rm.

Departament d’electrònica 80

Guia d’aprenentatge de QT sobre Linux Embedded

Driver.C

En aquest codi, s’introduirà totes les funcions que necessitem per interactuar amb el nostre hardware o altres drivers. També es prepara perquè pugui ser accedit i consultat des de altres capes del sistema, com per exemple lies llibreries QT’s.

A continuació s’escriu un petit codi com a mode exemple on servirà per interactuar amb el driver de la pantalla i un step_up, per tal de reduir el consum al màxim.

//AQUEST DRIVER S'ENCARRREGA DE CONTROLAR EL STEP_UP I ELS LEDS QUE IL.LUMINEN LA PANTALLA //AMB L'OBJECTIU DE REDUIR EL CONSUM. // BY CHARLIE

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

#include #include #include #include #include

#include #include //#include"step_up.h"

Departament d’electrònica 81

Guia d’aprenentatge de QT sobre Linux Embedded

#include "/home/carlos/BSP_32/Kernel/linux‐2.4.20/include/asm/arch/gpio.h" #include "/home/carlos/BSP_32/Kernel/linux‐ 2.4.20/include/asm/arch/hardware.h" #include"/home/carlos/BSP_32/Kernel/linux‐2.4.20/include/asm‐arm/arch‐ mx2ads/mx2.h"

#define MAX_ID 0x14 #define APAGA_PANTALLA 1 #define ENCEN_PANTALLA 2 #define ACTIVA_5V 3 #define APAGA_5V 4 #define CONSULTA_TOUCH 5 #define MODULE_NAME "stepUp"

#define INFO(fmt, args...) \ { \ printk("\n"); \ printk(fmt, ## args);\ }

//VARIABLE GLOBAL static int ret = 2; static int g_step_major=0; static devfs_handle_t g_devfs_handle; static struct tasklet_struct step_tasklet; //<<<<

//static struct timer_list pantalla_timer; static int step_up_ioctl (int dev, struct file *filp,unsigned int cmd, unsigned long arg); static int r_init(void); static void r_cleanup(void); static void Activa_Step_Up(void); static void Apaga_Step_Up(void);

//init_timer(&pantalla_timer); //CALCULAREM EL TEMPS D'INACTIVITAT DE LA DAS struct file_operations g_step_fops = { .open = r_init, .release = r_cleanup, .ioctl = step_up_ioctl, }; static int step_up_ioctl(int dev, struct file *filp,unsigned int cmd,unsigned long arg) //int digi_ioctl(struct inode * inode,struct file *filp,unsigned int cmd ,unsigned long arg) { unsigned long* nou = (unsigned long*) arg; //printk ("\n<1>CMD: %d\n",cmd); //printk ("\n<1>ARG:%d",arg); switch (cmd) {

case APAGA_PANTALLA: _reg_LCDC_LPCCR &= ~0xff; ret = 7

Departament d’electrònica 82

Guia d’aprenentatge de QT sobre Linux Embedded

; break;

case ENCEN_PANTALLA: //EN EL DRIVER DEL TOUCH FAIG QUE ES TORNI A ENCENDRE QUAN ES TOCA EL TOUCH _reg_LCDC_LPCCR |= 0xff; ret = 3; break;

case ACTIVA_5V: // L'estep up en concret ens permet pujar l'alimentacio als 5v, necessari per audio, pantalla, usb. Activa_Step_Up(); ret = 4; break;

case APAGA_5V: Apaga_Step_Up(); ret = 6; break;

case CONSULTA_TOUCH: // ENS PERMET SAVER SI ENS HAN APRETAT EL TOUCH EN UN INSTANT if((_reg_GPIO_SSR(GPIOE) & 0x00000400) == 0) {ret = 5;} else{ ret = 0;} //printk ("\n<1>VALOR TOUCH: %d\n",ret); break; } return ret; }

static void Activa_Step_Up(void) { //ENCENC STEP_UP _reg_GPIO_DDIR(GPIOF)=_reg_GPIO_DDIR(GPIOF)|(0x00000200); _reg_GPIO_DR(GPIOF)=_reg_GPIO_DR(GPIOF)|(0x00000200); _reg_GPIO_GIUS(GPIOF)=_reg_GPIO_GIUS(GPIOF)|(0x00000200); _reg_GPIO_OCR1(GPIOF)=_reg_GPIO_OCR1(GPIOF)|(0x000C0000); _reg_GPIO_GPR(GPIOF)=_reg_GPIO_GPR(GPIOF)&(0xFFFFFDFF); } static void Apaga_Step_Up(void) { //APAGO STEP_UP _reg_GPIO_DDIR(GPIOF)=_reg_GPIO_DDIR(GPIOF)|(0x00000200); _reg_GPIO_DR(GPIOF)=_reg_GPIO_DR(GPIOF)&(0xFFFFFDFF); _reg_GPIO_GIUS(GPIOF)=_reg_GPIO_GIUS(GPIOF)|(0x00000200); _reg_GPIO_OCR1(GPIOF)=_reg_GPIO_OCR1(GPIOF)|(0x000C0000); _reg_GPIO_GPR(GPIOF)=_reg_GPIO_GPR(GPIOF)&(0xFFFFFDFF); // _reg_GPIO_DR(GPIOF)=_reg_GPIO_DR(GPIOF)|(0x00000000);

}

/** * @brief Verify if the inode is a correct inode * @param pInode inode to be check. * @return @li Zero on success. * @li None‐zero on failure. */ int check_device(struct inode *pInode) {

Departament d’electrònica 83

Guia d’aprenentatge de QT sobre Linux Embedded

int minor; kdev_t dev = pInode‐>i_rdev;

if( MAJOR(dev) != g_step_major) return ‐1;

minor = MINOR(dev);

if ( minor < MAX_ID ) return minor; else return ‐1; } static void step_tasklet_action(unsigned long data) { } static int r_init(void) { //init_timer(&pantalla_timer); //CALCULAREM EL TEMPS D'INACTIVITAT DE LA DAS //mod_timer(&pen_pantalla, 100); Activa_Step_Up();//echo" up engegat" //if(register_chrdev(222,"stepup",&my_fops)){ // printk("<1>El registro ha fallado");} if ( g_step_major < 0 ) { printk("<1>%s driver: Unable to register driver\n",MODULE_NAME);

return ‐ENODEV; } tasklet_init(&step_tasklet, step_tasklet_action,(unsigned long)0); g_devfs_handle = devfs_register(NULL, MODULE_NAME, DEVFS_FL_DEFAULT, g_step_major, 0, S_IFCHR | S_IRUSR | S_IWUSR, &g_step_fops, NULL);

return 0; } static void r_cleanup(void) { tasklet_kill(&step_tasklet); Apaga_Step_Up(); //echo "step up apagat" printk("<1>Adios\n"); unregister_chrdev(222,"stepup"); return ; } module_init(r_init); module_exit(r_cleanup);

Driver.H

Departament d’electrònica 84

Guia d’aprenentatge de QT sobre Linux Embedded

En aquest exemple no s’ha utilitzat perquè tenim definides molt poques funcions, però per definir constants, o les diferents funcions a utilitzar pot ser molt útil. Un petit exemple seria el següent:

#ifndef _STEP_UP_H #define _STEP_UP_H

//A continuación todas las librerÃas que hemos necesitado.

#include #include #include #include #include #include

//Las librerÃas que siguen a continuación son para los registros internos del MX21 que //ya explicaremos en los siguientes capÃtulos.

#include "/home/carlos/BSP_32/Kernel/linux‐2.4.20/include/asm/arch/gpio.h" #include "/home/carlos/BSP_32/Kernel/linux‐ 2.4.20/include/asm/arch/hardware.h" #include"/home/carlos/BSP_32/Kernel/linux‐2.4.20/include/asm‐arm/arch‐ mx2ads/mx2.h"

//La declaración de las variables y de las funciones.

//char my_data[80]="hi from kernel"; /* our device */ //int mx2_gpio_set_bit(int port, int bitnum, int value); //int my_open(struct inode *inode,struct file *filep); //int my_release(struct inode *inode,struct file *filep); /*struct file_operations my_fops={ open: my_open, release:my_release,

};

int my_open(struct inode *inode,struct file *filep) { return 0; } int my_release(struct inode *inode,struct file *filep) { return 0; } */

#endif

Departament d’electrònica 85

Guia d’aprenentatge de QT sobre Linux Embedded

Un cop escrit el driver, es fan les crides del “make” a la línea de comandes i si no hi ha cap error en el codi, se’ns generarà un fitxer anomenat “driver.o”, que serà el que haurem d’incloure en la nostra plataforma, incloent‐lo en el sistema de fitxers o a través d’un Pen drive i copiant‐lo a dins la carpeta drivers. Un cop allà, s’haurà de fer la crida de la instrucció “insmod driver.o”, perquè aquest es posi en funcionament.

7.2 Creació de l’aplicació

En aquest punt generarem una aplicació QT que interactuï amb el driver esmentat.

Inicialment creem un projecte tal com s’ha explicat a en l’apartat anterior. En el QTdesigner3, QTDesigner 4 o QT Creator, funcionen de la mateixa manera, són les evolucions respectives. El Següent exemple està fet des de QTDesigner3 ja que és sobre el que s’ha treballat en la major part d’aquest temps.

Primer de tot, fem un new‐ File‐ widget.(new form‐Widget).

Figura 51 Aquesta serà la finestra on treballarem i posarem la nostra part gràfica per més tard escriure en el respectiu fitxer *.ui.h el codi que volem que executi.

Departament d’electrònica 86

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 52

En aquesta captura podem observar 3 butons, En dos botons, els hi hem posat una imatge de fondo més agradable per millorar l’aspecte visual. En l’altre, l’hem deixat tal d’origen perquè es vegi la diferència.

Abans d’escriure el codi, hem de connectar cada botó amb alguna de les funcions que nosaltres més tard crearem. Això ho trobem a la finestra signals & slots( connections).

Departament d’electrònica 87

Guia d’aprenentatge de QT sobre Linux Embedded

Figura 53

Aquí ho configurem de tal manera que els dos botons que tenen imatges realitzin aplicacions m’entres l’altre al clickar, sortírem de l’aplicació.

Ara en el respectiu *ui.h, escrivim el codi per tal d’executar diferents aplicacions en els moment que ens premem cada un dels botons.

#include #include #include #include #include #include #include //LLIBRERIES PER CONTROLAR PORTS MX21 //#include "/home/carlos/BSP_32/Kernel/linux‐2.4.20/drivers/char/step_up.h" //#include"/home/carlos/Driver step_up/step_up.h"

// ***************CONSTANTS PER PARLAR AMB EL DRIVER STEP_UP******************************** #define APAGA_PANTALLA 1 #define ENCEN_PANTALLA 2 #define ACTIVA_5V 3 #define APAGA_5V 4 #define CONSULTA_TOUCH 5

//init() En aquesta funció cridem el driverque hem creat enateriormentper poder accedir a les seves funcions. void MainForm::init() {

Departament d’electrònica 88

Guia d’aprenentatge de QT sobre Linux Embedded

system("insmod /drivers/step_up.o"); dev = open("/dev/stepUp",O_RDWR); //llegim el valor del driver printf ("DEV PANTALLA:%d",dev); tocatTouch = 0; } Aquesta funció es cridada quan premem un dels botons. El que fa és generar una altre widget un hi hauran nous botons. void MainForm::alarma() { printf("menu hora"); data="34"; CanviHora *hora = new CanviHora( this); printf("tot va fent"); printf("\n\n%d\n\n%d\n\n%d\n\n",dias,mess,horaactuals); hora‐>resize(640,480); cert=1; hora‐>show(); }

En aquesta funció que ve a continuació es fan crides al driver, en aquest cas per controlar la lluminositat de la pantalla. Utilitzem un timer per saber el temps que està passant. void MainForm::timerEvent( QTimerEvent * e ) {

unsigned long arg =1024; //printf ("DINS TIMER"); int valor = ioctl(dev,CONSULTA_TOUCH,(unsigned long)&arg); //consultem si ens han apretat el touch //printf("llegim touch:%d\n",valor);

if (valor == 5){ tocatTouch = 0; ioctl(dev,ENCEN_PANTALLA,(unsigned long)&arg);} // si es apretem el touch resetegem el contador de apgar la pantalla int id = e‐>timerId(); mseg++; if (mseg==1000) //10 segons { mseg=0;tocatTouch++; //printf ("\ntocatTouch:%d\n",tocatTouch); }

if (tocatTouch > 2) //SI NO ENS APRETEN EL TOUCH EN 30 seg, APAGUEM LA //PANTALLA PER REDUIR CONSUM { int be = ioctl(dev, APAGA_PANTALLA,(unsigned long)&arg); //_reg_LCDC_LPCCR &= ~0xff; //printf("APAGUEM PANTALLA:%d\n",be); } MostremHora(); VerificaAlarma();

}

El botó que hem configurat per sortir, automàticament surt de l’aplicació, però també podríem escriure el seu codi per si volem fer coses abans de que es tanqui l’aplicació.

Departament d’electrònica 89

Guia d’aprenentatge de QT sobre Linux Embedded

L’altre botó, mensual, ens cridarà a un widget que per exemple mostrarà una imatge de fondo. void MainForm::mensual() {

printf("\nFOTO\n"); fotogra *foto = new fotogra (this); foto‐>resize (620,480); foto‐>show();

}

Un cop escrit tot el codi, només queda generar el main.cpp i compilar l’aplicació. Per crear el main.cpp, podem anar a file, new main.cpp o el generem nosaltres amb un editor. L’haurem de guardar a la mateixa carpeta on tenim l’aplicació.

Allà escriurem el següent codi:

#include #include "mainform.h" #include #include "CanviHora.h" #include #include

int main( int argc, char ** argv ) { //Inicialitzem variables int hora=0; int dia=0; int mes=0; int alarm=0; bool ala = FALSE; bool cronome = FALSE; int run = 0;

//Inicialitzacions(); printf("\n\nINICIALITZEM EL PROGRAMA\n\n");

//Cridem el widget que nosaltres hem creat

QApplication a( argc, argv ); MainForm w(0,0,Qt::WStyle_Customize|Qt::WStyle_NoBorder);

//utilitzem funcionsfuncions caracateristiques dels widgets per inicialitzar l’aplicacio correctament

w.Principis(dia,mes,hora,alarm,ala,cronome,run);//li passem les variables inicials w.resize(640,480); //resolució de la pantalla w.show(); //Es mostra la pantalla i el codi es queda aquí fins que sortim de l’aplicació. Departament d’electrònica 90

Guia d’aprenentatge de QT sobre Linux Embedded

return a.exec(); }

Ara ja només falta compilar el programa i carregar‐lo al Mx21, per fer‐ho haurem de seguir les següents instruccions. Explicarem la manera de compilar tant pel PC i d’aquesta manera poder executar l’aplicació en el PC. I la segona part explica com compilar‐la per el MX21.

PEL PC

1.‐ Un cop realitzat el programa en el QTDESIGNER, aleshores posem la següent instrucció dins la carpeta que tinguem fet el programa dins la consola

./qmake ‐o Makefile metric.pro

//si ens diu que no hi ha el make, es perque hem de crear un enllaç a on es //troba el make, per fer‐ho, introduim la seguent instruccio. ln ‐s /home/carlos/qt‐embedded‐free‐3.3.4/qmake/qmake qmake

//el make final es el nom de lenllaç make //Compila el programa i genera el executable

./metric //executem el programa.

EN ARM

1‐Abans de tot hem de tenir la qt‐embedded‐free‐3.3.4‐arm crosscompilada

Després un cop realitzada l’aplicació, fem les següent instruccions.

./qmake ‐spec /home/carlos/qt‐embedded‐free‐3.3.4‐arm/mkspecs//qws/linux‐arm‐ g++ ‐o Makefile metric.pro

//dins el qws veiem que tenim el format en que volem que compili, nosaltres //agafem linux‐arm‐g++

make //si ens dona un error en la libqte es perquè no esta ben //direccionada la direcció de les llibreries. Si fem un:

Departament d’electrònica 91

Guia d’aprenentatge de QT sobre Linux Embedded echo $QTDIR //ens mostra on estan actualment, i per variar on apunten fem un:

export QTDIR=/home/carlos/qt‐embedded‐free‐3.3.4‐arm //igualem a la carpeta on tenim //la llibreria

./metric //veiem que no s'executa ,ja que l’aplicació nomes serveix pel micro.

Un cop tenim l'executable de l’aplicació creada, aleshores l'hem de copiar a la carpeta que comprimirem per carregar la micro i ens crearà l' arxiu *.jffs2.

En el nostre cas copiem dins la carpeta “sistema de fitxers” l'executable. I a continuació creem el fitxer per carregar al micro amb la següent instrucció.

carlos@pccarlos:~/MX21> mkfs.jffs2 ‐d SistemaFitxers/ ‐e 64 > proba.jffs2

Ara hem de carregar l’aplicació al MX21

Breu resum de com carregar l’aplicació al mx21.

Suposant que el bootloader ja esta carregat, s'ha de carregar el kernel, i el sistema de fitxers, que és sobretot el que ens interessa desprès d'haver realitzat canvis.

Procediment:

Fem un reset a la placa, i premem una tecla ràpidament, ens sortirà un menú on tenim diferents opcions.

ƒ Opcio 0 es poder canviar el bootloader. ƒ Opcio1 per canviar el kernel. ƒ Opcio2 per canviar el root‐disk.

Seleccionem la que ens interessi i el PC ens detecta con un disc dur extern, arrastrem l’aplicació *.jffs2 al disc dur detectat, i fem la opció de expulsar. Observarem que la placa es carrega, Quan hagi acabat la càrrega ens demanarà polsar el botó de reset. Si es carrega correctament, podrem controlar la placa a traves del minicom.

Un cop estem dins el micro, introduïm les següents instruccions per poder executar les aplicacions.

Departament d’electrònica 92

Guia d’aprenentatge de QT sobre Linux Embedded

export QTDIR=/qt

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib

Per executar l'aplicacio, introduim la instruccio “./nom ‐qws”

Perquè funcioni les llibreries tslib:

export ROOT_DIR=/tslib

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb

export TSLIB_TSDEVICE=/dev/digi

export TSLIB_CALIBFILE=$ROOT_DIR/etc/pointercal

export TSLIB_CONFFILE=$ROOT_DIR/etc/ts.conf

export TSLIB_PLUGINDIR=$ROOT_DIR/lib/ts

export PATH=$ROOT_DIR/bin:$PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ROOT_DIR/lib

export QWS_MOUSE_PROTO=linuxtp:/dev/digi

//ara hem de calibrar el ratoli.

ts_calibrate

Si al executar una aplicacio surt el missatge:

'Could not read calibration: /etc/pointercal'

Aleshores fer un:

cp /tslib/etc/pointercal /etc

nom_aplicacio ‐qws

Departament d’electrònica 93

Guia d’aprenentatge de QT sobre Linux Embedded

Instruccions a donar al mx21,per consola, per carregar fitxers directament des de el USB.

ln ‐s /dev/mtdblock/3 /dev/ram0

cd drivers

insmod usbdcore.o

insmod storage_fd.o

insmod mx2_bi.o

cd

mkdir /carpeta

mount ‐t vfat /dev/mtdblock/3 /carpeta

Instruccions per veure la informació que hi ha dins la targeta SD.

cd drivers

insmod mmcsd.o

cd

ln‐s /dev/mmcsd /dev/ram0

//creem la carpeta on volem veure la informació de la SD, per exemple SD

mkdir SD

mount ‐t vfat /dev/mmcsd SD /muntem la informació de la targeta a la carpeta creada.

INSTRUCCIONS UTILS

lsmod ‐‐>veiem que s’està executant

insmod “nom”‐‐>executem un driver

rsmod “nom”‐‐>deixem d’executar un driver

chmod +x “nom”‐‐>fer que larchiu pugui ser executable

ls ‐lisa‐‐>ens diu tipus de fitxer

ps ‐aux ‐‐>numero que te cada aplicació per poder‐lo utilitzar( kill numero).

Departament d’electrònica 94

Guia d’aprenentatge de QT sobre Linux Embedded

8 Durada estimada del projecte.

Aquesta guia s’ha pogut realitzar gràcies a l’experiència en la realització de diferents projectes:

• DAS (Domestic Assistent System) • PEM • Dinitel • Ares21 • Control Paint

De cadascun d’aquests projectes, s’ha n’ha pogut treure conceptes tant de hardware com de firmware, que ens han ajudat a realitzar aquesta guia.

Han estat un total de 3 anys on s’ha anat recopilant informació i ampliant els coneixements personals com del departament dedicat als embededs i a les seves possibilitats.

Departament d’electrònica 95

Guia d’aprenentatge de QT sobre Linux Embedded

9 Conclusions i línees de futur

Finalment, després de tota la realització del projecte, s’han aconseguit diferents objectius i assolit diferents coneixements.

• Primer de tot s’han aconseguit coneixements en Linux. S’ha hagut de aprendre el funcionament de Linux i la manera d’instal∙lar les coses o com carregar un driver.

• També s’ha conegut el microprocessador i.MX21 de una forma específica ja que cada un dels projectes treballats demanaven especificacions diferents.

• Per últim s’han conegut les llibreries QT amb un nivell alt d’aprenentatge i de coneixement d’aquestes.

Veiem quins objectius s’han aconseguit

• S’ha aconseguit la realització d’una guia per un usuari que no tingués cap coneixement en aquest camp, i que seguint els passos marcats en aquesta guia, pogués iniciar‐se de la manera més ràpida possible a la plataforma Ares21, i sobretot a la programació de firmware per aquesta plataforma.

Línies de futur

• Cal destacar que hi ha molts aspectes a millorar encara. Un d’ells i el més important és hardware. Estem utilitzant una plataforma que utilitza el kernel 2.4 i això ens dóna moltes limitacions de cara als nous programes o noves versions QT’s, ja que aquests estan preparats per treballar sobre el kernel 2.6, i algunes de les seves llibreries o aplicacions, no poden ser crosscompilades per la nostra plataforma. • Ja s’està realitzant feines per solucionar aquests problema. En aquests moment s’està dissenyant una nova plataforma que portarà el MX25, i que resoldrà la major part de les limitacions que tenim en la plataforma actual i no ens permet exprimir al màxim, per exemple, les possibilitats de les llibreries QT’s. • També cal destacar que cada any surten noves versions tant de Linux com de les llibreries QT’s, com també programes i aplicacions per poder programar i millorar l’entorn de programació.

Departament d’electrònica 96

Guia d’aprenentatge de QT sobre Linux Embedded

10 Bibliografia

10.1 Llibres consultats

1. BOVET D.P.; CESATI, M. (2002). Understanding the Linux Kernel. 2a ed. Madrid: McGraw‐Hill. ISBN: 0‐596‐00213. 2. YAGHMOUR, K.; (2003) Building Embedded Linux Systems. 1a ed. New York: O’Reilly. ISBN: 0‐596‐00222‐X 3. FREESCALE LTD (2005). i.MX21 Applications Processor Reference Manual. [en línia] Revisió 2. Disponible a Internet: http://www.freescale.com 4. RUBINI, S.; CORBET, J. (2001). Linux Device Drivers . 2a Ed. New York: O’Reilly. ISBN: 0‐596‐00008‐1.

10.2 Pàgines web consultades

• Documentació sobre el i.MX21 i CPU’s ARM: http://www.freescale.com/ http://www.arm.linux.org.uk/ http://www.arm.com http://www.gnuarm.com

• Documents utilitzats de la web de Freescale:

MC9328MX21RM (Reference Manual) AN2676 (Image Capture with MX21)

• Documentciño referent a les QT http://doc.trolltech.com/3.3/index.html http://qt.nokia.com/

Departament d’electrònica 97