PULPino在zedboard上的下載、測試

CopperDong發表於2017-11-21

PULPino是一個開源的微型控制系統,基於一個32位RISC-V核心,由瑞士蘇黎世聯邦理工學院與義大利博洛尼亞大學聯合開發。核心IPC接近1,完全支援基整數指令集(RV32I),壓縮指令(RV32C)和部分支援乘法指令集擴充套件(RV32M)。在https://github.com/pulp-platform上有全部原始碼,包括:處理器、外設、匯流排、編譯器等,下面是我在zedboard上下載、測試PULPino的過程。試驗環境是Ubuntu14.04,64bit。


1、下載、編譯GCC編譯器

      PULPino中引入了一些擴充套件指令,所以需要修改原來RISC-V提供的編譯器,方法很簡單,首先

[objc] view plain copy
  1. git clone https://github.com/pulp-platform/ri5cy_gnu_toolchain.git  
     獲取puplino專用編譯器。然後開啟終端,進入所在目錄,輸入make,會自動聯網下載RISC-V的編譯器,並且加入puplino的補丁。編譯過程比較長,編譯完成後,修改bashrc(使用命令gedit ~/.bashrc),將編譯得到的GCC工具所在路徑新增到PATH,如下:
[objc] view plain copy
  1. export PATH=$PATH:/home/leisl/ri5cy_gnu_toolchain/install/bin  
     然後在終端中使用source ~/.bashrc,使得新的設定生效。此時在終端中輸入riscv32-unknown-elf-,然後按兩下tab鍵,就會出現所有的GCC工具。


2、安裝vivado 2015.1

      因為PULPino提供的工程是在vivado 2015.1中測試的,所以這裡也下載這個版本,避免出現莫名其妙的問題,下載、解壓後,輸入

[objc] view plain copy
  1. sudo /.xsetup  
     會出現圖形化的安裝介面,按照提示安裝即可,版本選擇vivado webpack,軟體包裡面要勾選Software DevelopKit,安裝目錄保持預設的/opt/Xilinx,安裝的時候可能會提示許可權不足,需要在opt下新建一個資料夾Xilinx即可,賦予所有人讀寫許可權。

     安裝完成後,從xilinx官網獲取licence,下載匯入。修改bashrc(使用命令gedit ~/.bashrc),將xilinx可執行檔案的路徑新增到PATH,如下:

[objc] view plain copy
  1. export LD_LIBRARY_PATH=/opt/Xilinx/Vivado/2015.1/lib/lnx64.o  
  2. export PATH=$PATH:/home/leisl/ri5cy_gnu_toolchain/install/bin:/opt/Xilinx/Vivado/2015.1/bin:/opt/Xilinx/SDK/2015.1/bin:/opt/Xilinx/SDK/2015.1/gnu/microblaze/lin/bin:/opt/Xilinx/SDK/2015.1/gnu/arm/lin/bin:/opt/Xilinx/SDK/2015.1/gnu/microblaze/linux_toolchain/lin64_be/bin:/opt/Xilinx/SDK/2015.1/gnu/microblaze/linux_toolchain/lin64_le/bin:/opt/Xilinx/DocNav  
  3. export XILINX_VIVADO=/opt/Xilinx/Vivado/2015.1  
     使用source ~/.bashrc使得設定生效。

     此時輸入vivado可以直接開啟vivado,但是會提示一些資料夾的許可權不足,按照提示修改即可。

3、需要PyYAML,使用 sudo python ./setup.py install 進行安裝即可。


4、下載pulpino原始碼

     在終端中輸入如下指令:

[objc] view plain copy
  1. git clone https://github.com/pulp-platform/pulpino.git  
     很快,大約13.11MB,進入所在目錄,執行./update-ips.py,這個命令會將各個IP的程式碼從github上clone到ipx目錄下。

5、編譯pulpino
      在編譯的最後需要用到gmake,所以在編譯前先建立一個gmake的軟連線,如下:

[objc] view plain copy
  1. cd /usr/bin  
  2. sudo ln -s make gmake       
      進入pulpino的fpga目錄,輸入make all,會自動編譯需要下載到FPGA的bit檔案、rootfs、devicetree、fbsl、uboot等,都會在pulpino/fpga/sw/sd_image目錄下出現。

      在編譯得到rootfile的時候可能需要給出交叉編譯工具(BR2_TOOLCHAIN_EXTERNAL_PATH)的路徑,輸入如下路徑即可

[objc] view plain copy
  1. /opt/Xilinx/SDK/2015.1/gnu/arm/lin  

