Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Wydział IEiT Katedra Elektroniki SYSTEMY DEDYKOWANE W UKŁADACH PROGRAMOWALNYCH Ćwiczenie 4 Petalinux. Budowa własnego systemu. Zespół Rekonfigurowalnych Systemów Obliczeniowych Sebastian Koryciak & Paweł Russek
Wprowadzenie http://www..pl/gegula Kolejne zajęcia poświęcone płycie ZedBoard i systemowi PetaLinux. Łącząc możliwości programów PlanAhead, SDK i PetaLinux uruchamianych na różnych systemach operacyjnych (ze wględu na wymogi producenta i możliwości sprzętu na sali laboratoryjnej) student w trakcie zajęć od zera buduje część sprzętową i programową projektu. Zostaje przedstawiona technika importowania projektu w programie SDK, tworzenie i wgrywanie oprogramowania FSBL (First Stage Boot Loader) z wykorzystaniem interfejsu JTAG. Cele zajęć: - stworzenie projektu sprzętowego w środowisku PlanAhead - zaimportowanie projektu HW do SDK odpalonego na innym systemie operacyjnym - stworzenie BSP (Board Support Package) dla systemu PetaLinux - stworzenie FSBL - stworzenie BSP dla FSBL - wgrywanie pliku konfiguracyjnego i systemu startowego przez JTAG 2
1. Stworzenie projektu w PlanAhead 1. Proszę uruchomić program PlanAhead, a następnie przystąpić do stworzenia nowego projektu, który będzie podstawą do zbudowania całego systemu. 2. Proszę projekt zatytułować project_zynq_petalinux, oraz zadbać aby ścieżka dostępu do projektu nie zawierała znaków spacji. 3. W następnym oknie proszę wybrać opcję RTL Project (nie zaznaczać opcji Do not specify sources at this time) 3
4. W kolejnym oknie proszę jako Taget language wybrać opcję VHDL. 5. Proszę klikać Next w celu nie dodawania żadnych istniejących IP, źródeł Constraints. 6. W oknie wyboru części proszę zaznaczyć opcję Boards, a następnie wybrać rodzinę Zynq- 7000, opakowanie clg484. Ostatecznie z listy proszę wybrać opcję ZedBoard Zynq... Wybór zatwierdzić przyciskiem Next. 4
7. Zatwierdzamy stworzenie nowego projektu przyciskiem Finish. 8. Przystępujemy do dodawania źródeł do naszego projektu. W tym celu klikamy na ikonę umieszczoną w oknie zatytułowanym Sources 5
9. W nowo otwartym oknie zaznaczamy opcję Add or Create Embedded Sources, zatwierdzamy wybór przyciskiem Next, a następnie chcąc utworzyć nowy system klikamy na przycisk Create Sub-Design... 10. Nowo tworzony moduł proszę nazwać zynq_module i nacisnąć OK. Dodawanie systemów zakańczamy przyciskiem Finish. 11. W trakcie tworzenia, a także modyfikowania modułu systemu będzie pojawiało się powyżej umieszczone okno. W tym samym czasie zostaje uruchomiona automatycznie aplikacja XPS. Zaczynamy od zatwierdzenia dodania systemu. 6
12. Stworzony system jest pusty. Pierwsza czynność polega na zaimportowaniu ustawień jednostki PS (czyli ARM z peryferiami) przypisanych przez producenta płyty Zedboard. W związku z tym klikamy na ikonę Import. 13. W oknie zatytułowanym Import Zynq Processing System Configuration wybieramy z listy opcję ZedBoard Development Board Template, a nasz wybór potwierdzamy przyciskiem OK. 14. W następnej informacji program XPS poinformuje nas o zaimportowaniu nowej konfiguracji. Proszę potwierdzić wprowadzenie zmian przyciskiem YES. W ten sposób przygotowaliśmy Processing System do pracy. Teraz rozpoczniemy jego modyfikację, w celu podłączenia kontrolera PWM. Dokonamy następujących zmian: dodamy IP core do komunikacji z GPIO po przez magistralę AXI-Lite udostępnimy na zewnątrz systemu port GPIO, oraz zegar o zadanej częstotliwości 15. Proszę w oknie IP Catalog rozwinąć wiersz General Purpose IO, a następnie dwukrotnie kliknąć na dodawany moduł: AXI General Purpose IO. Przyciskiem YES potwierdzamy zamiar dodania nowego modułu. 7
16. Nie dokonując żadnych modyfikacji potwierdzamy wszystkie opcje przyciskiem OK, a następnie zgadzamy się na automatyczne stworzenie połączenia między modułem, a processing_system7_0 klikając OK. Prawidłowo podłączony moduł powinien być widoczny pod zakładką Bus Interfaces. 8
17. Kolejne modyfikacje będą dotyczyły portów, dlatego proszę przejść do zakładki Ports znajdującej się obok zakładki Bus Interfaces. 18. Proszę rozwinąć wiersz axi_gpio_0, a w nim wiersz (IO_IF) gpio_0. Klikając prawy przyciskiem myszy na wiersz GPIO_IO proszę wybrać opcję No Connection, a następnie klikając prawym przyciskiem myszy na wiersz GPIO_IO_O proszę wybrać opcję Make External. Po dokonanych zmianach okno powinno wyglądać jak poniższe. 9
19. Proszę zwinąć wiersz axi_gpio_0, a rozwinąć processing_system7_0. Proszę odnaleźć wiersz FCLK_CLK0, a następnie klikając na niego prawym przyciskiem myszy proszę wybrać opcję Make External. Po zmianach okno powinno wyglądać jak poniżej. 10
20. Proszę zwinąć wiersz processing_system7_0, a rozwinąć wiersz External Ports. Klikając raz lewym przyciskiem myszy na wiersze axi_gpio_0_gpio_io_o_pin oraz processing_system7_0_fclk_clk0_pin proszę zmodyfikować ich nazwy na odpowiednio: PWM_DutyCycle, oraz PWM_Clk. Po zmianach okno powinno wyglądać jak poniżej. 11
21. Wybierając zakładkę Addresses znajdującą się obok Ports, proszę odnaleźć i zapisać Base Address dla dodanego przez nas modułu, czyli axi_gpio_0. 12
22. Wszystkie dokonane przez nas zmiany zostaną zapisane w momencie wyjścia z aplikacji XPS. Dokonujemy tego klikając na File -> Exit. 23. Po powrocie do aplikacji PlanAhead dodajemy kolejne źródła w sposób analogiczny do punktu 1.8. Tym razem wybieramy opcję Add or Create Design Sources. 24. Proszę kliknąć na przycisk Add Files... po czym zaznaczyć pliki PWM_Controller.vhd i zynq_module_stub.vhd znajdujące się w archiwum dostępnym na stronie zespołu. Proszę zwrócić uwagę czy jest zaznaczone pole Copy sources into project, a następnie nacisnąć Finish. 25. Proszę zgodnie z punktem 1.8 powtórnie dodać źródła, ale tym razem wybrać opcję Add or Create Constraints. 26. Proszę kliknąć na przycisk Add Files... po czym zaznaczyć plik system.ucf znajdujący się również w powyższym archiwum. Proszę zwrócić uwagę czy jest zaznaczone pole Copy constraints files into project, a następnie nacisnąć Finish. 27. Na podstawie tak zbudowanego projektu proszę wygenerować bitstream klikając na ikonę zaznaczoną na poniższym zrzucie ekanu. Przy okazji proszę sprawdzić, czy zawartość okna Sources jest taka sama jak poniżej. 13
W trakcie syntezy pojawią się ostrzeżenia, które należy zignorować. Po poprawnym wykonaniu operacji Bitgen proszę otworzyć zaimplementowany projekt wybierając poniżej zaznaczoną ikonę 28. Pozostało nam jedynie wyeksportować projekt (Hardware + Bitstream) do aplikacji SDK. Proszę wybrać File -> Export -> Export Hardware for SDK. W nowym oknie proszę pozostawić zaznaczone jedynie opcje Include bitstream oraz Export Hardware. Proszę zamknąć aplikację PlanAhead. 14
2. Stworzenie całego systemu PetaLinux od podstaw 1. Proszę otworzyć aplikację Oracle VM VirtualBox, a następnie nasz system Petalinux - Laboratory. 2. Proszę rozpocząć pracę od skopiowania wyeksportowanego projektu do wirtualnej maszyny (wybrana_ścieżka_dostępu/project_zynq_petalinux/project_zynq_petalinux.sdk/ SDK/SDK_Export/). Pod tą ścieżką dostępu znajduje się katalog hw, który należy umieścić w wirtualnej maszynie w utworzonym przez każdą grupę katalogu: $PETALINU- X/workspace_<nazwa_grupy>. Aby dokonać kopiowania z systemu HOST (Windows) do systemu GUEST (Linux) należy stworzyć folder, który będzie współdzielony przez oba systemy. W tym celu proszę w oknie wirtualnej maszyny wybrać Devices -> Shared Folders... W nowo otwartym oknie dodajemy folder o następującej ścieżce dostępu: (ścieżka_dostępu/project_zynq_petalinux/project_zynq_petalinux.sdk/sdk/sdk_export) Folder Name: SDK_Export Zaznaczamy opcję Auto-mount 15
Potwierdzając wszystko w wirtualnym systemie otwieramy terminal, a następnie wpisujemy: sudo mount -t vboxsf SDK_Export /home/student/temp Następnie kopiujemy zawartość katalogu /tmp do naszego workspace, czyli: cp -r /home/student/temp/* $PETALINUX/workspace_<nazwa_grupy>/ Kończymy po przez odmontowanie folderu sudo umount /home/student/temp 3. Proszę w terminalu wejść do katalogu $PETALINUX, a następnie uruchomić aplikację SDK z parametrem workspace jak poniżej: cd $PETALINUX xsdk -workspace workspace_<nazwa_> 4. Tworzenie całego projektu rozpoczynamy od zaimportowania stworzonego wcześniej projektu sprzętu. W aplikacji SDK wybieramy File -> New -> Xilinx Hardware Platform Specification -> 16
5. Następnie klikając na przycisk Browse proszę odnaleźć w skopiowanym folderze hw plik zynq_module_xml. Wszystko należy zakończyć przyciskiem Finish. 6. Kolejnym krokiem jest dodanie repozytoriów zawierających pliki źródłowe systemu Petalinux. Proszę wybrać z menu Xilinx Tools -> Repositories, a następnie po naciśnięciu New... proszę zaznaczyć katalog petalinux-v12.12-final-full/hardware/ edk_user_repository. Wszystko zatwierdzamy przyciskiem OK. 17
7. W następnym kroku dodajemy odpowiednie BSP. Wybierając z menu File -> New -> Xilinx Board Support Package proszę w nowym oknie zaznaczyć opcję petalinux, a następnie przycisnąć Finish. 18
8. W oknie Board Support Package Settings przechodzimy do wiersza petalinux, a następnie wykonujemy wypisane poniżej modyfikacje kolumny Value. Zmiany potwierdzamy przyciskiem OK. stdin: ps7_uart_1 stdout: ps7_uart_1 main_memory: ps7_ddr_0 flash_memory: ps7_qspi_0 periph_type_overrides: {phy ps7_ethernet_0 0 marvell,88e1510} gpio: axi_gpio_0 sdio: ps7_sd_0 ethernet: ps7_ethernet_0 19
9. Kolejną czynnością jest stworzenie aplikacji startowej FSBL, która ma za zadanie konfigurację FPGA i modyfikację ustawień jednostki PS. Proszę wybrać z menu File -> New -> Xilinx C Project, a następnie w oknie Select Project Template proszę odnaleźć i zaznaczyć Zynq FSBL. Pozostawiając zaznaczone opcje proszę kliknąć Next (Software Platform: Standalone), a następnie przy aktywnej opcji Create a new Board Support Package project proszę kliknąć Finish. 20
10. W następnym kroku stworzymy nową platformę PetaLinux z własną konfiguracją. Proszę kliknąć prawym przyciskiem na petalinux_bsp_0 a następnie wybrać Copy BSP to Peta- Linux. Jako nazwę Platform proszę wpisać ZedBoard_<nazwa_zespołu>. Aktualizację ustawień potwierdzamy przyciskiem YES. 11. Ostatnim krokiem przed pierwszym uruchomieniem jest zbudowanie całego systemu. Proszę z menu wybrać PetaLinux SDK -> Build All. 3. Pierwsze uruchomienie nowego systemu 1. Proszę na płycie ZedBoard (przy wyłączonym zasilaniu) ustawić konfigurację wgrywania systemu za pomocą interfejsu JTAG (wszystkie 5 (JP7 - JP11) zworek do GND, zwora JP6 otwarta). Następnie proszę podłączyć płytę do zasilania, oraz dwa połączenia USB z komputerem: UART i JTAG. 2. Zaczynamy od wgrania konfiguracji FPGA. Po włączeniu zasilania na płycie Zedboard proszę aktywować w wirtualnej maszynie urządzenie Digilent: Devices -> USB Devices -> Digilent USB Device 21
3. Następnie w aplikacji SDK uruchomionej na wirtualnym systemie proszę wybrać z menu Xilinx Tools -> Program FPGA. 4. W kolejnym oknie upewniamy się czy ścieżka dostępowa do pliku Bitstream jest prawidłowa, a następnie programujemy FPGA przyciskiem Program. Prawidłowe wgranie konfiguracji potwierdzi zapalona niebieska dioda na płycie ZedBoard. 5. Jako pierwszą aplikację uruchamiamy stworzony FSBL. Proszę nacisnąć prawym przyciskiem myszy na projekt zynq_fsbl_0, a następnie wybrać opcję Run as -> Run on Hardware. Na zakończenie wgrywania należy cierpliwie poczekać, ponieważ jego przerwanie może spowodować błąd aplikacji. Postęp możemy zaobserwować w okienku zaznaczonym zielonym kółkiem na zrzucie ekranu powyżej. 6. Przygotowujemy terminal do komunikacji z płytą ZedBoard przez UART. Na systemie HOST (Windows) uruchamiamy aplikację (np. Putty) i łączymy się z portem COM3 / 115200. 7. Teraz należy wgrać obraz systemu Linux (image.ub) wykorzystując jedną z poznanych na wcześniejszych zajęciach metod (TCP/IP lub karta SD). Na przykład po podłączeniu czytnika kart SD z włożoną kartą proszę w menu maszyny wirtualnej wybrać Devices -> USB Devices -> Czytnik kart SD W ten sposób zostanie on zamontowany w systemie. Aktualny plik image.ub znajduje się w folderze /tftpboot. Proszę pamiętać od odmontowaniu czytnika przed wyjęciem karty. 8. Proszę wrócić do systemu wirtualnego, aplikacji SDK, a przy jej pomocy proszę wgrać aktualny system U-Boot korzystając z menu PetaLinux SDK -> Boot JTAG (U-Boot). Po prawidłowym wgraniu systemu U-Boot na terminalu COM zobaczymy znajomą konsolę U- Boot-PetaLinux. Jeżeli wgrywanie nowego obrazu nie rozpocznie się automatycznie, proszę wpisać komendę boot. 9. Po uruchomieniu systemu proszę sprawdzić jego funkcjonowanie. 22
4. Stworzenie drivera dla kontrolera PWM (user space / mmap()) 1. W celu stworzenia nowej aplikacji działającej pod systemem PetaLinux proszę pod dotychczas używanym Workspace utworzyć nowy projekt File -> New -> Project... 2. W oknie wyboru rodzaju projektu proszę wybrać PetaLinux New Application, a następnie po naciśnięciu przycisku Next, nadać aplikacji nazwę gpio_pwm (język C) 3. Zawartość pliku gpio_pwm.c proszę podmienić z zawartością pliku o tej samej nazwie znajdującym się w archiwum zamieszczonym w materiałach dodatkowych. 23
4. Proszę otworzyć plik dts korzystając z menu PetaLinux SDK -> Open Platform Device Tree. W nowo otwartym pliku należy odnaleźć adres naszego modułu axi_gpio_0 (gpio@???????). Powinien być to ten sam adres, który został zapisany w poleceniu 1.21. 5. Zapisany adres proszę wpisać w odpowiednie miejsce do pliku gpio_pwm.c 6. Projekt proszę zbudować, a następnie uaktualnić. Dokonując kolejnych zmian tylko w naszej aplikacji wystarczy następująca procedura: PetaLinux SDK -> Build... -> Applications -> User 24
PetaLinux SDK -> Build... -> Root Filesystem PetaLinux SDK -> Build... -> System Images 7. Proszę powtórzyć polecenia 3.1 do 3.8 w celu wgrania nowego obrazu na płytę Zedboard. 8. Proszę sprawdzić działanie aplikacji / drivera wydając polecenie gpio_pwm z odpowiednim parametrem. 25