h_da Embedded Technologies-Praktikum 6. Aufgabenblatt QNX Interrupts Prof. Wietzke Build eines QNX-ifs-root-Images Ziele Es soll ein QNX RTOS 6.4.1 Image für das Beagle-Board erstellt werden, auf dem mindestens als Devices die serielle Schnittstelle und die Ethernet-Schnittstelle über einen USB-Ethernet-Adapter angesprochen werden sollen. Außerdem soll die Verbindung via qconn zur QNX-Momentics-IDE funktionsfähig sein. Im ersten Aufgabenteil sollen Sie dann eine eigene einfache Hello-World -Applikation auf dem QNX-Beagle-Board zum Laufen und Debuggen bekommen. Im zweiten Aufgabenteil sollen Sie über den USER-Button auf dem Beagle-Board einen Interrupt, der ein Ein- bzw. Ausschalten der USR0- und USR1-LEDs bewirkt, auslösen. Vorbereitung Auf den Beagle-Boards befindet sich ein X-Loader und ein U-Boatloader, der dann das von Ihnen gebaute QNX-ifs-root-Image mittels einer SD-Speicherkarte laden soll. Sollten Sie über keine vfat-formatierte SD-Karte verfügen, müssen Sie eine solche auf einem Linux-System mit Administrator-Rechten erstellen, z.b. mit dem Konsolen- Kommando sudo mkfs.vfat -F 32 -n "boot" /dev/sdd1 Aufgabenteil 1, QNX Build 1. QNX-Beagle-BSP herunterladen (bsp-nto641-ti-omap3530-evm-beagle- DevBuild.zip) Laden Sie sich von der QNX-Community-Hompage
(http://community.qnx.com/sf/wiki/do/viewpage/projects.bsp/wiki/bspdown_ti_omap_3530_ evm) die neuste Trunk-Version vom Board-Support-Package (BSP) für das Beagle-Board herunter. Für den Download ist ein QNX-Account notwendig. Alternativ laden Sie sich das BSP von der InCarMultimedia-Laborseite herunter. 2. BSP in Momentics-IDE importieren Entpacken Sie das Archiv. Dies wiederum enthält wieder ein Archiv, das eigentliche BSP: bsp-nto641-ti-omap3530-beagle-trunk-201006150402.zip. Importieren Sie nun dieses Archiv als BSP in der Momentics-IDE: File Import QNX QNX Source Package and BSP In der IDE sollten Sie nun zwei neue Ordner bsp-ti-omap3530 (enthält fertig erstelltes ifsroot-image) und bsp-ti-omap3530-scr (Ihr Arbeitsordner, enthält die Sourcen und Build- Scripts für das zu erstellende ifs-root-image). 3. Build-Script für ifs-root-image anpassen Um das ifs-image anzupassen, müssen sie die Datei beagle.build im Arbeitsordner bsp- TI-omap3530-scr/src/hardware/startup/boards/omap3530/ bearbeiten. Fügen Sie sowohl die Funktionalität zum Debuggen pty-manager und pdebug über tcp/ip als zum Initialisieren und Starten des Netzwerkes io-pkt-v4-hc mit Asix-Treiber (devn-asix.so) für USB-Ethernet-Schnittstelle dhcp-client qconn (zur Verbindung mit der Momentics-IDE) hinzu. Dazu müssen Sie sich über die Bedeutung der einzelnen Sektionen in dem Build- Script vertraut machen. 4. Build des ifs-root-images und Export auf die SD-Karte Sie können das ifs-root-image mit einem Rechtsklick auf den BSP-Arbeitsordener Build Project bauen.
Kontrollieren sie den Build-Vorgang in der IDE-Konsole. Ihr korrekt gebautes ifs-root- Image sollte ifs-omap3530-beagle.bin heißen. Abschließend exportieren Sie dieses Image mit einem Rechtsklick auf die SD-Karte. 5. SD-Boot-Script erstellen Erstellen Sie mit dem Editor eine Boot-Script (z.b. qnx_boot_sd.scr ), dass dann vom U- Bootloader nach der Feststellung über eine eingelegte SD-Karte zum weiteren Boot- Vorgang genutzt wird. Beispielhafter Inhalt des Boot-Scripts: echo "hello boot.scr" fatload mmc 0 [Addr] [ifs-image.bin] go [Addr] Da U-Boot dieses Boot-Script nicht als Text-Datei interpretiert, müssen Sie aus diesem Boot-Script ein Image erstellen, das den Namen boot.scr tragen muss: /usr/bin/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "qnx boot from sd" -d qnx_boot_sd.scr boot.scr (Hinweis: Für das Kommando mkimage muss auf dem Linux-Build-Host das Paket ubootmkimage installiert sein. Bei dessen Aufruf den kompletten Pfad angeben, da die QNX- Entwicklungumgebung ebenfalls ein Kommando namens mkimage zur Verfügung stellt.) Abschließend das erstellte boot.scr -Image ebenfalls auf die SD-Karte kopieren. 6. Beagle-Board starten a) USB-Ethernet-Adapter von den QNX-Holzkisten-Targets an das Beagle-Board anschließen. Verwenden Sie nicht die vorinstallierten Adapter, da diese nicht mit dem von QNX bereitgestellten Asix-Treiber kompatibel sind. b) Linux-Host-System via serieller Schnittstelle mit Beagle-Board verbinden. c) SD-Karte in das Beagle-Board einsetzen. d) Minicom-Session auf Linux-Host-System in der Konsole mit Kommando minicom -s starten und konfigurieren
+-----------------------------------------------------------------------+ A - Serieller Anschluss : /dev/ttys0 B - Pfad zur Lockdatei : /var/lock C - Programm zur Rufannahme : D - Programm zum Wählen : E - Bps/Par/Bits : 115200 8N1 F - Hardware Flow Control : Nein G - Software Flow Control : Nein +------------------------------------------------------------+ e) Spannungsversorgung an Beagle-Board anschließen, evtl. Reset-Button des Beagle- Boards betätigen. Beaobachten Sie den Start-Vorgang und unterbrechen Sie u.a. auch den autoboot- Vorgang. Lassen Sie sich mit dem Kommando help alle verfügbaren Kommandos anzeigen. Lassen Sie sich die im U-Boot voreingestellten Umgebungsvariablen (vgl. Kommando printenv) anzeigen. Interpetieren Sie so den autoboot-vorgang. Bei Durchlauf des autoboot-vorgangs sollte dieser ohne Fehlermeldungen durchlaufen werden. Wurde das ifs-root-image korrekt gestartet, sollten Sie beispielsweise mit ifconfig die aktuelle IP oder mit dem Kommando pidin alle aktuell laufenden QNX-Prozesse abfragen können. 7. Erstellen einer Hello World -Applikation Erstellen Sie in der QNX Momentics-IDE eine eigene kleine Hello World -Applikation für QNX auf ARM-Architektur. Compilieren Sie diese und debuggen Sie diese Applikation in der IDE mittels einer QNXqconn-Verbindung auf dem laufenden Beagle-Board.
Aufgabenteil 2 int-routine Auf dem Beagle-Board gibt es einen Taster, der am GPIO-Modul 1 an Pin 7 angeschlossen ist. Zwei Leuchtdioden sind am GPIO-Modul 5 an Pin 21 und 22 angeschlossen. Mit dem Taster soll ein Interrupt ausgelöst werden, der als Primary Interrupt von QNX gehandled wird. Dieses Handling können Sie sich in den mitgelieferten call-out Routinen anschauen. In den Anlagen ist ein rudimentäres test_gpio.c Programm mitgegeben, in denen Sie Ihre unten beschriebenen Code-Snippets einfügen können. Die entsprechenden Stellen sind mit to do gekennzeichnet. Zum Ansprechen der HW müssen Sie sich in Ihrer Applikation zunächst io-privilegien geben und können dann Werte per out32 auf die HW ausgeben. Den Adressbereich der GPIO-Module müssen Sie zuvor mit Basisadresse und Size der Module per mmap in den Adressbereich auf eigene Basepointer mappen. Wenn Sie in der Applikation den gewünschten Interrupt definieren und Ihren eigenen ISR-Handler für Pin 7 registrieren, können Sie sich den int vom Kernel an den ISR-Handler durchstellen lassen. In Ihrem ISR-Handler maskieren Sie den Interrupt gegen neue Aufrufe und geben ein sigevent zurück. Dieses wird dann vom Kernel an die schlafende Applikation durchgestellt, die den Interrupt registriert hatte. Diese User-Applikation kann dann die LEDs an- oder ausschalten. Anschließend muss der Interrupt wieder unmasked werden. Hinweis: Die init_intrinfo.c enthält einen Patch für das Int0-Modul. Ersetzen Sie bitte die Datei und bauen Sie das BSP neu. 2. Hinweis: Sie finden GPIO-Definitionen (#defines für Datenrichtungen etc.) in omap.h und omap2420.h in den BSP Sourcen. Relevante files: projektordner\src\hardware\startup\lib\public\arm\omap.h projektordner \src\hardware\startup\lib\public\arm\omap2420.h projektordner \src\hardware\startup\lib\public\arm\omap3530.h In den Referenzen von TI finden Sie ebenfalls die erforderlichen Adressen und Erklärungen zum GPIO der Link für die aktuelle Version lautet http://www.ti.com/lit/ug/spruf98u/spruf98u.pdf... noch besser ist dieser Link, der wird vmtl. auch für zukünftige Versionen funktionieren: http://processors.wiki.ti.com/index.php/omap35x_technical_reference_manual_(trm)