6、製作zedboard啟動的SD卡

      需要將上面得到的bit檔案、rootfs、devicetree、fbsl、uboot等複製到SD卡中,在複製之前,需要格式化SD卡,將其分為兩個分割槽,一個boot分割槽,一個root分割槽,分割槽製作的方法在www.wiki.xilinx.com/Prepare+Boot+Medium中有詳述,按照其中的步驟一步步來即可。這裡也簡單提一下,不清楚的可以參考那篇文章。我是通過USB讀卡器讀寫SD卡的,插上讀卡器之後,使用命令

[objc] view plain copy
  1. dmesg  
     會在最後列出SD對應的碟符,我的是sdb,所以使用如下指令擦除第一個sector,將其中的X換為b,在後面不再強調這一點

[objc] view plain copy
  1. dd if=/dev/zero of=/dev/sdX bs=1024 count=1  
使用如下指令檢視SD卡的情況:

[text] view plain copy
  1. fdisk -l /dev/sdX  
輸出類似如下:

[objc] view plain copy
  1. Disk /dev/sdb: 8068 MB, 8068792320 bytes  
  2. 249 heads, 62 sectors/track, 1020 cylinders, total 15759360 sectors  
  3. Units = sectors of 11 * 512 = 512 bytes  
  4. Sector size (logical/physical): 512 bytes / 512 bytes  
  5. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  6. Disk identifier0x00000000  
  7.    
  8. Disk /dev/sdb doesn't contain a valid partition table  
使用上面結果第一行的SD卡總大小除以8225280,得到扇面數,也就是8068792320 / 8225280 = 980,這個值在下面會用到,接下來進行分割槽:

[objc] view plain copy
  1. fdisk /dev/sdX  
  2. Command (m for help): x  
  3. Expert command (m for help): h  
  4. Number of heads (1-256default 30): 255  
  5. Expert command (m for help): s  
  6. Number of sectors (1-63default 29): 63  
  7. Expert command (m for help): c  
  8. Number of cylinders (1-1048576default 2286): <剛剛計算得到的扇面數>  
  9. Command (m for help): r  
  10. Command (m for help): n  
  11. Partition type:  
  12.  p primary (0 primary, 0 extended, 4 free)  
  13.  e extended  
  14. Select (default p): p  
  15. Partition number (1-4default 1): 1  
  16. First sector (2048-15759359default 2048):  
  17. Using default value 2048  
  18. Last sector, +sectors or +size{K,M,G} (2048-15759359default 15759359): +200M  
  19.    
  20. Command (m for help): n  
  21. Partition type:  
  22.  p primary (1 primary, 0 extended, 3 free)  
  23.  e extended  
  24. Select (default p): p  
  25. Partition number (1-4default 2): 2  
  26. First sector (411648-15759359default 411648):  
  27. Using default value 411648  
  28. Last sector, +sectors or +size{K,M,G} (411648-15759359default 15759359):  
  29. Using default value 15759359  
  30. Command (m for help): a  
  31. Partition number (1-4): 1  
  32.    
  33. Command (m for help): t  
  34. Partition number (1-4): 1  
  35. Hex code (type L to list codes): c  
  36. Changed system type of partition 1 to c (W95 FAT32 (LBA))  
  37.    
  38. Command (m for help): t  
  39. Partition number (1-4): 2  
  40. Hex code (type L to list codes): 83  
  41. Command (m for help): p  
  42.    
  43. Disk /dev/sdb: 8068 MB, 8068792320 bytes  
  44. 249 heads, 62 sectors/track, 1020 cylinders, total 15759360 sectors  
  45. Units = sectors of 11 * 512 = 512 bytes  
  46. Sector size (logical/physical): 512 bytes / 512 bytes  
  47. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  48. Disk identifier0x920c958b  
  49.    
  50.  Device Boot Start End Blocks Id System  
  51. /dev/sdb1 * 2048 411647 204800 c W95 FAT32 (LBA)  
  52. /dev/sdb2 411648 15759359 7673856 83 Linux  
  53.    
  54. Command (m for help): w  
  55. The partition table has been altered!  
  56.    
  57. Calling ioctl() to re-read partition table.  
  58.    
  59. WARNING: If you have created or modified any DOS 6.x  
  60. partitions, please see the fdisk manual page for additional  
  61. information.  
  62. Syncing disks.  
     拔出SD卡,再插入計算機,此時在/dev目錄下應該出現了sdb1、sdb2,使用如下命令格式化這兩個分割槽:

[objc] view plain copy
  1. mkfs.vfat -F 32 -n boot /dev/sdb1  
  2. mkfs.ext4 -L root /dev/sdb2  
然後載入這兩個分割槽

