Embedded Linux en Xilinx Micro Kernel voor System on Chip op FPGA
Studiegebied Industriële Wetenschappen en Technologie Opleiding Elektronica-ICT Afstudeerrichting Ontwerptechnieken Academiejaar 2005-2006
Eindwerk
Rodolf Casier Wim Van Eessen
Voorwoord Bij deze willen wij in eerste plaats de Provinciale Industriële Hogeschool (PIH) bedanken om het mogelijk maken van dit eindwerk. De lokalen en materieel waren op ieder moment beschikbaar om deze thesis te voltooien. Wanneer wij extra technisch materiaal nodig hadden voor deze thesis werd dit zo snel mogelijk besteld door de hogeschool waardoor wij continu konden opbouwen aan dit eindwerk. In tweede instantie willen we onze oprechte dank betuigen aan onze interne promoter ing. Johan Beke. Met zijn kennis en ervaring hadden we een uitstekende basis om dit eindwerk te starten. Hij ondersteunde en begeleidde dit eindwerk gedurende het ganse jaar vol energie en enthousiasme. We willen eveneens Dr. Ir. Danaë Delbeke bedanken voor haar inbreng in deze thesis. Als laatste willen we onze ouders, vrienden en vriendinnen bedanken. Onze ouders hebben het mogelijk gemaakt dat we deze opleiding konden volgen. Met morele en financiële steun hebben ze gedurende deze vierjarige opleiding een sterke bijdrage geleverd aan onze studies. Zij waren er altijd om ons te steunen tijdens de moeilijke momenten dit jaar.
Inhoudsopgave Inleiding................................................................................................................. 1 Deel 1: 1.1
Development Board .............................................................................. 2 Oefenbord Digilent XUPV2P [6] .................................................................. 2
1.1.1
Eigenschappen: .................................................................................... 2
1.1.2
Algemene beschrijving: ......................................................................... 3
1.1.2.1
Blok diagram................................................................................. 3
1.1.2.2
Componenten op het bord ............................................................. 4
Voeding .................................................................................................... 5 Multi-Gigabit Transceivers .......................................................................... 5 Systeem RAM ............................................................................................ 5 Fast Ethernet Interface .............................................................................. 5 Seriële poorten .......................................................................................... 5 LEDs, schakelaars en drukknoppen ............................................................. 6 Expansion Connectors................................................................................ 6 XSGA uitgang ............................................................................................ 6 AC97 Audio CODEC.................................................................................... 6 USB 2 Programming interface..................................................................... 6 1.2
Virtex-II Pro FPGA ..................................................................................... 7
1.2.1
Overzicht.............................................................................................. 7
1.2.2
PowerPC 405 Processor Block ................................................................ 8
1.2.3
Input/Output Blocks (IOBs) ..................................................................11
1.2.4
Configureerbare Logische Blokken (CLBs)..............................................13
1.2.4.1
Block SelectRAM+ Memory............................................................15
1.2.4.2
Shift Registers..............................................................................17
1.2.4.3
3-state Buffers in de CLBs .............................................................18
1.2.4.4
Multiplexers .................................................................................18
1.2.4.5
Overzicht CLB/slice configuratie van XC2VP30 ................................19
1.2.5 1.3
FPGA pin layout informatie ...................................................................20
Virtex-4 MB Development Board ................................................................21
1.3.1
Algemeen overzicht..............................................................................21
1.3.2
Jumpersettings ....................................................................................23
1.3.2.1
RS232..........................................................................................23
1.3.2.2
JTAG Chain ..................................................................................24 I
1.3.2.3 Deel 2:
Configuration Modes.....................................................................25
Xilinx Platform Studio (EDK) .................................................................26
2.1
Invoegen XUPV2P Board Support Package (BSP) ........................................26
2.2
Aanmaken Hardware ontwerp (PPC) op XUPV2P Board ...............................28
2.2.1
Systeem vereiste .................................................................................28
2.2.2
Hardware vereiste ...............................................................................28
2.2.3
PowerPc hardware beschrijving ............................................................28
2.2.4
Project creëren in XPS..........................................................................29
2.2.5
Hardware definiëren ............................................................................31
2.3
Implementatie Software in Hardware project..............................................39 2.3.1
Invoegen van softwarre in hardwareplatform......................................39
2.3.2
Inladen van een software apllicatie in Extern RAM .............................40
2.4
LCD aansturing op Virtex-4 MB Development Board ....................................43
2.4.1
Hardware Invoegen .............................................................................43
2.4.2
Software toevoegen .............................................................................44
Deel 3:
Embedded Operating Systems ..............................................................47
3.1
Inleiding ..................................................................................................47
3.2
Xilinx Micro Kernel ....................................................................................49
3.2.1
Inleiding..............................................................................................49
3.2.2
Xilkernel Onderdelen [1] ......................................................................49
3.2.2.1
Processen, Threads en Scheduling.................................................49
3.2.2.2
Synchronization Constructs ...........................................................52
Semaphoren.............................................................................................52 Mutexen...................................................................................................53 3.2.2.3
Inter- Process Communication.......................................................53
Shared memory........................................................................................53 Message Passing ......................................................................................53 3.2.2.4
Code en Runtime Structure ...........................................................54
Separate Executable mode ........................................................................54 Kernel Bundled Executable mode...............................................................54 Code structure..........................................................................................56 3.2.2.5
Using Xilkernel .............................................................................56
Hardware platform....................................................................................57 Configureren van de Xilkernel....................................................................57 Creëren van een applicatie ........................................................................63 II
Inladen van het project in de FPGA............................................................67 3.2.2.6
Verschil tussen MicroBlaze & PowerPC Xilkernel implementaties ......69
Xilkernel met MicroBlaze ...........................................................................70 Xilkernel met PowerPC ..............................................................................70 Toepassing op ons project ........................................................................70 3.2.3
Ethernet Libraries ................................................................................72
3.2.3.1
LibXil Net .....................................................................................72
Inleiding ..................................................................................................72 Ondersteunde protocols ............................................................................72 Architectuur van de bibliotheek .................................................................73 Beperkingen .............................................................................................73 XilNet gebruiken in een applicatie ..............................................................74 3.2.3.2
Webserver ...................................................................................74
Hardware vereiste ....................................................................................74 Software vereiste......................................................................................74 Hardware ontwerp....................................................................................74 Software en implementatie........................................................................75 3.2.3.3
LwIP (v2.00.a) .............................................................................77
Inleiding ..................................................................................................77 Ondersteunde protocols ............................................................................78 Raw API...................................................................................................78 Socket API ...............................................................................................78 LwIP gebruiken in een applicatie ...............................................................78 3.2.3.4
Echoserver ...................................................................................80
Hardware vereiste ....................................................................................80 Software vereiste......................................................................................80 Hardware ontwerp....................................................................................80 Software ..................................................................................................81 3.3
Embedded Linux.......................................................................................87
3.3.1
De Linux Kernel ...................................................................................87
3.3.1.1
Kernel-gegevensstructuren............................................................89
3.3.1.2
Geheugenbeheer ..........................................................................89
3.3.1.3
Procesbeheer ...............................................................................90
3.3.1.4
Device-drivers ..............................................................................92
3.3.1.5
Het bestandsysteem .....................................................................93 III
3.3.1.6 3.3.2
De opbouw van de kernel: uit één stuk of modulair ........................94
Embedded Linux op PowerPC ...............................................................95
3.3.2.1
Inleiding ......................................................................................95
3.3.2.2
Hardware instellingen ...................................................................95
3.3.2.3
BSP maken in EDK........................................................................96
3.3.2.4
Cross-Compiler maken voor PPC....................................................98
1ste compiler: Crosstool............................................................................98 2de compiler: DENX ELDK PPC-tools ........................................................100 3.3.2.5
De Linux PPC-kernel bronbestanden ............................................101
Installatie van rsync 2.6 ..........................................................................101 Source code afhalen via rsync .................................................................102 3.3.2.6
De Linux kernel configureren.......................................................102
3.3.2.7
BSP Installeren...........................................................................106
3.3.2.8
Kernel aanpassingen uitvoeren ....................................................107
3.3.2.9
De Kernel Compileren .................................................................108
3.3.2.10
De Kernel testen .....................................................................110
Methode via XMD ...................................................................................111 Methode via Compact Flash.....................................................................111 3.3.2.11
Aanmaken van het Root File Systeem ......................................113
Inleiding ................................................................................................113 Aanmaken van Root File Systeem via Busybox .........................................114 Het Root File Systeem op Compact Flash plaatsen ....................................116 3.3.3
µClinux .............................................................................................123
3.3.3.1
µClinux voor Microblaze op Virtex II-Pro ......................................123
Inleiding ................................................................................................123 µClinux voorbereiding van de EDK-software .............................................123 Hardware instellingen in EDK ..................................................................124 Auto-config.in bestand ............................................................................125 De Microblaze Compiler...........................................................................126 De µClinux-dist en –kernel bronbestanden ...............................................128 Invoegen van het configuratiebestand .....................................................129 Maken van de µClinux Kernel Image ........................................................130 De kernel in het bord laden .....................................................................132 3.3.3.2
µClinux voor Microblaze op Virtex-4 .............................................135
Hardware instellingen in EDK ..................................................................135 IV
Besluit.................................................................................................................138 Literatuurlijst .......................................................................................................141 Appendix A:
Linux distributie via VMware ........................................................... A-1
A.1
Installeren van Linux Omgeving via VMWare ............................................ A-1
A.2
Installeren van VMware Tools................................................................ A-15
A.3
USB-Stick of Externe USB-HD mounten onder CentOS 3.5....................... A-17
Appendix B:
Formatteren van CompactFlash met mkdosfs ................................... B-1
Appendix C:
Maken van mkxupv2prootfs.sh script en /etc directory ..................... C-1
C.1
Het mkxupv2prootfs.sh script .................................................................. C-1
C.2
De /etc directory .................................................................................... C-3
Appendix D:
C-Files Webserver .......................................................................... D-1
Appendix E:
C-Files Echoserver.......................................................................... E-1
V
Lijst van Figuren Figuur 1-1. Blokschema XUP Virtex-II Pro Development Systeem ............................... 3 Figuur 1-2. XUP Virtex-II Pro Development Systeem [].............................................. 4 Figuur 1-3. Virtex-II Pro Processor Blok [7] .............................................................. 8 Figuur 1-4 PPC405 Blok diagram ............................................................................10 Figuur 1-5. Virtex-II Pro Input/Output Structuur [7].................................................11 Figuur 1-6. Virtex-II Pro I/O blok [7].......................................................................11 Figuur 1-7. Double Data Registers (DDR) [7] ...........................................................12 Figuur 1-8. LVTTL, LVCMOS of PCI select IO standaard [7] ......................................12 Figuur 1-9. SSTL of HSTL select-IO Ultra standaard [7] ............................................13 Figuur 1-10. Virtex-II Pro Slice configuratie [7] ........................................................13 Figuur 1-11. Virtex-II Pro CLB element [7] ..............................................................14 Figuur 1-12. Register/Latch configuratie in een slice [7] ...........................................14 Figuur 1-13. Bovenste helft van een Virtex-II Pro Slice [7] .......................................15 Figuur 1-14. Distributed SelectRAM+ (RAM 16 x 1S)[7] ............................................16 Figuur 1-15. Distributed SelectRAM+ (RAM 32 x 1S)[7] ............................................16 Figuur 1-16. Dual-port Distributed SelectRAM+ (RAM 16 x 1D) [7]............................17 Figuur 1-18. Virtex-II Pro 3-state buffers [7] ...........................................................18 Figuur 1-19. 3-state Buffer verbinding met de horizontale 3-state lijnen [7]..............18 Figuur 1-20. MUXFX multiplexer in CLBs [7].............................................................19 Figuur 1-21. FF896 Composite Pinout Diagramma [7] ..............................................20 Figuur 1-22. Virtex-4 MB Development Board [5] .....................................................22 Figuur 1-23. Virtex-4 MB Development Board Blokschema [5] ..................................23 Figuur 1-24. RS232 Interface [5] ............................................................................24 Figuur 1-25. JTAG Chain [5] ...................................................................................24 Figuur 2-1. Directory structuur EDK map .................................................................27 Figuur 2-2. BSB wizard board instellingen................................................................27 Figuur 2-3. PowerPc hardware [4] ..........................................................................29 Figuur 2-4. BSB New Project...................................................................................30 Figuur 2-5. Project map aanmaken .........................................................................30 Figuur 2-6. Peripheral Repository Directory..............................................................31 Figuur 2-7. Embedded Development Kit ..................................................................31 Figuur 2-8. BSB Board selection ..............................................................................32 Figuur 2-9. BSB Processor Configuration..................................................................33 VI
Figuur 2-10. BSB IO Interface configuration ............................................................34 Figuur 2-11. BSB Additional IO Interfaces................................................................35 Figuur 2-12. BSB Memory Configuration ..................................................................36 Figuur 2-13. BSB Add Internal Peripherals ...............................................................37 Figuur 2-14. BSB Software Setup ............................................................................37 Figuur 2-15. BSB System Created ...........................................................................38 Figuur 2-16. Add SW Application.............................................................................39 Figuur 2-17. Software project naam ........................................................................41 Figuur 2-18. Overzicht Software Projects .................................................................41 Figuur 2-19. Openen van Generate Linker Script ......................................................42 Figuur 2-20. Generate Linkescript venster ...............................................................42 Figuur 3-1. 3coms Router (3CR860-95) beschikt over een embedded Linux OS..........47 Figuur 3-2. Samsung SGH-858 met Smartphone Linux OS ........................................47 Figuur 3-3. Xilkernel onderdelen [1] ........................................................................49 Figuur 3-4. Prioriteits afhandeling [1] ......................................................................51 Figuur 3-5. Process Context states [1].....................................................................51 Figuur 3-6. Building Applications for Xilkernel [1] .....................................................55 Figuur 3-7. Hardware Platform Xilkernel toepassing .................................................57 Figuur 3-8. Software Platform Settings ....................................................................58 Figuur 3-9. Library/OS Parameters ..........................................................................59 Figuur 3-10. Library/OS Parameters instellingen.......................................................60 Figuur 3-11. Generate Bitstream .............................................................................61 Figuur 3-12. Generate Linker Script.........................................................................62 Figuur 3-13. Set Compiler settings ..........................................................................63 Figuur 3-14. Thread declaration in Library O/S.........................................................67 Figuur 3-15. Hyperterminal Start Menu....................................................................67 Figuur 3-16. Eigenschappen Seriële Verbinding........................................................68 Figuur 3-17. Downloaden in de Virtex .....................................................................68 Figuur 3-18. Threads in HyperTerminal ...................................................................69 Figuur 3-19. Microblaze op oscilloscoop...................................................................71 Figuur 3-20. PowerPC op oscilloscoop .....................................................................71 Figuur 3-21. LibXilnet Architecture [1].....................................................................73 Figuur 3-22. Hardware Design WebServer ...............................................................75 Figuur 3-23. Webserver in HyperTerminal................................................................76 Figuur 3-24. Webserver in Internet Explorer ............................................................77 VII
Figuur 3-25. Hardware Design EchoServer...............................................................81 Figuur 3-26. Linker Script EchoServer......................................................................82 Figuur 3-27. Software Platform Settings EchoServer.................................................83 Figuur 3-28. XMD EchoServer .................................................................................85 Figuur 3-29. EchoServer in HyperTerminal...............................................................86 Figuur 3-30. HyperTerminal en Telnet EchoServer ...................................................87 Figuur 3-31. Overzicht van de onderdelen van een besturingsysteem........................88 Figuur 3-32. Afhandeling van system calls ...............................................................91 Figuur 3-33. De rol van het bestandsysteem in relatie tot de kernel ..........................94 Figuur 3-34. Make menuconfig venster..................................................................104 Figuur 3-35. Make menuconfig venster van BusyBox ..............................................114 Figuur 3-36. Naam CF kaart lezer via Hardware Browser in Linux............................117 Figuur 3-37. Overzicht van partitietabel op CF kaart...............................................118 Figuur 3-38. Linux kernel configuratie menu ..........................................................131 Figuur A-1. Verschillende download uitvoeringen voor CentOS 3.5 .......................... A-1 Figuur A-2. VMWare virtual machine configuratie ................................................... A-2 Figuur A-3. Selecteren van een Guest Operating System in VMWare ....................... A-3 Figuur A-4. Naam en locatie ingeven voor virtual machine...................................... A-3 Figuur A-5. Netwerk voor virtual machine selecteren.............................................. A-4 Figuur A-6. Opgeven voor de grote van virtual machine opgeven............................ A-4 Figuur A-7. Device opties voor virtual machine ...................................................... A-5 Figuur A-8. CR-ROM device opties voor virtual machine.......................................... A-5 Figuur A-9. CentOS welkomst venster ................................................................... A-6 Figuur A-10. Installatie soort kiezen voor CentOs 3.5 ............................................. A-7 Figuur A-11. Automatisch partitioneren selecteren ................................................. A-7 Figuur A-12. Waarschuwingsventer om station de initialiseren ................................ A-8 Figuur A-13. het automatisch partitioneren venster ................................................ A-8 Figuur A-14. Waarschuwingsvenster voor partitioneren van Linux ........................... A-9 Figuur A-15. CentOS 3.5 bootloader configuratie venster........................................ A-9 Figuur A-16. Netwerk configureren voor CentOS 3.5 ............................................ A-10 Figuur A-17. Firewall instellingen voor CentOS 3.5 ............................................... A-10 Figuur A-18. Taalinstellingen voor Linux systeem ................................................. A-11 Figuur A-19. Ingeven van een root-wachtwoord .................................................. A-11 Figuur A-20. Pakketkeuze selectie venster van CentOS 3.5 ................................... A-12 Figuur A-21. CentOS welkomsvenster na installatie .............................................. A-13 VIII
Figuur A-22. Inlog venster van CentOS 3.5 .......................................................... A-14 Figuur A-23. Afmeld venster in Linux CentOS 3.5 ................................................. A-14 Figuur A-24. Virtual Machine CD-ROM device instellingen ..................................... A-15 Figuur A-25. Selecteren om VMware Tools te installeren....................................... A-16 Figuur C-1. Inhoud van de map /etc ..................................................................... C-4
IX
Lijst van Tabellen Tabel 1-1 Eigenschappen van XC2VP30................................................................... 7 Tabel 1-2. Overzicht dual-port en single port configuraties [7] ..................................15 Tabel 1-3. Overzicht van het aantal gebruikte LUTs per configuratie [7] ....................16 Tabel 1-4. Logica aanwezig in 1 CLB van XC2VP30 [7] .............................................19 Tabel 1-5. Overzicht van totaal beschikbare logica in de FPGA [7].............................19 Tabel 2-1. Aansturing LCD display...........................................................................45 Tabel 2-2. LCD aansturing in HyperTerminal............................................................46 Tabel 3-1. C Code thread creatie.............................................................................56 Tabel 3-2. Xilkernel in MSS bestand ........................................................................61 Tabel 3-3. LwIP Initialization Routines Raw API [2]..................................................79 Tabel 3-4. LwIP Initialization Routines Socket API [2] ..............................................79 Tabel 3-5. Hyperterminal output van het TestApp_memory programma ....................96 Tabel 3-6. Output in hyperterminal bij initieel opstarten van de kernel ....................113 Tabel 3-7. µClinux boot procedure in hyperterminal ...............................................134 Tabel C-1. Het mkxupv2prootfs.sh script ............................................................... C-3 Tabel C-2. Inhoud /etc/fstab bestand .................................................................... C-4 Tabel C-3. Inhoud /etc/inittab............................................................................... C-5 Tabel C-4. Inhoud /etc/issue bestand.................................................................... C-6 Tabel C-5. Inhoud /etc/issue.net........................................................................... C-6 Tabel C-6. Inhoud /etc/motd bestand.................................................................... C-6 Tabel C-7. inhoud /etc/passwd bestand................................................................. C-6 Tabel C-8. Inhoud /etc/group bestand................................................................... C-7 Tabel C-9. Inhoud /etc/init.d/rcH bestand ............................................................. C-7 Tabel C-10. Inhoud /etc/init.d/rcS bestand ............................................................ C-7
X
Inleiding Het doel van dit eindwerk is het bestuderen van twee embedded besturingsystemen voor System on Chip (SoC) op een Digilent XUPV2P oefenbord met een Xilinx Virtex-II Pro FPGA. Hiervoor zal men een System on Chip op de FPGA moeten implementeren en aanpassen. Daarbij wordt de Xilinx EDK software gebruikt. Om vertrouwd te raken met de software werden enkele tutorials doorlopen omtrent de EDK software. Nadat deze kennis werd verworven werd overgeschakeld naar de implementatie van embedded besturingsystemen op een hardware platform. Daarbij concentreerde Wim zich op het Xilinx Micro Kernel besturingssysteem met daarop enkele toepassingen. Rodolf bestudeerde en implementeerde een embedded Linux kernel met bestandsysteem voor een SoC voor de verschillende processor architecturen op de FPGA (Microblaze soft-processor en PowerPC hard-processor). Voor een Microblaze processor architectuur wordt een µClinux kernel gebruikt. Voor de PowerPC processor wordt een aangespaste PowerPC Linux desktop kernel geïmplementeerd. Als laatste werd ook op een Memec Virtex-4 MB Development Board een µClinux kernel geïmplementeerd door Wim. Op dit bord werd het LCD display ook aangestuurd in een SoC hardware platform.
1
Deel 1: Development Board 1.1 Oefenbord Digilent XUPV2P [6] 1.1.1 Eigenschappen: •
Virtex™-II Pro FPGA met twee PowerPC™ 405 kernen
•
Tot 2 GB of Double Data Rate (DDR) SDRAM
•
System ACE™ controller en Type II CompactFlash™ connector voor FPGA
•
Configuratie en data opslag.
•
Embedded Platform Cable USB configuratie poort
•
Programmeerbare configuratie PROM
•
On-board 10/100 Ethernet PHY device
•
RS-232 DB9 seriële poort
•
Twee PS-2 seriële poorten
•
Vier LEDs verbonden aan de Virtex-II Pro I/O pinnen
•
Vier schakelaars verbonden aan de Virtex-II Pro I/O pinnen
•
Vijf drukknoppen verbonden aan de Virtex-II Pro I/O pinnen
•
Zestig uitbreidingspinnen samen met 80 Virtex-II Pro I/O pinnen met overvoltage bescherming
•
Hoge snelheid uitbreidingsconnector samen met 40 Virtex-II Pro I/O pinnen
•
AC-97 audio CODEC met audio versterker en luidspreker uitgang
•
Microfoon ingang
•
On-board XSGA uitgang, tot 1200 x 1600 bij 70 Hz refresh
•
Drie Serial ATA poorten
•
100 MHz systeem klok, 75 MHz SATA klok
•
Power-on reset circuit
2
1.1.2 Algemene beschrijving: Het XUP Virtex-II Pro Development Systeem voorziet een hardware platform die bestaat uit een Virtex-II Pro Platform FPGA omgeven door randapparatuur die kan gebruikt worden om een complex systeem te creëren.
1.1.2.1 Blok diagram Ziehier een blokdiagram van het XUP Virtex-II Pro Development Systeem:
Figuur 1-1. Blokschema XUP Virtex-II Pro Development Systeem
3
1.1.2.2 Componenten op het bord
Figuur 1-2. XUP Virtex-II Pro Development Systeem []
4
Voeding Het XUP Virtex-II Pro Development Systeem wordt gevoed met 5V. Het bord zelf zorgt intern voor volgende voedingen: 2.5V, 3.3V en 1.5V voor de FPGA.
Multi-Gigabit Transceivers Op het bord zijn ook drie Serial Advanced Technology Attachment (SATA) connectoren aanwezig. Deze zijn voorzien van een 75 Mhz klok om deze te ondersteunen.
Systeem RAM Het systeem is voorzien van een 184-pin dual in-line Double Data Rate Synchronous Dynamic RAM (DDR SDRAM DIMM) memory module. Deze ondersteunt een capaciteit van 2GB.
Fast Ethernet Interface Er is een fast ethernet interface aanwezig die zowel 100Base-TX en 10Base-T applicaties ondersteunt. We kunnen dus snelheden hebben van 10 Mb/sec tot 100 Mb/sec. Elk bord is ook voorzien van een 48- bit uniek Silicon Serial Number dat kan gebruikt worden voor het MAC adres van het systeem.
Seriële poorten Het XUP Virtex-II Pro Development System heeft drie seriële poorten: één RS232 poort en twee PS/2 poorten. De RS232 poort maakt gebruik van een standaard DB-9 seriële connector. Die wordt meestal gebruikt voor communicatie met een computer via de COM poort. De twee PS/2 poorten kunnen gebruikt worden om een keyboard en een muis op aan te sluiten.
5
LEDs, schakelaars en drukknoppen De vier LEDs zijn voor de gebruiker voorzien. Let wel op! De LED’s zijn actief laag, wanneer we er een logische nul naar schrijven zal de LED oplichten. Er zijn ook vier schakelaars aanwezig en vijf drukknoppen. Wanneer we een drukknop indrukken zal de FPGA een logische nul waarnemen.
Expansion Connectors Met een totaal van 80 Virtex-II Pro I/O pinnen die uitgebracht zijn als vier maal 60 pin headers en twee maal 40 pin connectoren. De 60 pin headers zijn gemaakt om met ribbon- kabel connectoren te worden verbonden. Op de twee maal 40 pin connectoren kunnen we bijvoorbeeld Digilent Expansion Modules aanbrengen. Er zijn ook nog 40 pinnen voor High- speed connectoren voorzien.
XSGA uitgang Het bord is voorzien van een video DAC die een pixel frequentie tot 180 Mhz toelaat en de XSGA uitgang ondersteunt. De maximaal ondersteunde resolutie bedraagt 1600 x 1200 bij een refresh frequentie van 70Hz.
AC97 Audio CODEC Een Audio CODEC en versterker zijn aanwezig op het Virtex-II Pro Development Systeem die een hoge kwaliteit voorzien. Het bevat een full duplex stereo ADC en DAC met een analoge mixer gecombineerd met een microfoon ingang.
USB 2 Programming interface Ons bord bevat een embedded USB 2.0 microcontroller om snelle communicatie te voorzien (480 Mb/sec). Deze USB 2 poort gebruiken we om onze FPGA te programmeren.
6
1.2 Virtex-II Pro FPGA 1.2.1 Overzicht Het XUPV2P development bord bevat een Virtex-II pro XC2VP30 FPGA in een flip-chipfine-pitch FF 896 BGA package. Een overzicht van de belangrijkste kenmerken van deze FPGA wordt gegeven in Tabel 1-1. Deze worden verder in dit hoofdstuk besproken[6]. XC2VP30 30 816 Logische cellen 80 x 46 Array Size 136 18 x 18 bit Multiplier Blocks 136 18 Kb Blocks Block SelectRAM+ 2448 Kb Max Block RAM 8 Digital Clock Managers (DCMs) 2 PowerPC 405 RISC Cores Multi-Gigabit Transceivers 8 (RocketIO Transceiver Blocks) 13 696 Slices CLB( 1=4slices =max 128bits) 428 Kb Max Distr RAM 644 Maximum User I/O Pads Tabel 1-1 Eigenschappen van XC2VP30
De cijfers en letters in de volledige naam van de Xilinx FPGA die op het oefenbord aanwezig is betekenen:
XC2VP30 -7 FF 896 C C = Commercial Device Type Speed grade (-5, -6, -7)
(TJ = 0°C tot +85°C) I = Industrial Aantal Pinnen Package Type
7
1.2.2 PowerPC 405 Processor Block De Virtex II Pro FPGA bevat 2 PowerPC 405 hard processors. Deze bevinden zich in een processor blok in de FPGA zoals volgende figuur schematisch voorstelt. Het processor blok bevat naast de PPC405 ook nog 2 OCM (On-Chip Memory) Controllers (Hard IP). Deze hebben de taak om snelle toegang te hebben tot het instructie- en data-geheugen [8].
Figuur 1-3. Virtex-II Pro Processor Blok [7]
De belangrijkste specificaties van de PowerPC 405 zijn: •
PowerPC RISC CPU
Implementatie van de PowerPC User Instruction Set Architecture (UISA) en uitbreiding voor embedded systemen
32-bit General Purpose registers (GPRs)
Static Branch Prediction
5-stage pipeline met één-cyclus uitvoering van de meeste instructies, inclusief loads/stores
Unaligned en aligned load/store support tot de cache, main memory en het on-chip memory
8
Snelle integer multiply/divide arithmetic (4cyclus multiply en 35 cyclus divide)
•
Enhanced string en multiple-word handling
Big/little endian ondersteuning
Storage control
Gescheiden instructie- en data- cache units, (beiden two-way set-associative en non-blocking)
8 woorden (32bytes) per cache lijn
16 KB array Instruction Cache Unit (ICU) en 16KB array Data Cache Unit (DCU)
•
•
Operand forwarding tijdens instruction cache line fill
Copy-back of write-through DCU strategie
Dubbelwoord instructie mogelijkheden in cache
Virtual memory management unit (MMU)
Vertaling van de 4GB logische adres ruimte in fysieke adressen
Software controle van de page replacement strategie
Ondersteunt verschillende page size ranging van 1KB tot 16MB
OCM controllers zodat high-speed interfaces toegang verkrijgen tot Block SelectRAM+ memory en processor block instructies
•
•
PowerPC timer mogelijkheden
64-bit time base
Programmable interval timer (PIT)
Watchdog timer (WDT)
Debug ondersteuning (IAC, DAC, DVC) via JTAG
9
Schematisch kan de PPC405 CPU als volgt worden voorgesteld:
Figuur 1-4 PPC405 Blok diagram
10
1.2.3 Input/Output Blocks (IOBs)
Figuur 1-5. Virtex-II Pro Input/Output Structuur [7]
Figuur 1-6. Virtex-II Pro I/O blok [7]
De IOBs zijn programeerbaar en kunnen in volgende categorieën worden verdeeld: •
Input blocks met een optioneel Single Data Rate (SDR) of een Double Data
Rate (DDR) register •
Output blocks met een optionele SDR of DDR register en optioneel een 3state buffer direct aangestuurd door een SDR of DDR register
•
Bidirectional blocks (elke combinatie van input en output configuratie)
Deze registers zijn edge-triggered D-type flipflops of level-sensitive latches
11
Figuur 1-7. Double Data Registers (DDR) [7]
IOBs ondersteunen volgende single-ended I/O standaarden: •
Low Voltage Tranistor-Transistor Logic (LVTTL), Low Voltage CMOS (LVCMOS 3.3V, 2.5V, 1.8V en 1.5V)
•
Peripheral Component Interconnect-X (PCI-X) compatible (133 MHz en 66 MHz) op 3.3V
•
PCI compatible (66 MHz en 33 MHz) en 3.3V
•
Gunning Transceiver Logic (GTL) en Gunning Transceiver Logic Plus (GTLP)
•
High-Speed Transceiver Logic (HSTL 1.5V en 1.8V, Class I, II, III en IV)
•
Stub Series Terminated Logic (SSTL 1.8V en 2.5V, Class I en II)
Figuur 1-8. LVTTL, LVCMOS of PCI select IO standaard [7]
On-chip termination is beschikbaar voor elke single-ended I/O standaard.
12
De IOB elementen ondersteunen volgende differential signaling I/O standaarden • • • •
Low Voltage Differential Signaling (LVDS) en Extended LVDS (2.5V) Bus Low Voltage Differential Signaling (BLVDS) Lightning Data Transport (LDT) Low Voltage Positive Emitter Coupled Logic (LVPECL 2.5V)
Voor LVDS, LVDS extended en LDT standaarden is on-chip termination beschikbaar.
Figuur 1-9. SSTL of HSTL select-IO Ultra standaard [7]
1.2.4 Configureerbare Logische Blokken (CLBs) De CLB blokken van de Virtex-II Pro FPGA bevatten vier slices en twee 3-state buffers. Iedere slice van een CLB blok is equivalent en bevat volgende onderdelen (zie ook ): •
2 functie generators (F&G)
•
2 storage elementen
•
Arithmetic logic gates
•
Grote multiplexers
•
Grote functiemogelijkheden
•
Fast carry look-ahaid chain
•
Horizontale cascade ketting (OR gate)
Figuur 1-10. Virtex-II Pro Slice configuratie [7]
13
Figuur 1-11. Virtex-II Pro CLB element [7]
De functiegeneratoren F & G zijn configureerbaar als 4-input look-up tables (LUTs), als 16-bit shift registers, of als 16-bit distributed SelectRAM+ memory. De 2 geheugen elementen zijn edge-triggered D-type flip-flops of level-sensitive latches. Elk CLB bevat een interne fast interconnect en is verbonden met een switch matrix om de algemene routing elementen te gebruiken.
Figuur 1-12. Register/Latch configuratie in een slice [7]
14
Figuur 1-13. Bovenste helft van een Virtex-II Pro Slice [7]
1.2.4.1 Block SelectRAM+ Memory De block selectRAM+ geheugen blokken zijn 18 Kbit True Dual-Port RAM. Deze zijn programeerbaar in verschillende configuraties van 16K x 1 bit tot 512 x 36 bit. Het Block SelectRAM+ kan in cascade worden geplaatst zodat het mogelijk is om grote embedded data te implementeren. Een overzicht van de verschillende dual-port en single-port configuraties wordt in volgende tabel weergegeven. 16K x 1bit
4K x 4 bits
1K x 18 bits
8K x 2 bits
2K x 9 bits
512 x 36 bits
Tabel 1-2. Overzicht dual-port en single port configuraties [7]
Iedere functie generator (LUT) bevat een synchroon 16x 1 bit RAM geheugen en wordt een distributed selectRAM+ element genoemd. En wordt geïmplementeerd en is configureerbaar in een CLB. Aangezien een CLB vier slices bevat en iedere slice twee LUTs kunnen we dus volgende configuraties maken (max 128bit per CLB): •
Single-Port 16 x 8-bit RAM
•
Single-Port 32 x 4-bit RAM
•
Single-Port 64 x 2-bit RAM
•
Single-Port 128 x 1-bit RAM
•
Dual-Port 16 x 4-bit RAM
15
•
Dual Port 32 x 2-bit RAM
•
Dual Port 64 x 1-bit RAM
In een volgende tabel wordt beschreven hoeveel LUTs er worden gebruikt bij iedere configuratie van het distributed Block selectRAM+. S= Single port configuratie D= Dual port configuratie RAM Aantal LUTs 1 16 x 1S 2 16 x 1D 2 32 x 1S 4 32 x 1D 4 64 x 1S 8 64 x 1D 8 128 x 1S Tabel 1-3. Overzicht van het aantal gebruikte LUTs per configuratie [7]
Enkele voorbeelden van configuraties uit Tabel 1-3.
Figuur 1-14. Distributed SelectRAM+ (RAM 16 x 1S)[7]
Figuur 1-15. Distributed SelectRAM+ (RAM 32 x 1S)[7]
16
Figuur 1-16. Dual-port Distributed SelectRAM+ (RAM 16 x 1D) [7]
1.2.4.2 Shift Registers Iedere functie generator in een CLB kan geconfigureerd worden als 16-bit shift register. De write actie is synchroon met de clock input en een optionele clock enable. Een dynamische lees actie wordt uitgevoerd door een 4-bit address bus, A[3,0]. De 16bit shift registers kunnen niet worden gereset of geset. Bijgevolg is de lees-actie asynchroon. Met een geheugenelement of flip-flop kan gezorgd worden voor een synchrone lees-actie. Men kan de shift registers die in de vier verschillende slices van de CLB zitten in cascade plaatsen zodat men een shift chain creërt in de CLB. Deze Shift Chain kan ook nog in cascade geplaatst worden met een volgend CLB zodat men nog grotere shift registers kan maken. De shift register chaining (vier 16-bit shift registers in een CLB) en de multiplexers MUXF5, MUXF6 en MUXF7 laten toe dat er maximaal een 128-bit adresseerbaar shift register kan worden geïmplementeerd in een CLB.
Figuur 1-17. Shift Register Configuratie [7]
17
1.2.4.3 3-state Buffers in de CLBs Elke Virtex-II Pro CLB bevat twee 3-state drivers (TBUFs) die on-chip bussen kunnen sturen. Iedere 3-state Buffer heeft zijn eigen 3-state controle pin en zijn eigen input pin. Elke van de vier slices van de CLB heeft toegang tot deze twee 3-state buffers via een Switch Matrix (zie Figuur 1-18). De XC2VP30 FPGA bevat in totaal 6848 3-state buffers.
Figuur 1-18. Virtex-II Pro 3-state buffers [7]
Figuur 1-19. 3-state Buffer verbinding met de horizontale 3-state lijnen [7]
1.2.4.4 Multiplexers Elke Virtex-II Pro Slice bevat één MUXF5 multiplexer en één MUXFX multiplexer. De MUXFX multiplexer bevat een MUXF6, MUXF7 of een MUXF8 zoals op Figuur 1-20 kan waargenomen worden. Elk CLB element heeft twee MUXF6 multiplexers, één MUXF7 multiplexer en één MUXF8 multiplexer.
18
Figuur 1-20. MUXFX multiplexer in CLBs [7]
1.2.4.5 Overzicht CLB/slice configuratie van XC2VP30 Één CLB bevat volgende logica.
Slices
LUTs
FlipFlops
4
8
8
MULT_ ANDs
Arithmetic & CarryChain
SOP Chains
Distibuted Select RAM+
Shift Registers
TBUF
8
2
2
128 bits
128 bits
2
Tabel 1-4. Logica aanwezig in 1 CLB van XC2VP30 [7]
De logica van alle CLBs tezamen van de XC2VP30 geeft volgende tabel. CLB Array: Row x Column
Aantal Slices
Aantal LUTs
Max Distributed SelectRAM of Shift Register (bits)
Aantal Flip-Flops
Aantal CarryChains
Aantal SOP Chains
80 x 46
13 696
27 392
438 272
27 392
92
160
Tabel 1-5. Overzicht van totaal beschikbare logica in de FPGA [7]
19
1.2.5 FPGA pin layout informatie De Virtex-II pro XC2VP30 FPGA zit in een flip-chip-fine-pitch FF 896 Ball Grid Array package (1.00mm Pitch). De afmetingen van de FPGA zijn 31mm x 31mm. Het pinout diagramma van de Ball Grid Array van de XC2VP30 FPGA wordt voorgesteld in Figuur 1-21 .
Figuur 1-21. FF896 Composite Pinout Diagramma [7]
20
1.3 Virtex-4 MB Development Board 1.3.1 Algemeen overzicht Er werd op het eind van het jaar ook gewerkt met een development board waarop een Virtex- 4 FPGA is geïmplementeerd. Deze FPGA is momenteel het paradepaardje van chipfabrikant Xilinx. In tegenstelling tot de Virtex-II Pro FPGA bevat de Virtex-4 geen ingebakken PowerPC’s, dus hier kan enkel gebruik gemaakt worden van een MicroBlaze softcore Processor. Dit bord heeft ook 64MB aan DDR SDRAM geheugen aan boord, zodus zal het niet meer nodig zijn om het bord uit te breiden met een externe geheugenlat. Volgende peripherals bevinden zich op het bord: •
Xilinx XC4VLX60 -10FF668 FPGA
•
64MB of DDR SDRAM
•
4MB of Flash
•
16-Bit LVDS Transmit and Recieve Interfaces
•
10/100 Ethernet PHY
•
Programmable LVDS Clock Source (25-700 MHz)
•
On- board 100 MHz LVTTL Oscillator
•
P240 Connectors
•
LCD Panel
•
32Mb Serial Flash for FPGA configuration
•
PC4 JTAG Programming/Configuration Port
•
SystemACE Module Connector
•
RS232 Port
•
Four User LEDs
•
Four User Push Button Switches
•
An 8-Position DIP Switch
•
USB-RS232 Bridge
21
Figuur 1-22. Virtex-4 MB Development Board [5]
Om een algemeen beeld te krijgen van hoe de verschillende peripherals aan de FPGA zijn gekoppeld is in figuur 1-23 een blokschema gegeven.
22
Figuur 1-23. Virtex-4 MB Development Board Blokschema [5]
1.3.2 Jumpersettings Wanneer het bord van de fabrikant komt, zullen de jumpers zich niet in de gewenste posities bevinden en zal de fpga niet kunnen geprogrammeerd worden via de JTAG kabel. 1.3.2.1 RS232 Om het bord te kunnen uitlezen met de RS232 seriële kabel zullen enkele jumpers moeten worden verplaatst. Er zijn twee modes waarin kan gewerkt worden: DCE en DTE mode. Hier kiezen we voor de DCE mode, dit betekent dat volgende instellingen moeten worden toegepast: JP19
Installeer een jumper op pinnen 2-3
JP21
Installeer een jumper op pinnen 1-2
23
Figuur 1-24. RS232 Interface [5]
1.3.2.2 JTAG Chain Op het Virtex-4 bord is zowel een FPGA als een CPLD geïntegreerd. De CPLD regelt de juiste interfacing met de FPGA en dient dus niet voor gebruikersdoeleinden zoals een design implementeren. Er wordt hier enkel gewerkt met de FPGA dus zullen we de CPLD niet in de JTAG Chain opnemen. De jumpersettings hiervoor zijn: FPGA
Installeer een jumper op pinnen 1-2 en 4-5
Figuur 1-25. JTAG Chain [5]
24
1.3.2.3 Configuration Modes De FPGA kan op verschillende manieren worden geconfigureerd. Het programmeren van de FPGA via JTAG is hier vereist, hiervoor worden volgende jumpers geplaatst: FPGA Mode
M0 open M1 gesloten M2 open HS gesloten
25
Deel 2: Xilinx Platform Studio (EDK) 2.1 Invoegen XUPV2P Board Support Package (BSP) Wanneer gewerkt wordt met een bord van een zekere fabrikant, moet dit bord herkend worden in de EDK software. Bij elk van deze borden zal er een bibliotheek te vinden zijn op internet, dit bij de website van de fabrikant. Voor het XUP Virtex-II Pro Development System kan de bibliotheek gedownload worden op volgende site: http://www.digilentinc.com/ Eenmaal dit gebeurd zal de library in de EDK map moeten geplaatst worden. Er zijn 3 subdirectories in de lib directory. Deze zijn: •
boards
•
drivers
•
pcores
Deze directories zijn ook te vinden in de EDK map. We kopiëren de inhoud van de board directory in de EDK board directory. Er bevinden zich al enkele borden in deze map. Herhaal dit voor de driver en pcore directory. De directories waarin de mappen moeten worden ingevoegd zijn de volgende: Boards: EDK -> board -> Xilinx -> boards Drivers: EDK -> sw -> XilinxProcessorIPLib -> drivers Pcores: EDK -> hw -> XilinxProcessorIPLib -> pcores Zie hieronder de directory structuur van de EDK:
26
Figuur 2-1. Directory structuur EDK map
Eenmaal dit gebeurd is, zal het bord beschikbaar zijn in de BSB wizard.
Figuur 2-2. BSB wizard board instellingen
27
2.2 Aanmaken Hardware ontwerp (PPC) op XUPV2P Board 2.2.1 Systeem vereiste Je moet volgende software geïnstalleerd hebben op je pc om dit project te volgen: •
Windows 2000 SP2 of Windows XP
•
EDK 6.2 of later
Het is aangeraden om de laatste Service Packs van de software te installeren. Deze kunnen gedownload worden op de Xilinx site: http://www.xilinx.com
2.2.2 Hardware vereiste Om het project te kunnen downloaden en testen moet je volgende hardware ter beschikking hebben: •
Virtex- 2 Pro Development Board
•
USB kabel om de fpga te kunnen programmeren
•
Seriële kabel
2.2.3 PowerPc hardware beschrijving Ons design bestaat uit volgende hardware componenten: •
PPC 405_0 & PPC 405_1
•
JTAGPPC_CNTLR
•
PROC_SYS_RESET
•
PLB Bus
•
o
PLB_BRAM_IF_CNTLR
o
PLB BRAM
o
PLB2OPB_BRIDGE
OPB Bus o
OPB_GPIO
o
OPB_UARTLITE
28
Figuur 2-3. PowerPc hardware [4]
2.2.4 Project creëren in XPS 1. Om XPS te openen, selecteer: Start -> Programma’s -> Xilinx Platform Studio 7.1i -> Xilinx Platform Studio 2. Selecteer File -> New Project -> Base System Builder om een nieuw project te maken. We krijgen volgend kader:
29
Figuur 2-4. BSB New Project
3. Gebruik de Browse knop om je project map te selecteren. Klik dan op openen om je system.xmp bestand te maken zoals in volgende figuur:
Figuur 2-5. Project map aanmaken
30
4. Wanneer we onze library files niet in het programma hebben ingevoegd, kunnen we deze bibliotheek van ons bord zelf invoegen met de Peripheral Repository Directory. Vink deze aan en klik op browse. 5. Hier klikken we onze library file aan zoals in de figuur hieronder gegeven. Deze library file kan je downloaden op de site van de fabrikant van het bord: http://www.digilentinc.com/info/XUPV2P.cfm
Figuur 2-6. Peripheral Repository Directory
6. Klik ok om de BSB wizard te starten.
2.2.5 Hardware definiëren 1. We komen terecht in de BSB wizard, hier maken we een nieuw design aan en klikken we op next.
Figuur 2-7. Embedded Development Kit
31
2. In het volgende venster selecteren we de opties: o
Board Vendor: Xilinx
o
Board Name: XUP Virtex- 2 Pro Development System
o
Board Revision: C
Figuur 2-8. BSB Board selection
3. Klik next. 4. Hier selecteren we onze processor. We hebben de keuze tussen een microblaze processor of een PowerPc. We kiezen voor een PowerPc. 5. In het volgende venster moeten we de processor options instellen zoals in de figuur.
32
Figuur 2-9. BSB Processor Configuration
Uitleg: System Wide Setting: o
Reference Clock Frequency: Dit is de frequentie van de interne klok in het systeem.
o
Processor Clock Frequency: Dit is de frequentie van de klok die de PowerPc aandrijft. Deze wordt gegenereerd met een DCM module.
o
Bus Clock Frequency: Dit is de frequentie van de klok die alle componenten aan een bus stuurt.
PowerPc 405 Processor Engine Settings: o
JTAG Debug Interface: Hier kunnen we kiezen hoe de processor JTAG interface moet worden verbonden.
o
On Chip Memory: Hier kunnen we kiezen hoeveel BRAM memory moet worden gebruikt voor de OCM ruimte. 33
6. Klik next. In de volgende vensters moeten we onze IO interfaces kiezen. Selecteer deze zoals in de figuren.
Figuur 2-10. BSB IO Interface configuration
34
Figuur 2-11. BSB Additional IO Interfaces
35
Figuur 2-12. BSB Memory Configuration
Het is vanzelfsprekend, als we geen CompactFlash kaart, DDR geheugen en ethernet hebben aangesloten op het bord, we deze niet in ons project moeten opnemen. Dit verkort het verwerken van het project.
36
Figuur 2-13. BSB Add Internal Peripherals
7. We voegen een PLB BRAM IF CNTLR in met een geheugen van 64 KB.
Figuur 2-14. BSB Software Setup
8. Wanneer we de Software Setup te zien krijgen, selecteren we: o
STDIN -> RS232_Uart_1
o
STDOUT -> RS232_Uart_1 37
Deze dienen om gegevens te kunnen terugsturen via de RS232 naar de PC. We kunnen ook nog kiezen om een voorbeeldapplicatie te laten maken door de wizard die een lees/schrijf test uitvoert op het geheugen van het systeem. We vinken deze uit. 9. In het volgende venster zien we het volledige systeem zoals in onderstaande figuur. We zien de adresindeling in het geheugen, deze kunnen we nog niet veranderen, dit kan pas in XPS.
Figuur 2-15. BSB System Created
10. Klik op Generate. En hierna op voltooien om het project te volledigen.
38
2.3 Implementatie Software in Hardware project 2.3.1 Invoegen van softwarre in hardwareplatform Eenmaal er een project is aangemaakt en de hardware geconfigureerd is, kan een applicatie geschreven en toegevoegd worden aan het project. De software wordt in de C- programmeertaal geschreven. Het softwaregedeelte bevindt zich onder het tabblad Applications. Voeg een nieuwe softwareapplicatie toe, door rechts te klikken op Software Projects en Add SW Application Project aan te klikken. Geef het project een naam.
Figuur 2-16. Add SW Application
De softwareapplicatie is dan toegevoegd aan het project. De software wordt door een processor uitgevoerd. Hier zijn twee PowerPc’s beschikbaar om onze code te laten in uitvoeren. Momenteel wordt de eerste PowerPc (ppc405_0) gebruikt. Deze kan worden veranderd door er rechts op te klikken en bij Associate Processor, de andere processor (ppc405_1) aan te vinken. Om verder te werken moeten libraries worden gegenereerd, zodat de C- code de hardware kan aanspreken. Dit gebeurt door het menu tools -> Generate libraries and BSPs. Eenmaal dit is gebeurd, kan je onder de processor de gegenereerde header xparameters.h vinden. Deze header bevat alle adressen van de gpio’s, zoals leds en dipswitches. De geheugenindeling wordt ingesteld via het menu Tools -> Generate Linker Script. De verschillende delen van het geheugen worden voor kleine applicaties in het geheugen op de chip zelf geladen. Voor grotere applicaties zullen we moeten gebruik maken van 39
extern geheugen. Wanneer de applicatie te groot zou worden voor het BRAM geheugen zal de compiler een fout geven, en moet het linker script worden aangepast. De C- files worden toegevoegd door rechts te klikken op sources en de files aan te klikken. Er kan ook gebruik gemaakt worden van headers, deze worden dan op gelijke manier toegevoegd maar dan onder headers in plaats van sources. De applicatie wordt in de fpga gedownload via het menu : Tools -> Download. Hierna zal de applicatie zich in de fpga bevinden.
2.3.2 Inladen van een software apllicatie in Extern RAM Indien men een software applicatie wil laten uitvoeren in het extern DDR-RAM geheugen op het oefenbord in plaats van in het BRAM, dan moet er een andere werkwijze gevolgd worden dan enkel maar het project te downloaden via EDK. Ieder software project kan op deze manier in het extern geheugen worden uitgevoerd. In eerste instantie moet via de Base System Builder het extern geheugen geïmplementeerd worden in een hardware project. In bepaalde gevallen kan deze methode zelfs zeer handig zijn. Zo is het bijvoorbeeld niet mogelijk om kommagetallen af te printen via de xil_printf() functie van Xilinx. Dit omdat de Xil_printf() slechts een vereenvoudiging is van de algemene printf() functie in C. De Xil_printf() wordt gebruik omdat deze minder plaats in het beperkte geheugen(BRAM) van embedded systemen inneemt dan de gewone printf(). Doordat het onboard BRAM geheugen van het oefenbord te beperkt is om meerdere printf() acties uit te voeren, is het de beste keuze om het volledige software project in een externe geheugen module (DIMM RAM 256MB) uit te voeren. In het extern geheugen is plaats genoeg om de printf() functies uit te voeren. De methode om een software project in een extern RAM uit te voeren, verschilt op enkele punten met de methode om toepassingen in het BRAM uit te voeren. Dit wordt hier verder besproken in een voorbeeld software project met naam Test_opb_fp. 1. Genereer de SW libraries van de Hardware via Tools
Generate
libraries and BSPs… 2. Ga in EDK naar het menu Project
Add SW Application project… Geef
het nieuwe project een naam (Figuur 2-17). Selecteer de juiste processor en klik op OK. 40
Figuur 2-17. Software project naam
3. Kies in het tabblad Applications in EDK om de Default: ppc405_0_bootloop in het BRAM te initialiseren. Kies er voor om het project Test_opb_fp niet te initialiseren in het BRAM. Men kan slechts één SW applicatie in het BRAM initialiseren. De overige applicaties in het project worden dus “Make project
inactive” gemaakt. Onderstaande Figuur 2-18 geeft het tabblad Applications weer.
Figuur 2-18. Overzicht Software Projects
4. Maak een nieuw C bestand aan met daarin de C code van het softwareprogramma dat moet uitgevoerd worden. Voeg dit bestand toe aan de
sources van het software project. 5. Kies in het menu Tools
Build All User Applications… om het
software project te compileren en om te bouwen tot een .elf bestand. Controleer met de volgende stappen de instellingen van het Linker Script. Zorg dat deze ingesteld staan zoals hieronder beschreven wordt. 6. Klik met de rechtermuisknop op de SW project titel: Project: Test_opb_fp en selecteer Generate Linkerscript.. (Figuur 2-19)
41
Figuur 2-19. Openen van Generate Linker Script
7. Kies in het Generate Linkerscript venster om alle onderdeleen van de applicatie in het extern geheugen uit te voeren. Zet alles op DDR_256MB_32MX64… Enkel de stukken .boot0 en .boot blijven op plb_bram_if_cntlr_1 staan (Figuur 2-20). Klik op Generate om het linkerscript te genereren en het venster af te sluiten.
Figuur 2-20. Generate Linkescript venster
8. Voer nu opnieuw build project uit met het nieuwe linkerscript. 9. Klik op het download icoontje (
)om de hardware te programmeren en de
bootloader in het oefenbord te laden. 10. Open de XMD console (
). Kies ppc405_0 als Processor instance. Wanneer
de XMD prompt verschijnt moet de .elf file die het programma bevat ingeladen worden en de processor gestart worden. Dit gebeurt als volgt: XMD% XMD%
dow Test_opb_fp/executable.elf run
42
De PowerPC processor wordt gestart en het programma wordt uitgevoerd. Om de processor te stoppen en XMD af te sluiten moet men volgende commando’s ingeven. XMD% XMD%
stop exit
2.4 LCD aansturing op Virtex-4 MB Development Board Voordat we aan de slag gaan met een applicatie op het Virtex-4 bord, zullen terug zoals bij de Virtex-II Pro de bibliotheken moeten worden ingevoegd. Deze kunnen gevonden worden op het volgend internet adres: http://legacy.memec.com/solutions/reference Op deze site is registratie vereist om de bestanden te kunnen downloaden. De implementatie van deze library files hebben we uitvoerig besproken in vorige hoofdstukken en dus zullen we hier niet verder op ingaan. Op het Virtex-4 bord is een LCD scherm geïmplementeerd. Deze kan niet via de BSB wizard worden ingevoegd, dus zal de gebruiker dit zelf moeten doen. Voor deze LCD is een driver en pcore ter beschikking, die we bij de bibliotheken voegen van Memec. Dit zal het programmeren van het LCD scherm enorm vereenvoudigen.
2.4.1 Hardware Invoegen Eenmaal de pcore en driver van het LCD display is ingevoegd, en de BSB wizard doorlopen is, openen we het menu Add/Edit Cores. Indien de libs goed zijn ingevoegd zal hier de opb_lcd_controller beschikbaar zijn. Voeg deze toe en verbind deze in het volgende tabblad als slave op de mb_opb bus. Voor dit display zal ook een adresrange moeten worden gedefinieerd, deze kan automatisch worden gegenereerd met de button Generate Addresses in het volgende tabblad. In het volgende tabblad Ports zullen volgende instellingen moeten worden gemaakt: Internal Port Connections: Instance: opb_lcd_controller_0
Port Name:
Net Name:
43
lcd_rs
opb_lcd_controller_0_lcd_rs
lcd_en
opb_lcd_controller_0_lcd_en
lcd_data
opb_lcd_controller_0_lcd_data
Deze ports moeten ook external worden gemaakt, en bij opb_lcd_controller_0_lcd_data zal een range moeten worden gedefinieerd van [0:7]. Eenmaal dit alles is gebeurd, mag de bistream worden aangemaakt.
2.4.2 Software toevoegen Volgende code zal in een nieuwe software applicatie moeten worden ingevoegd:
#include "xuartlite_l.h" #include "xgpio_l.h" #include "xparameters.h"
unsigned int count_1 = 0; unsigned int count_2 = 0; unsigned int timer_count = 1; char *lcd_message_line1[2] = {"
Designed by
", "
Van Eessen
"}; Xuint32 ReadFromGPInput(Xuint32 BaseAddress) { Xuint32 data = XGpio_mGetDataReg(BaseAddress, 1); return data; } main() { int count_1 =0; int count_2 =0; int delay; unsigned char *naam; int i;
xil_printf("Entering Main \r\n"); Xuint32 push = ReadFromGPInput(XPAR_PUSH_BUTTONS_3BIT_BASEADDR); xil_printf("Data read from Push_Buttons_3Bit: 0x%x\r\n", push); 44
Xuint32 switches = ReadFromGPInput(XPAR_DIP_SWITCHES_8BIT_BASEADDR); xil_printf("Data read from Dip_Switches_8Bit: 0x%x\r\n", switches);
lcd_init(XPAR_OPB_LCD_CONTROLLER_0_BASEADDR); lcd_clear(XPAR_OPB_LCD_CONTROLLER_0_BASEADDR);
xil_printf("Geef u naam in: "); for(i=0;i<16;i++) { naam[i] = inbyte(); xil_printf("%c",naam[i]); if(naam[i]=='\r') break; } xil_printf("\n");
{ lcd_write(XPAR_OPB_LCD_CONTROLLER_0_BASEADDR, lcd_message_line1[count_1]); lcd_line(XPAR_OPB_LCD_CONTROLLER_0_BASEADDR, 2); lcd_write(XPAR_OPB_LCD_CONTROLLER_0_BASEADDR, naam); lcd_line(XPAR_OPB_LCD_CONTROLLER_0_BASEADDR, 1); } xil_printf("Exiting Main\r\n"); } Tabel 2-1. Aansturing LCD display
Als er gewerkt wordt met HyperTerminal moeten we volgende instellingen definiëren: Baud rate: 9600 Data:
8 bit
Parity:
none
Stop:
1 bit
45
Eenmaal de design is ingeladen krijgen we volgende reactie van Hyperterminal: Entering Main Data read from Push_Buttons_3bit: 0x7 Data read from Dip_Switches_8bit: 0x55 Geef u naam in: Van Eessen Wim Exiting Main Tabel 2-2. LCD aansturing in HyperTerminal
Eenmaal we dit gekregen hebben, krijgen we op het lcd display: Designed by Van Eessen Wim
46
Deel 3: Embedded Operating Systems 3.1 Inleiding Typisch voor het ontwerp van embedded systemen is het gelijktijdig ontwerpen, en de nauwe verwevenheid van hardware (de elektronische schakeling) en software (het programma dat de elektronische schakeling leven in blaast). Embedded systemen dateren uit het begin van de jaren 1960 waarbij ze gebruikt werden om de elektromechanische telefoon schakelaars te besturen. Later werden ze geïntroduceerd in de militaire-, medische-, luchtvaart- en auto-industrie. Tegenwoordig worden de embedded systemen gebruikt voor veel verschillende toepassingen: •
Netwerk apparatuur zoals Firewalls, routers, switches..
•
Consument apparatuur zoals MP3 spelers, GSM’s, PDA’s, digitale camera’s, home entertainment systemen…
•
Huishoudtoestellen zoals microgolfovens, wasmachines, televisies…
•
Kritische systemen zoals satellieten en vlucht controle apperatuur
Enkele voorbeelden waarin gebruik gemaakt wordt van een embedded besturingsystemen.
Figuur 3-1. 3coms Router (3CR860-95) beschikt over een embedded Linux OS
Figuur 3-2. Samsung SGH-858 met Smartphone Linux OS
47
De belangrijkste verschillen van embedded systemen ten op zichte van de gewoone desktop computer zijn de volgende: •
Embeddded systemen zijn meestal kostgevoelig
•
De meeste embedded systemen hebben real-time vereisten
•
Er zijn heel veel CPU architecturen (zoals ARM, MIPS, PowerPC, Microblaze,…) die gebruikt worden voor embedded systemen. Bij embedded systemen wordt gebruik gemaakt van toepassing-specifieke processors. Zo is een processor in een digitale camera op maat gemaakt voor beeldopname en bewerking.
•
Embedded systemen maken gebruik van weinig RAM, ROM en andere I/O toepassingen in vergelijking met een desktop computer.
•
Power management is zeer belangrijk bij de meeste embedded systemen.
•
Bij een embedded systeem gebeurt het ontwerp van de hardware en software gelijktijdig. Daarbij wordt rekening gehouden met de specifieke toepassing van het systeem en zal er een grote verwevenheid van hardware en software zijn.
In het begin van de embedded systemen werd nog geen gebruik gemaakt van een operating systeem. De software werd direct ontwikkeld voor gebruik op de hardware met geen of bijna geen multitasking of gebruikersinteractie met het systeem. In de loop der tijden zijn de vereisten steeds hoger geworden, waardoor op deze systemen een besturingsysteem nodig was om aan alle vereisten goed te kunnen voldoen. Daardoor werden de systemen uitgerust met multitasking/multithreading, proces en geheugen management, communicatie tussen de verschillende processen, timers,enz… Op dit moment zijn er verschillende bedrijven die een Embedded Operating Systeem op de markt hebben zoals Wind River VxWorks, Microsoft Windows CE, QNX Neutrino, Accelerated Technology Nucleus, Red Hat eCos, Sun Microsystems ChorusOS, LynuxWorks LynxOS,… Deze operating systemen zijn meestal commerciële producten en kunnen specifiek ontwikkeld worden voor een klant die zijn hardwaresysteem op de markt wil brengen. Een andere mogelijkheid voor een embedded besturingsysteem is de Open Source Linux. De Open Source Linux is meestal niet op maat gemaakt voor het embedded hardwaresysteem maar kan aangepast worden naar het hardwaresysteem zonder dat daarbij gebruikersrechten of licenties betaald moeten worden aan een firma die besturingsystemen op de markt heeft. Daarbij komt nog het voordeel dat linux door bijna alle types processors ondersteund wordt. Daarnaast zijn er nog bedrijven die hun eigen OS voor hun eigen hardware ontwikkeld hebben. Zo is er de Xilinx Micro Kernel die gebruikt kan worden voor Xilinx FPGA toepassingen en die in de volgende paragraaf besproken wordt . [9] 48
3.2 Xilinx Micro Kernel 3.2.1 Inleiding De Xilkernel is een kleine kernel van de fabrikant zelf die zich gemakkelijk laat bijwerken. De Xilkernel kan zowel op de MicroBlaze als PowerPC worden geïmplementeerd. Bovendien is hij gratis bijgeleverd in de EDK software, en kunnen we direct aan de slag.
3.2.2 Xilkernel Onderdelen [1] De Xilkernel bestaat uit verschillende onderdelen; deze onderdelen zullen we ook terugvinden in andere besturingssystemen. We zullen deze kort beschrijven.
Figuur 3-3. Xilkernel onderdelen [1]
3.2.2.1 Processen, Threads en Scheduling Besturingssystemen kunnen meerdere applicaties als onafhankelijke processen verwerken. Elk proces heeft een zekere geheugenruimte, gescheiden van de andere processen. Een hardware timer zal periodiek een interrupt geven aan de processor, die de scheduler aanstuurt. Het tijdsinterval tussen deze interrupts noemt met een time slice. De scheduler is een functie binnen het besturingssysteem die bepaalt aan welk proces wordt gewerkt per time slice. Een voorbeeld hiervan: 1. Timeslice1: De kernel start zich op, en de scheduler beslist dat proces A mag beginnen. De kernel start proces A
49
2. Timeslice2: De kernel stopt proces A, bewaart zijn toestand en begint proces B. 3. Timeslice3: De kernel stopt proces B, bewaart zijn toestand, haalt de toestand van proces A op en herstart proces A. 4. Timeslice4: Proces A stopt. De kernel haalt de toestand van proces B op en herstart proces B. Door deze manier van werken, zullen proces A en proces B de indruk geven dat ze tegelijkertijd worden uitgevoerd. Bijvoorbeeld, wanneer we in onze Internet explorer werken, zal het ene proces ervoor zorgen dat onze webpagina ingeladen wordt. Terwijl een tweede proces ervoor zorgt dat we onze schuifbalk kunnen bewegen. Zonder besturingssysteem, zouden we moeten wachten tot onze hele pagina geladen is, voordat we de schuifbalk zouden kunnen gebruiken. In de Xilkernel is een thread de eenheid van verwerking en deze qua werking is analoog met een proces. Het programmeren van deze threads is gebaseerd op de welgekende POSIX standaard. We spreken hier dus van pthreads. Terwijl andere besturingssystemen een thread zien als een onderdeel van een proces, is een thread de primaire eenheid van verwerking in onze Xilkernel. De Xilkernel voorziet in verschillende soorten scheduling, de priority driven pre-emptive scheduling (SCHED_PRIO) of de Round Robin (SCHED_RR) scheduling. Dit moet worden ingesteld in de kernel, we komen hier nog op terug. Werken we in SCHED_RR, zal een ready queue gemaakt worden waarin tussen de processen wordt getimesliced. In de SCHED_PRIO mode, zullen er evenveel ready queues zijn als prioriteit niveaus. Prioriteit 0 is de hoogste prioriteit en hogere waarden zullen dus lagere prioriteit hebben. Het proces met de hoogste prioriteit in de ready queue wordt dus als eerste uitgevoerd. Wanneer er meerdere processen zijn met dezelfde prioriteit, worden deze Round- Robin uitgevoerd. Lege ready queues worden overgeslagen. Wanneer een proces geblokkeerd is, wordt het uit zijn ready queue genomen en in de wait queue geplaatst. De lengte van de wachtrijen en het aantal prioriteitniveaus kan worden aangepast. 50
Figuur 3-4. Prioriteits afhandeling [1]
Elk proces kan zich in een van volgende toestanden bevinden: •
PROC_NEW
•
PROC_READY
•
PROC_RUN
•
PROC_WAIT
•
PROC_DEAD
Figuur 3-5. Process Context states [1]
51
3.2.2.2 Synchronization Constructs Wanneer twee processen dezelfde gedeelde bron, zoals bv. een LCD- scherm willen aanspreken, kan het nodig zijn om een exclusieve toegang te geven aan één van deze processen. Bijvoorbeeld: wanneer proces A aan het schrijven is naar deze ruimte, moet proces B wachten totdat proces A klaar is alvorens uit ditzelfde blokje te lezen. Dit geldt dan ook omgekeerd. De constructs die daarvoor zorgen worden synchronization
constructs genoemd. De Xilkernel kent twee constructs namelijk Semaphoren en Mutexen.
Semaphoren De semaphoren zijn meer geavanceerd dan de mutexen en ze zijn voorzien van een telinrichting die het coördineren vergemakkelijkt in complexere systemen. Een mutex lock is te vergelijken met een binaire semaphore, maar de mutexen en semaphoren worden toch onafhankelijk geïmplementeerd. Volgend kort voorbeeld kan wat duidelijkheid scheppen in de werking van semaphoren voor proces A en proces B: 1. Proces A creëert een semaphore X met als initiële waarde 0. 2. Proces B creëert een semaphore Y, ook met een initiële waarde 0 en wacht voor een signaal van semaphore X. De wait operatie blokkeert een proces tot een corresponderende signaaloperatie deze vrijgeeft. 3. Proces A schrijft in de gedeelde geheugenplaats. Wanneer hij klaar is roept hij het commando sem_post() op, die semaphore X signaleert. Proces A zal nu wachten op semaphore Y vooraleer hij zal schrijven. Ondertussen krijgt proces B nu toegang tot de geheugenplaats door semaphore X. 4. Wanneer proces B klaar is, zal hij semaphore Y signaleren en terug wachten op semaphore X. 52
Mutexen Hoewel mutexen niet veel verschillen van semaphoren, toch zijn mutexen alleen gedefinieerd voor threads in de Xilkernel. Iedere thread die een bron wil aanspreken roept de pthread_mutex_lock() functie op om exclusieve toegang te krijgen. Als de bron niet beschikbaar is, wordt de thread geblokkeerd tot de bron toegankelijk is. Wanneer de thread uiteindelijk klaar is met zijn acties wordt de bron terug vrijgegeven met de pthread_mutex_unlock() functie. 3.2.2.3 Inter- Process Communication Onafhankelijke processen of threads kunnen onderling informatie uitwisselen door gebruik te maken van shared memory ofwel door message passing.
Shared memory Stel: we hebben een systeem met twee processen dat ons gedeeld geheugen als volgt gebruikt: 1. Proces A leest data van een seriële ingang en bewaart het in het geheugen. 2. Proces B leest de data van het geheugen en berekent hiermee een waarde. In dit geval moet je de data bewaren in een shared memory segment. Je kunt het aantal en de grootte configureren in de kernel.
Message Passing Een andere techniek om proces A en proces B dezelfde data te laten delen is, message passing. Volgend voorbeeld toont de werking van twee processen die message passing gebruiken: 1. Proces A leest data van een seriële ingang en creëert een message die deze data bevat. 2. Proces A zendt de message naar de message queue, samen met een queue indentifier. 3. Proces B zal de message van de message queue halen, en de data uit deze message verwerken.
53
De message passing gebruikt inwendig semaphoren om een simpele communicatie te voorzien tussen processen. Om shared memory en message passing te programmeren maken we hier terug gebruik van de POSIX standaard. 3.2.2.4 Code en Runtime Structure Er zijn twee soorten applicatie modes in de Xilkernel.
Separate Executable mode Desktop operating systemen zoals Linux of Windows hebben een structuur die gebruikersapplicaties gescheiden houdt van de besturingssysteemcode. De executable bestanden hebben de extensie *.elf. Wanneer een machine wordt gestart, wordt de executable code voor het besturingssysteem in het geheugen geladen en opgestart. Het besturingssysteem creëert op zich dan nieuwe processen voor de gebruikersapplicaties. Applicaties kunnen gebruik maken van de kernel via de system call interface. Deze system call kan gebruikt worden als we de applicaties linken aan de bibliotheek libsyscall.a. De Xilkernel werkt op deze manier in de ‘separate executable’ mode. Het grote voordeel van deze mode is dat we zeer flexibel kunnen werken en elke applicatie afzonderlijk kunnen inladen.
Kernel Bundled Executable mode Veel embedded operating systemen gebruiken een ander mechanisme die de interactie met het besturingssysteem vereenvoudigt. In veel gevallen, zullen alle applicaties die zullen draaien op het embedded systeem al bekend zijn wanneer het systeem wordt gecreëerd. Al deze applicaties bevinden zich in een soort niet vluchtig geheugen. In zulke situaties, zijn de operating system kernel en gebruikersapplicaties gebonden in één enkele executable file die in het geheugen wordt geladen. Wanneer we de kernel opbouwen wordt de bibliotheek libxilkernel.a gegenereerd, die we dan linken aan elke applicatie die op de kernel werkt. Deze manier van werken noemt men de ‘Kernel
Bundled Executable Mode’.
54
Figuur 3-6. Building Applications for Xilkernel [1]
In de Separate Executable Mode voor MicroBlaze bevinden de Xilkernel code en data zich in dezelfde locaties als in de Kernel Bundled Executable Mode, maar elke applicatie heeft zijn eigen elf file en een ander start adres. Bijvoorbeeld, applicatie A heeft een startadres 0x10000000 en zijn code en data heeft een adresruimte van 0x10000000: 0x10FFFFFF. Terwijl applicatie B het startadres 0x11000000 en een adresruimte van 0x11000000: 0x110FFFFF heeft. De applicaties in de Separate Executable Mode moeten worden gecompiled met de –xl –mode –xilkernel vlag. De PowerPC versie van de Xilkernel heeft een andere geheugenlay-out. Het standaard linker script bevat drie delen: vecmem, codemem en datamem waarvan de grootte door de gebruiker kan worden aangepast. Vecmem is een vector deel en heeft een standaard grootte van 9KB en het startadres 0x0. Codemem is het geheugen dat alle instructies bevat, samen met het boot adres 0xFFFFFFFC. Het beginadres van codemem is 0xFFFFD000 en het heeft een grootte van 12K. Datamem bevat alle data, heeft het startadres 0x00002400 en een grootte van 9K. In de Separate Executable Mode zijn deze geheugenruimtes voldoende groot om de Xilkernel executable en de applicaties met hun executable elf bestanden in op te slaan.
55
Code structure Willen we een applicatie schrijven, dan moeten we enkele basisregels volgen: de code moet xmk.h includeren. Deze zorgt ervoor dat de xilkernel bepaalde standaard C bibliotheken kan lezen. Onze applicatie moet ook de routine main() bevatten. Wanneer we deze functie oproepen, zal onze kernel nog steeds inactief zijn. Om de kernel actief te maken gebruiken we de functie xilkernel_main(). Deze functie start de kernel, scheduler, timers en het interrupt systeem. Onze code heeft dus volgende structuur:
#include “xmk.h” #include <stdio.h> /* De declaratie van de variabelen gebeurt hier. */ int main() { /* Applicatie initialisatie gebeurt hier. */ /* De applicatie mag nog geen kernel interface gebruiken */ xilkernel_main();
/* starten van de kernel
} /* creeeren van de eerste thread */ int first_thread() { } Tabel 3-1. C Code thread creatie
3.2.2.5 Using Xilkernel We doorlopen volgende stappen om de Xilkernel te gebruiken in je applicaties: 1. We creëren ons hardware platform 2. We configureren de kernel 3. We creëren onze applicatie(s) 4. We downloaden alles in de Virtex-II pro
56
Hardware platform Het hardwareplatform voor de applicatie dat we hier gebruiken ziet er als volgt uit:
Figuur 3-7. Hardware Platform Xilkernel toepassing
Configureren van de Xilkernel Eenmaal ons project is gemaakt met de BSB wizard, beschreven in de vorige hoofdstukken, kunnen we aan de slag. We selecteren Project -> Software Platform Settings…
57
Figuur 3-8. Software Platform Settings
Bij Kernel and Operating Systems zien we onze twee PowerPC’s staan. We hebben hier de keuze tussen volgende mogelijkheden: vxWorks, xilkernel, standalone en linux_mvl31. We kiezen de xilkernel. Om onze kernel te configureren, klikken we op het derde tabblad Library/OS Parameters.
58
Figuur 3-9. Library/OS Parameters
We zien hier terug de twee PowerPC’s met hun instellingen. We selecteren het volgende: stdin
RS232_Uart_1
stdout
RS232_Uart_1
Dit is nodig om via de RS232 uitgang data te kunnen verzenden.
59
Verder stellen we de volgende parameters in:
Figuur 3-10. Library/OS Parameters instellingen
60
Deze instellingen vinden we ook terug in het MSS bestand onder de Project files: PARAMETER VERSION = 2.2.0 BEGIN OS PARAMETER OS_NAME = standalone PARAMETER OS_VER = 1.00.a PARAMETER PROC_INSTANCE = ppc405_1 END BEGIN OS PARAMETER OS_NAME = xilkernel PARAMETER OS_VER = 3.00.a PARAMETER PROC_INSTANCE = ppc405_0 PARAMETER sched_type = SCHED_PRIO PARAMETER stdin = RS232_Uart_1 PARAMETER stdout = RS232_Uart_1 END Tabel 3-2. Xilkernel in MSS bestand
Eenmaal dit gebeurd is, maken we onze bitstream aan.
Figuur 3-11. Generate Bitstream
We maken hierna een nieuwe applicatie aan door in het tabblad applications te dubbelklikken op Software Projects. Hierna creëren we ons linker script. We selecteren Tools -> Generate Linker Script
61
Figuur 3-12. Generate Linker Script
Klik op Generate. Werken we met de Xilkernel als besturingssysteem dan moeten we onze Compiler opties aanpassen. Dubbelklik op compiler options in het tabblad applications.
62
Figuur 3-13. Set Compiler settings
Bij Libs to link plaatsen we –lxilkernel, dit om onze applicatie te kunnen compileren. Nu zijn we klaar om onze applicatie toe te voegen aan ons project.
Creëren van een applicatie
We voegen nu deze applicatie toe aan ons project: #include #include #include #include #include #include #include #include #include #include #include
"xmk.h" <stdio.h> <string.h> <stdlib.h>
<sys/process.h> "xstatus.h" <xparameters.h> "xgpio.h" <xgpio_l.h>
#include "sys/ipc.h" 63
#include "sys/msg.h"
#define DELAY 150000 int ret; int ret_sem; // Pthread indentifiers and attributes pthread_t tid, tid0, tid1; pthread_attr_t attr; int retval; int x; int y; XGpio Gpio; // Structures for setting up task priority struct sched_param prio; void* thread_func1(void *dummy) { for(x=0; x< 5; x++){ xil_printf("thread 1 \r\n"); XGpio_mSetDataReg(XPAR_LEDS_4BIT_BASEADDR,1, 0xe); usleep(DELAY); } return(0); }
void* thread_func2(void *dummy) { do { xil_printf("thread 2 \r\n"); XGpio_mSetDataReg(XPAR_LEDS_4BIT_BASEADDR,1, 0xd); usleep(DELAY); } while(1); return(0); } void* thread_func3(void *dummy) { do { xil_printf("thread 3 \r\n"); XGpio_mSetDataReg(XPAR_LEDS_4BIT_BASEADDR,1, 0xb); usleep(DELAY); }while(1); return(0); } void* thread_func4(void *dummy) { 64
for(y=0; y<5; y++){ xil_printf("thread 4 \r\n"); XGpio_mSetDataReg(XPAR_LEDS_4BIT_BASEADDR,1, 0x7); usleep(DELAY); } return(0); }
void* test_main(void *dummy) { xil_printf("entering test_main \r\n"); // initialiseren van de attributen retval = pthread_attr_init(&attr); if(retval == 0) { print("Attributen Geinitialiseerd \r\n"); } // initialiseren van taken // prioriteit van de taken zettenen voor de Xilkernel prio.sched_priority = 1; pthread_attr_setschedparam(&attr, &prio); retval = pthread_create(&tid, &attr, thread_func1, NULL); if(retval == 0) { print("Thread 1 gecreeerd \r\n"); print("prioriteit: "); putnum(attr.schedparam.sched_priority); print("\r\n"); } prio.sched_priority = 2; pthread_attr_setschedparam(&attr, &prio); retval = pthread_create(&tid0, &attr, thread_func2, NULL); if(retval == 0) { print("Thread 2 gecreeerd \r\n"); print("prioriteit: "); putnum(attr.schedparam.sched_priority); print("\r\n"); }
prio.sched_priority = 3; pthread_attr_setschedparam(&attr, &prio); retval = pthread_create(&tid1, &attr, thread_func3, NULL); if(retval == 0) { 65
print("Thread 3 gecreeerd \r\n"); print("prioriteit: "); putnum(attr.schedparam.sched_priority); print("\r\n"); } prio.sched_priority = 1; pthread_attr_setschedparam(&attr, &prio); retval = pthread_create(&tid, &attr, thread_func4, NULL); if(retval == 0) { print("Thread 4 gecreeerd \r\n"); print("prioriteit: "); putnum(attr.schedparam.sched_priority); print("\r\n"); } xil_printf("Exiting test_main \r\n"); return(0); } int main() { print("\r\nEntering Main \r\n"); int i; XGpio_mSetDataDirection(XPAR_LEDS_4BIT_BASEADDR, 1,0); for (i = 0; i < 8; i++) { XGpio_mSetDataReg(XPAR_LEDS_4BIT_BASEADDR,1, 0x0); usleep(150000); XGpio_mSetDataReg(XPAR_LEDS_4BIT_BASEADDR,1, 0xf); usleep(150000); }
//Starten van kernel xil_printf("Starten van de kernel \r\n"); xilkernel_main(); print("Exiting Main \r\n"); return(0); }
We kunnen onze threads in onze source files definiëren, maar we kunnen deze ook in ons softwareplatform implementeren. Hier zorgen we ervoor dat onze test_main een thread met prioriteit 0 wordt. Dit doen we als volgt:
66
Figuur 3-14. Thread declaration in Library O/S
Klik op ok.
Inladen van het project in de FPGA Open hyperterminal in windows:
Figuur 3-15. Hyperterminal Start Menu
67
Stel een seriële verbinding op met volgende eigenschappen:
Figuur 3-16. Eigenschappen Seriële Verbinding
We laden nu het project in de virtex 2 pro:
Figuur 3-17. Downloaden in de Virtex
68
We krijgen volgend resultaat in onze hyperterminal:
Figuur 3-18. Threads in HyperTerminal
We zien dat thread 1 en thread 4, vijf maal in Round Robin worden uitgevoerd en dat daarna thread 2 in zijn lus blijft hangen. Thread 3 zal nooit uitgevoerd worden omdat hij de laagste prioriteit heeft, en omdat we thread 2 continu blijven uitvoeren. Dit duidt de eerder uitlegde werking aan van threads. 3.2.2.6 Verschil tussen MicroBlaze & PowerPC Xilkernel implementaties De programming interface blijft dezelfde voor de gebruiker, zowel met MicroBlaze als met PowerPC. Er is wel een verschil in de onderliggende hardware, dat verschillen kan tonen in grootte van gecompileerde code en efficiëntie.
69
Xilkernel met MicroBlaze Wanneer we onze Xilkernel willen draaien op een MicroBlaze processor hebben we volgend hardware platform nodig: •
MicroBlaze processor
•
16KB BRAM of ander geheugen die met de processor verbonden is via een LMB of OPB bus met een memory controller. (Het kan meer of minder zijn naargelang de instellingen van de kernel.)
•
OPB timer die verbonden is met de processor via de interrupt poort.
•
Uart or Uartlite voor input/output. (optioneel, maar is handig voor debugging)
Xilkernel met PowerPC Willen we onze Xilkernel laten werken op een PowerPC processor hebben we volgend hardware platform nodig: •
PowerPC processor
•
32 KB BRAM of een extern geheugen die met de processor verbonden is via een PLB of OPB bus met een memory controller. (Het kan meer of minder zijn naargelang de instellingen van de kernel.)
•
Uart of Uartlite voor input/output. (optioneel, maar is handig voor debugging)
Toepassing op ons project
De PowerPC heeft geen timer nodig die een interrupt geeft aan de processor, omdat deze timer zich al in de PowerPC bevindt. We hebben dit project wat aangepast zodat we tussen thread 1 en thread 4 blijven Round Robin schakelen. We sturen met deze threads twee LED’s aan. We configureren beide processors op hun maximum werkingsfrequentie. De maximum werkingsfrequentie van een MicroBlaze processor is 100MHz; deze van een PowerPC processor 300MHz. Wanneer men nu meet met een oscilloscoop op deze twee LED’s voor beide hardwareplatformen krijgen we volgende resultaten:
70
MicroBlaze:
Figuur 3-19. Microblaze op oscilloscoop
PowerPC:
Figuur 3-20. PowerPC op oscilloscoop
71
We zien duidelijk wanneer onze ene LED zal oplichten, de andere LED zal doven. Wat zoveel betekent dat de Round Robin drie maal zo snel gebeurt bij een PowerPC hardwareplatform en dit op een frequentie van ±150Hz.
3.2.3 Ethernet Libraries 3.2.3.1 LibXil Net
Inleiding De Embedded Development Kit (EDK) Networking Library, LibXilNet maakt het mogelijk om met een processor verbinding te maken met het Internet. LibXilNet bevat functies om met het TCP/IP protocol te werken. Het voorziet eveneens in een simpele instructieset van Socket Application Programming Interface (APIs).
Ondersteunde protocols •
Ethernet Encapsulation (RFC 894)
•
Address Resolution Protocol (ARP RFC 826)
•
Internet Protocol (IP RFC 791)
•
Internet Control Management Protocol (ICMP RFC 792)
•
Transmission Control Protocol (TCP RFC 793)
•
User Datagram Protocol (UDP RFC 768)
•
Socket API
72
Architectuur van de bibliotheek In volgende figuur zien we de architectuur van libXilNet.
Figuur 3-21. LibXilnet Architecture [1]
Beperkingen De LibXilNet bibliotheek is een kleine TCP/IP stack. Xilnet is ongeveer 8KB groot, waardoor hij zich uitstekend leent voor systemen met weinig geheugen. Doordat deze stack zo klein is, zullen bepaalde functies niet ondersteund worden in deze bibliotheek. Wil men een volledige TCP/IP functionaliteit, dan moet men de LwIP bibliotheek gebruiken. Maar deze zal dan wel meer geheugen in beslag nemen.
73
XilNet gebruiken in een applicatie Wanneer deze bibliotheek gebruikt wordt in een applicatie dienen volgende regels in de code te worden ingevoegd: Define “#include ” Define “#include ” 3.2.3.2 Webserver Hierbij een voorbeeld van een webserver die op de XilNet bibliotheek gebaseerd is.
Hardware vereiste •
Virtex-II pro Development Board (XUP V2P)
•
Seriële kabel voor UART uitgang
•
USB download kabel
•
Ethernet kabel
Software vereiste •
Embedded Development Kit (EDK) 7.1i
•
Terminal Programma (Hyperterminal - 9600, 8, 1, N)
Hardware ontwerp De hardware van dit project is gemaakt door het uitvoeren van de BSB wizard. Volgende peripherals werden aan dit project toegevoegd. •
PPC405
•
PLB BRAM – 64 KB
•
PLB2OPB Bridge
•
OPB uart16550 – 9600 Baud
•
PLB ETHERNET MAC
•
LEDs_4 Bit
•
DIPSWs_4 bit
•
OPB_ONEWIRE
74
Figuur 3-22. Hardware Design WebServer
Software en implementatie Hierna wordt de bitstream gegenereerd. Wanneer deze klaar is, worden volgende instellingen in het menu Software Platform Settings gemaakt: 1. Vinken de bibliotheek XilNet aan in het software platform tabblad. 2. In het tabblad Library/OS parameters moeten we bij de processor STDIN & STDOUT aanvullen met de UART peripheral. 3. In dit zelfde tabblad in het openklapmenu Xilnet is het nodig de emac_instname op te geven. Deze vinden we terug in de MSS- file. Wanneer dit gebeurd is, maken we een nieuwe applicatie. We genereren een nieuw linkerscript en voegen onze source & headerfiles toe, de code hiervan bevindt zich in de bijlagen. Verbind het bord met het netwerk en met de RS232 van de computer. Dan pas kan het project in het bord geladen worden. Wanneer alles goed verloopt, krijg je volgende reactie in de HyperTerminal:
75
Figuur 3-23. Webserver in HyperTerminal
Start nu Internet Explorer in Windows. Surf naar het adres: http://172.23.6.120:8080 Volgend scherm krijgen we te zien:
76
Figuur 3-24. Webserver in Internet Explorer
Wanneer een hexadecimale waarde ingevuld wordt, zal de desbetreffende LED branden op het bord. De waarde van onze switches op het bord wordt ook op de webpagina weergegeven. Wanneer er aanpassingen worden gemaakt moet de webpagina vernieuwd zijn, dit kan met indrukken van F5. Hierbij zal de achtergrondkleur van de webpagina veranderen. 3.2.3.3 LwIP (v2.00.a)
Inleiding TCP/IP is een protocolsuite die ontworpen is om een stabiele datastroom tussen twee hosts te voorzien. Het is een manier om te communiceren over een netwerk. De meeste mensen gebruiken dit protocol dagelijks om hun email, surfen op het web en bestanden te dowloaden. TCP/IP wordt ook meer en meer gebruikt in embedded systemen. Dit hoofdstuk beschrijft de Light Weight IP bibliotheek. Deze bibliotheek bevat een open source implementatie van een TCP/IP protocol. De bibliotheek ondersteunt twee
77
interfaces, namelijk Raw API en Socket API. Wat hierbij interessant is, is dat de socket interface gebruikt maakt van de Xilinx Microkernel module (XMK) [2].
Ondersteunde protocols •
IP (Internet Protocol)
•
ICMP (Internet Control Message Protocol)
•
UDP (User Datagram Protocol)
•
TCP (Transmission Control Protocol)
•
Raw API interface
•
Socket API interface
Raw API De Raw API in de LwIP bibliotheek is het laagste niveau van interface die voorziet in directe toegankelijkheid van de stack. De LwIP stack zorgt voor de goede werking van de interne timers. Deze interne timers zijn bij een PowerPC afkomstig van een ingebouwde hardware timer. Bij een MicroBlaze systeem moeten we gebruik maken van een externe timer.
Socket API De Socket API is er om normale, sequentiële programma’s gebruik te laten maken van de LwIP stack. De Socket API wordt gebruikt door een operating system laag die de verbinding maakt tussen de LwIP code en het onderliggende besturingssysteem. De sockets maken hier gebruik van semaforen en mailboxes. De Xilinx Microkernel zorgt voor de aansturing van deze semaforen en mailboxes.
LwIP gebruiken in een applicatie Iedere applicatie zal zich aan een aantal initiële routine functies moeten houden. Deze regels code zullen dus in de applicatie moeten worden ingevoegd. Voor een Raw API zijn dit de volgende:
78
/*************************************************************** * CalllwIP Initialization Routines *****************************************************************/
sys_init(); mem_init(); memp_init(); pbuf_init(); netif_init(); tcp_init();
/*************************************************************** * Setup our 1 network interface *****************************************************************/
netif = netif_add(&ip_addr, &net_mask, &gw, &XEmacIF_ConfigTable[0], xemacif_init, ip_input); // use xemacliteif_init for ethernetlite instance netif_set_default(netif); Tabel 3-3. LwIP Initialization Routines Raw API [2]
Voor een Socket API interface moet in de main functie van de kernel aangeroepen worden. Dit gebeurt op dezelfde manier als bij een gewoon Xilkernel programma.
int main() { /* Initialize devices like UART, GPIO etc in the system */ /* Invoke the kernel */
xilkernel_main();
// App thread gets specified in MSS and hence started after this... } Tabel 3-4. LwIP Initialization Routines Socket API [2]
79
Elke applicatie maakt gebruik van threads in deze interface. Deze threads moeten in de Software Platform Settings opgegeven zijn bij static_pthread_table.
3.2.3.4 Echoserver Dit voorbeeld draait de LwIP v2.00.a in de socket mode op een PPC405. De LwIP maakt hier gebruik van de XilKernel(XMK) om de Socket API te ondersteunen. Hij maakt hiervoor gebruik van de 10/100 Ethernet core. Dit design is een TCP gebaseerde echoserver die het IP adres 172.23.6.120 gebruikt, poort 7, MAC adres 0x000000002238. Dit ontwerp maakt gebruik van 5 connecties(sockets). De echo server bevat ook een dummy thread die aantoont dat de kernel op verschillende threads scheduling toepast.
Hardware vereiste •
Virtex-II pro Development Board (XUP V2P)
•
Seriele kabel voor UART uitgang
•
USB download kabel
•
Ethernet kabel
Software vereiste •
Embedded Development Kit (EDK) 7.1i
•
Terminal Programma (Hyperterminal - 115200, 8, 1, N)
Hardware ontwerp Om gebruik te maken van de LwIP bibliotheek zullen enkele hardware en software instellingen moeten gemaakt worden. Dit is een voorbeeld van hoe de hardware voor een PowerPC design er moet uitzien:
80
Figuur 3-25. Hardware Design EchoServer
Bij gebruik van deze bibliotheek is het gebruik van een interrupt controller nodig die de 10/100 Ethernet verbint met de PowerPC via een niet kritische ingang. In de BSB wizard gebeurt dit automatisch door bij de ethernet peripheral ‘use interrupts’ aan te vinken. Bij een MicroBlaze systeem zal een OPB TIMER moeten extra ingevoegd worden. In dit voorbeeld is gebruik gemaakt van 256 MB DDR extern geheugen. Deze dient opgegeven te zijn in de BSB wizard en op het Virtex-II Pro bord te zijn aangebracht. Het is ook aan te raden, de test_memory_app applicatie, die in de BSB wizard te vinden is, aan te vinken en te testen. Deze voert een test van het geheugen uit.
Software Eenmaal de hardware in orde gebracht is, kan men de bitstream genereren. Wanneer dit gebeurd is, kan de source code aan een nieuw software project worden toegevoegd. De source code van de echoserver bevindt zich in de bijlage. Hierna wordt een linkerscript gegenereerd. Dit is de geheugenverdeling:
81
Figuur 3-26. Linker Script EchoServer
Bij de compiler options moet bij Libs to Link staan: -lwip4 –lxilkernel Dit zorgt ervoor dat de source code correct kan gecompileerd worden.
82
Instellingen In het menu Software Platform Settings dienen volgende instellingen te worden gemaakt:
Figuur 3-27. Software Platform Settings EchoServer
In het tabblad Library/OS Parameters moeten volgende instellingen aangebracht worden: Menu Xilkernel -> config_pthread_support max_pthreads
50
pthreads_stack_size
5000
static_pthread_table
socket_dummy
1
dummy_thread
1
83
-> config_sched max_readyq
100
-> config_time config_time
true
max_tmrs
100
-> config_sema config_sema
true
max_sem
25
max_sem_waitq
100
-> stdin & stdout stdin & stdout
RS232_Uart_1
-> sysintc_spec sysintc_spec
opb_intc_0
Menu LwIP -> api_mode api_mode
SOCKET API
-> proc_instance proc_instance
ppc405_0
-> emac_instance emac_instance
Ethernet_MAC
eth_addr1
0x00
eth_addr2
0x00
eth_addr3
0x00
eth_addr4
0x00
eth_addr5
0x22
eth_addr6
0x38
84
Implementatie Eenmaal al deze instellingen gebeurd zijn, wordt het bord via de RS232 uitgang met de computer verbonden. Daarna worden de instellingen van de hyperterminal in orde gezet. Hierna kan het project in de design geladen worden. Dit moet via de XMD compiler gebeuren van Xilinx. Wanneer deze opgestart is, worden volgende commando’s toegepast: dow naamproject/executable.elf con Wanneer alles goed verloopt, zien we volgende vensters: XMD:
Figuur 3-28. XMD EchoServer
85
Hyperterminal:
Figuur 3-29. EchoServer in HyperTerminal
Eenmaal dat de processor z’n taken uitvoert, wordt een Telnetsessie geopend. Dit kan via Start -> Uitvoeren -> telnet Volgende commando’s worden ingegeven: Open 172.23.6.120 7 Daarna moet een ‘Enter’ gegeven worden na de lijn: Bezig met verbinden met 172.23.6.120 Dan wordt een zwart scherm bekomen. Als nu hier iets wordt getypt, zal onze echoserver zorgen voor een echo op de getypte karakters. We zien hier een voorbeeld:
86
Figuur 3-30. HyperTerminal en Telnet EchoServer
3.3 Embedded Linux 3.3.1 De Linux Kernel Een besturingsysteem is een programma die als interface optreedt tussen de gebuiker en de hardwarelaag van het systeem. Het heeft tot doel om een omgeving te creëren waarin de gebruiker programma’s kan uitvoeren zonder dat daarbij op hardware niveau moet gewerkt worden. Linux besturingsystemen zijn modulair opgebouwd. De verschillende elementen zijn: •
System-calls: De implementatie van taken die door de kernel afgehandeld moeten worden; processen kunnen met de kernel communiceren dankzij de system-calls interface.
•
Bestandsystemen: maken het mogelijk om gegevens op te slaan op diverse media.
•
Buffercache: een cache die gebruikt wordt voor input en output.
•
Beheer van randapparaten: zorgt ervoor dat de fysieke apparaten kunnen worden aangestuurd.
•
Netwerkmanager: beheert de netwerkprotocollen, zoals IP.
•
De Kernel: Zorgt voor procesbeheer, een scheduler, messages, modules en beheer van fysiek en virtueel geheugen. 87
Figuur 3-31. Overzicht van de onderdelen van een besturingsysteem
Processen binnen het Linux-besturingsysteem kunnen niet direct communiceren met de hardware, de kernel zit er altijd tussen. Dit is erg belangrijk, want op deze manier kan een slecht geprogrammeerd proces het systeem niet verstoren of tot stilstand brengen, dat kan alleen de kernel zelf als er zich een probleem voordoet. Het besturingsysteem zorgt dat de commando’s die door de gebruikers worden gegeven, worden omgezet in machinespecifieke instructies. Voor elk gegeven commando wordt een aantal opeenvolgende maar samenhangende functies uitgevoerd. Dit blijkt wanneer er het commando ls wordt ingegeven. Indien ls wordt ingegeven, herkent de driver waarmee het toetsenbord wordt aangestuurd dat er tekens ingetypt zijn. Deze tekens worden door de driver doorgegeven aan de Shell. De Shell gaat vervolgens met het commando aan het werk door te zoeken naar een uitvoerbaar stuk programma met dezelfde naam als het opgegeven commando. De Shell vindt de programmacode, in dit geval in de vorm van het commando /bin/ls. De kernel-services zorgen er vervolgens voor dat dit programmabestand in het geheugen wordt uitgevoerd. Vervolgens maakt het commando ls calls naar het onderdeel van de kernel dat zich bezighoudt met het 88
bestandsysteem, om uit te vinden welke bestanden beschikbaar zijn. Het bestandsysteem zorgt er verder voor dat deze gegevens uit cache vanaf de harde schijf worden gelezen en verwerkt. Ook zijn voor de verdere verwerking de drivers nodig van het media waarop de gegevens staan, alsook de drivers van het uitvoerapparaat om de resultaten op het scherm weer te geven. Het blijkt dus dat het systeem gebruik maakt van een verzameling van functies die op één of andere manier met elkaar samenwerken. In de volgende paragrafen zal wat dieper worden ingegaan op een aantal belangrijke taken van het besturingsysteem 3.3.1.1 Kernel-gegevensstructuren Het besturingsysteem moet gegevens bijhouden over de huidige status van het systeem en doet dit met gegevenstructuren die een reflectie vormen van de huidige status van het systeem. Deze gegevensstructuren bestaan normaal in het fysieke werkgeheugen en worden op een Linux-systeem bijgehouden in het bestandsysteem /proc. De kernel maakt er intensief gebruik van om te achterhalen waar bepaalde gegevens zich precies bevinden. De gegevens in de gegevensstructuur staan vaak verspreid over het systeem. De Linux-kernel kan deze gegevens aan elkaar verbinden doordat de gegevensstructuren aan elkaar gekoppeld zijn. Dit houdt in dat elk element in de gegevensstructuur een pointer bevat naar het volgende en eventueel ook naar het vorige element. Om de gegevens snel terug te vinden wordt gebruik gemaakt van hash-tables, die in het geheugen bewaard worden. 3.3.1.2 Geheugenbeheer Algemene zaken, zoals het bewaren van veelgebruikte gegevens in het geheugen, moeten worden geregeld. Verder is het vaak noodzakelijk dat naast het fysieke geheugen ook logisch geheugen in de vorm van een swap-bestand aanwezig is. Het totaal van deze geheugens moet als één geheel aan het besturingsysteem gerepresenteerd worden. Dit “totaalgeheugen” wordt doorgaans virtueel geheugen genoemd. Verder moet worden geregeld dat elk proces netjes gebruik maakt van zijn eigen adresruimte, dit is een gedeelte van het werkgeheugen dat voor een proces is gereserveerd. Daarbij mag nooit de mogelijkheid bestaan dat twee processen gebruik maken van hetzelfde gebied in het geheugen. Ook moet het geheugenbeheer-
89
subsysteem ervoor zorgen dat elk proces een evenredig deel van het totale geheugen tot zijn beschikking krijgt. Indien verschillende processen dezelfde code gebruiken moet het mogelijk zijn om deze code te gebruiken, terwijl deze slechts éénmaal in het geheugen is geladen. 3.3.1.3 Procesbeheer Een proces kan het beste worden voorgesteld als een programma in actie. Het proces kan gestart worden door een commando in te voeren. Hiermee wordt bereikt dat het nieuwe proces als child van het huidige proces gestart wordt. Een proces als geheel is dynamisch, het verandert met de instructies die door de processor worden uitgevoerd. Het proces moet zich bewust zijn van de locaties in het geheugen waar zich gegevens van het proces bevinden. Daarnaast moet het proces op de hoogte zijn van de registers van de processor die in gebruik zijn. Elk proces is actief in zijn eigen virtuele adresruimte en is niet in staat om direct te communiceren met andere processen, dit kan enkel met tussenkomst van de kernel. De Linux-kernel moet zich bewust zijn van wat alle processen doen en van welke registers een proces gebruik maakt. Ook houdt de kernel bij op welke plaats in het geheugen zich de gegevens bevinden die bij een bepaald proces behoren. Linux is een multiprocessing-systeem, de kernel moet er dus voor zorgen dat meerdere processen gelijktijdig gebruik kunnen maken van de CPU. De processen communiceren met het systeem door gebruik te maken van system-calls. Een system-call is een verzoek in user-modus van een proces aan de kernel. Doordat het proces dit in user-modus doet, heeft het slechts zeer beperkt toegang tot de resources van het systeem. De kernel gaat vervolgens in kernel-modus verder met de afwerking van het verzoek. In kernel-modus heeft de kernel volledig toegang tot de systeemresources en kan zo een voor het proces gevraagde taak uitvoeren. Het resultaat daarvan wordt vervolgens weer teruggestuurd naar het proces.
90
Figuur 3-32. Afhandeling van system calls
Voor de communicatie met processen kunnen programma’s gebruik maken van signalen. Dergelijke signalen kunnen bijvoorbeeld gegenereerd worden door een interrupt van het toetsenbord of door een foutstatus in een programma. Een aantal signalen kunnen door de kernel en door de processen op een Linux-systeem worden gegenereerd. Processen kunnen ervoor kiezen sommige van deze signalen te negeren. Er zijn echter twee signalen die nooit genegeerd kunnen worden. (behalve door het proces init): SIGSTOP, dat ervoor zorgt dat een proces zijn activiteit staakt, en SIGKILL, dat ervoor zorgt dat het proces wordt afgebroken. Niet elk proces op een systeem is in staat signalen te sturen naar elk willekeurig ander proces, alleen de kernel en de superuser kunnen dat. Normale processen kunnen alleen signalen sturen naar processen met dezelfde UID en GID, of naar processen in dezelfde procesgroep. Hierdoor kan een gewone gebruiker nooit een proces van een andere gebruiker verwijderen. Voor communicatie tussen processen maakt Linux gebruik van drie soorten communicatiemethodes: message queues, semaphores en shared memory. Voordat een proces echter kan communiceren met een ander proces, moet het daarvoor een speciale system-call uitvoeren naar de kernel, zodat de kernel de toeganpermissies die het proces daartoe heeft, kan controleren.
91
Via een message queue kan een proces direct een bericht sturen naar een ander proces, bijvoorbeeld als gebruik wordt gemaakt van FIFO’s. Een semaphore is in zijn eenvoudigste vorm een locatie in het geheugen waarvan de waarde getest en ingesteld kan worden door meerdere processen. De derde mogelijke interprocescommunicatie (IPC) is gebruik maken van shared memory, dit is geheugen dat voorkomt in de virtuele adresruimten van meerder processen. 3.3.1.4 Device-drivers De kernel kan met de devices communiceren doordat elk apparaat gerepresenteerd wordt door zijn eigen bestand. Deze device-bestanden kunnen door de kernel worden teruggevonden doordat elk apparaat voor de kernel wordt weergegeven door een major en minor nummer, de kernel kent het device aan de hand van deze nummers, die ook gekoppeld zijn aan de device-bestanden. Voor de communicatie met een apparaat moet het programma dat wil gebruik maken van dit apparaat zijn gegevens doorsturen naar het device-bestand. Aan dit devicebestand zijn een major en minor nummer gekoppeld. Met behulp van deze nummers, die functioneren als identificatienummers, kan de kernel communiceren met het device en het device met de kernel. Vervolgens zorgt de kernel dat de gegevens daadwerkelijk op het fysieke apparaat terecht komen. De kernel kent drie soorten apparaten, namelijk character-, block- en network-devices. Het lezen van en naar character-devices kan rechtstreeks plaatsvinden, zonder dat gebruik gemaakt wordt van buffering. Block-devices kunnen alleen worden benaderd door er gegevens naar toe te sturen die een veelvoud van de blokgrootte van 512 of 1024 bytes, waarbij de buffercache gebruikt wordt. Voor de benadering van een blockdevice wordt altijd gebruik gemaakt van het bestandsysteem. Ten slotte worden de network-devices benaderd via het netwerksubsysteem. Alle device-drivers in de Linux-kernel hebben een aantal overeenkomstige eigenschappen; •
Elke driver maakt deel uit van de kernel, hetzij direct, hetzij indirect in de vorm van een module. Het feit dat een device-driver deel kan uitmaken van de kernel betekent dat hij in het ongunstigste geval in staat is om het hele systeem om zeep te helpen als er iets niet goed gaat.
92
•
Er worden standaardmethoden gebruikt voor de communicatie met enerzijds de kernel en anderzijds het apparaat.
•
Device-drivers maken gebruik van standaard kernel-services zoals memoryallocation, interrupt-afhandeling en queues.
•
Veel device-drivers kunnen als module worden geladen als ze nodig zijn en weer ontladen worden op het moment dat ze niet meer nodig zijn. Alleen de drivers die fundamenteel zijn voor het opstarten van het systeem kunnen niet als module worden geladen.
•
Ze worden geïntegreerd in de kernel
•
Tijdens het opstarten van het systeem worden alle device-drivers die voorkomen in de kernel geactiveerd. Ze gaan vervolgens op zoek naar aanwezige hardware. Als de hardware er niet is doen ze niets en nemen ze hooguit geheugenruimte in beslag.
3.3.1.5 Het bestandsysteem Één van de kenmerken van Linux is dat ondersteuning geleverd wordt voor verschillende bestandsystemen. Dit maakt Linux flexibel en zorgt ervoor dat het vrij eenvoudig kan samenwerken met andere besturingsystemen. Al deze bestandsystemen zijn door mounts geïntegreerd in één hiërarchische structuur, die verspreid kan staan over meerdere block-devices. De kernel beschouwd alle block-devices waarop de bestandsystemen voorkomen als een aaneengesloten verzameling van block-devices, zonder dat hij weet heeft van de methodes die daarop gebruikt worden om bestanden op te halen. Het bestandsysteem is dus eigenlijk gewoon een overkoepelende instantie voor alle block-devices. Elk bestandsysteem communiceert met de kernel via een tussenliggende laag, het Virtual File System (VFS). De kernel is zich uitsluitend bewust van het virtuele bestandsysteem, alle afzonderlijke bestandsystemen bieden een interface naar dit algemene bestandsysteem. Het zorgt er met behulp van een tussenliggende buffercache voor dat bestanden weggeschreven kunnen worden naar de block-devices. De meest gangbare bestandsystemen die onder Linux gebruikt worden zijn ext2 en zijn opvolgers ext3 en ReiserFS.
93
Figuur 3-33. De rol van het bestandsysteem in relatie tot de kernel
3.3.1.6 De opbouw van de kernel: uit één stuk of modulair In tegenstelling tot bij andere besturingsystemen maken de device-drivers ook deel uit van de Linux-kernel. Oorspronkelijk werd één grote kernel gebruikt, waarin de drivers voor alles devices waren opgenomen. Aangezien de functionaliteit van veel devicedrivers niet continu nodig is, betekende dit dat de kernel vaak veel groter was dan strikt noodzakelijk. Dit is vanaf kernel 2.0 verbeterd doordat kan worden gewerkt met modules. Alle device-drivers die niet nodig zijn om de Linux-kernel zelf goed op te starten, kunnen worden geïnstalleerd als module. Dit biedt volgende voordelen: •
De omvang van de kernel blijft beperkt.
•
Door de kleinere omvang neemt de snelheid van de kernel toe.
•
Modules zijn alleen geladen als ze echt nodig zijn, zodat efficiënter kan worden omgegaan met systeemresources.
Niet alle componenten kunnen worden geladen als modules. Zeker deze componenten die nodig zijn tijdens de eerste fase van het opstarten mogen niet als module worden geladen. Over het algemeen moeten volgende componenten in de kernel direct worden gecompileerd. •
Het bestandsysteem waar de root-partitie gebruik van maakt.
•
Drivers die nodig zijn om het systeem op te starten.
•
Ondersteuning voor andere harde schijven
•
Networking-ondersteuning
•
TCP/IP-networking
•
Ondersteuning voor ELF-binaries
94
De overige componenten kunnen meestal onder de vorm van modules worden geïnstalleerd.
3.3.2 Embedded Linux op PowerPC 3.3.2.1 Inleiding Het oefenbord van digilent beschikt over een Virtex-II Pro FPGA. In deze FPGA zijn twee vaste processors aanwezig van het type PowerPC. Daarnaast beschikken ze net zoals vele andere FPGA’s van Xilinx de mogelijkheid om soft-processors te implementeren (Microblaze-processor). In deze paragraaf zal beschreven worden hoe men een Linux besturingsysteem kan implementeren op een PPC systeem. Men hoeft niet noodzakelijk dezelfde instellingen te gebruiken. Het zijn instellingen die getest geweest zijn naar beschikbare hardware en software. Er bestaan zeker nog andere mogelijkheden, maar deze zijn niet onderzocht in dit eindwerk. Gebruikt systeem: •
Besturingsystemen: Windows XP Linux distributie: Fedora Core 4
•
Hardware:
XUPV2P-oefenbord Compact Flash 512MB DDR-RAM 256MB Cross-Over netwerk kabel, Gewoon Netwerk kabel en RS232 Seriële kabel
•
Software:
Xilinx Platform Studio: Release V. 7.1.02i (Win XP) Terminal programma (vb. Hyperterminal, Tera Term Pro
•
Cross Compiler voor PPC:
Crosstool Denx ELDK
•
Tools:
rsync 2.6.6
3.3.2.2 Hardware instellingen Maak een nieuw project aan en bouw de hardware via de Base System Builder (BSB) wizard voor het XUPV2P bord via de library files van het oefenbord. Let wel op dat het project niet wordt opgeslagen in een directory welke spaties bevat! Bijvoorbeld map “ Mijn Documenten” in Windows XP zal niet werken! Neem dit als een algemene regel voor EDK. Indien dit niet zo is zullen er foutmeldingen optreden bij het bouwen van libraries, maken van bitstreams,…
95
Hardware instellingen in EDK:
PowerPC processor (300MHz) OPB_UART_16550 OPB_ETHERNET (no DMA) OPB_SYSACE DDR_256_32Mx64_rank1_row13_col10_cl2_5
(DIMM van 256 MB)
Maak alles interrupt-driven. Kies bij de instellingen voor PLB_BRAM_IF_CONTRL voor 128 KB( maximum voor het XUP bord). Laat de PPC’s O/S als stand-alone staan voor beide CPU’s. Op dit punt kan de hardware getest worden door een simpele hardwaretest. Dit kan later veel problemen verhelpen. Indien de PowerPC’s in standalone niet werken zullen ze zeker niet werken met een Linux OS! Creëer dus een simpel “Hello World” programma of gebruik het TestApp_Memory programma dat werd gemaakt door de BSB wizard. Indien dit werkt, dan is de hardware goed geconfigureerd. Indien het TestApp_Memory programma uitgevoerd werd moet er in een hyperterminal venster (met instellingen: Baud Rate: 9600, Databits: 8, Pariteit: Geen, Stopbits: 1, datatransportbesturing: Geen) volgende output verkregen worden: --Entering main( )-Starting MemoryTest for DDR_256MB_32Mx64_rank1_row13_col10_cl2_5: Running 32-bit test… PASSED! Running 16-bit test… PASSED! Running 8-bit test… PASSED! --Exiting main( ) -Tabel 3-5. Hyperterminal output van het TestApp_memory programma
Als deze test geslaagd is moet in het “application” tabblad van het project de bootloop geconfigureerd worden voor gebruik in het BRAM. Klik dus met de rechtermuisknop op “default: ppc_405_0_bootloop” en kies “Mark to initialize BRAM”. Zorg er voor dat er geen andere programma’s in het BRAM worden geladen! Ga nu via het menu “tools” van XPS naar “update bitstream” om de nieuwe instellingen in de bitstream aan te passen. 3.3.2.3 BSP maken in EDK Het BSP (Board Support Package) zijn files die worden gemaakt om later de Linux kernel te kunnen compileren. Het BSP bevat de hardwareconfiguratie en de benodigde drivers en .h bestanden van het XUPV2P bord.
96
Kies in de EDK “Software Platform Settings”. In het tabblad “Software Platform” moeten volgend instellingen gemaakt worden: Kies onder kernel and Operating Systems van de PPC_405_0 processor voor Linux kernel: Linux_mv131
versie 1.01.a
Onder het “Library/OS Parameter” tabblad: - Kies voor MEM_SIZE de grootte van het DDR: 0x10000000
(voor 256MB RAM)
- Stel PLB_CLOCK_FREQ_HZ in op de PLB speed: 100000000 - Kies voor TARGET_DIR een directory op het systeem waar de BSP moet geplaatst worden. Let wel op! Gebruik enkel voorwaartse slashes anders zal het niet lukken! (Bijvoorbeeld /bsp of c:/bsp). Met voldoende kennis van Linux kan er via een windows XP box en een VMWare Workstation Linux box een intern netwerk gelegd worden, zodat je de bestanden direct op de juiste plaats komen te staan in de Linux kernel distribution tree. Dit wordt niet verder in dit eindwerk besproken. - Onder Connected_perihps worden de devices opgegeven die de Linux kernel moet ondersteunen: RS232_Uart_1 Ethernet_MAC SysACE_CompactFlash opb_intc_0 - Verander in de system.mss file de versie van de ethernet driver van 1.00.e naar 1.00.c. Indien men toch gebruik wil maken van versie 1.00.e dienen er later enkele aanpassingen aangebracht worden in de Linux kernel. Deze veranderingen worden later beschreven bij de kernel configuratie (Zie paragraaf 3.3.2.8). - Maak de BSP aan dmv “Generate Libraries and BSP’s” in het “tools” menu. De configuratiebestanden worden aangemaakt en in de opgegeven directory geplaatst. Ga naar de TARGET_DIR (/bsp) via windows verkenner. Deze directory moet gecomprimeerd worden tot een .tar bestand. Dit kan door middel van programma’s die 97
dit ondersteunen in windows. (Bijvoorbeeld powerarchiver 2006, http://www.powerarchiver.com). Plaats dit .tar bestand op een USB-stick en start de Fedora Core Linux-omgeving op via VMWare. Vanaf dit punt wordt overgeschakeld naar een Linux omgeving. 3.3.2.4 Cross-Compiler maken voor PPC In eerste instantie moet het systeem over een Compiler beschikken die de betreffende processor architectuur ondersteund, in dit geval een cross-compiler voor PowerPC of ELDK van DENX voor PPC. Een cross-compiler laat de software ontwerper toe om Ccode te compileren voor een PPC architectuur ook al wordt gewerkt op een x86 linux omgeving. Hier worden twee veel gebruikte gratis PowerPC crosstools beschreven. Er bestaan nog andere welke ook gratis te downloaden zijn alsook commerciële pakketten die uiteraard niet gratis zijn maar deze worden hier niet besproken.
1ste compiler: Crosstool Crosstool is een script die helpt bij het bouwen van een cross-compiler. Het bevat alle nodige commando’s zodoende dat dit script enkel dient uitgevoerd te worden in een terminal venster en de compiler wordt automatisch aangemaakt. Start met het downloaden van Crosstool en bewaar deze tarball op het systeem. Bijvoorbeeld in map /opt.
Ga naar de directory waarin het bestand crosstool-0.38.tar.gz gedownload werd. Pak het bestand uit. Hierbij wordt een nieuwe map gecrëerd met naam /opt/crosstool-0.38 Voer in een terminal venster volgende commando’s uit:
$ $ $
cd /opt tar –zvxf crosstool-0.38.tar.gz rm –fr crosstool-0.38.tar.gz
Ga naar de directory crosstool-0.38. In deze map bevinden zich .sh scripts. Deze bevatten configuraties voor de bibliotheken glibc en gcc. Voor het aanmaken van een compiler voor PowerPC 405 wordt het script demo-ppc405.sh uitgevoerd.
$ $
cd crosstool-0.38 gedit demo-ppc405.sh
(#=lijn in commentaar)
98
Deze file bevat onderstaand script. Controleer als de juiste lijnen in commentaar staan. Één versie van gcc en glibc is voldoende voor de Cross-Compiler. Neem best de laatste stabiele versie dat het script ondersteunt. Zet de andere lijnen in commentaar.
#eval `cat #eval `cat #eval `cat #eval `cat #eval `cat #eval `cat #eval `cat eval `cat #eval `cat notest
powerpc405.dat powerpc405.dat powerpc405.dat powerpc405.dat powerpc405.dat powerpc405.dat powerpc405.dat powerpc405.dat powerpc405.dat
gcc3.3glibc2.2.5.dat` sh all.sh --notest gcc3.3glibc2.3.2.dat` sh all.sh --notest gcc3.2.3glibc2.2.5.dat` sh all.sh --notest gcc3.3.2glibc2.3.2.dat` sh all.sh --notest gcc3.3.2glibc2.3.2.dat` sh all.sh --notest gcc3.3.3glibc2.3.2.dat` sh all.sh --notest gcc3.4.0glibc2.3.2.dat` sh all.sh --notest gcc3.4.1glibc2.3.3.dat` sh all.sh --notest gcc3.4.1glibc20040827.dat` sh all.sh --
Vooraleer het script wordt uitgevoerd moeten er nog enkele Linux omgevingsvariabelen worden gespecificeerd. Meer bepaald TARGET, welke de naam van de processor architectuur bevat. Evenals PREFIX die de directory waar de toolchain zal in terecht komen bevat. Geef in een terminal venster volgende commando’s in:
$ $ $
export TARGET=powerpc-405-linux export PREFIX=/opt/${TARGET} sh demo-ppc405.sh
Het script wordt nu uitgevoerd. De uitvoering van het demo-ppc405.sh script neemt tijd(>1uur) en veel plaats(≈1,2GB) in beslag. Wanneer het script volledig is uitgevoerd staat in de PREFIX directory de volledige Cross-Compiler. De laatste stap in het bouwen van de Cross-compiler is de PREFIX directory kenbaar maken aan het Linux zoek pad met volgend commando:
$
export PATH=${PREFIX}/bin:${PATH}
Op dit punt gekomen kan het Linux systeem C-code compileren naar PPC processors op een i386 systeem. Met andere woorden de Cross-Compiler is gebouwd.
99
2de compiler: DENX ELDK PPC-tools Een andere gratis Cross-Compiler voor de PowerPC architectuur is de Embedded Linux
Development Kit (ELDK) van Denx. Deze kan gedownload worden via de website van DENX (http://www.denx.de). De downloadpagina van ELDK kan teruggevonden worden door bovenaan op software te klikken. Klik onder Embedded Linux
Development Kit op mirror sites. Kies de meest recente beschikbare versie. Via de map ISO kan de .iso-image van ELDK gedownload worden. Bijvoorbeeld ppc-2005-0607.iso. Men kan deze image branden op CD of men kan deze rechtstreeks in Linux openen door de .iso image te mounten als CD-ROMstation. Deze methode wordt hier niet verder besproken. Ga naar een Linux sessie en plaats de CD met ELDK in het station. In Fedora Core 4 wordt deze automatisch gemount en verschijnt een pictogram op het bureaublad. Indien dit niet het geval is moet het CD-ROM station nog gemount worden. Daarvoor verwijs ik naar handleidingen over het mounten van CD-stations in Linux. Ga nu via een terminalvenster naar de gemounte directory van het CD-ROMstation ( in Fedora Core 4 is dit /media/cdrecorder) en voer volgend commando uit in een terminal venster:
$ ./install [-d ] [] [] … Waarbij:
= Directory waarin ELDK zal komen ,,… = Verschillende cpu-architecturen waarvoor ELDK moet worden geïnstalleerd. (bijvoorbeeld PPC_4xx, PPC_4xxFP, PPC_6xx…)
In het geval van de XUPV2P oefenborden met daarop twee PowerPC-405 processors moet vanuit de locatie waarop de CD gemount is de volgende installatie uitgevoerd worden:
$ $
mkdir /opt/eldk cd /media/cdrecorder
(Nieuwe directory maken voor ELDK) (Naar de directory van de CD gaan)
100
$
./install –d /opt/eldk ppc_4xx
De installatie wordt nu uitgevoerd. Na de installatie zal het zoekpad van Linux opnieuw moeten aangepast worden. Voer daarom volgend commando uit in een terminal venster:
$
PATH=$PATH:/opt/eldk/usr/bin:/opt/eldk/bin
Het is altijd mogelijk om het zoekpad te bekijken om te controleren of de juiste directories doorzocht worden door Linux. Dit kan door volgend commando:
$
echo $PATH
Bij de output van dit commando moet altijd de directory vermeld staan van de CrossCompiler die men wil gebruiken om C-files te compileren voor PPC-architectuur. 3.3.2.5 De Linux PPC-kernel bronbestanden In tal van (oudere) documenten wordt beschreven om een ppc-kernel-tree af te halen via bitkeeper. Maar doordat bitkeeper sinds 1 juli 2005 niet meer gratis beschikbaar is, zijn de alternatieve manieren om een ppc-kernel tree af te halen intressanter. Er wordt soms gesproken over Bitmover wat de huidige gratis versie van bitkeeper zou zijn. Deze werd getest zonder enig resultaat te bereiken. Daarom werd een alternatief gezocht via rsync 2.6 welke ook gratis is. Rsync bezit geen mogelijkheden om versieroll-back te gebruiken. Er kan dus enkel gewerkt worden met de versies van de kernel die beschikbaar zijn in de desbetreffende rsync source server. Het is dus niet mogelijk om via rsync van kernel versie 2.4.26 terug te keren naar een vroegere uitvoering van bv 2.4.21 zoals dit vroeger wel mogelijk was via bitkeeper. Andere mogelijke programma’s om hetzelfde te bereiken werden niet getest.
Installatie van rsync 2.6 Ga naar de open-source site van rsync (http://samba.anu.edu.au/rsync) en download de laatste versie (bijvoorbeeld rsync-2.6.6.tar.gz) op de HD ( bijvoorbeeld in directory /opt). De installatie van rsync gebeurt door volgende commando’s in te geven in een terminal venster:
101
$ $ $ $ $ $
cd /opt tar –zvxf rsync-2.6.6.tar.gz rm –fr rsync-2.6.6.tar.gz cd rsync-2.6.6 ./configure make
Ga over naar su want voor volgend commando zijn root-rechten nodig #
make install
Source code afhalen via rsync De open-source bron bestanden voor de kernel die speciaal werden samengesteld voor de PPC architectuur kunnen worden afgehaald van de site http://www.pinguinppc.org. Deze open-source kernel trees bevatten alle bronbestanden om een kernel te bouwen voor de PPC-architectuur op de Xilinx-FPGA oefenborden. Als alternatief kunnen er ook kernel bron bestanden afgehaald worden via de officiële kernel.org website. Deze bevatten voor de 2.4.x kernels evenwel niet de mogelijkheid om met de Xilinx oefenborden te werken. De 2.6.x kernels bevatten deze mogelijkheden wel. Hier wordt enkel gewerkt met een 2.4 kernel omdat de configuratie instellingen beperkter zijn en dus duidelijker begrijpbaar zijn. Voer volgende commando’s uit in een terminalvenster om de bron bestanden af te halen via rsync van de montavista server:
$ rsync source.mvista.com:: $ rsync –avz --delete source.mvista.com::linuxppc_2_4_devel /opt/linuxppc_2_4_devel De source-code wordt afgehaald en in directory /opt/linuxppc_2_4_devel geplaatst. Neem als veiligheid vooraleer naar de volgende stap over te gaan een backup van deze map. Dit is altijd handig en kan veel tijd besparen indien er iets mis loopt tijdens de Linux kernel configuratie. 3.3.2.6 De Linux kernel configureren De kernel zal worden gebouwd met de Cross-Compilers die hierboven werden aangemaakt. De configuratie van de kernel gebeurt via een .config file. Deze bevat alle informatie van de onderdelen die de kernel zal bevatten. Deze file is niet rechtstreeks aanpasbaar maar dit gebeurt via make menuconfig of make xconfig. De veiligste methode voor een 2.4 kernel is via make menuconfig omdat de make
102
xconfig niet alle instellingsmogelijkheden bevat en zo bepaalde instellingen zelf zal meken waardoor de kernel niet zal kunnen worden gecompileerd zonder fouten door de gebrekkige of foute declaraties. De eerste stap is het aanpassen van het bestand Makefile, waarin opgegeven wordt dat er een kernel gebouwd wordt voor PowerPC. De Cross-Compiler die gebruikt zal worden moet eveneens ingesteld worden. Ga naar de map waarin de broncode van de kernel zich bevindt (bijvoorbeeld /opt/linuxppc_2_4_devel). Zoek en verander in de Makefile via een editor (nedit, gedit,…) de volgende lijnen naar:
ARCH :=ppc CROSS_COMPILE = powerpc-405-linux-gnu(indien Crosstool compiler wordt gebruikt) Of CROSS_COMPILE = ppc_4xx(indien de ELDK compiler gebruikt wordt) Sla de veranderingen aan het Makefile bestand op en sluit de teksteditor af. Voer nu het volgende commando uit in een terminal venster:
$
make menuconfig
103
Figuur 3-34. Make menuconfig venster
In het volgende stuk worden instellingen besproken die een werkende kernel opleveren wat op zich al geen evidentie is. Er zitten onderdelen in die nooit zullen aangesproken worden door de hardware. De instellingen die hieronder gegeven worden, zijn instellingen die moeten aanwezig zijn in de kernel ( includes). Deze worden aangeduid door [*] in de menuconfig. De instellingen die niet vermeld staan mogen achterwege gelaten worden ( excludes). Deze worden aangeduid door [ ] in de menuconfig.
Code Maturity Level Options [*] Prompt for development and/or incomplete drivers Platform Support [*] 40x Processor Type [*] Xilinx-ML300 Machine Type [*] Math Emulation TTYS0 device and default console (X) UART0 General Setup [*] Networking support [*] Sysct1 support [*] System V IPC
Mogelijkheid 1: Root File System via NFS aanspreken [*]
Default bootloader kernel arguments
104
“console=ttyS0, 38400 root=/dev/nfs nfsaddrs=client:server:gateway:netmask rw nfsroot=/opt/xupv2p”
Dit is een vast IP-address met NFS-rootfile system configuratie. Dit wordt later verder uitgediept. Dit zal later ook nog aangepast worden.( Daar zal de rol van Client, Server Gateway en netmask verder uitgelegd worden.) Zie paragraaf 0 Mogelijkheid 2: Root File System via Compact Flash zonder netwerkfuncties. [*]
Default bootloader kernel arguments “console=ttyS0, 38400 root=/dev/xsysace/disc0/part3 rw”
Mogelijkheid 3: Root File System via Compact Flash met DHCP network mogelijkheden. [*]
Default bootloader kernel arguments “console=ttyS0, 38400 root=/dev/xsysace/disc0/part3 rw ip=on”
Ip=on wil zeggen dat er gebruik gemaakt wordt van DHCP tijdens het booten van het systeem. Memory Technology Devices (MTD) [*] Memory Technology Device (MTD) Support [*] MTD partitioning support [*] Redboot partition table parsing [*] Direct char device acces to MTD devices [*] Caching block device acces to MTD devices RAM/ROM/flash chip device drivers --> [*] Detect flash chips by Common Flash Interface (CFI) probe [*] Support for AMD/Fujitsu flash chips Block Devices [*] Xilinx on-chip System ACE [*] Loopback device support [*] Network block device support [*] RAM disk support (4096) Default RAM disk size [*] Initial RAM disk (initrd) support Networking [*] [*] [*] [*]
Options Socket Filtering Unix domain sockets TCP/IP networking IP: multicasting 105
[*] [*] [*]
IP: kernel level autoconfiguration IP: DHCP support IP:TCP syncookie support (disabled per default)
Network Device Support [*] Network device support [*] Ethernet (10 or 100Mbit) [*] Ethernet(10 or 100Mbit) [*] Xilinx on-chip Ethernet Character devices [*] Standard/generic (8250/1650 and compatible UARTs) serial support [*] Support for console on serial port [*] Unix98 PTY support [*] I2C File Systems [*] Journaling Flash File Systems v2 (JFFS2) support (0) JFS2 debugging verbosity (0=quiet, 2=noisy) [*] Virtual memory file system support [*] /proc file system support [*] /dev file system support (EXPERIMENTAL) [*] Automatically mount at boot [*] /dev/pts file system for Unix98 PTY [*] Second extended fs support Network file system support --> [*] Provide NFSV3 client support [*] Root file system on NFS
Deze optie mag enkel worden ingeschakeld als het root-file system via netwerk moet aangesproken worden. Indien het bestandsysteem op de Compact Flash zal komen mag deze optie niet ingeschakeld staan. [*]
SMB file system support (to mount Windows shares etc.) Native Language Support --> Default NLS Option: “iso8859-1” Kernel Hacking [*] kernel debugging [*] include BDI-2000 user context switcher [*] Add any additional compile options Additional compile arguments:”-g –ggdb” (0) Kernel message buffer length shift (0=default) 3.3.2.7 BSP Installeren Voeg .tar file in die onder paragraaf 3.3.2.3 gecreërd werd op een willekeurige map in Linux toe. Dit kan eenvoudig door middel van een USB-Stick. Eventueel kunnen deze files ook doorgestuurd worden via smb server indien het Linux besturingsysteem in het windows netwerk is opgenomen. Untar dit bestand en zorg dat de files die werden 106
aangemaakt in EDK op de juiste plaats komen in de kernel directory (bijvoorbeeld /opt/linuxppc_2_4_devel). De structuur in de BSP directory komt overeen met de structuur in de kerneldirectory. De veiligste manier om fouten te vermijden is de bestanden manueel in de juiste directory te plaatsen van de kernel directory (bijvoorbeeld /opt/linuxppc_2_4_devel). De nodige bestanden bevinden zich in de mappen: …/arch/ppc/platforms/xilinx_ocp/ …/drivers/block/xilinx_sysace/ …/drivers/net/xilinx_enet/ 3.3.2.8 Kernel aanpassingen uitvoeren 1. Indien in EDK gebruik werd gemaakt van de ethernet driver “1.00.e” dan moet zoals eerder aangegeven het bestand /arch/ppc/platforms/xilinx_ocp/Makefile aangepast worden door middel van een teksteditor (bijvoorbeeld nedit, gedit,…) Doe volgende aanpassing:
Xilinx_ocp-objs += xbasic_types.o xdma_channel.o xdma_channel_sg.o \ Xipif_v1_23_b_o \ Xpacket_fifo_v2_00_a.o xpacket_fifo_l_v2_00_a.o \ Xversion.o Dit omdat er een nieuwere versie gebruikt wordt voor de xpacket_fifo driver dan dewelke in de originele Makefile gebruikt wordt. 2. In de menuconfig werd de bootloader ingesteld op een baudrate van 38400. Het is beter om alle communicatie die via de seriële poort gebeurt met dezelfde baudrate in te stellen. Om te communiceren met de bootloader op een baudrate van 38400 moet volgende file aangepast worden: /arch/ppc/boot/common/ns16550.c Pas de parameter SERIAL_BAUD aan van 9600 naar 38400. 3. Standaard heeft de ethernet controller op het oefenbord een MAC address dat Xilinx meegegeven heeft (00:0A:35:00:22:00). Indien er meerdere borden op een netwerk zullen staan zullen ze allemaal hetzelfde MAC address hebben. Dit kan aangepast worden door in het bestand /arch/ppc/boot/simple/embed_config het volgende te veranderen:
107
Zoek de lijn die het volgende bevat: BD->bi_enetaddr [5]= 0x00 Verander de hexadecimale waarde van 0x00 naar een andere willekeurige hexadecimale waarde. Zorg er evenwel voor dat er geen twee borden met dezelfde waarde aanwezig zijn in het netwerk! 3.3.2.9 De Kernel Compileren Zorg ervoor dat in het zoekpad van Linux de juiste compiler directories aanwezig zijn. Dit hangt natuurlijk af van welke compiler men wil gebruiken. Het zoekpad van Linux kan opgevraagd worden door in een terminal venster het volgende commando in te geven:
$
echo $PATH
Het volledig zoekpad wordt nu afgeprint op het scherm. Naargelang de gebruikte Cross-Compiler moet op het scherm iets afgeprint worden als:
Voor de Crosstool Cross-Compiler:
/opt/powerpc-405linux/bin:/usr/Kerberos/bin:/usr/local/bin…
Voor de ELDK Cross-Compiler: …:/opt/ELDK/usr/bin:/opt/ELDK/bin Indien de verwijzingen er zijn naar de Cross-Compiler die ingesteld werd in de Makefile van de kernelmap, dan zal de compiler de juiste bestanden terug vinden die nodig zijn om te compileren. Indien er geen verwijzing is naar deze mappen waar de Cross-Compiler gebouwd is moeten deze mappen nog toegevoegd worden aan het zoekpad. Het toevoegen van deze mappen aan het zoekpad werd reeds vroeger besproken in dit eindwerk namelijk bij het aanmaken van de Cross-Compilers. Maar doordat het compileren een vrij cruciaal proces is tijdens het bouwen van de Linux kernel worden de nodige commando’s nog eens meegegeven. Voor alle duidelijkheid: deze commando’s dienen enkel om een Cross-Compiler aan het Linux zoekpad toe te voegen en niet om een Cross-Compiler zelf te bouwen! In een terminalvenster dient men volgende commando’s uit te voeren:
108
Voor de Crosstool Cross-Compiler:
$ $ $
export TARGET=powerpc-405-linux export PREFIX=/opt/${TARGET} export PATH=${PREFIX}/bin:${PATH}
Voor de ELDK Cross-Compiler: $
PATH=$PATH:/opt/eldk/usr/bin:/opt/eldk/bin
Op dit punt is het systeem volledig ingesteld om de kernel te compileren. De kernel kan nu gecompileerd en gebouwd worden tot executable bestand voor de PPC processor door het volgende commando uit te voeren:
$
make dep && make zImage
Nu start de Cross-Compiler met alle files te compileren en wordt een zImage.elf binary bestand aangemaakt die kan worden geprogrammeerd in het hardware systeem op het oefenbord. Het is bijna uitgesloten dat tijdens het compile proces geen fouten zullen optreden. Deze fouten kunnen in het beste geval worden opgelost door instelling aan te passen in de make menuconfig. Het is meestal mogelijk om een aantal fouten snel te lokaliseren omdat de compiler stopt op het moment dat een fout werd ontdekt. Dan kan men door de laatste regels voor de fout te analyseren meestal snel achterhalen waar het probleem zich juist bevindt. Daarnaast zijn er nog twee fouten die altijd terug komen. Deze zullen zeker moeten aangepast worden gedurende het compile proces. -
In het midden van het compilatie proces zal er een fout gegeven worden in de file /arch/ppc/boot/simple/embed_config. Deze fout meldt dat er een I2C eprom nodig is om het MAC address te kunnen bewaren. Na wat onderzoek van de betreffende file is er het volgende te vinden op lijn 700 tot 707:
/*The ML300 uses an I2C SEEPROM to store the Ethernet MAC address, but either an I2C interface or the SEEPROM aren’t configured in. If you are in this situation, you’ll need to define an alternative way of storing the Ethernet MAC address. To temporarily work around the situation, you can simply comment out the following #error and a hard-coded MAC will be used.*/
109
De kernel is geconfigureerd voor een ML300 bord en deze bevat een I2C eprom interface. Zoals beschreven wordt kan de fout weggewerkt worden door de volgende lijn (#error…) in commentaar te plaatsen simpelweg omdat het XUPV2P oefenbord geen I2C eprom aan boord heeft en deze in geen geval kan geconfigureerd worden. Plaats dus de lijn waarop #error staat in commentaar als volgt:
//#error I2C needed for obtaining the Ethernet MAC address
Start opnieuw met het compileren ($ make dep && make zImage). -
Een tweede fout zal er zeker komen op het einde van het compilatie proces. Er is een bestand dat 2 keer wordt verplaatst van eenzelfde locatie wat natuurlijk niet kan, want eens bestand verplaatst is kan het geen tweede keer vanaf dezelfde locatie verplaatst worden. Een oplossing bestaat er dus in om de desbetreffende move instructies te vervangen door copy commando’s in de Makefile die zich bevindt in de map /arch/ppc/boot/simple/. Het gaat hier om de volgende regels code waar de mv commando’s moeten vervangen worden door cp commando’s:
zImage: $(ZIMAGE) cp zvmlinux ../images/zImage.elf zImage-EMBEDDED: zvmlinux cp zvmlinux ../images/zImage.$(END) Start het compilatie proces opnieuw. Als het volledige proces doorlopen wordt zonder fouten dan zal in de map /arch/ppc/boot/images/ een bestand staan met de naam zImage.elf. Dit bestand moet terug naar een Windows XP omgeving gebracht worden door middel van een USB-Stick of via het netwerk of een andere methode. Plaats het zImage.elf bestand in de projectmap van het bestaande project dat werd aangemaakt door Xilinx Platform Studio. 3.3.2.10
De Kernel testen
De kernel kan nu getest worden. Het Linux systeem zal nog niet werken want er is immers nog geen bestandsysteem gebouwd maar het moet initieel wel opstarten. Het testen kan gebeuren op verschillende manieren. Hier worden twee methodes
110
besproken nl. de methode via een Compact Flash kaart en de methode via de Hardware debugger XMD van EDK.
Methode via XMD Open het project dat onder Hardware werd aangemaakt in Xilinx Platform Studio. Er wordt gestart van de veronderstelling dat de hardware werkt en getest werd zoals hierboven beschreven. Evenals dient de bootloop geïnitialiseerd te worden in het BRAM. Het is ook noodzakelijk om XPS minimaal te updaten naar versie Xilinx Platform Studio: Release Version 7.1.02i zodat debuggen met JTAG via USB mogelijk wordt. -
Download de bitstream in het bord.
-
Start XMD op via het icoontje bovenaan of via het menu “tools”. Er wordt gevraagd naar een processor instance. Kies voor de ppc405_0. De JTAG verbinding wordt nu gemaakt met het oefenbord en de aanwezige hardware wordt onderzocht. Eventueel moet in de XMD debug options “JTAG Cable Type” nog ingesteld worden naar USB.
-
Als de XMD Shell op het scherm komt dienen volgende instructies ingegeven worden in de XMD shell prompt:
XMD% XMD% -
dow zImage.elf run
Om de processor te beëindigen en de XMD Shell te verlaten, worden volgende commando’s ingegeven:
XMD% XMD%
stop exit
Methode via Compact Flash Om het bord op te starten via een Compact Flash kaart moet er een .ace file aangemaakt worden die door het bord kan herkend worden en dus zo kan worden geconfigureerd. Dit kan op verschillende manieren gebeuren. Hier wordt 1 methode besproken:
111
-
Start met het maken van een bestand met naam xupGenace.opt (via kladblok of in XPS) die de volgende regels bevat. Sla dit bestand op in de projectmap waarin gewerkt wordt. -jprog -board user -target ppc_hw -hw implementation/download.bit -elf zImage.elf -configdevice devicenr 1 idcode 0x1127e093 irlength 14 partname xc2vp30 -debugdevice devicenr 1 cpunr 1 -ace xupppc.ace
-
Ga naar de “Xilinx xygwin Shell” via het icoontje (
) bovenaan XPS of via het
menu “tools”. Geef het volgende commando in:
$ -
xmd –tcl genace.tcl –opt xupGenace.opt
Er wordt nu een .ace file aangemaakt met de instellingen uit het xupGenace.opt bestand. Men kan deze file terugvinden in de projectmap. De naam en de maplocatie worden opgegeven in het xupGenace.opt bestand. In dit geval hier is de naam xupppc.ace (keuze is vrij) en de locatie is de hoofd projectmap. Eventueel kan er een andere submap aangemaakt worden in de projectmap. Om de .ace file in deze map dan op te slaan moet men de naam van de subdirectory opgeven in het xupGenace.opt bestand. In de lijn waar – ace staat voegt men de subdirectory toe. Bijvoorbeeld subdirectory acefiles
-ace acefiles/xupppc.ace -
Kopieer nu de xupppc.ace file op de Compact Flash kaart die op de juiste manier geformarteerd werd zodat de Xilinx SystemACE controller op het bord het filesysteem kan lezen. (Zie Appendix B:)
-
Plaats de CF kaart nu in het bord en schakel de power on. De .ace file wordt uitgevoerd. In het geval met de zImage.elf binary die eerder werd gecreëerd zal in een terminalvenster met baudrate 38400 het volgende verschijnen:
112
loaded at: 00400000 004BC1E4 board data at: 004B913C 004B9154 relocated to: 0040563C 00405654 zimage at: 00405B5C 004B838A avail ram: 004BD000 10000000 Linux/PPC load: console=ttyS0,38400 root=/dev/xsysace/disc0/part3 rw ip=on Uncompressing Linux...done. Now booting the kernel Linux version 2.4.26 (rodolf@localhost) (gcc versie 3.3.3 (DENX ELDK 3.1.1 3.3.3 -10)) #5 vr dec 16 18:19:28 CET 2005 Xilinx Virtex-II Pro port (C) 2002 MontaVista Software, Inc. ([email protected]) On node 0 totalpages: 65536 zone(0): 65536 pages. zone(1): 0 pages. zone(2): 0 pages. Kernel command line: console=ttyS0,38400 root=/dev/xsysace/disc0/part3 rw ip=on Xilinx INTC #0 at 0x41200000 mapped to 0xFDFFE000 Calibrating delay loop... 99.73 BogoMIPS … Tabel 3-6. Output in hyperterminal bij initieel opstarten van de kernel
-
Het bootproces zal een foutmelding geven wanneer het root file system zal worden gemount omdat er nog geen root file system aanwezig is op de Compact Flash kaart zoals opgegeven werd in de kernelconfiguratie. (root=/dev/xsysace/disc0/part3 rw)
3.3.2.11
Aanmaken van het Root File Systeem
Inleiding Tijdens het configureren van de kernel moet er een locatie opgegeven worden waarop het root file systeem zich zal bevinden. Dit bestandsysteem moet alle opstartbestanden bevatten om het linux systeem volledig operationeel te krijgen. Het bevat eveneens de instructies (ls, chmod, adduser…) om met het embedded linux systeem te werken. Zoals onder paragraaf 3.3.2.6 besproken werd kan het bestandsysteem op twee verschillende manieren aangesproken worden. Namelijk via Compact Flash en via een Network File System (NFS). De werkwijzeom beide root file systemen aan te maken is identiek. Enkel de locatie waarop ze zich bevinden is verschillend. De kernel moet ingesteld zijn zodat hij tijdens het opstarten de juiste locatie van het bestandsysteem weet en deze kan terugvinden(Zie paragraaf 3.3.2.6 ). Het aanmaken van het root file systeem is gebaseerd op de werkwijze die op het internet te vinden is voor een ML300 oefenbord beschreven door Klingauf.
113
Aanmaken van Root File Systeem via Busybox Busybox omvat vele van de Unix functies in een lichtere versie dan deze die in een normaal Unix systeem aanwezig zijn in bijvoorbeeld GNU fileutils, shellutils, etc. Doordat deze commando’s lichter zijn maar toch zeer compleet is het gebruiken van Busybox voor embedded linux systemen zeker een goede oplossing. De laatste versie van de broncode van Busybox (bijvoorbeeld busybox-1.1.1.tar.gz ) kan men downloaden via de site http://www.busybox.net. Busybox wordt daarna geconfigureerd via make menuconfig. Voer in een terminalvenster volgende commando’s uit:
$ $ $ $ $
cd /opt tar –zvxf busybox-1.1.1.tar.gz rm –fr busybox-1.1.1.tar.gz cd busybox-1.1.1 make menuconfig
Figuur 3-35. Make menuconfig venster van BusyBox
Het busybox configuration scherm start op in een standaard configuratie. In deze standaard configuratie dienen enkele aanpassingen aangebracht te worden volgens Klingauf. De eerste drie submenu’s in het configuratie menu zijn instellingen die betrekking hebben tot het configureren en compileren van BusyBox systeem. Schakel in het submenu General Configuration het volgende AF van de default instellingen.
114
General Configuration --> [ ] Runtime SUID/SGID configuration via /etc/busybox.conf In het volgende submenu build options moet er opgegeven worden op welke locatie de Cross-Compiler te vinden is. Schakel dus het volgende aan in vergelijking met de default instellingen: Build options --> [*] Do you want to build BusyBox with a Cross Compiler? (/opt/powerpc-405-linux/bin/powerpc-405-linux-gnu-) Vanaf het vierde submenu in de General Configuration kan er gekozen worden welke Unix-commando’s van BusyBox er in het Root File Systeem moeten aanwezig zijn. Zo kunnen bijvoorbeeld volgende instellingen nog toegevoegd worden ten op zichte van de standaardconfiguratie.
Login/Password Management Utilities --> [*] getty [*] passwd [*] su [*] sulogin Networking [*] [*] [*] [*] [*] [*]
Utilities --> Use busybox ifconfig and route applets inetd netstat nslookup telnet telnetd
Sluit het menu configuratiescherm af en bewaar alle instellingen. Het bestandsysteem kan nu worden gebouwd. Daarvoor bestaat er een script (mkrootfs.sh) op de site van klingauf (http://www.klingauf.de/v2p/index.phtml) die de verschillende stappen voor het bouwen van het bestandsysteem, inclusief het uitvoeren van de BusyBox configuratie gestructureerd uitvoert voor een ML300 oefenbord. Eveneens bevat de file
mkrootfs.tgz die gedownload kan worden via de hierboven vermelde locatie een voorbeeld /etc map voor het ML300 bord. [11] In deze map bevindt zich onder andere een inittab file die zorgt voort de initialisatie van het bestandsysteem bij het opstarten van het embedded Linux systeem. Let wel op want alle files die zich in het gecomprimeerde mkrootfs.tgz bestand van klingauf bevinden, bevatten DOS einde-lijn 115
tekens. Voer dus op al deze bestanden een dos2unix conversie uit zoals besproken onder(0). Voor het XUPV2P oefenbord kan dit zelfde ML300 script ook gebruikt worden. Het bevat echter veel overbodige onderdelen die voor het XUPV2P niet nodig zijn. Daarom werd het script aangepast voor het gebruik op de XUPV2P borden. In
Appendix C: wordt dit script dat voor XUPV2P oefenbord werd aangepast verder besproken. Evenals de volledige structuur en inhoud van de bestanden in de map /etc die in het Root File Systeem zal worden opgenomen. Vanaf hier wordt er enkel nog gebruik gemaakt van het aangepaste mkxupv2prootfs.sh script zoals in
Appendix C: beschreven wordt. Plaats nu het script mkxupv2prootfs.sh en de /etc map in de directory waarin BusysBox zich bevindt en voer als root het script uit als volgt:
#
./mkxupv2prootfs.sh
Het Linux bestandssysteem wordt nu aangemaakt door het script. Let wel op dat de Cross Compiler zich in het Linux zoekpad bevindt (zie paragraaf 3.3.2.9). Er werden twee mogelijkheden bestudeerd om dit bestandsysteem door de kernel aan te spreken op het oefenbord in dit eindwerk. Namelijk door het te kopiëren op een speciaal geformatteerde Compact Flash kaart ofwel via een Network File System.
Het Root File Systeem op Compact Flash plaatsen Formatteren van CF kaart Om het Root File Systeem op de Compact Flash kaart te plaatsen hebben we 3 partities nodig op de kaart. Een eerste partitie moet geformatteerd worden als DOS
FAT16, wat het enige formaat is dat de ace-controller op het oefenbord kan lezen om de hardware te programmeren. Op deze SystemACE partitie zal dus het .ace bestand met alle hardware informatie (oa. Bitstream), die eerder werd aangemaakt in EDK, op gekopieerd worden. Een tweede partitie zal worden geformatteerd als Linux Swap partitie. Het derde stuk waarop ons bestandsysteem zal komen dat in de vorige paragraaf werd aangemaakt door het script Deze partitie zal worden geformatteerd in het Linux ext2 bestandsysteem formaat. Wanneer de Compact Flash kaart in de USB kaartlezer geplaatst wordt, verschijnt er in Fedora Core 4 reeds één partitie. Omdat onder 0 de CF reeds werd gepartitioneerd in één DOS FAT 16 partitie. Om nu te weten te komen onder welke /dev/sdx de CF 116
kaart zich bevindt kan onder andere gebruik worden gemaakt van de Hardware
Browser in Fedora Core 4. De Hardware Browser kan terug gevonden worden onder het menu Toepassingen--> Systeemgereedschap --> Hardware Browser. Selecteer
Harde schijven. Er wordt een overzicht gegeven van alle opslagmedia die in het systeem aanwezig zijn. In dit geval hier is de USB CF kaart lezer terug te vinden onder
/dev/sdc (zie Figuur 3-36).
Figuur 3-36. Naam CF kaart lezer via Hardware Browser in Linux
Er moet eerst een partitietabel aangemaakt worden op de Compact Flash kaart. Dit gebeurt als volgt. Ga naar een terminalvenster en voer volgend commando in als su -:
$
su -
#
fdisk /dev/sdc
De drie partities moeten in de partitietabel toegevoegd worden. Verwijder eerst de aanwezige partities (d= partitie verwijderen). Creëer daarna de 3 primaire partities (n=
partitie toevoegen) met partitienummers 1,2 en 3. De grootte van de partities kan zelf gekozen worden en is ook afhankelijk van de capaciteit van de Compact Flash kaart. De eerste partitie moet enkel de .ace file bevatten (50MB is zeker voldoende). De tweede partitie de Swap partitie moet niet zo groot zijn (5MB). De rest van de ruimte kan gebruikt worden voor de derde partitie, deze zal het Root File Systeem bevatten. Nadat de drie partities verdeeld werden, moet de systeem id van iedere partitie nog toegewezen worden (t= systeem id van partitie wijzigen). Voor partitienummer 1 wordt de id 6 (FAT16), voor partitienummer 2 wordt de id 82 (Linux Swap / Solaris)
117
en voor partitienummer 3 wordt de id 83 (Linux). De partitietabel kan gecontroleerd worden door p = de partitietabel weergeven in fdisk. De partitietabel ziet er dus uiteindelijk uit zoals in Figuur 3-37 voor een 128MB CF kaart:
Figuur 3-37. Overzicht van partitietabel op CF kaart
Sluit fdisk af en schrijf de partitietabel naar de CF kaart (w= de tabel naar schijf
schrijven en afsluiten). Partitie 3 Formatteren onder Linux Deze partitie moet geformatteerd worden in een Linux ext2 file systeem. Zorg ervoor dat de CF kaart niet gemount is door Linux. Voer in een terminal venster het volgende commando uit:
$
mke2fs
/dev/sdc3
Deze partitie is nu geformatteerd en moet nu opnieuw gemount worden onder Linux. Er kunnen nu bestanden toegevoegd worden aan deze partitie. Kopieer het volledige Root File Systeem dat in paragraaf 0 werd aangemaakt op deze partitie. Partitie 1 Formatteren onder Windows XP Dit gebeurt opnieuw door mkdosfs uit te voeren in een commando venster. (Zie
Appendix B:) Voor een 128MB CF kaart die zich bevindt onder directory F:\ en die een volumenaam XLNX_XUP krijgt, wordt dit dus:
C:\> mkdosfs –v –F 16 –R 1 –s 8 –n XLNX_XUP F:
Kopieer nu het xupppc.ace bestand op de Compact Flash kaart in Windows XP.
118
Partitie 2 Formatteren onder Linux Als laatste wordt het swap bestandsysteem op de CF kaart geplaatst door in een terminal venster in Linux het volgende commando uit te voeren:
$
mkswap
/dev/sdc2
De CF kaart is nu volledig geformatteerd en kan gebruikt worden met de kernel waarbij ingesteld werd dat het Root File Systeem op de derde partie van de CF kaart verwacht wordt (zie paragraaf 3.3.2.6 mogelijkheid 2: Root File System via Compact Flash
zonder netwerkfuncties of mogelijkheid 3: Root File System via Compact Flash met DHCP netwerk mogelijkheden). Opstarten via CF Plaats de Compact Flash kaart in het oefenbord. Schakel het bord in. Indien kernel met DHCP geconfigureerd werd dient de netwerkkabel ook verbonden worden met de ethernet aansluiting van het oefenbord. Het systeem start nu volledig op en wanneer er gevraagd wordt om in te loggen kan men root invullen (geen paswoord nodig). Het systeem start verder op tot in de linux shell omgeving. Het is nu mogelijk om het systeem te gebruiken met de unix commando’s. Root File System via NFS (Network File System) Bij deze methode staat het root filesystem niet op de Compact Flash kaart maar wordt het bestandsysteem aangesproken via een network file system. Dit bevindt zich op een Linux PC waarmee het oefenbord via ethernet communiceert. Deze methode biedt vooral veel voordeel bij het ontwikkelen van applicaties. Het bestandsysteem moet niet iedere keer opnieuw worden gekopieerd naar een CF kaart want het wordt rechtstreeks aangesproken in de ontwikkelomgeving in linux. Zo kan de applicatie sneller getest worden in de praktische omgeving. Op het moment dat de ontwikkeling van een toepassing voltooid is kan men het bestandsysteem opnieuw op een CF kaart plaatsen. Eerst moet de kernel worden aangepast zodat een bestandsysteem via NFS kan worden aangesproken. Voeg dus via make menuconfig de instellingen voor NFS toe aan de kernel. Configureer de kernel zoals onder paragraaf 3.3.2.6 reeds besproken werd met volgende extra instellingen voor NFS: 1. NFS toevoegen aan kernel File Systems ---> 119
Network file system support --> [*] Provide NFSV3 client support [*] Root file system on NFS 2. De kernel command lijn voor het booten van Linux moet ook aangepast worden. Er moet meegegeven worden dat het root file systeem zich op een netwerk locatie bevindt. Dit wordt als volgt gedaan in de menuconfig: Onder General Setup ---> [*] Default bootloader kernel arguments “console=ttyS0, 38400 root=/dev/nfs nfsaddrs=client:server:gateway:netmask rw nfsroot=/opt/xupv2p” Hierbij moet het NFS adres nog ingevuld worden. Er wordt gebruik gemaakt van een statisch IP adres voor het bord (de client). Er zal daarbij rekening moeten gehouden worden dat de server Linux PC zich in de dezelfde IP range bevindt dan deze client. Bijvoorbeeld het IP adres van het oefenbord wordt ingesteld op 192.168.0.10. Op de plaats waar server staat moet het IP adres van de server ingevuld worden. Bijvoorbeeld 192.168.0.1. De gateway voor het bord om te communiceren via het netwerk mag hetzelfde adres zijn als dat van de server. Als laatste moet de netmask nog worden ingesteld op bijvoorbeeld 255.255.255.0. Dus in dit voorbeeld zal de instelling voor de bootloader kernel
arguments er als volgt uit zien: [*]
Default bootloader kernel arguments “console=ttyS0, 38400 root=/dev/nfs nfsaddrs=192.168.0.10:192.168.0.1:192.168.0.1:25 5.255.255.0 rw nfsroot=/opt/xupv2p”
3. Sluit het menuconfig venster af en bewaar de nieuwe instellingen. Bouw nu opnieuw de kernel zoals besproken werd onder 3.3.2.9. Wanneer de kernel gebouwd is kan deze terug op de Compact Flash kaart geplaatst worden of kan de zImage.elf file via XMD terug in het oefenbord geladen worden. De NFS server moet nu nog worden ingesteld op het Linux-systeem voor deze kan aangesproken worden. De instellingen voor de NFS server: Login als su – in een terminalvenster van linux. Open het bestand /etc/exports met gedit. En voeg volgende lijn toe aan dit bestand: /opt/xupv2p 192.168.0.10 (rw,no_root_squash,sync)
120
Waarin:
/opt/xupv2p de locatie voorstelt die moet geëxporteerd worden. 192.168.0.10 is de locatie van de gebruiker van het bestandsysteem. rw
duidt erop dat de gebruiker mag lezen en schrijven in het bestandsysteem.
no_root_squash wil zeggen dat de root gebruiker die het bestandsysteem gebruikt, gezien wordt als een lokale root gebruiker van het systeem. Sync duidt erop dat er dat de schrijfopdrachten in het bestandsysteem gesynchroniseerd worden. Voor de beveiliging van de map wordt ervoor gekozen dat de NFS map enkel kan worden geëxporteerd naar de client (in dit geval de gebruiker van het oefenbord). Open daarom nog steeds als su- het bestand /etc/hosts.deny en voeg volgende lijnen toe. portmap:ALL lockd:ALL mountd:ALL rquotad:ALL statd:ALL Om nu het oefenbord wel toegang tot het NFS te geven moeten volgende lijnen worden toegevoegd in het bestand /etc/hosts.allow: portmap:192.168.0.10 lockd:192.168.0.10 mountd:192.168.0.10 rquotad:192.168.0.10 statd:192.168.0.10
Nu moeten deze gewijzigde instellingen van het bestand /etc/exports opnieuw ingeladen worden. Dit gebeurt door volgend commando in te geven in een terminal venster: #
exportfs –ra
Om het serversysteem het juiste IP adress mee te geven zoals ingesteld werd in de kernel, wordt gebruik gemaakt van IP-aliasing. Dit laat toe om meerdere IP adressen toe te kennen aan 1 netwerk interface zoals bijvoorbeeld eth0. Via het commando ifconfig kan als root gekeken worden welke netwerk devices in het systeem aanwezig zijn. Om nu het IP adres van de server in te stellen op 192.168.0.1 als 2de IP adres moet het volgende commando uitgevoerd worden: 121
#
ifconfig eth0:2 192.168.0.1
Bij deze methode van IP-aliasing wordt het ingestelde 2de IP adres verloren bij het heropstarten van het linux systeem. Het IP adres zal dus iedere keer opnieuw moeten worden ingesteld bij het heropstarten. Wanneer het oefenbord nu opgestart wordt met de nieuwe kernelconfiguratie zal als root filesysteem het NFS systeem gebruikt worden. (Hierbij werd gebruik gemaakt van een gekruiste netwerk kabel tussen het oefenbord en de ethernet aansluiting van de PC)
122
3.3.3 µClinux 3.3.3.1 µClinux voor Microblaze op Virtex II-Pro
Inleiding Het XUPV2P oefenbord van digilent beschikt (net zoals de meeste Xilinx FPGA’s) de mogelijkheid om de softprocessor Microblaze te gebruiken. De werkwijze is relatief eenvoudig in vergelijking tot deze die hierboven besproken werd voor de PowerPC. Er wordt gebruik gemaakt van een ander aanpak via µClinux. De voornaamste reden voor die andere aanpak is dat de Xilinx Microblaze processor wordt ondersteund als processor architectuur wanneer men gebruik maakt van µClinux. Andere kernel distributies bevatten de Microblaze compabiliteit niet. Men kan door middel van een eenvoudig hardware configuratiebestand de µClinux kernel met bestandsysteem min of meer automatisch laten bouwen. Dit in tegenstelling tot de aanpak bij PPC waarbij alle instellingen in de kernel en het bestandsysteem zelf moeten worden geconfigureerd. Zoals later zal blijken zal de vrijheid beperkt worden bij het gebruik van µClinux wat dus als een zeker nadeel kan beschouwd worden. Een voordeel van deze methode is dan weer dat ze kan gebruikt worden, en in grote lijnen dezelfde is, voor alle systemen met Microblaze processor waarop men Linux kernel wil implementeren. µClinux is oorspronkelijk ontworpen voor een M68K processor in 1998. Het grootste verschil in uitvoering van deze Linux distributie ten op zichte van de standaard Linux is dat het de eerste keer was dat men een Linux ontwikkeld had voor processors zonder
Memory Management Unit (MMU). Tot daarvoor kon men op processors zonder MMU enkel commerciële of zelfgemaakte RTOS besturingsystemen gebruiken. Meer informatie omtrent het µClinux project kan gevonden worden op http://www.uclinux.org.
µClinux voorbereiding van de EDK-software Om µClinux te implementeren op een Microblaze SOC moet in EDK het hardware platform volledig ingesteld worden. Eens de hardware ingesteld is, moeten deze in een configuratiebestand gebracht worden waarmee de Linux kernel kan geconfigureerd worden. Daarvoor is er een µClinux Board Support Package(BSP) nodig. Dit BSP zorgt ervoor dat er een configuratiebestand kan gegenereerd worden via de hardware
123
instellingen van het hardware platform gekozen in EDK. Het µClinux BSP kan worden gedownload via: http://www.petalogix.com/resources/downloads/uclinux-bsp Het bestand heeft de naam edk_user_repository.tar.gz en het kan worden uitgepakt op een willekeurige plaats op de PC via een programma die dit image formaat ondersteunt (bijvoorbeeld PowerArchiver 2006). Na het uitpakken moeten de mappen die zich bevinden onder de map bsp (uclinux_v1_00_a, uclinux_v1_00_b,…) gekopieerd worden in de map waarin EDK werd geïnstalleerd op de PC op de locatie: \EDK\SW\lib\bsp\.
Hardware instellingen in EDK Maak een nieuw project aan via de BSB wizard in EDK. Kies voor volgende hardwareonderdelen: Microblaze (100MHz) OPB_UARTLITE (baudrate: 9600, databits:8, Parity: None) OPB_ETHERNET (no DMA) OPB_SYSACE OPB_GPIO (leds_4bit) OPB_GPIO (Dipsw_4bit) DDR_256_32Mx64_rank1_row13_col10_cl2_5 (DIMM van 256 MB)
Maak alles interrupt gestuurd. Voeg via het Add Peripheral venster van de BSB wizard een OPB_Timer toe met instellingen: Counter Bit With: 32 One timer is present Use Interrupt
Vervolledig de BSB wizard nu met de default instellingen. Aanpassingen in het add/edit cores venster van het EDK project: Bus Connections:
Mb_opb Ethernet_MAC_msopb
ilmb
dlmb
MS
Ethernet_Mac Op dit punt gekomen kan er een hardwaretest uitgevoerd worden. Dit kan later veel problemen voorkomen. Want indien de instellingen niet werken in standalone dan 124
zullen ze zeker niet werken met een µClinux besturingsysteem. Test daarom het TestApp_memory programma dat door de BSB wizard gecreëerd werd. Indien dit werkt kan er verder gegaan worden met volgende stappen. De instellingen voor hyperterminal, en de uitvoer in hyperterminal staan beschreven in het stuk over Linux op PPC (Zie pagina 95).
Auto-config.in bestand Het aanmaken van een configuratiebestand om een µClinux kernel te bouwen gebeurt op volgende manier. Ga in EDK naar het applications tabblad en configureer de bootloop voor gebruik in het BRAM. Klik via de rechtermuisknop op “default: microblaze_0_bootloop” en kies voor “Mark to initialize BRAM”. Zorg dus dat er geen andere programma’s in het BRAM geladen worden! Vergeet niet om een “update bitstream” uit te voeren. Verander in de Software Platform Settings van het EDK project: Tabblad: Software Platform Kies bij Kernel and Operating Systems voor: Microblaze_0
uclinux
Tabblad: Library/OS parameters Microblaze_0: uclinux - TARGET_DIR - std_out - std_in - main_memory - main_memory_bank - main_memory_size - flash_memory - flash_memory_bank - flash_memory_size - lmb_memory - periph_type_overrides
1.00.a LET OP: / in plaats van \ !!!
z:/bsp RS232_UART_1 RS232_UART_1 DDR_256MB… 0 0x10000000 none -1 0 ilmb_cntrl
Creëer nu het auto-config.in bestand door het uitvoeren van “Generate libraries and BSP’s” via menu “tools”. Soms is het mogelijk dat bij het genereren van de libraries een fout optreedt waarbij gezegd wordt dat de waarde van het geheugen (0x10000000) een integer moet zijn. Daarom kan het voorgaande ook bereikt worden via aanpassing van het .mss bestand. Indien de vorige methode niet werkt, wordt het best begonnen met een nieuw project.
125
Voer alle stappen uit zoals hierboven beschreven tot aan het veranderen van de
Software Platform Settings. Open de .mss file en plaats de lijnen van het huidig besturingsysteem (=standalone) in commentaar en voeg het nieuwe besturingsysteem (= uclinux) toe zoals hier:
# BEGIN OS # PARAMETER # PARAMETER # PARAMETER # PARAMETER # PARAMETER # END
OS_NAME = standalone OS_VER = 1.00.a PROC_INSTANCE = microblaze_0 STDIN = RS232_Uart_1 STDOUT = RS232_Uart_1
BEGIN OS PARAMETER TARGET_DIR = z:/bsp PARAMETER OS_NAME = uclinux PARAMETER OS_VER = 1.00.a PARAMETER PROC_INSTANCE = microblaze_0 PARAMETER stdout = RS232_UART_1 PARAMETER stdin = RS232_UART_1 PARAMETER main_memory = DDR_256MB_32Mx64_rank1_row13_col10_cl2_5 PARAMETER main_memory_bank = 0 PARAMETER main_memory_size = 0x10000000 PARAMETER lmb_memory = ilmb_cntlr END
Creëer opnieuw het auto-config.in bestand door het uitvoeren ven “Generate libraries
and BSPs” via het menu “tools”. De foutmelding die eerder voorkwam komt nu niet meer voor. Alles kan gecheckt worden via de “software Platform Settings”. Het autoconfig.in bestand bevindt zich nu in de map waarnaar TARGET_DIR verwijst (in dit geval z:/bsp). Dit bestand bevat alle benodigde hardware informatie om een µClinux kernel systeem te bouwen. Breng het auto-config.in bestand over naar een Linux sessie (via netwerk of USB-stick). Vanaf hier wordt opnieuw overgeschakeld naar een Linux omgeving via VMware.
De Microblaze Compiler Net zoals bij PPC is er opnieuw een cross-compiler nodig om de kernel te bouwen. Op het internet is reeds een compiler beschikbaar voor Microblaze processors. Het downloaden en uitpakken kan op volgende manier gebeuren. Type in een terminal venster: $ $
$
cd /opt wget http://www.itee.uq.edu.au/~jwilliams/mblazeuclinux/Toolchain/_files/microblaze-elf-tools20051121.tar.gz tar –xzf microblaze-elf-tools-20051121.tar.gz
126
$
rm microblaze-elf-tools-20051121.tar.gz
De microblaze-elf-tools moeten nu nog toegevoegd worden aan het Linux zoekpad. Dit kan op verschillende manieren gebeuren. Indien dezelfde manier gebruikt wordt als bij PPC dan wordt dit: $ $ $
export TARGET=microblaze-elf-tools export PREFIX=/opt/${TARGET} export PATH=${PREFIX}/bin:${PATH}
Het is mogelijk om het zoekpad te controleren als de juiste directories doorzocht worden. Dit kan door volgend commando uit te voeren in een terminal venster:
$
echo $PATH
De map waarin de toolchain zich bevindt moet hierin vermeld staan. Indien dit geval is, kan gebruik gemaakt worden van de Microblaze compiler om de C-files te compileren voor microblaze architectuur. Er kan eveneens een Microblaze Cross-compiler gedownload worden via de website:
http://www.petalogix.com/resources/downloads Deze website beschikt momenteel over de meest recente Compiler libraries voor de microblaze processor. Het downloaden en het gebruiksklaar maken gebeurt op een analoge wijze zoals hierboven beschreven. $ $ $ $
cd /opt mkdir microblaze-elf-tools cd microblaze-elf-tools wget http://www.petalogix.com/resources/downloads/files/mi croblaze-elf-tools-20060213.tar.gz
$ $
tar –xzf microblaze-elf-tools-20060213.tar.gz rm microblaze-elf-tools-20060213.tar.gz
Het toevoegen van een compiler aan het Linux-pad kan ook in één regel gebeuren als volgt: $
export PATH=$PATH:/opt/microblaze-elf-tools/bin
127
De µClinux-dist en –kernel bronbestanden De µClinux broncode kan afgehaald worden van de officiële µClinux website. Dit kan gebeuren volgens verschillende methodes. Hier worden er twee besproken. De methode via Concurrent Versions System (CVS) is niet altijd mogelijk door netwerkinstellingen of doordat Linux omgeving het CVS commando niet ondersteunt. Daarom wordt in dit eindwerk nog een tweede methode besproken. 1ste methode: µClinux via CVS-server Hier wordt gebruik gemaakt van een CVS “uClinux distribution tree”. Voor het kunnen gebruiken van CVS servers moeten in de Linux omgeving de pakketten voor software ontwikkeling geïnstalleerd zijn. Anders zal de terminal het commando CVS niet kennen en kan er dus niet ingelogd worden op de server. Creëer of zoek een map waarin deze files moeten geplaatst worden. Bijvoorbeeld indien gebruik gemaakt wordt van /opt
$ $
mkdir /opt/uClinux-cvs cd /opt/uClinux-cvs
Login in de µClinux anonymous CVS server
$ cvs –d:pserver:[email protected]:/var/cvs login
Druk op enter als het paswoord gevraagd wordt.
$ cvs –z3 –d:pserver:[email protected]:/var/cvs co uClinux-dist $ cvs –z3 –d:pserver:[email protected]:/var/cvs co uClinux-2.4.x
Er worden files gedownload. De eerste keer indien er nog geen files zijn moeten ze eerst allemaal afgehaald worden. Dit neemt serieus war tijd in beslag want de uClinuxdist in ongeveer 700MB groot en de uClinux-2.4.x is ongeveer 180MB groot. Indien er een update van de bronbestanden doorgevoerd wordt, zullen enkel de files afgehaald worden die veranderd zijn geweest sedert de laatste keer deze afgehaald werden via de CVS server. Maak nu nog een symbolische link mapping voor uClinux-2.4.x zoals
uClinux-dist/linux-2.4.x. Dit gebeurt als volgt:
128
$ $
cd uClinux-dist ln –s ../uClinux-2.4.x Linux-2.4.x
2de methode: µClinux-dist zonder CVS-server Indien de eerste methode niet bruikbaar is, bestaan er bepaalde distributies die op een gewone manier kunnen worden gedownload. De laatst beschikbare versie kan gevonden worden via de site( http://www.uclinux.org). Momenteel is de laatste versie (februari 2006) uClinux-dist-20051110.tar.gz (=260MB) Het downloaden en uitpakken van de uClinux distribution gebeurt als volgt:
$ $ $ $
cd /opt wget http://www.uclinux.org/pub/uClinux/dist/uClinuxdist-20051110.tar.gz tar xvzf uClinux-dist-20051110.tar.gz rm uClinux-dist-20051110.tar.gz
Er kan ook overgegaan worden naar andere kernel versies door updates uit te voeren op de huidige kernel versies die worden gedownload via uCLinux-dist-20051110.tar.gz. Deze distributies bevatten nooit de laatst beschikbare kernel. Maar men gebruikt een stabiele versie van enkele maanden oud. Dit enkel ter vermelding, want voor dit eindwerk is de versie keuze van weinig belang en zal dus ook niet verder besproken worden.
Invoegen van het configuratiebestand Het auto-config.in bestand werd gemaakt via EDK in een Windows omgeving. Het bestand bezit ‘dos einde-lijn’ karakters. Deze zijn anders dan bij een UNIX systeem. Daarom is het noodzakelijk dat de file aangepast wordt naar UNIX formaat. Dit kan gebeuren door een software programma hd2u waarbij bestanden van Dos-formaat kunnen omgezet worden naar UNIX formaat en omgekeerd. Deze kan geïnstalleerd en afgehaald worden als volgt: $ $
$ $ $ $ $
cd /opt wget http://www.megaloman.com/~hany/_data/hd2u/hd2u1.0.0.tgz tar xvzf hd2u-1.0.0.tgz rm –fr hd2u-1.0.0.tgz cd hd2u1.0.0 ./configure make 129
$ #
su Geef het root paswoord in make install
Het dos2unix conversieprogramma is nu geïnstalleerd en kan worden gebruikt om bestanden die in Windows werden gemaakt om te zetten naar UNIX formaat. Bijvoorbeeld om het auto-config.in bestand om te zetten naar UNIX formaat dient men het volgende uit te voeren in een Linux terminal venster indien men zich in de map bevindt waarin het bestand staat:
$
dos2unix –v auto-config.in
(= bestandsnaam)
Indien men zich niet bevindt in de map van het bestand dan dient men de map locatie nog mee te geven voor de bestandsnaam. Bijvoorbeeld:
$
dos2unix –v /opt/auto-config.in
Plaats nu het auto-config.in bestand dat gemaakt werd via EDK in de juiste map van de µClinux kernel bron code namelijk: /opt/uClinux-cvs/uClinux-dist/uClinux2.4.x/arch/microblaze/platform/uclinux-auto/
En eveneens ook in de map: /opt/uClinux-cvs/uClinux-2.4.x/arch/microblaze/platform/uclinux-auto/
Maken van de µClinux Kernel Image 1. Ga naar de uClinux-dist map en voer een make clean uit vooraleer over te gaan naar de make menuconfig. $ $ $
cd /opt/uClinux-cvs/uClinux-dist make clean make menuconfig
2. In het menuconfig venster moeten de volgende instellingen gebeuren voor de Xilinx-microblaze processor. “Vendor/Product Selection” (Xilinx) Vendor (uclinux-auto) Xilinx Products “Kernel/Library/Defaults Selection” [*] Customize Kernel Settings (NEW) Selecteer “Exit” om het menu te verlaten en kies voor “yes” om de nieuwe kernel configuratie te bewaren. 130
3. Het menuconfig venster wordt afgesloten. En er zullen enkele vragen gesteld worden omtrent enkele parameters die niet gespecificeerd werden door de auto-config.in file. - Memory model (RAM, ROM) [RAM] (NEW) RAM - FLASH size (AUTO, NONE, 128KB, 1MB, 2MB, 4MB, 6MB, 8MB) [8MB] (NEW) NONE - SPI support (CONFIG_SPI) [N/y/m/?] (NEW) N - Yet Another Flash File System(YAFFS) for NAND flash support (CONFIG_YAFFS_FS) [N/y/m/?] (NEW) N 4. Het kernel configuratiescherm komt op het scherm. Sluit dit configuratiescherm af zonder iets te veranderen en bewaar de instellingen door “yes” te selecteren wanneer gevraagd wordt om de configuratie op te slaan.
Figuur 3-38. Linux kernel configuratie menu
5. Compileer nu de kernel via de instructies make dep en make.
$ $
make dep make
De kernel wordt nu gecompileerd en gebouwd tot een image.bin bestand. Tijdens het compileren zullen nog een reeks vragen gesteld worden zoals:
Does your system support GNU gettext? (I18N) [n]n 131
UNIX protocol family (HAVE_AFUNIX) [y] n INET (TCP/IP) protocol family (HAVE_AFINET) [y] n INET6 (IPv6) protocol family (HAVE_AFINET6) [n] n Novell IPX/SPX protocol family (HAVE_AFIPX) [y] n Appletalk DDP protocol family (HAVE_AFATALK) [y] n … Vul op deze vragen steeds een n in.
Op het einde van het proces kan volgende foutmelding voorkomen:
# Copy image files into /tftpboot, if requested [ -n "" ] || cp /opt/uClinux-cvs/uClinux-dist/images/image.bin /tftpboot cp: cannot create regular file `/tftpboot/image.bin': Toegang geweigerd make[2]: *** [image] Fout 1 make[2]: Leaving directory `/opt/uClinux-cvs/uClinuxdist/vendors/Xilinx/uclinux-auto' make[1]: *** [image] Fout 2 make[1]: Leaving directory `/opt/uClinux-cvs/uClinuxdist/vendors' make: *** [image] Fout 2
Deze foutmelding wil zeggen dat image.bin niet kan gekopieërd worden naar de map /tftpboot omdat de gebruiker geen rechten heeft om in deze map iets te schrijven. Verander daarom onder su de rechten van de map /tftpboot en zorg ervoor dat ook andere gebruikers dan de root gebruikersrechten hebben om te schrijven in deze map. Voer opnieuw make uit
$
make
Als de compilatie goed verlopen is zal er in de map /tftpboot van Linux het bestand image.bin staan. Dit bestand bevat alle informatie omtrent onze kernel. Dit bestand zal door EDK in het geheugen van ons bord worden gebracht. Breng daarom dit bestand over naar de Windows omgeving via een USB-stick of netwerk en plaats het bestand in de gemaakte EDK project directory.
De kernel in het bord laden Start XPS op en laadt het project. Er zijn nu 2 methodes om de image.bin file in het geheugen te laden van het bord. De eerste methode is via een mdm (microblaze 132
debug module). Daarbij zal de bitstream steeds moeten in het bord geladen worden zodat de hardware geprogrammeerd wordt in het bord vooraleer de image.bin zal kunnen worden ingeladen. Het is dus niet mogelijk om de Linux kernel op te starten zonder de hulp van de PC. Via de tweede methode met SysAce en de Compact Flash kaart zal de Linux kernel wel kunnen geladen worden zonder een beroep te moeten doen op de PC. Alle nodige informatie over hardware (bitstream) en software (image.bin) staan op de Compact Flash kaart. Wat als voordeel zal hebben dat linux kan werken zonder dat er een PC in de buurt is. Hieronder worden deze twee methodes besproken. Methode via mdm Download de bitstream (
) in het XUPV2P bord en start de XMD debugger (
).
Als de verbinding met de microblaze processor tot stand gebracht is via de USB JTAG device verschijnt de XMD% shell. Geef volgende instructies in de Shell:
XMD% XMD% XMD% XMD% XMD%
dow mwr rwr rwr con
–data image.bin 0x100 0 5 0x100 pc 0x30000000
0x30000000
Het image.bin bestand is nu in het geheugen geladen van ons bord (dat zich bevindt op het adres 0x30000000 (zie .MHS file)). Via een Hyperterminalvenster (met instellingen 9600baud/N81) zal men volgende output zien.
133
Linux version 2.4.32-uc0 (rodolf@localhost) (gcc version 3.4.1 ( Xilinx EDK 8.1 Build EDK_I.17 090206 )) #2 ma feb 20 14:36:42 CET 2006 On node 0 totalpages: 65536 zone(0): 65536 pages. zone(1): 0 pages. zone(2): 0 pages. CPU: MICROBLAZE Kernel command line: Console: xmbserial on UARTLite Calibrating delay loop... 2.98 BogoMIPS Memory: 256MB = 256MB total Memory: 257004KB available (1236K code, 1068K data, 52K init) Dentry cache hash table entries: 32768 (order: 6, 262144 Inode cache hash table entries: 16384 (order: 5, 131072 bytes) Mount cache hash table entries: 512 (order: 0, 4096 bytes) Buffer cache hash table entries: 16384 (order: 4, 65536 bytes) Page-cache hash table entries: 65536 (order: 6, 262144 bytes) POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink socket Microblaze UARTlite serial driver version 1.00 ttyS0 at 0x40600000 (irq = 2) is a Microblaze UARTlite Starting kswapd xgpio #0 at 0x40020000 mapped to 0x40020000 xgpio #1 at 0x40040000 mapped to 0x40040000 xgpio #2 at 0x40000000 mapped to 0x40000000 … Tabel 3-7. µClinux boot procedure in hyperterminal
Username :
root
Password :
root
Methode via Compact Flash Deze methode werd besproken bij het stuk Linux op PowerPC. De methode is gelijklopend enkel moet hier de image.bin file gespecificeerd worden in de xupGenace.opt file. -jprog -board user -target mb -hw implementation/download.bit -data image.bin 0x30000000 -configdevice devicenr 1 idcode 0x1127e093 irlength 14 partname xc2vp30 -debugdevice devicenr 1 cpunr 1 -ace xupmb.ace
134
Ga naar de “Xilinx xygwin Shell” (
)via het icoontje bovenaan XPS of via het menu
“tools”. Geef het volgende commando in:
$
xmd –tcl genace.tcl –opt xupGenace.opt
De .ace file wordt aangemaakt met de instellingen uit het xupGenace.opt bestand. Men kan deze file terugvinden in de projectmap. De naam en de maplocatie worden opgegeven in het xupGenace.opt bestand. In dit geval hier is de naam xupmb.ace (keuze is vrij) en de locatie is de hoofd projectmap van het project. Kopieer nu de xupmb.ace file op de Compact Flash kaart die op de juiste manier geformateerd werd zodat de Xilinx SystemACE controller op het bord het filesysteem kan lezen. Plaats de CF kaart nu in het bord en start het bord. In een Hyperterminalvenster moet men hetzelfde bekomen als met de methode via mdm(zie 0). 3.3.3.2 µClinux voor Microblaze op Virtex-4 Eenmaal u er in geslaagd bent om µClinux op de Virtex II-pro te plaatsen, zal u zien dat deze werkwijze niet veel verschilt bij het Virtex-4 platform. Er zullen wel een aantal aanpassingen moeten worden gemaakt hoofdzakelijk in de hardwareconfiguratie en geheugenlocaties in de EDK software. Deze aanpassingen zullen hieronder worden besproken; de instellingen die hier niet zijn besproken, blijven zoals deze uiteengezet onder hoofdstuk 3.3.3.1.
Hardware instellingen in EDK Maak hier terug een nieuw project aan via de BSB wizard, en selecteer volgende hardwareonderdelen: Microblaze
(100MHz)
RS232
(OPB_UARTLITE baudrate: 9600, databits:8, Parity: None)
OPB_ETHERNET
(No DMA)
OPB_SYSACE OPB_GIO
(leds_4bit)
OPB_GIO
(dip_switches_8bit)
DDR_SDRAM_32MX16
135
Maak alles interrupt gestuurd. Voeg via het ‘Add Peripheral’ venster van de BSB wizard een OPB_Timer toe met volgende instellingen: Counter Bit With: 32 One timer is present Use Interrupt Vanaf hier kan men verder gaan naar de Virtex II-Pro µClinux tutorial. Let wel op! Bij de Software Platform Settings zullen nog volgende aanpassingen moeten worden gemaakt: Tabblad: Software Platform Kies bij Kernel and Operating Systems voor: Microblaze_0
µClinux
1.00.a
Tabblad: Library/OS Parameters
Microblaze_0: uclinux - TARGET_DIR
D:/bsp
- std_out
RS232
- std_in
RS232
- main_memory
DDR_SDRAM_32Mx16
- main_memory_bank
0
- main_memory_size
0x1000000
- flash_memory
none
- flash_memory_bank
-1
- flash_memory_size
0
- lmb_memory
ilmb_cntrl
- periph_type_overrides Het deel dat moet uitgevoerd worden onder het Linux besturingssysteem, zoals de toolchain kiezen en het maken van de µClinux Kernel Image blijft hetzelfde. Wanneer we dan terug overgaan naar onze EDK software samen met het image.bin bestand zullen we voor het downloaden in de FPGA met de XMD iets andere adressen bekomen. XMD%
dow –data image.bin
XMD%
mwr 0x100 0
XMD%
rwr 5 0x100
0x24000000
136
XMD%
rwr pc 0x24000000
XMD%
con
Hierna zou u moeten µClinux zien opstarten in ons hyperterminalvenster. Als wachtwoord en passwoord geeft u terug ‘root’ in.
137
Besluit In de EDK software van Xilinx vinden we het besturingssysteem Xilinx Micro Kernel. Met deze kernel kunnen we direct aan de slag, we hoeven ons dus geen zorgen te maken over het implementeren van de kernel op een hardwareplatform zoals bij een embedded Linux versie. Deze kernel laat zich heel gemakkelijk aanpassen en configureren in de EDK omgeving, waardoor een grote flexibiliteit gegarandeerd is. De werking van de kernel en de onderdelen van deze kernel zullen analoog zijn met andere besturingssystemen. De software wordt geschreven in de POSIX standaard die ook gebruikt wordt door Linux. Een gebruiker die ervaring heeft met andere besturingssystemen, zal deze kernel dus heel snel onder de knie krijgen. Wanneer een bedrijf zijn applicaties geschreven heeft voor de Xilinx Micro Kernel en beslist binnen een x aantal jaren van chipfabrikant te veranderen dan zullen deze applicaties aangepast moeten worden aan de kernel van de nieuwe fabrikant. Dit zal heel wat tijd in beslag nemen, en ook veel aanpassing vragen van de softwareprogrammeur. Dit kan vermeden worden door te werken met een embedded Linux versie. Indien we werken met een Linux kernel en we veranderen van chipfabrikant zullen we onze applicaties niet moeten aanpassen. Wel zal de Linux kernel opnieuw moeten worden ingesteld voor het nieuwe hardware platform. Het is gemakkelijker om Linux aan te passen naar het hardwareplatform, dan onze applicaties te veranderen, dit omdat Linux zich redelijk gemakkelijk laat plaatsen op een systeem. De EDK software van Xilinx bevat ook enkele bibliotheken. In dit eindwerk werden twee ethernet bibliotheken gebruikt, namelijk de XilNet bibliotheek en de LwIP bibliotheek. De XilNet bibliotheek is een heel kleine TCP/IP stack. XilNet is ongeveer 8KB groot, waardoor hij zich uitstekend leent voor systemen met weinig geheugen. Wel moet gezegd worden dat de vrijgegeven informatie van de fabrikant over de werking van de XilNet bibliotheek vrij pover is. De LwIP is een volledige TCP/IP stack die is aangepast voor embedded systemen. Wat zoveel betekent als het inkrimpen van het geheugengebruik. Toch zal deze LwIP nog een geheugenruimte van ongeveer 40KB innemen, wat toch nog redelijk veel is. We zullen bij het invoegen van de LwIP bibliotheek best gebruik maken van extern geheugen. 138
Het plaatsen van een Linux kernel op een System on Chip op FPGA is een complex gegeven. Zelf creëren van een kernel distributie of aanpassen van een bestaande Linux kernel distributie voor een eigen hardwareplatform vraagt enorm veel kennis over de structuur en opbouw van de Linux kernel. Daarom werd er in eerste instantie gezocht naar een kernel distributie die embedded processor architecturen ondersteunen. Op het internet kan men gemakkelijk kernel distributies vinden voor de verschillende processor architecturen die op de Xilinx Virtex-II Pro FPGA geïmplementeerd kunnen worden. Daarbij moet wel rekening gehouden worden dat deze kernel tree bronnen
open source zijn. Daarbij maak ik wel enkele bedenkingen. Zo zijn de aangespaste “beschikbare” kernel distributies voor de Xilinx Virtex-II Pro FPGA processors steeds enkele jaren oud en zijn ze van Linux kernel versie 2.4 waarmee de meeste aanpassingen gebeurd werden in het jaar 2004. Het zou perfect mogelijk zijn om een
2.6 kernel aan te passen zodat men deze ook kan laten draaien op een PowerPC op de Xilinx Virtex-II Pro FPGA. Men heeft dit zeker al gerealiseerd. Maar deze worden niet zo gemakkelijk vrij gegeven. De kernel ontwikkelaars geven niet zo snel hun gepresteerde werk vrij. Wat volgens mij logisch is want wie wil er energie en tijd steken in iets waar financieel niets kan aan gewonnen worden? En wat bijgevolg gratis door iedere andere gebruiker kan gebruikt worden zonder dat die er tijd of geld moet in investeren. Wanneer we de methodes om een linux kernel te bouwen vergelijken dan zien we dat de methode voor µClinux op een Microblaze processor te plaatsen veel rapper kan gebeuren dan het plaatsen van een Linux kernel op de PowerPC processor. Dit komt door dat µClinux de configuratie automatisch doorvoert. Daarbij is de vrijheid erg beperkt en ziet men niet duidelijk waarmee men bezig is. Dit in tegenstelling tot het creëeren voor een Linux kernel op PowerPC. Hier wordt alles handmatig geconfigureerd (tot het bestandsysteem toe) en is de vrijheidsgraad enorm toegenomen. Het kiezen voor µClinux voor de Microblaze processor heeft als enige reden dat de µClinux distributie de ondersteuning biedt voor de Microblaze processor. Alle andere kernel distributies bevatten deze processor archtectuur ondersteuning niet en dus konden ze simpelweg niet gebruikt worden of die moesten we zelf aangepassen wat dan weer enorm veel werk en tijd zou in beslag nemen. Dit was hetzelfde voor de PowerPC kernel. Het is zo dat bij het kiezen van een Linux distributie eerst moet gekeken worden of deze de processor architectuur ondersteundt waarvoor men een kernel wil bouwen. 139
Met dit eindwerk werd slechts een klein stuk van de Embedded Linux porting bestudeerd. Zo zie ik naar te toekomst toe enkele mogelijke verderzettingen van dit eindwerk. Er kan bijvoorbeeld een bootloader gecreëerd worden voor het embedded Linux systeem op PowerPC. Een andere interessante verderzetting van dit eindwerk zou het creëeren van toepassingen voor op de embedded Linux systemen zijn. Zo zou het mogelijk moeten zijn om Xilinx GPIO hardware IO aan te sturen vanuit het embedded Linux besturingsysteem. Wat dan nog kan uitgebreid worden om andere eigen hardware blokken aan te sturen vanuit Linux.
140
Literatuurlijst [1]
EDK OS and Libraries Document Collection, EDK 7.1i Juli 5, 2005, 240 p., Beschikbaar op het World Wide Web: http://www.xilinx.com/ise/embedded/edk7_1docs/oslibs_rm.pdf
[2]
Sathyanarayanan Thammanur, Chris Borrelli, TCP/IP on Virtex-II Pro Devices Using lwIP, XAPP663 (v1.1.1) Augustus 30, 2004, 16 p., Beschikbaar op het World Wide Web: http://www.xilinx.com/bvdocs/appnotes/xapp663.pdf
[3]
Delbeke Danaë, cursus besturingssystemen gedoceerd in de richting 4e jaar elektronica- ICT, Hogeschool West-Vlaanderen departement PIH, Kortrijk, Dokeos, 2005
[4]
Platform Studio User Guide, UG113 (v4.0) februari 15, 2005, 192 p., Beschikbaar op het World Wide Web: http://www.xilinx.com/ise/embedded/ps_ug.pdf
[5]
Virtex-4™ MB Development Board User’s Guide, (v3.0) December 2005, 45 p., Beschikbaar op het World Wide Web: http://legacy.memec.com/solutions/reference/xilinx
[6]
Xilinx University Program Virtex-II Pro Development System: Hardware Reference Manual, UG069 (v1.0) March 8, 2005, 138p, Beschikbaar op het World Wide Web: http://direct.xilinx.com/bvdocs/userguides/ug069.pdf
[7]
Virtex-II Pro and Virtex-II Pro X FPGA User Guide, UG012 (v4.0) 23 March 2005, 557p, Beschikbaar op het World Wide Web: http://direct.xilinx.com/bvdocs/userguides/ug012.pdf
[8]
PowerPC 405 Processor Block Reference Guide: Embedded Development Kit, UG018 (v2.1) July 20, 2005, 250p, Beschikbaar op het World Wide Web: http://direct.xilinx.com/bvdocs/userguides/ug018.pdf
141
[9]
P. Raghavan/Amol Lad/Sriram Neelakandan, Embedded Linux System Design and Development, New York, Auerbach Publications, 2006, 400 p, ISBN 0-84934058-6
[10]
Yaghmour K., Building Embedded Linux Systems, Sebastopol, O'Reilly & Associates, 2003, 416 p, ISBN 0-596-00222-X
[11]
Wolfgang Klingauf/Uwe Klingauf, Virtex2Pro & Linux, Beschikbaar op het World Wide Web http://www.klingauf.de/v2p/index.phtml [13.10.2005]
142
Appendix A:
Linux distributie via VMware
A.1 Installeren van Linux Omgeving via VMWare Er werd gebruik gemaakt van VMware Workstation versie 5.5.0 build-16958 software. Deze software laat toe om een linux omgeving te emuleren via een Microsoft Windows XP host Operating System. Eerst moet een Linux omgeving gedownload worden (eventueel op DVD of CD’s branden). Er werd gekozen voor de CentOS 3.5 linux die kan gedownload worden via de website http://www.centos.org. Een andere geteste omgeving is Fedora Core 4. Deze kan gedownload worden via http://fedora.redhat.com/. De installatie is voor beide systemen quasi identiek. Daarom wordt hier enkel de installatie van CentOS 3.5 besproken. Men kan via de download link op de CentOS webpagina naar een gewenste downloadpagina gaan. Daar kan men kiezen uit een mapstructuur met alle beschikbare CentOS versies. De ISO-images van het CentOS 3.5 kan men terugvinden door achtereenvolgens te klikken op:
Nu zijn er volgende mogelijkheden
Figuur A-1. Verschillende download uitvoeringen voor CentOS 3.5
A-1
CentOS neemt drie CD-ROMs in beslag. Er kan gekozen worden om de bestanden
CentOS-3.5-i386-disc1.iso, CentOS-3.5-i386-disc2.iso en CentOS-3.5-i386-disc3.iso rechtsreeks te downloaden. Of via een torrent-client (zoals bitcomet, BitTornado...) kan de CentOS-3.5-i386-discs1-3.torrent file afgehaald worden. Hier zijn de drie verschillende CD’s in één downloadbestand gegroepeerd. In de volgende Linux installatieprocedure werd gebruik gemaakt van CentOS-3.5-i386-dvd.iso.torrent die dus via een torrent-client werd gedownload. Er kan gekozen worden om de ISO images te branden op CD-ROM of eventueel DVD via software die toe laat om deze ISO images te branden. De CentOS-3.5-i386-dvd.iso (of de aparte .iso cds) kunnen ook geïnstalleerd worden zonder deze images eerst op CD-ROM te plaatsen. VMWare laat immers toe om ISO-images gemakelijk te gebruiken in het virtuele workstation. Opstarten van VMware Doe het volgende om een nieuwe Virtual Machine aan te maken. 1. Klik op 2. Er verschijnt een welkomswizard venster. Klik op “Volgende” 3. In het Appropriate Configuration venster wordt gekozen voor een typical virtual machine. Klik op “Volgende”.
Figuur A-2. VMWare virtual machine configuratie
A-2
4. In het Select a Guest Operating System moet een keuze gemaakt worden voor welk Guest Operating System er op de virtual machine zal geïnstalleerd worden. Selecteer hier “Linux” en bij version kiezen we voor “Other Linux”. Klik op “Volgende”.
Figuur A-3. Selecteren van een Guest Operating System in VMWare
5. In het volgende venster van de wizard moet een naam voor de virtual machine ingegeven worden. Bepaal hier eveneens de locatie waarop de VM zal komen. LET OP!! Er moet voldoende plaats vrij zijn op deze HD (minimum 10GB).
Figuur A-4. Naam en locatie ingeven voor virtual machine
A-3
6. Kies in het Network Type menu voor “Use bridged networking” en klik op “volgende”.
Figuur A-5. Netwerk voor virtual machine selecteren
7. In het Specify Disk Capacity venster moet de grootte van de virtuele HD ingesteld worden. Neem deze groter dan 10GB. Anders komt men snel in plaatsgebrek. Het creëren van een Cross-Compiler en de Linux bronbestanden om de embedded Linux kernels te compileren nemen veel plaats in beslag. Selecteer eventueel “Allocate all disk space now” om de harde schijf ruimte direct te reserveren voor de virtual machine. Klik op “voltooien” om de virtual machine aan te maken.
Figuur A-6. Opgeven voor de grote van virtual machine opgeven
A-4
8. Nu kunnen nog enkele bijkomende instellingen gedaan worden aan de virtuele machine. Zo kan men instellen hoeveel geheugen er mag gebruikt worden door het virtueel workstation. Daarvoor moet men dubbelklikken op Memory en dat in dit venster aanpassen. De hoeveelheid gereserveerd geheugen voor de VM machine zal afhangen van het aanwezige RAM in het computersysteem.
WindowsXP moet ook nog vlot kunnen werken. Door dubbel te klikken op een gewenst device kunnen nog andere instellingen aangepast worden voor de VM.
Figuur A-7. Device opties voor virtual machine
9. Voor de installatie van CentOS 3.5 wordt de ISO image DVD die eerder gedownload werd gebruikt. Dubbel klik op CD-ROM onder Devices van VMware. Selecteer “use ISO image”. Klik op browse en kies daar het CentOS-3.5-i386-
dvd.iso bestand op de locatie waar deze ISO-image gedownload werd. Klik op “OK”. Indien gebrande CD-ROMs of DVD gebruikt worden mag deze stap overgeslaan worden. Er kan direct naar de volgende stap overgegaan worden. Plaats dan wel de eerste CD-ROM van CentOS 3.5 in het station.
Figuur A-8. CR-ROM device opties voor virtual machine
A-5
10. Start de VM door te klikken op: 11. Nu wordt de installatie van CentOS 3.5 opgestart. Druk op <Enter> om CentOS-3 te installeren. (Indien men naar volledige scherm modus wil overgaan via VMware dan moet op gedrukt worden. Indien men de volledige schermweergave wil verlaten moeten opnieuw de ingedrukt worden.)
Figuur A-9. CentOS welkomst venster
12. Het welkomsvenster van CentOS komt te voorschijn. Klik op “next”. 13. In het Language Selection venster moet de gewenste taal van het OS ingesteld en Klik op “Next”.
worden. Selecteer
14. Nu moet een toetsenbord indeling gekozen worden. Selecteer en klik opnieuw op “volgende”. 15. In het volgende venster zal gevraagd worden om een muis te selecteren. Om een PS/2 muis in te stellen selecteer
en klik op
“volgende”. 16. In het installatie soort venster moet een Linux soort systeem ingesteld worden. Kies voor Personal Dekstop. Later in de installatieprocedure worden de tools voor software-ontwikkeling toegevoegd aan het systeem. Er kan ook voor een A-6
werkstation installatie gekozen worden. Daarbij wordt het gereedschap voor software-ontwikkeling direct geïnstalleerd op het systeem. Klik op “volgende”.
Figuur A-10. Installatie soort kiezen voor CentOs 3.5
17. In het volgende venster moeten de partities van het Linux systeem gespecifieerd worden. Doordat er met een VMware sessie gewerkt wordt en daarbij een virtuele drive aangemaakt werd, is er hier geen gevaar op beschadiging van een windows partitie. Kies om het installatie programma automatisch te laten partitioneren. Klik op “volgende” om verder te gaan.
Figuur A-11. Automatisch partitioneren selecteren
Er verschijnt een waarschuwingsvenster waarbij er gewaarschuwd wordt dat de schijf nog moet geïnitialiseerd worden en dat daarbij alle gegevens op deze schijf zullen verloren gaan. Aangezien er op het virtueel station nog geen
A-7
gegevens staan is er dus geen gevaar. Klik op “Ja” om verder te gaan en het station te initialiseren.
Figuur A-12. Waarschuwingsventer om station de initialiseren
18. Selecteer de standaard instellingen in het Automatisch Partitioneren venster zoals in volgende figuur wordt voorgesteld. Klik op “volgende” om verder te gaan.
Figuur A-13. het automatisch partitioneren venster
Er zal opnieuw een waarschuwingsvenster verschijnen. Klik opnieuw op “Ja” om verder te gaan met de installatie van Linux.
A-8
Figuur A-14. Waarschuwingsvenster voor partitioneren van Linux
19. In dit venster van de installatie-procedure moet de bootloader configuratie ingesteld worden om eventueel nog andere besturingsystemen te kunnen selecteren bij het opstarten. Dit is hier van minder belang. Kies standaardinstellingen en klik op “volgende” om verder te gaan.
Figuur A-15. CentOS 3.5 bootloader configuratie venster
20. De netwerkinstellingen zijn hier ook heel eenvoudig. Dit komt doordat via VMware een gebridged netwerk ingesteld werd via WindowsXP. Klik op “volgende” .
A-9
Figuur A-16. Netwerk configureren voor CentOS 3.5
21. In het volgende venster kan de Firewall ingesteld worden. Opnieuw kan gekozen worden om de standaardinstellingen van het installatie programma te accepteren. Klik op “volgende” om naar het volgende venster te gaan.
Figuur A-17. Firewall instellingen voor CentOS 3.5
22. Kies de standaardtaal voor het systeem. Selecteer hier“Dutch (Belgium)” en klik op “volgende” om verder te gaan.
A-10
Figuur A-18. Taalinstellingen voor Linux systeem
23. Kies
als tijdszone voor het systeem in het
tijdinstellingsvenster en klik op “volgende”. 24. Geef een root wachtwoord in voor hete Linux systeem en bevestig dit. Klik op
“volgende”.
Figuur A-19. Ingeven van een root-wachtwoord
25. Nu wordt er een overzicht gegeven van welke pakketten er zullen worden geïnstalleerd op het systeem. Indien men enkel met CentOS als desktop besturingsysteem wil werken zijn de basispakketten goed. Voor het bouwen en aanpassen van kernels is een aanpassing van pakketten nodig. Kies daarom voor “De verzameling van pakketten die worden geïnstalleerd, aanpassen”.
A-11
Figuur A-20. Pakketkeuze selectie venster van CentOS 3.5
Klik op “volgende”. Nu wordt een overzicht gegeven van alle beschikbare pakketten in CentOS. Selecteer alle pakketten die staan onder de groep ontwikkeling van software en klik op “volgende”. 26. Klik op “volgende” om te beginnen met de installatie van CentOS 3.5. 27. Nu worden alle gekozen instellingen geconfigureerd en alles software pakketten worden geïnstalleerd op het systeem. Wanneer alle pakketten geïnstalleerd zijn moet opnieuw op “volgende” geklikt worden. 28. De videohardware van grafische omgeving van (X) wordt nu ingesteld. Automatisch wordt gekozen voor
omdat er via VMware sessie
gewerkt wordt. Er kan eveneens ingesteld worden hoeveel videokaart-RAM het systeem mag gebruiken. Klik op “volgende”. 29. Als laatste wordt het beeldscherm ingesteld. Kies bijvoorbeeld voor een 1280x800 instelling:
. Omdat er met VMware werkt is
deze resolutie hier nog van weinig belang. Later (zie A.2) zal deze via VMware tools toepassing op de juiste resolutie ingesteld worden. Klik op “volgende”.
A-12
30. De installatie is nu voltooid. Klik op “afsluiten”. Het systeem zal nu opnieuw worden opgestart. 31. Tijdens het opstarten moet in het volgend venster nog enkele bijkomende instellingen gebeuren. Klik op “volgende” om de instellingen te valideren. Hier moet men ook een eerste gebruiker aanmaken voor het CentOS systeem. Daarvoor moet in dit vensters de gegevens vervolledigd worden onder “System
User”. Tot hier toe was enkel maar de root gebruiker beschikbaar. Het is niet aan te raden om continue als root gebruiker te werken. Een verandering aan systeeminstelling is snel gebeurt in linux en deze kunnen grote gevolgen hebben voor het besturingsysteem.
Figuur A-21. CentOS welkomsvenster na installatie
32. Indien alle voorgaande instellingen gedaan werden verschijnt volgend inlogvenster. Vul daar de aangemaakte gebruikersnaam in met paswoord. (of eventueel root met rootpaswoord). De grafische omgeving X wordt nu geladen.
A-13
Figuur A-22. Inlog venster van CentOS 3.5
33. Indien er gebruik gemaakt werd van .iso file om CentOS via VMware te installeren moet nog volgende stap uitgevoerd worden om de CD-ROM drive te kunnen gebruiken. -
Sluit CentOS af door te klikken op:
1. Start menu 2. Afmelden 3. Uitschakelen 4. Ok
Figuur A-23. Afmeld venster in Linux CentOS 3.5
-
Wanneer het systeem volledig afgesloten is. Ga in VMware Workstation naar de CD-ROM instellingen van de virtual machine door dubbel te klikken op CD-ROM onder devices. Er verschijnt een scherm waar de instellingen van de CD-ROM voor de virtuele machine kunnen aangepast worden. Hier stond de connectie op CentOS-3.5-i386-dvd.iso. Verander dit door de juiste CD-Rom drive van het computersysteem te selecteren. Bijvoorbeeld . Vink eveneens “connect exclusively to this virtual
machine” aan. A-14
Figuur A-24. Virtual Machine CD-ROM device instellingen
A.2 Installeren van VMware Tools Omdat de videokaart ingesteld werd op VMware en deze drivers maar standaard een beperkt aantal resoluties kunnen aannemen. Een systeem met een resolutie van 1200x800 kan niet via de gewoone beeldinstellingen van CentOS ingesteld worden. Om dit probleem op te lossen moeten de VMware tools geïnstalleerd worden. Dit gaat als volgt. 1. Start de virtuele machine in VMware. 2. Indien het systeem volledig is opgestart en er werd ingelogd, ga dan naar VM in de menubalk van VMware (eventueel op te drukken als men zich in volledige scherm mode bevindt). Klik onder VM op “Install VMware Tools”.
A-15
Figuur A-25. Selecteren om VMware Tools te installeren
3. Ga terug naar de linux omgeving. Dit kan door om terug naar volledige schermmodus over te gaan. Of gewoon op het CentOS bureaublad te klikken. Tip: Indien men wenst over te gaan naar de Windows XP omgeving klik op dan verschijnt de witte Windows XP muiscursor opnieuw en kan men terug WindowsXP besturen. 4. Dubbel klik op het VMware Tools CD pictogram op het bureaublad van CentOS. 5. Dubbel klik daarna op de .rpm installatie file die in dit venster staat. 6. Geef het root paswoord in. 7. Klik op “Continue”. Het installatieprogramma bereidt de pakketten voor die moeten worden geïnstalleerd 8. Klik op “Continue” wanneer er een dialoogvenster komt waarbij gezegd wordt: Completed System Preparation. Er verschijnt nu een een dialoogvenster met Updating System. Wanneer deze installatie voltooid is, wordt er geen confirmation of finish boodschap getoond. 9. Open een X terminal venster. (Klik met rechtermuisknop op bureaublad en kies “nieuw terminalvenster” ). Ga over naar root om de VMware Tools in te stellen door middel van commando: $
su –
Geef het root paswoord in. En geef volgend commando als root gebruiker: #
vmware-config-tools.pl
A-16
Beantwoord de gestelde vragen van het configuratie programma. Geef hier de gewenste resolutie in (voor een systeem met een resolutie van 1200x800 is dit nummer 5). Opmerking: Antwoord zeker met yes als de installer vraagt om het configuratie programma te starten. 10. Herstart het Linux systeem. Indien de installatie goed doorlopen werd start het systeem in de juiste resolutie opnieuw op.
A.3 USB-Stick of Externe USB-HD mounten onder CentOS 3.5 In linux is het zo dat alle randapparatuur en partitie’s moeten aangekoppeld worden aan de /-partitie. Anders kan er geen toegang tot deze device gekregen worden. Meestal worden bij de nieuwste Linux distributies de (FAT32-) Windows-partitie’s, CDs of DVDs of USB-sticks automatisch aangekoppeld. Maar bij CentOS 3.5 is dit nog niet het geval. Daarom wat uitleg hoe deze externe media kunnen gemount worden in Linux. Let op!! Indien Linux via VMware werkt mag het USB-apparaat maar aangesloten
worden als je in het venster zit van het guest operating system. In dit geval CentOS 3.5. Indien het USB-apparaat aangesloten wordt wanneer er nog in de Windows XP omgeving gewerkt wordt, zal dit USB-apparaat niet worden teruggevonden in CentOS of andere Linux omgeving met als gevolg dat deze apparaten niet zullen kunnen worden gebruikt onder Linux op het moment dat ze aangesloten zijn in Windows XP!! Ondersteuning voor lezen en schrijven van FAT32-partities zit in de CentOS kernel. Om een externe FAT32-partitie via USB te mounten moeten volgende stappen uitgevoerd worden: Maak een map aan waarin de partitie zal worden gemount. Bijvoorbeeld /media/externHD (deze locatie is vrij te kiezen). Zorg ervoor dat de gewone Linux gebruiker de juiste rechten heeft in /media om een nieuwe map aan te maken. Indien dit niet geval is kan dit via het chmod aangepast worden. Voer in een terminalvenster volgend commando uit:
A-17
$
mkdir /media/externHD
Vervolgens moet de naam van het apparaat dat wordt aangekoppeld gekend zijn. Dit kan men eenvoudig te weten komen door het USB-apparaat aan te koppelen en daarna naar de Hardware Browser te gaan van CentOS 3.5. De Hardware Browser kan teruggevonden worden als volgt:
1. Ga naar hoofdmenu 2. Kies “Systeemgereedschap”
>> “Hardware Browser”
3. Geef het root paswoord op 4. Ga naar “Harde Schijven” Nu wordt een overzicht gegeven van alle harde schijven die aan het systeem aangesloten zijn. De eerste is in het geval via VMware /dev/sda. Dit stelt de algemene VMware Linux partitie voor. Deze is nog onderverdeeld in verschillende partities. Deze partities worden voorgesteld als /dev/sda1, dev/sda2 en /dev/sda3. Daaronder staan de andere HD’s die nog op het systeem zijn aangesloten. Indien er 1 externe HD aangesloten is zal deze terug te vinden zijn onder /dev/sdb. Deze HD wordt opnieuw afgebeeld met zijn verschillende partities die kunnen gemount worden. Stel er is één partitie aanwezig op de externe HD of USBstick dan zal de partitie die moet aangekoppeld worden de naam hebben /dev/sdb1. Zijn er op de externe HD of USB-stick meerdere partities dan zullen deze ook worden weergegeven onder de namen /dev/sdb2, dev/sdb3 enz… Voor het mounten van een partitie (bijvoorbeeld :dev/sdb1) dienen volgende commando’s worden ingevoerd in een terminalvenster:
$ $
su (Geef het root passwoord in) mount /dev/sdb1 /media/externHD
Nu kan in de map /media/externHD de inhoud van de gewenste partitie bekeken worden, in de bestandsbeheerder, via terminal venster,… Indien men wenst te schrijven op het externe medium, kan dit enkel gebeuren wanneer er werd ingelogd als root (of su). Dit is het geval in CentOS 3.5. Het veranderen van de rechten op de map /media/externHD via chmod commando blijken hier niet te werken. Bij
A-18
bijvoorbeeld een Fedora Core 4 Linux omgeving worden externe HD en USB-stick automatisch gemount door de kernel en zijn ze wel beschrijfbaar en leesbaar als gewone gebruiker en niet enkel als root.
A-19
Appendix B:
Formatteren van
CompactFlash met mkdosfs Zoals de datasheet van het XUPV2P oefenbord beschrijft moet de compact Flash kaart geformatteerd worden op een specifieke manier zodat de SysACE controller die op het oefenbord aanwezig is het .ace bestand op de CF kaart zal kunnen lezen. Dit komt door de specifieke eigenschappen van de ACE controller die op het bord aanwezig is. Het FAT bestandsysteem kan geen ROOT directory sectoren behandelen groter dan 512 bytes of meer dan 16 32-bit bestanden/directory toegangen. Indien de ROOT directory structuur meer dan 16 bestanden/directory toegangen (inclusief gewiste toegangen) bevat, dan zal de System ACE controller niet correct functioneren. En bijkomend, De SystemACE controller kan geen Compact Flash kaarten behandelen waarbij het FAT bestandsysteem ingesteld is met 1 cluster = 1 sector = 512 bytes. Daarom moet de Compact Flash kaar geformatteerd worden zodat 1 cluster is > 512 bytes, en het boot parameter blok ingesteld is met enkel 1 gereserveerde boot sector. Het is normaal dat nieuwere besturingsystemen CF kaarten formatteren met meer dan 1 gereserveerde sectoren. Er bestaan applicaties die de CF kaarten kan formatteren naar de eisen van de System Ace controller. Zoals mkdosfs dat kan gevonden worden via
http://www.mager.org/mkdosfs/ . Download het mkdosfs.zip bestand en pak het uit onder C:/ van het systeem. Ga nu naar een commando venster in Windows XP en voer de volgende commando’s uit naar gelang de grootte van de CF kaart. De Compact Flash kaart bevindt zich onder drive F: en de naam die meegeven wordt is XLNX_XUP.
C:\> mkdosfs –v –F 16 –R 1 –s 2 –n XLNX_XUP F: (voor 16 MB CFC) C:\> mkdosfs –v –F 16 –R 1 –s 8 –n XLNX_XUP F: (voor 128 MB CFC) C:\> mkdosfs –v –F 16 –R 1 –s 16 –n XLNX_XUP F: (voor 512 MB CFC) C:\> mkdosfs –v –F 16 –R 1 –s 64 –n XLNX_XUP F: (voor 1 GB CFC)
De .ace bestanden via Xilinx EDK gemaakt worden kunnen nu gebruikt worden in het bord door deze te kopiëren op de Compact Flash kaart en deze kaart in het bord te plaatsen.
B-1
Appendix C:
Maken van
mkxupv2prootfs.sh script en /etc directory C.1 Het mkxupv2prootfs.sh script Het script zal zorgen dat de volgende taken worden uitgevoerd voor het bouwen van het Root File Systeem: •
Verwijderen van een bestaand bestandssysteem indien nodig
•
Het maken van alle mappen die nodig zijn voor het bestandssysteem (/bin, /dev, /etc, …)
•
Aanbrengen van de juiste glibc ( GNU C Library)
•
Het kopiëren van de /etc map met de juiste initialisatie bestanden
•
Uitvoeren van de BusyBox configuratie in het bestandssysteem
•
Veranderen van alle rechten en eigendom van de bestanden en mappen in het bestandssysteem naar root.
Dit script werd aangepast uit een script mkrootfs.sh dat te vinden is op de website van Klingauf voor het bouwen van een Root File System voor een ML300 bord [11]. # ***mkxupv2prootfs.sh*** # # mkxupv2prootfs.sh maakt een Root File Systeem voor het XUPV2P # # Plaats waar Embedded Root File Systeem zal komen in Linux # LFS=/opt/xupv2p # Cross Compiler prefix CC=powerpc-405-linux-gnu # Locatie prefix van Powerpc Toolchain TARGET_PREFIX=/opt/powerpc-405-linux/powerpc-405-linux-gnu # locatie van de Cross Compiler build Tools BUILD_TOOLS=/opt/powerpc-405-linux # locatie van de linux kernel bronbestanden #PPC_KERNEL=/opt/eldk # embedded linux kernel version #PPC_KERNEL_VERSION=2.4.26
C-1
#Plaats dit script in de directory van BusyBox #Indien op een andere locatie uitgevoerd wordt dan moet volgend LOCBBOX=`pwd` echo echo echo "mkxupv2prootfs aangepast script R. Casier" echo echo "Het Root File System zal in map $LFS geplaatst worden" echo echo "Voer dit script wanneer ingelogd als root" echo echo "...Let op het oude bestandsysteem in $LFS zal worden verwijderd " echo "...Druk CTRL-C om te stoppen..." echo "...Of druk op een andere toets om verder te gaan ..." read cd ${LOCBBOX} # Verwijderen van oud Root File Systeem indien er 1 bestaat if [ -a ${LFS} ] then echo "Verwijderen van het oude Root File Systeem op $LFS"; rm -rf ${LFS} fi # aanmaken van de linux directory structuur echo Maken directory structuur... mkdir -p ${LFS} mkdir -p ${LFS}/{bin,boot,dev/{pts,shm},etc/opt,home,lib,mnt,proc} mkdir -p ${LFS}/{root,sbin,tmp,usr/local,var,opt} for dirname in ${LFS}/usr ${LFS}/usr/local do mkdir $dirname/{bin,etc,include,lib,sbin,share,src} ln -s share/{man,doc,info} $dirname mkdir $dirname/share/{dict,doc,info,locale,man} mkdir $dirname/share/{nls,misc,terminfo,zoneinfo} mkdir $dirname/share/man/man{1,2,3,4,5,6,7,8} done mkdir ${LFS}/var/{lock,log,mail,run,spool} mkdir -p ${LFS}/var/{tmp,opt,cache,lib/misc,local} mkdir ${LFS}/opt/{bin,doc,include,info} mkdir -p ${LFS}/opt/{lib,man/man{1,2,3,4,5,6,7,8}} chmod 0750 ${LFS}/root chmod 1777 ${LFS}/tmp ${LFS}/var/tmp # Voor syslogd ln -s /tmp/messages ${LFS}/var/log/messages # Kopiëren van glibc (.so) bestanden uit de Cross-Compiler map #(dus specifiek voor PPC405) echo Kopiëren van glibc... cd ${TARGET_PREFIX}/lib C-2
cp *-*.so ${LFS}/lib cp -d *.so.[*0-9] ${LFS}/lib cp libSegFault.so libmemusage.so libpcprofile.so ${LFS}/lib echo "glibc bestanden zijn geinstalleerd onder de directory /lib van het Root File Systeem. " # installeren /etc echo "Installeren /etc..." cd ${LOCBBOX} cp -a etc ${LFS} # installeren /home echo "Installeren /home..." cd ${LOCBBOX} cp -a home ${LFS} # Klaar met maken van directory structuur echo "Het Root File systeem is gemaakt." echo echo "Busybox wordt geïnstalleerd" # Indien BusyBox op een andere directory staat dan deze van het script # moet dit hier vermeld worden in plaats van ${LOCBBOX} cd ${LOCBBOX} # Aanpassen van de .config bestanden en backup nemen van vorige .config # bestand. mv .config .config.OLD cat .config.OLD | sed /^PREFIX/d > .config.OLD2 && rm -f .config.OLD echo "PREFIX=\"$LFS\"" > .config cat .config.OLD2 >> .config && rm -f .config.OLD2 make dep && make && make install echo "Aanpassen van rechten en eigendom naar Root" chown -R root ${LFS} chmod -R a+x ${LFS} echo "Voltooid..." Tabel C-1. Het mkxupv2prootfs.sh script
C.2 De /etc directory De /etc map bevat de bestanden nodig voor de initialisatie van het linux systeem bij het opstarten zodat men kan inloggen. Deze map bevat eveneens alle bestanden die de gebruiker en groeps-accounts van het embedded Linux systeem beheren. Het is dus een zeer belangrijke map in het Linux systeem. Deze map is oorspronkelijk afkomstig van Klingauf website voor Virtex-II Pro ML300 oefenbord. Deze map kan gedownload worden met het mkrootfs.sh script in één .tar bestand. Maar doordat de /etc map voor het ML300 project veel zaken bevat die C-3
overbodig zijn voor de werking van dit project werd deze aangepast tot een ingekorte versie van de /etc map. Deze map wordt net zoals het mkxupv2prootfs.sh in de
BusyBox map geplaatst (zie paragraaf 0). /etc/init.d
/etc
Figuur C-1. Inhoud van de map /etc
De inhoud van deze bestanden gebruikt voor dit eindwerk wordt in de volgende tabellen weergegeven met wat informatie.
fstab: Hier worden alle systeemdevices gemount van het systeem. (FSTAB staat voor File System Table)
-
proc lijn: beschrijft de mount voor het proc bestandssysteem. Als proc gemount wordt komt daar alle informatie over het systeem en linux in te staan. Bijvoorbeeld de processen, geladen drivers, interrupts en netwerkgegevens. Elk bestand kan ingelezen worden, om meer informatie over het systeem te achterhalen (handig voor het configureren van een nieuwe kernel).
-
/dev/root lijn: Zorgt ervoor dat het root bestandsysteem gemount wordt.
# /etc/fstab: static file system information. # # <mount point> /dev/root / auto defaults,errors=remount-ro proc /proc proc defaults
<pass> 0 0 0 0
Tabel C-2. Inhoud /etc/fstab bestand
inittab: Dit bestand beschrijft initieel in welk runlevel het systeem moet opgestart worden en het beschrijft ook welke processen er op ieder runlevel
C-4
aanwezig zijn. In dit voorbeeld besturingsysteem worden geen processen uitgevoerd in de verschillende runlevels. Een lijn in het inittab bestand heeft volgend formaat: id:runlevel:actie:proces waarbij:
id:
Een unieke naam van 1 tot 4 karakters die kan meegeven worden om een lijnentry een naam te geven in het inittab bestand. In dit kleine inittab bestand werd geen naam meegegeven aan de verschillende lijnen omdat dit hier van weinig belang is voor dit klein systeem.
runlevels:
Hier wordt meegegeven in welk runlevel ieder specifiek proces
moet worden uitgevoerd in de linux kernel. Zo is het ook mogelijk dat processen in verschillende runlevels kunnen worden uitgevoerd. Dit wordt hier in dit bestand mee gegeven. Het linuxsysteem beschikt over 8 verschillende runlevels. Het systeem kan slechts 1 runlevel per keer uitvoeren. Zoals hierboven reeds besproken werd, wordt er geen gebruik gemaakt van deze runlevels omdat de acties hier gebruikt boven deze runlevels staan en deze toch negeren.
Actie: Er zijn verschillende acties mogelijk in de inittab. De acties die hier gebruikt werden worden hieronder kort beschreven: -
sysinit: Dit proces wordt uitgevoerd tijdens het booten van het systeem. Het wordt uitgevoerd voor iedere boot of bootwait actie uit de inittab (hier niet aanwezig).
-
ctrlaltdel: Dit proces zorgt voor het rebooten van het systeem bij het indrukken van Ctrl+Alt+Del.
-
restart: Zorgt voor een systeem herstart
-
respawn: het proces moet opnieuw uitgevoerd worden indien het beëindigd werd.
Proces: Hier wordt de locatie van het procesbestand meegegeven met eventueel de opties voor het uitvoeren van het desbetreffende proces.
##inittab ::sysinit:/etc/init.d/rcS ::ctrlaltdel:/sbin/reboot ::restart:/sbin/init ::respawn:/sbin/getty 38400 tts/0 Tabel C-3. Inhoud /etc/inittab
C-5
issue: Dit is een tekstbestand die het bericht bevat die voor de login prompt zal afgeprint worden.
XUPV2P PowerPc Linux 2.4.26 ----- Login Screen: Tabel C-4. Inhoud /etc/issue bestand
issue.net: Dit is een tekstbestand dat een bericht of een systeemidentificatie uitvoert voor het begin van de opdrachtregel van een telnet sessie. Deze kan verschillende %char commando’s bevatten. De commando’s die hier gebruikt werden betekenen:
%s: Naam van het operating systeem tonen %m: Het machine type (Hardware) tonen %r: De operating system release tonen ##issue.net =================================== Xupv2P PowerPc Linux %s/%m %r =================================== Tabel C-5. Inhoud /etc/issue.net
motd: Tekstbestand die een bericht op het scherm toont na het inloggen van iedere gebruiker op het systeem.
##motd Welcome to the XUPV2P, 2005-2006 edition Tabel C-6. Inhoud /etc/motd bestand
passwd en group: Tekstbestand die een tekstueel overzicht geeft van de gebruikers en groepen op het Linux systeem.
##passwd root::0:0:root:/root:/bin/sh rodolf:x:500:100:Rodolf_Casier:/rodolf:/bin/sh Tabel C-7. inhoud /etc/passwd bestand
C-6
#/etc/group root:*:0:root,operator users:*:100:rodolf Tabel C-8. Inhoud /etc/group bestand
rcH: Script dat wordt uitgevoerd tijdens het rebooten. Bevat hier enkel een extra tekstlijn voor het reboot proces.
#rcH #!/bin/sh echo "Rebooting..." Tabel C-9. Inhoud /etc/init.d/rcH bestand
rcS: Dit is een script die eerst wordt uitgevoerd door het sysinit commando uit het inittab bestand. Hier worden enkele bestandsystemen gemount. Het bevat ook enkele informatielijnen die tijdens het opstarten op het terminal venster zullen verschijnen.
#rcS #!/bin/sh echo echo Welcome to XUPV2P powerpc linux 2.4.26, 2005-2006 edition echo echo Created By R. Casier, Eindwerk PIH 2005-2006 echo Starting systeem... # First mount /proc! echo -n "mounting /proc: " mount -n /proc /proc -t proc echo "done." # Make sure / is rw echo -n "Mounting '/' read-write: " mount -n -o remount,rw / echo "done." echo Systeem is opgestart. echo "Login naam: root" Tabel C-10. Inhoud /etc/init.d/rcS bestand
C-7
Appendix D:
C-Files Webserver
De webserver c- files bestaan uit 3 source files en 3 header files. De drie source files zijn: •
peripheral.c
•
web.c
•
http.c
Het eerste bestand dat we aan sources moeten toevoegen: peripheral.c
#include #include #include #include
<xgpio_l.h> <xparameters.h> <xuartns550_l.h> "peripheral.h"
#define LED_BASEADDR XPAR_LEDS_4BIT_BASEADDR #define SWITCH_BASEADDR XPAR_DIPSWS_4BIT_BASEADDR void init_uart() { XUartNs550_SetBaud(UART_BASEADDR, UART_CLOCK, UART_BAUDRATE); XUartNs550_mSetLineControlReg(UART_BASEADDR, XUN_LCR_8_DATA_BITS); } void initLedDip() {
XGpio_mSetDataDirection(LED_BASEADDR, 1, 0x0); XGpio_mSetDataDirection(SWITCH_BASEADDR, 1, 0xFF); turnLED(-1, 0); } //Helper method, turn the specified LED on or off void turnLED(int ledNumber, int on){ Xuint32 data = 0xffffffff; if(ledNumber == -1){ if(on) data = 0; else data = 0xFFFFFFFF; } else{ switch (ledNumber){ case 0: data = 0xFFFFFFF7; break; case 1: data = 0xFFFFFFFB; break; case 2: data = 0xFFFFFFFD; break; D-1
case 3: data = 0xFFFFFFFE; break; default: data = 0xffffffff; } } XGpio_mSetDataReg(LED_BASEADDR, 1, data); } Xuint8 getDIP(int dipNumber) { Xuint32 data; data = XGpio_mGetDataReg(SWITCH_BASEADDR, 1); data = (data>>(6-dipNumber)) & 0x1; return (Xuint8)data; }
void testLedDip() { int i, delay; Xuint8 dip; turnLED(-1, 1); for(delay=0; delay<50000; delay++); turnLED(-1, 0); while(1){{ char s = 'a'; xil_printf("Input the LED to turn on (0-7):"); s = XUartNs550_RecvByte(UART_BASEADDR); xil_printf("%d\r\n",s); turnLED(-1, 0); s = s - '0'; turnLED(s, 1); for(i=0; i<=6; i++){ dip = getDIP(i); xil_printf("DIP %d = %d } xil_printf("\r\n");
", i, dip);
} } }
D-2
Het tweede bestand: web.c /***************************** Include Files *********************************/ #include <stdio.h> #include <string.h> #include #include #include <xgpio_l.h> #include <xemac_l.h> #include <xparameters.h> #include <xuartns550_l.h> #include "web.h" #include "http.h" #include "peripheral.h" #include int count = 0; extern struct web_conn_ent web_conns[MAX_WEB_CONNS]; int main() { int i; int n = 0; int s; int err; struct sockaddr_in addr;
init_uart();
// Initialize general purpose I/O initLedDip(); // Initialize network device init_net(); // Create the socket s = init_socket(&addr); if (s == -1) { xil_printf("socket() error \n\r"); exit(1); } stop_webserver = 0; for (;;) { int alen = 0; count = count % 6; /* Accept new connections */ alen = sizeof(struct sockaddr);
D-3
// Accept a new connection. Sets the global xilsock_status_flag. err = xilsock_accept(s, (struct sockaddr *)&addr, &alen); if (xilsock_status_flag & XILSOCK_NEW_CONN) { /* A new connection was found. Add a web connection. */ add_web_conn(err); } /* Process all existing connections */ if (do_proc_conns()==-1){ print("WEB server stoped\r\n"); return 0; } } return 0; } void init_net() { int i; unsigned char hw_addr[ETH_ADDR_LEN_PLUS_COLONS]; Xuint8 ip[16]="192.168.0.3"; print("Starting Up!!\n\r");
OneWire_GetHardwareAddrWithColons(XPAR_ONEWIRE_0_BASEADDR,h w_addr); xil_printf("ETH_HW_ADDR: %02x:%02x:%02x:%02x:%02x:%02x \r\n",hw_addr[0],hw_addr[2],hw_addr[4],hw_addr[6],hw_addr[8],hw_ addr[10]); // Set MAC address (eth.c) of hardware in the TCP/IP stack xilnet_eth_init_hw_addr(hw_addr); // Initialize Ethernet hardware table (eth.c) xilnet_eth_init_hw_addr_tbl(); // Set the IP address getIP(ip); xilnet_ip_init(ip);
(ip.c)
// Initialize the MAC OPB base address (MAC driver in net/mac.c) xilnet_mac_init(XPAR_ETHERNET_MAC_BASEADDR); // xemac_l.h xil_printf("Reseting PHY\n\r"); XEmac_mPhyReset(XPAR_ETHERNET_MAC_BASEADDR); // Set the MAC physical Ethernet address in the MAC driver (xemac_l.h) XEmac_mSetMacAddress(XPAR_ETHERNET_MAC_BASEADDR, mb_hw_addr);
D-4
// Enable MAC (xemac_l.h) XEmac_mEnable(XPAR_ETHERNET_MAC_BASEADDR); // Print IP address xil_printf("ip: %d.%d.%d.%d \n\r", mb_ip_addr[0], mb_ip_addr[1],mb_ip_addr[2],mb_ip_addr[3]); } int init_socket(struct sockaddr_in *addr) { //struct sockaddr_in addr; // defined in net/in.h int s; int err; // Allocate a new socket (xilsock.c) s = xilsock_socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { return -1; } // Define the address for the socket addr->sin_family = AF_INET; //socket.h (IP) addr->sin_addr.s_addr = INADDR_ANY; //net/in.h addr->sin_port = SERVER_PORT; //defined in web.h (web server at 8080) //Bind the allocated socket to a specific address err = xilsock_bind(s, (struct sockaddr *)addr, sizeof(struct sockaddr)); if (err == -1) { xil_printf("bind() error \n\r"); return(-1); }
// Enable listening on the socket err = xilsock_listen(s, 4); if (err == -1) { xil_printf("listen() error \n\r"); return -1; } print("Socket created, bound, and listening. Accepting connections\r\n"); return s; } void getIP(unsigned char* ipAddr) { int i; Xuint8 correct = 'n'; while(correct != 'y'){
D-5
xil_printf("Input your IP address(such as 192.168.0.3), hit enter to finish:"); for(i=0;i<16;i++){ ipAddr[i] = XUartNs550_RecvByte(UART_BASEADDR); xil_printf("%c",ipAddr[i]); if(ipAddr[i]=='\r') break; } xil_printf("\n"); xil_printf("Are you sure this IP address is correct?(y/n)"); correct = XUartNs550_RecvByte(UART_BASEADDR); xil_printf("%c\r\n",correct); } ipAddr[i]='\0'; } Het derde bestand: http.c /***************************** Include Files *********************************/ #include <stdio.h> #include <string.h> #include #include #include <xgpio_l.h> #include <xemac_l.h> #include <xparameters.h> #include <xuartns550_l.h> #include "web.h" #include "http.h" #include "peripheral.h" #include int count = 0; extern struct web_conn_ent web_conns[MAX_WEB_CONNS]; int main() { int i; int n = 0; int s; int err; struct sockaddr_in addr;
init_uart();
// Initialize general purpose I/O initLedDip(); // Initialize network device init_net();
D-6
// Create the socket s = init_socket(&addr); if (s == -1) { xil_printf("socket() error \n\r"); exit(1); } stop_webserver = 0; for (;;) { int alen = 0; count = count % 6; /* Accept new connections */ alen = sizeof(struct sockaddr); // Accept a new connection. Sets the global xilsock_status_flag. err = xilsock_accept(s, (struct sockaddr *)&addr, &alen); if (xilsock_status_flag & XILSOCK_NEW_CONN) { /* A new connection was found. Add a web connection. */ add_web_conn(err); } /* Process all existing connections */ if (do_proc_conns()==-1){ print("WEB server stoped\r\n"); return 0; } } return 0; } void init_net() { int i; unsigned char hw_addr[ETH_ADDR_LEN_PLUS_COLONS]; Xuint8 ip[16]="192.168.0.3"; print("Starting Up!!\n\r");
OneWire_GetHardwareAddrWithColons(XPAR_ONEWIRE_0_BASEADDR,h w_addr); xil_printf("ETH_HW_ADDR: %02x:%02x:%02x:%02x:%02x:%02x \r\n",hw_addr[0],hw_addr[2],hw_addr[4],hw_addr[6],hw_addr[8],hw_ addr[10]); // Set MAC address (eth.c) of hardware in the TCP/IP stack xilnet_eth_init_hw_addr(hw_addr); // Initialize Ethernet hardware table (eth.c) xilnet_eth_init_hw_addr_tbl(); D-7
// Set the IP address getIP(ip); xilnet_ip_init(ip);
(ip.c)
// Initialize the MAC OPB base address (MAC driver in net/mac.c) xilnet_mac_init(XPAR_ETHERNET_MAC_BASEADDR); // xemac_l.h xil_printf("Reseting PHY\n\r"); XEmac_mPhyReset(XPAR_ETHERNET_MAC_BASEADDR); // Set the MAC physical Ethernet address in the MAC driver (xemac_l.h) XEmac_mSetMacAddress(XPAR_ETHERNET_MAC_BASEADDR, mb_hw_addr); // Enable MAC (xemac_l.h) XEmac_mEnable(XPAR_ETHERNET_MAC_BASEADDR); // Print IP address xil_printf("ip: %d.%d.%d.%d \n\r", mb_ip_addr[0], mb_ip_addr[1],mb_ip_addr[2],mb_ip_addr[3]); } int init_socket(struct sockaddr_in *addr) { //struct sockaddr_in addr; // defined in net/in.h int s; int err; // Allocate a new socket (xilsock.c) s = xilsock_socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { return -1; } // Define the address for the socket addr->sin_family = AF_INET; //socket.h (IP) addr->sin_addr.s_addr = INADDR_ANY; //net/in.h addr->sin_port = SERVER_PORT; //defined in web.h (web server at 8080) //Bind the allocated socket to a specific address err = xilsock_bind(s, (struct sockaddr *)addr, sizeof(struct sockaddr)); if (err == -1) { xil_printf("bind() error \n\r"); return(-1); }
// Enable listening on the socket err = xilsock_listen(s, 4); if (err == -1) { D-8
xil_printf("listen() error \n\r"); return -1; } print("Socket created, bound, and listening. Accepting connections\r\n"); return s; } void getIP(unsigned char* ipAddr) { int i; Xuint8 correct = 'n'; while(correct != 'y'){ xil_printf("Input your IP address(such as 192.168.0.3), hit enter to finish:"); for(i=0;i<16;i++){ ipAddr[i] = XUartNs550_RecvByte(UART_BASEADDR); xil_printf("%c",ipAddr[i]); if(ipAddr[i]=='\r') break; } xil_printf("\n"); xil_printf("Are you sure this IP address is correct?(y/n)"); correct = XUartNs550_RecvByte(UART_BASEADDR); xil_printf("%c\r\n",correct); } ipAddr[i]='\0'; } Eenmaal de sources zijn toegevoegd, moeten de headers aan het project worden toegevoegd, dit zijn 3 bestanden namelijk: •
peripheral.h
•
web.h
•
http.h
De eerste header die we moeten toevoegen is: peripheral.h
#include <Xbasic_types.h> #define UART_BASEADDR #define UART_CLOCK #define UART_BAUDRATE
XPAR_RS232_UART_1_BASEADDR XPAR_XUARTNS550_CLOCK_HZ 9600
void init_uart(); D-9
void initLedDip(); void turnLED(int ledNumber, int on); Xuint8 getDIP(int dipNumber); void testLedDip(); De tweede header: web.h /* * Web server related #defines */ #ifndef __WEB_H #define __WEB_H struct web_conn_ent { int s; // socket descriptor int state ; // state of the connection char *file_name; // name of file served int bytes_rem; // no of bytes remaining to send }; #define SERVER_PORT 8080 #define MAX_WEB_CONNS 1 // Web Server States for connections #define WEB_GET 1 // Got a Get request #define WEB_GET_PROC 2 // processing a GET request #define WEB_DONE 3 // done with a GET request processing #define WEB_CONN_FREE -1 // conn free to assign to client extern stop_webserver; int web(void); void init_net(void); void getIP(unsigned char* ipAddr); #endif De derde header: http.h #ifndef HTTP_TEST_H #define HTTP_TEST_H int add_web_conn(int); void free_web_conn(int); int do_proc_conns(); #endif
D-10
Appendix E:
C-Files Echoserver
Om de echoserver te maken, voegen we volgend C file toe aan sources:
/* Xilinx Includes */ #include "xuartns550_l.h" #include "xtime_l.h" #include "xparameters.h" #include "xcache_l.h" #include "xgpio_l.h" #include "xintc.h" #include "xbasic_types.h" #include "xstatus.h" #include "xexception_l.h" /* lwIP Includes */ #include "netif/xemacif.h" #include "lwip/tcpip.h" #include "lwip/memp.h" #include "netif/etharp.h" #include "lwip/sys.h" #include "lwip/sockets.h" #define UART_BASEADDR #define UART_CLOCK #define UART_BAUDRATE
XPAR_RS232_UART_1_BASEADDR XPAR_XUARTNS550_CLOCK_HZ 115200
#define GPIO_BASEADDR
XPAR_LEDS_4BIT_BASEADDR
// Upper 6 bytes of MAC #define XILINX_MAC_OUI0 #define XILINX_MAC_OUI1 #define XILINX_MAC_OUI2
- Xilinx Ethernet OUI = 00-0A-35 0x00 0x00 0x00
char buf[400]; static void show_dotted_decimal( char * address_array); static void show_dashed_hex( int bytes, char *address_array); // Static Global Variables static u8_t my_timer = 0; // External Global Variables /* defined in lwip/src/core/tcp.c */ extern u32_t tcp_ticks; /* defined in EDK generated xemacif_g.c file */ extern XEmacIf_Config XEmacIf_ConfigTable[]; /*--------------------------------------------------------------------------*/ E-1
// show dotted decimal prints a dotted decimal address to the UART */ /*--------------------------------------------------------------------------*/ static void show_dotted_decimal( char *address_array) { int bb; char temp; for(bb=0;bb<4;bb++) { temp = address_array[bb]; if(bb!=0) xil_printf("."); xil_printf("%d", (int) temp); } } /*--------------------------------------------------------------------------*/ /* show dashed hex prints a dashed hex address to the UART */ /*--------------------------------------------------------------------------*/ static void show_dashed_hex( int bytes, char *address_array) { //Assumes the caller passes the correct number of bytes int bb; for(bb=0;bb
E-2
xil_printf("# XILINX DEVICES. #\r\n"); xil_printf("# #\r\n"); xil_printf("# (c) Copyright 2003, 2003 Xilinx, Inc. #\r\n"); xil_printf("# All rights reserved. #\r\n"); xil_printf("# #\r\n"); xil_printf("#################################################### ################\r\n"); }
void* socket_process_thread(void* arg) { int len; int s = *((int*) arg); print ("\r\nSOCKET: Processing data for connection..."); while((len = read(s,buf,400)) > 0) { write(s,buf,len); } print ("\r\nSOCKET: Closing socket..."); close(s); print ("done."); } void* socket_app_thread(void *arg) { struct ip_addr ipaddr, netmask, gw; struct netif *default_netif; char menu_select = 0; char low_mac[3] = {0x00,0x22,0x38}; char fullmac[6] = {XILINX_MAC_OUI0, XILINX_MAC_OUI1, XILINX_MAC_OUI2, low_mac[0], low_mac[2], low_mac[3]}; char ip[4] = {172,23,6,120}; char subnet[4] = {255,255,0,0}; char gateway[4] = {172,23,0,1}; int sock,s; int len; struct sockaddr_in addr,rem; XEmacIf_Config *xemacif_ptr = &XEmacIf_ConfigTable[0]; /* while (1) { print("Sock Thread \n\r"); } */
E-3
/*----------------------------------------------------------------------*/ /* Initial Header and Menus. Do this before the netif_init() so we can */ /* change the MAC Address and IP addresses if needed */ /*----------------------------------------------------------------------*/ print_app_header(); fullmac[0] fullmac[1] fullmac[2] fullmac[3] fullmac[4] fullmac[5]
= = = = = =
XILINX_MAC_OUI0; XILINX_MAC_OUI1; XILINX_MAC_OUI2; low_mac[0]; low_mac[1]; low_mac[2];
/*----------------------------------------------------------------------*/ /* Set host addresses */ /*----------------------------------------------------------------------*/ xemacif_setmac(0, (u8_t *) fullmac); //Set MAC IP4_ADDR(&gw, gateway[0],gateway[1],gateway[2],gateway[3]); //Set gateway IP4_ADDR(&ipaddr, ip[0],ip[1],ip[2],ip[3]); //Set ip IP4_ADDR(&netmask,subnet[0],subnet[1],subnet[2],subnet[3]); //Set subnet msk /*----------------------------------------------------------------------*/ /* Show some host boot stuff and parameters */ /*----------------------------------------------------------------------*/ xil_printf("\r\nStarting Network Interface...\r\n"); xil_printf(" MAC Address: "); show_dashed_hex(6, fullmac); xil_printf("\r\n"); xil_printf(" IP Address: "); show_dotted_decimal(ip); xil_printf("\r\n"); xil_printf(" Subnet Mask: "); show_dotted_decimal(subnet); xil_printf("\r\n"); xil_printf(" Gateway IP: "); show_dotted_decimal(gateway); xil_printf("\r\n"); xil_printf(" Echo Port: 7 \r\n"); /*----------------------------------------------------------------------*/ /* Set up the lwIP network interface... */ /*----------------------------------------------------------------------*/ E-4
/* allocate netif structure */ default_netif = mem_malloc(sizeof(struct netif)); if (default_netif == NULL) { print(NETIF_DEBUG, ("netif_add(): out of memory for default_netif\n")); return NULL; } default_netif = netif_add(default_netif, &ipaddr, &netmask, &gw, &XEmacIf_ConfigTable[0], xemacif_init, tcpip_input ); netif_set_default(default_netif); /* Register XEmacHandler with interrupt controller and enable interrupts * with XMK */ register_int_handler(XPAR_OPB_INTC_0_ETHERNET_MAC_IP2INTC_IRPT_I NTR, (XInterruptHandler)XEmac_IntrHandlerFifo, xemacif_ptr->instance_ptr); /* Enable EMAC interrupts in XMK */ enable_interrupt(XPAR_OPB_INTC_0_ETHERNET_MAC_IP2INTC_IRPT_INTR) ; /*----------------------------------------------------------------------*/ /* create socket and start application */ /*----------------------------------------------------------------------*/ print ("\r\nSOCKET: Creating socket.."); sock = socket(AF_INET,SOCK_STREAM,0); print ("done."); print ("\r\nSOCKET: Doing bind.."); addr.sin_family = AF_INET; addr.sin_port = htons(7); addr.sin_addr.s_addr = INADDR_ANY; bind(sock,(struct sockaddr *)&addr,sizeof(addr)); print ("done."); print ("\r\nSOCKET: Listening..."); listen(sock,5); print ("done."); E-5
while(1) { len = sizeof(rem); print ("\r\nSOCKET: Accepting a new connection..."); s = accept(sock,(struct sockaddr*)&rem,&len); print ("\r\ndone."); // Start a new thread that handles the data for the new conn sys_thread_new(socket_process_thread, &s, 0); } //return 1; } void* socket_thread(void* arg) { /*----------------------------------------------------------------------*/ /* Do LWIP System Inits */ /*----------------------------------------------------------------------*/ xil_printf("Initializing lwIP .\r\n"); lwip_init(); xil_printf("."); xil_printf(" done."); sys_thread_new(socket_app_thread, 0, 0); }
void* dummy_thread(void* arg) { int i; while (1) { print("DUMMY THREAD \n\r"); for (i=0; i < 0x3ffffff; i++); } } /* void* dummy2_thread(void* arg) { while (1) print("DUMMY2 THREAD \n\r"); } */ int main() { /*-----------------------------------------------------------------------* Uart Init E-6
* * The XIo stuff below is to make the new ABQ drivers act like the original * SEG drivers from V2PDK 1.0. Otherwise, the UART won't work on some * revisions of the Insight Boards. * *-----------------------------------------------------------------------*/ /* Disable Interrupts */ XIo_Out8(UART_BASEADDR + XUN_LCR_OFFSET, 0UL); XIo_Out8(UART_BASEADDR + XUN_IER_OFFSET, 0UL); /* Clear Latches */ XIo_In8(UART_BASEADDR + XUN_LSR_OFFSET); XIo_In8(UART_BASEADDR + XUN_IIR_OFFSET); XIo_In8(UART_BASEADDR + XUN_MSR_OFFSET); /* Disable FIFOs (16450) */ XIo_Out8(UART_BASEADDR + XUN_FCR_OFFSET, 0UL); /* Normal ABQ level 0 driver inits */ XUartNs550_SetBaud(UART_BASEADDR, UART_CLOCK, UART_BAUDRATE); XUartNs550_mSetLineControlReg(UART_BASEADDR, XUN_LCR_8_DATA_BITS); /* Sets DTR, RTS, and OUT2 in the MCR */ XIo_Out8(UART_BASEADDR + XUN_MCR_OFFSET, XUN_MCR_OUT_2 | XUN_MCR_RTS | XUN_MCR_DTR);
xil_printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \r\n"); xil_printf("Starting Up...\r\n"); xil_printf("Console: 16550 initialized.\r\n"); // clear UART Receive Buffer while (XUartNs550_mIsReceiveData(UART_BASEADDR)) { XUartNs550_RecvByte(UART_BASEADDR); } // set GPIO I/O Mask XGpio_mSetDataDirection(GPIO_BASEADDR, 1, 0x00000FFF); // Turn on 4 LEDs (Active Low) XGpio_mSetDataReg(GPIO_BASEADDR, 1, 0x00000000);
xilkernel_main(); // App thread gets specified in MSS and hence started after this ... }
E-7