OpenWiFi是个不错的东西(除了许可选择比较激进外^@^),还是要十分感谢原作者开源这样一个项目让大家学习的。为了学习方便,我搞个最便宜的开发板AntSDR AD9363版本先测一下。本篇记录一下在Debian中的OpenWiFi开发环境搭建过程(作为CentOS的忠实用户,要全面转到Debian下了)。
本次用的服务器其实是我之前搭建TensorFlow的一个环境,使用的是debian-10.11.0版本。安装Debian10可以参考另一篇文章的配置Debian部分: Debian 10安装TensorFlow | OopsDump 。我看了下其他人的文章,有用Windows和Linux结合的,我感觉有点麻烦,就选择All in Linux了。反正Vivado和Matlab都有Linux版本,完全不影响使用。
安装必要的程序:
# apt-get install vim build-essential python3.7-dev python3-pip git
# apt-get install libncurses5-dev device-tree-compiler libssl-dev
在用户Home下创建一个工作目录:(以后工程都放在该目录下)
$ mkdir ~/workspace
$ cd ~/workspace
提示,命令中以#开始表示以root用户执行,以$开始表示以普通用户执行。
安装Vivado 2018.3
先安装个依赖:(不然安装会卡在结束位置)
# apt-get install libtinfo5
下载Xilinx Vivado 2018.3。然后解压文件:
$ tar zxvf Xilinx_Vivado_SDK_2018.3_1207_2324.tar.gz
然后,使用图形界面运行Vivado安装文件:
$ su -
# ./xsetup
如果图形界面无法显示,需要加入用户的x11认证到root:
# xauth add $(xauth -f ~<username>/.Xauthority list|tail -1)
# xauth list
# export DISPLAY=:<n为上面显示的最后一列的:后值>
# ./xsetup
在安装时,注意以下几个选项:
1. 在安装Edition选择时,HL Design和HL System都可以,因为涉及到WebPack License问题,所以我选了HL Design。
2. 支持芯片选能用到的就行,可以减少大小。
3. 安装位置,建议改为/opt/Xilinx。
安装之后,会弹出许可导入界面,我们使用XC7Z020用WebPack不需要许可,可以直接关闭。
然后试一下打开Vivado:
$ . /opt/Xilinx/SDK/2018.3/settings64.sh
$ vivado
****** Vivado v2018.3 (64-bit)
**** SW Build 2405991 on Thu Dec 6 23:36:41 MST 2018
**** IP Build 2404404 on Fri Dec 7 01:43:56 MST 2018
** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.
start_gui
打开DocNAV会遇到libpng12找不到的问题,可以手动下载并安装这个:
https://blog.lazy-evaluation.net/data/libpng12-0_1.2.50-2+deb8u3dzu1_amd64.deb
# dpkg -i libpng12-0_1.2.50-2+deb8u3dzu1_amd64.deb
# apt-get install libcanberra-gtk-module
将默认文本编辑器改为VSCode(关于VSCode的安装,参考上一篇Debian中安装环境的文章)。进入Vivado后,通过菜单Tools->Settings打开配置。在配置中,他选择“Text Editor”页面,在Current Editor中选择最后的“Custom Editor”,配置参数为:
code -g [file name]:[line number]
安装Jtag驱动程序:
# cd /opt/Xilinx/Vivado/2018.3/data/xicom/cable_drivers/lin64/install_script/install_drivers
# ./install_drivers
安装其他环境
提示:本章中的内容为非必要操作,可以选择有用的安装。
普通用户权限可使用USB串口
串口设备默认需要Root权限打开,为了方便使用USB转串口,更改默认权限:
# vi /etc/udev/rules.d/70-ttyusb.rules
(加入下面信息)
KERNEL=="ttyUSB[0-9]*", MODE="0666"
安装免费版本的ModelSim 10.6d
免费版ModelSim for Intel FPGA Starter Edition可以10000行的Verilog,验证一些小的模块够用了。由于ModelSim 10.6d为32位程序,需要安装一下必要的环境:(为了安装速度快,也可以下载32位的iso系统,并加入源列表)
# dpkg --add-architecture i386
# apt-get update
# apt-get install lib32z1 libx11-6:i386 libxext6:i386 libxft2:i386
在Intel FPGA的网站下载18.1版本的ModelSim(对应10.6d版本): Intel FPGAs 下载中心。
使用Root用户安装时,选择Starter版本,建议安装到/opt目录。(注意:Root用户安装前要先修改DISPLAY环境变量,参考之前Vivado安装)
安装完成后,进入modelsim安装目录下的 /opt/intelFPGA_pro/18.1/modelsim_ase/bin 运行./vsim 出现 Error: Cannot find ”./../linux_rh60/vsim”。需要修改 /opt/intelFPGA_pro/18.1/modelsim_ase/vco文件:
case $utype in
2.4.[7-9]*) vco="linux" ;;
2.4.[1-9][0-9]*) vco="linux" ;;
2.[5-9]*) vco="linux" ;;
2.[1-9][0-9]*) vco="linux" ;;
3.[0-9]*) vco="linux" ;;
*) vco="linux_rh60" ;;
中linux_rh60改为linux。
在一些应用调用时会出现错误,需要再创建一个软链:
# cd /opt/intelFPGA_pro/18.1/modelsim_ase
# ln -s linuxaloem/ linuxpe
联合仿真库编译:
以Root权限打开Vivado,菜单中选择Tools -> Compile Simulation Libraries…。按下面图片填入后,点Compile。
编译完成后,确认errors为0即可。
在菜单中选择Tools -> Settings…,再选择3rd Party Simulators页,填入下面信息:
对于工程,需要配置使用的仿真工具:
安装IVerilog
这里再安装一下Verilog开源工具环境:
# apt-get install iverilog gtkwave
获取代码
由于众所周知的原因,使用Git clone GitHUB的代码比较慢,可以搭个梯子,并配置socks5的代理:(改为你实际的代理端口,也可以手动更改~/.gitconfig文件)
$ git config --global http.proxy 'scoks5://127.0.0.1:1080'
$ git config --global https.proxy 'scoks5://127.0.0.1:1080'
创建目录~/workspace/openwifi,将openwifi的代码都放在此目录中。
$ mkdir ~/workspace/openwifi
使用Git clone出最新SW工程:git clone https://github.com/open-sdr/openwifi.git。
Clone完后, 进入目录再更新Linux的submodule:git submodule update –init –recursive。
再使用Git clone出最新HW工程:git clone https://github.com/open-sdr/openwifi-hw.git。
Clone完后,进入目录再更新ADI HDL和OpenOFDM的submodule:git submodule update –init –recursive。
下载ADI提供的镜像(后续OpenWiFi版本可能有变化,以OpenWiFi最新的Readme.md为准):https://swdownloads.analog.com/cse/2019_R1-2020_02_04.img.xz
$ cd ~/workspace/openwifi
$ git clone --recursive https://github.com/open-sdr/openwifi.git
$ git clone --recursive https://github.com/open-sdr/openwifi-hw.git
$ wget https://swdownloads.analog.com/cse/2019_R1-2020_02_04.img.xz
$ xz -d 2019_R1-2020_02_04.img.xz
$ cd openwifi/adi-linux
$ git pull origin 2019_R1:2019_R1
$ cd ../adi-linux-64
$ git pull origin 2019_R1:2019_R1
编译系统
先介绍一下Vivado安装后,和编译程序相关的环境。这里的环境没有使用PetaLinux,而是使用了原始的方式。
环境中,需要包含进必要的环境变量,可以使用:
$ source /opt/Xilinx/Vivado/2018.3/settings64.sh
使用OpenWiFi官方的方法更新系统
先准备一个不小于8G的SDCard,这里AntSDR用的是TF卡。
直接写入SDCard
先要卸载自动挂载的SDCard设备,这里使用的是(/dev/mmcblk0p1),可能与你的不同,替换为你系统中的设备(如果SDCard存在多个分区,需要分别)。然后,使用dd命令将img文件写入SDCard中。最后,使用sync命令进行同步后,方可拔出设备。
$ su -
# umount /dev/mmcblk0p1
# dd if=2019_R1-2020_02_04.img of=/dev/mmcblk0 bs=4194304
# sync
挂载img到系统
也可以将img文件直接挂载到系统中。先使用fdisk查看一下img的分区信息。
# fdisk -lu 2019_R1-2020_02_04.img
Disk 2019_R1-2020_02_04.img: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00096174
Device Boot Start End Sectors Size Id Type
2019_R1-2020_02_04.img1 8192 2105343 2097152 1G b W95 FAT32
2019_R1-2020_02_04.img2 2105344 15501311 13395968 6.4G 83 Linux
2019_R1-2020_02_04.img3 4096 6143 2048 1M a2 unknown
Partition table entries are not in disk order.
为了同时编辑不同分区文件,这里使用losetup将img分割为不同的loop文件。
# losetup -P -f --show 2019_R1-2020_02_04.img
# losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop1 0 0 1 0 /opt/debian_dvd/firmware-10.11.0-amd64-DVD-1.iso 0 512
/dev/loop4 0 0 0 0 /home/oopsdump/workspace/openwifi/2019_R1-2020_02_04.img 0 512
/dev/loop2 0 0 1 0 /opt/debian_dvd/debian-10.11.0-amd64-DVD-3.iso 0 512
/dev/loop0 0 0 1 0 /opt/debian_dvd/debian-10.11.0-amd64-DVD-2.iso 0 512
/dev/loop3 0 0 1 0 /opt/debian_dvd/debian-10.11.0-amd64-DVD-1.iso 0 512
# ls /dev/loop4*
/dev/loop4 /dev/loop4p1 /dev/loop4p2 /dev/loop4p3
将需要的分区进行挂载:
# mkdir -p /mnt/adimg/BOOT /mnt/adimg/rootfs
# mount /dev/loop4p1 /mnt/adimg/BOOT
# mount /dev/loop4p2 /mnt/adimg/rootfs
显示目录:
# ls /mnt/adimg/BOOT
README.txt zynq-zc702-adv7511-ad9361-fmcomms2-3
socfpga_arria10_socdk_ad9172_fmc zynq-zc702-adv7511-ad9361-fmcomms5
socfpga_arria10_socdk_adrv9009 zynq-zc702-adv7511-ad9364-fmcomms4
socfpga_arria10_socdk_adrv9371 zynq-zc706-adv7511
socfpga_arria10_socdk_daq2 zynq-zc706-adv7511-ad6676-fmc
socfpga_arria10_socdk_fmclidar1 zynq-zc706-adv7511-ad9172-fmc-ebz
socfpga_cyclone5_sockit_arradio zynq-zc706-adv7511-ad9265-fmc-125ebz
uEnv.txt zynq-zc706-adv7511-ad9361-fmcomms2-3
VERSION zynq-zc706-adv7511-ad9361-fmcomms5
zynq-adrv9361-z7035-bob zynq-zc706-adv7511-ad9361-fmcomms5-ext-lo-adf5355
zynq-adrv9361-z7035-bob-cmos zynq-zc706-adv7511-ad9364-fmcomms4
zynq-adrv9361-z7035-fmc zynq-zc706-adv7511-ad9434-fmc-500ebz
zynq-adrv9361-z7035-packrf zynq-zc706-adv7511-ad9625-fmcadc2
zynq-adrv9364-z7020-bob zynq-zc706-adv7511-ad9625-fmcadc3
zynq-adrv9364-z7020-bob-cmos zynq-zc706-adv7511-ad9739a-fmc
zynq-adrv9364-z7020-packrf zynq-zc706-adv7511-adrv9008-1
zynq-common zynq-zc706-adv7511-adrv9008-2
zynqmp-adrv9009-zu11eg-revb-adrv2crr-fmc-revb zynq-zc706-adv7511-adrv9009
zynqmp-common zynq-zc706-adv7511-adrv9371
zynqmp-zcu102-rev10-ad9172-fmc-ebz-mode4 zynq-zc706-adv7511-adrv9375
zynqmp-zcu102-rev10-ad9361-fmcomms2-3 zynq-zc706-adv7511-fmcdaq2
zynqmp-zcu102-rev10-ad9361-fmcomms5 zynq-zc706-adv7511-fmcdaq3-revC
zynqmp-zcu102-rev10-ad9364-fmcomms4 zynq-zc706-adv7511-fmcjesdadc1
zynqmp-zcu102-rev10-adrv9008-1 zynq-zc706-adv7511-fmclidar1
zynqmp-zcu102-rev10-adrv9008-2 zynq-zc706-adv7511-fmcomms11
zynqmp-zcu102-rev10-adrv9009 zynq-zed-adv7511
zynqmp-zcu102-rev10-adrv9371 zynq-zed-adv7511-ad9361-fmcomms2-3
zynqmp-zcu102-rev10-adrv9375 zynq-zed-adv7511-ad9364-fmcomms4
zynqmp-zcu102-rev10-fmcdaq2 zynq-zed-adv7511-ad9467-fmc-250ebz
zynqmp-zcu102-rev10-fmcdaq3 zynq-zed-adv7511-cn0363
zynqmp-zcu102-rev10-fmclidar1 zynq-zed-imageon
zynq-zc702-adv7511
# ls /mnt/adimg/rootfs
bin boot dev etc home lib lost+found media mnt opt proc root run sbin share srv sys tmp usr var
编译OpenWiFi文件
对于挂载SDCard的方式,改为实际目录。
使用OpenWiFi的Readme中提供的方法编译:
$ export SDCARD_DIR=/mnt/adimg/
$ export XILINX_DIR=/opt/Xilinx/
$ export OPENWIFI_HW_DIR=/home/oopsdump/workspace/openwifi/openwifi-hw/
$ export BOARD_NAME=antsdr
$ cd openwifi/user_space
$ ./update_sdcard.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME $SDCARD_DIR
更新的文件主要在:rootfs/lib/modules/,rootfs/root/openwifi/,BOOT/BOOT.BIN,BOOT/devicetree.dtb,BOOT/openwifi/
生成FPGA的bit
配置Vivado工程
【TODO】
获取Xilinx的IP评估使用许可
获取Xilinx Viterbi Decoder的Evaluation License:
【TODO】
本文参考了:
https://blog.lazy-evaluation.net/posts/linux/vivado-2018-3-buster.html
https://blog.csdn.net/long_fly/article/details/78643258