[objc] view plain copy
  1. mkdir -p /mnt/boot  
  2. mount /dev/sdb1 /mnt/boot  
  3. <pre class="text">mkdir -p /mnt/root  
  4. mount /dev/sdb2 /mnt/root   


     將pulpino/fpga/sw/sd_image目錄下的BOOT.bin、uImage、devicetree.dtb三個檔案複製到/mnt/boot,也就是SD的Boot分割槽,將rootfs.tar解壓縮到/mnt/root,也就是root分割槽,解壓指令如下:

[objc] view plain copy
  1. cd /mnt/root  
  2. tar -xvf /home/leisl/pulpino/fpga/sw/sd_image/rootfs.tar  
    SD卡就製作完成了。


7、安裝minicom,這是一個linux下使用的串列埠工具,使用如下命令即可安裝:

[objc] view plain copy
  1. sudo apt-get install minicom  

8、將zedboard接電源,並且將J14 UART口接計算機,網口接到hub,要求有DHCP功能,家用的無線路由器都有這個功能。波動開關,加電。


9、此時在終端中使用ls /dev可以發現又一個新裝置ttyACM0,這個對應的就是zedboard,開啟minicom,如下:

[objc] view plain copy
  1. sudo minicom -s  
      然後配置串列埠為/dev/ttyACM0,如下:

      

      其餘保持不變,返回後,點選回車,即可連上,如下:

      

     輸入reset,重新啟動zedboard。登入時使用者名稱是root,沒有密碼。


10、設定zedboard的SSH

      在zedboard上新建一個使用者,與主機的使用者名稱相同,我這裡就是leisl,

[objc] view plain copy
  1. adduser leisl  
        修改zedboard上的/etc/shadow,原來的一行如下:


改為如下:

[objc] view plain copy
  1. leisl:1H9sF86SwXPkk:15695:5:99999:7:5:20000:   
    此時就可以正常使用ssh訪問zedboard了,也可以使用scp傳遞檔案了。


11、進入pulpino/fpga/sw/apps/spiload,輸入make,得到spiload,上傳到zedboard

[objc] view plain copy
  1. scp spiload leisl@192.168.2.104:/home/leisl/  

12、編譯應用程式

      首先安裝cmake、libswitch-perl

[objc] view plain copy
  1. sudo apt-get install cmake  
  2. sudo apt-get install libswitch-perl  
       在pulpino目錄下新建一個資料夾build,將pulpino/sw目錄下的cmake_configure.riscv.gcc.sh複製到build資料夾下,修改如下兩項:
[objc] view plain copy
  1. # if you want to have compressed instructions, set this to 1  
  2. RVC=1,改為1  
  3. PULP_GIT_DIRECTORY=../   按照實際修改即可  
       執行這個配置檔案。接下來可以編譯應用程式,在build目錄下,輸入make led_demo,將pulpino/build/apps/fpga/led_demo/slm_files目錄下的spi_stim.txt上傳到開發板,如下:
[objc] view plain copy
  1. scp spi_stim.txt leisl@192.168.2.101:/home/leisl  
       然後在ssh或者minicom中執行./spiload ./spi_stim.txt,可以發現亮了7個紅色LED燈。但是實際上這個程式要豐富的多,LED燈應該是類似於跑馬燈那樣點亮的,而不是一下子點亮,需要修改pulpino/sw/apps/fpga/led_demo目錄下的main.c,將其中waste_time函式中的迴圈次數變大,改為1000000,重新到build目錄下編譯,然後上傳,執行,可以發現跑馬燈的效果。


13、編譯應用程式helloworld

       首先需要修改一下helloworld,具體原因不知道,但是如果不做這個修改,不會顯示helloworld,修改pulpino/sw/apps/helloworld目錄下的main.c檔案,如下:

[objc] view plain copy
  1. #include <stdio.h>  
  2. void waste_time() {  
  3.   int i;  
  4.   for(i = 0; i < 1000000; i++) asm volatile("nop");  
  5. }  
  6.   
  7. int main()  
  8. {  
  9.   waste_time();                 // 新增了一個waste_time函式  
  10.   printf("Hello World!!!!!\n");  
  11.   
  12.   return 0;  
  13. }  
然後進入build目錄,輸入make helloworld,將pulpino/build/apps/helloworld/slm_files目錄下的spi_stim.txt上傳到開發板,具體步驟參考上面的,然後再minicom中執行,

[objc] view plain copy
  1. ./spiload -t5 ./helloworld  
有個地方需要注意,spiload要加上引數-t,表示在這幾秒之內pulpino通過UART輸出的資訊都顯示在螢幕上,就可以發現helloworld了。


其餘的試驗還沒有做,有興趣的朋友可以試試,到時告訴我測試步驟、測試結果啊。


相關文章