xref: /openwifi/README.md (revision 0e94d49d869cbcc8794ca8ab0652f1ece61f31fc)
1a6085186SLina Ceballos<!--
23b4065baSJiao XianjunAuthor: Xianjun jiao, Michael Mehari, Wei Liu
3f1d0fee3SJiao XianjunSPDX-FileCopyrightText: 2019 UGent
4a6085186SLina CeballosSPDX-License-Identifier: AGPL-3.0-or-later
5a6085186SLina Ceballos-->
6a6085186SLina Ceballos
70df4ca4dSimoerman# openwifi
82ee67178SXianjun Jiao<img src="./openwifi-arch.jpg" width="900">
92ee67178SXianjun Jiao
1038f76c01SJiao Xianjun**openwifi:** Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio).
112ee67178SXianjun Jiao
12f4c9b072SXianjun JiaoThis repository includes Linux driver and software. **openwifi-hw** repository has the FPGA design. It is **YOUR RESPONSIBILITY** to follow your **LOCAL SPECTRUM REGULATION** or use **CABLE** to avoid potential interference over the air.
13525f977bSJiao Xianjun
14a2ffb301SXianjun Jiao[[Quick start](#Quick-start)]
15a2ffb301SXianjun Jiao[[Project document](doc/README.md)]
16a2ffb301SXianjun Jiao[[Application notes](doc/app_notes/README.md)]
17dc7c18bfSJiao Xianjun[[Videos](doc/videos.md)]
184046c688SJiao Xianjun[[Publications and How to Cite](doc/publications.md)]
19a2ffb301SXianjun Jiao[[maillist](https://lists.ugent.be/wws/subscribe/openwifi)]
202ee67178SXianjun Jiao
211ee5906aSJiao XianjunOpenwifi code has dual licenses. [AGPLv3](https://github.com/open-sdr/openwifi/blob/master/LICENSE) is the opensource license. For non-opensource and advanced feature license, please contact [email protected]. Openwifi project also leverages some 3rd party modules. It is user's duty to check and follow licenses of those modules according to the purpose/usage. You can find [an example explanation from Analog Devices](https://github.com/analogdevicesinc/hdl/blob/master/LICENSE) for this compound license conditions. [[How to contribute]](https://github.com/open-sdr/openwifi/blob/master/CONTRIBUTING.md).
222ee67178SXianjun Jiao
232ee67178SXianjun Jiao**Features:**
242ee67178SXianjun Jiao
2594c4a85fSJiao Xianjun- 802.11a/g/n [[IEEE 802.11n (Wi-Fi 4)](doc/app_notes/ieee80211n.md)]
2681493bdcSJiao Xianjun- 20MHz bandwidth; [70 MHz to 6 GHz frequency range](doc/README.md#let-openwifi-work-at-arbitrary-frequency)
2781493bdcSJiao Xianjun- Mode tested: [Ad-hoc](doc/app_notes/ad-hoc-two-sdr.md); [Station; AP](doc/app_notes/ap-client-two-sdr.md), Monitor
2881493bdcSJiao Xianjun- [DCF (CSMA/CA) low MAC layer in FPGA (10us SIFS is achieved)](doc/app_notes/frequent_trick.md)
29a2ffb301SXianjun Jiao- [802.11 packet injection and fuzzing](doc/app_notes/inject_80211.md)
30d14d06e5SXianjun Jiao- [CSI](doc/app_notes/csi.md): Channel State Information, freq offset, equalizer to computer
31b49db4c5SXianjun Jiao- [CSI fuzzer](doc/app_notes/csi_fuzzer.md): Create artificial channel response in WiFi transmitter
32a816a273SJiao Xianjun- [CSI radar](doc/app_notes/radar-self-csi.md): Moving detection. Joint radar and communication
33d14d06e5SXianjun Jiao- [[IQ capture](doc/app_notes/iq.md)]: real-time AGC, RSSI, IQ sample to computer. [[Dual antenna version](doc/app_notes/iq_2ant.md)]
3481493bdcSJiao Xianjun- [Configurable channel access priority parameters](doc/app_notes/frequent_trick.md):
3581493bdcSJiao Xianjun  - CCA threshold, receiver sensitivity, etc
36b73660adSXianjun Jiao  - duration of RTS/CTS, CTS-to-self
37b73660adSXianjun Jiao  - SIFS/DIFS/xIFS/slot-time/CW/etc
3881493bdcSJiao Xianjun- [Time slicing based on MAC address (time gated/scheduled FPGA queues)](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html#sdr-tx-time-slicing)
3981493bdcSJiao Xianjun- Easy to change bandwidth and [frequency](doc/README.md#let-openwifi-work-at-arbitrary-frequency):
40b73660adSXianjun Jiao  - 2MHz for 802.11ah in sub-GHz
41b73660adSXianjun Jiao  - 10MHz for 802.11p/vehicle in 5.9GHz
42a2ffb301SXianjun Jiao- **802.11ax** under development
432ee67178SXianjun Jiao
44e91d8a29SJiao Xianjun**Performance (best case: aggregation/AMPDU on):**
45e91d8a29SJiao Xianjun- iperf: TCP 40~50Mbps; UDP 50Mbps
46b9b3abd3SJiao Xianjun- EVM -38dB; MCS0 sensitivity -87dBm; MCS7 -72dBm. (FMCOMMS2 2.4GHz; cable and OTA test)
472ee67178SXianjun Jiao
48b73660adSXianjun Jiao**Supported SDR platforms:** (Check [Porting guide](#Porting-guide) for your new board if it isn't in the list)
492ee67178SXianjun Jiao
50a2ffb301SXianjun Jiaoboard_name|board combination|status|SD card img|Vivado license
51a2ffb301SXianjun Jiao-------|-------|----|----|-----
52*0e94d49dSXianjun Jiaozc706_fmcs2|[Xilinx ZC706 board](https://www.xilinx.com/products/boards-and-kits/ek-z7-zc706-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-1-32bit.img.xz)|Need
53*0e94d49dSXianjun Jiaozed_fmcs2|[Xilinx zed board](https://www.xilinx.com/products/boards-and-kits/1-8dyf-11.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-1-32bit.img.xz)|**NO** need
54*0e94d49dSXianjun Jiaoadrv9364z7020|[ADRV9364-Z7020 + ADRV1CRR-BOB](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/adrv9364-z7020.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-1-32bit.img.xz)|**NO** need
55*0e94d49dSXianjun Jiaoadrv9361z7035|[ADRV9361-Z7035 + ADRV1CRR-BOB/FMC](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/ADRV9361-Z7035.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-1-32bit.img.xz)|Need
56*0e94d49dSXianjun Jiaozc702_fmcs2|[Xilinx ZC702 board](https://www.xilinx.com/products/boards-and-kits/ek-z7-zc702-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-1-32bit.img.xz)|**NO** need
57*0e94d49dSXianjun Jiaoantsdr|[MicroPhase](https://github.com/MicroPhase/) enhanced ADALM-PLUTO [Notes](kernel_boot/boards/antsdr/notes.md)|Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-1-32bit.img.xz)|**NO** need
58*0e94d49dSXianjun Jiaosdrpi|[HexSDR](https://github.com/HexSDR/) |Done|[32bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-1-32bit.img.xz)|**NO** need
59cff2d60eSJiao Xianjunzcu102_fmcs2|[Xilinx ZCU102 board](https://www.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Done|[64bit img](https://users.ugent.be/~xjiao/openwifi-1.3.1-wilsele-64bit.img.xz)|Need
60f65d9fc8SJiao Xianjunzcu102_9371|[Xilinx ZCU102 board](https://www.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html) + [ADRV9371](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-adrv9371.html)|Future|Future|Need
619e696164SXianjun Jiao
62b73660adSXianjun Jiao- board_name is used to identify FPGA design in openwifi-hw/boards/
63b73660adSXianjun Jiao- Don't have any boards? Or you like JTAG boot instead of SD card? Check our test bed [w-iLab.t](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html) tutorial.
642ee67178SXianjun Jiao
65b73660adSXianjun Jiao[[Quick start](#Quick-start)]
66b73660adSXianjun Jiao[[Basic operations](#Basic-operations)]
67b73660adSXianjun Jiao[[Update FPGA](#Update-FPGA)]
68b73660adSXianjun Jiao[[Update Driver](#Update-Driver)]
69b73660adSXianjun Jiao[[Update sdrctl](#Update-sdrctl)]
70b73660adSXianjun Jiao[[Easy Access and etc](#Easy-Access-and-etc)]
712ee67178SXianjun Jiao
72b73660adSXianjun Jiao[[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)]
73b73660adSXianjun Jiao[[Special note for 11b](#Special-note-for-11b)]
74b73660adSXianjun Jiao[[Porting guide](#Porting-guide)]
75d9e94a69SJiao Xianjun[[Project document](doc/README.md)]
7675890522SJiao Xianjun[[Application notes](doc/app_notes/README.md)]
772ee67178SXianjun Jiao
78b73660adSXianjun Jiao## Quick start
791f288d27SJiao Xianjun- Restore openwifi board specific img file (from the table) into a SD card. To do this, program "Disks" in Ubuntu can be used (Install: "sudo apt install gnome-disk-utility"). After restoring, the SD card should have two partitions: BOOT and rootfs. You need to config the **correct files in the BOOT partition** according to the **board you have** by operation on your computer:
80b1dd94e3Sluz paz  - Copy files in **openwifi/board_name** to the base directory of BOOT partition.
81b1dd94e3Sluz paz  - Copy **openwifi/zynqmp-common/Image** (zcu102 board) or **openwifi/zynq-common/uImage** (other boards) to the base directory of BOOT partition
829d56afc0SJiao Xianjun- Connect two antennas to RXA/TXA ports. Config the board to SD card boot mode (check the board manual). Insert the SD card to the board. Power on.
839d56afc0SJiao Xianjun- Login to the board from your PC (PC Ethernet should have IP 192.168.10.1) with password **openwifi**.
842ee67178SXianjun Jiao  ```
852ee67178SXianjun Jiao  ssh [email protected]
862ee67178SXianjun Jiao  ```
8740773b78SXianjun Jiao- Then, run openwifi AP and the on board webserver
889d56afc0SJiao Xianjun  ```
8940773b78SXianjun Jiao  cd openwifi
9040773b78SXianjun Jiao  ./wgd.sh
9140773b78SXianjun Jiao  ./fosdem.sh
9240773b78SXianjun Jiao  (Use "./wgd.sh 1" to enable experimental AMPDU aggregation on top of 11n)
93f4c9b072SXianjun Jiao  (Use "./fosdem-11ag.sh" to force 11a/g mode)
949d56afc0SJiao Xianjun  ```
950fae09a8SJiao Xianjun  **NOTE** adrv9361z7035 has ultra low TX power in 5GHz. Move **CLOSER** when you use that board in 5GHz!!!
96b1dd94e3Sluz paz- After you see the "openwifi" SSID on your device (Phone/Laptop/etc), connect it. Browser to 192.168.13.1 on your device, you should see the webpage hosted by the webserver on board.
979d56afc0SJiao Xianjun  - Note 1: If your device doesn't support 5GHz (ch44), please change the **hostapd-openwifi.conf** on board and re-run fosdem.sh.
989d56afc0SJiao Xianjun  - Note 2: After ~2 hours, the Viterbi decoder will halt (Xilinx Evaluation License). Just power cycle the board if it happens. (If output of "./sdrctl dev sdr0 get reg rx 20" is always the same, it means the decoder halts)
990a9ca3b0SDaniel Bovensiepen Li- To give the Wi-Fi client internet access, configure routing/NAT **on the PC**:
100b73660adSXianjun Jiao  ```
101b73660adSXianjun Jiao  sudo sysctl -w net.ipv4.ip_forward=1
102a2ffb301SXianjun Jiao  sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE
1032ee67178SXianjun Jiao  sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
104b73660adSXianjun Jiao  ```
105a2ffb301SXianjun Jiao  **ethX** is the PC NIC name connecting the board ethernet. **NICY** is the PC NIC name connecting internet (WiFi or another ethernet).
1062ee67178SXianjun Jiao
107b73660adSXianjun Jiao  If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC.
10822dd0cc4SXianjun Jiao- To monitor **real-time CSI (Chip State Information)**, such as timestamp, frequency offset, channel state, equalizer, please refer to [[CSI notes](doc/app_notes/csi.md)].
109b73660adSXianjun Jiao
110b73660adSXianjun Jiao## Basic operations
111b73660adSXianjun JiaoThe board actually is an Linux/Ubuntu computer which is running **hostapd** to offer Wi-Fi AP functionality over the Wi-Fi Network Interface (NIC). The NIC is implemented by openwifi-hw FPGA design. We use the term **"On board"** to indicate that the commands should be executed after ssh login to the board. **"On PC"** means the commands should run on PC.
112b73660adSXianjun Jiao- Bring up the openwifi NIC sdr0:
113b73660adSXianjun Jiao  ```
114b73660adSXianjun Jiao  cd ~/openwifi && ./wgd.sh
115f4c9b072SXianjun Jiao  (Use "./wgd.sh 1" to enable experimental AMPDU aggregation)
116b73660adSXianjun Jiao  ```
117b73660adSXianjun Jiao- Use openwifi as client to connect other AP (Change wpa-connect.conf on board firstly):
118b73660adSXianjun Jiao  ```
1192ee67178SXianjun Jiao  route del default gw 192.168.10.1
120b73660adSXianjun Jiao  wpa_supplicant -i sdr0 -c wpa-connect.conf &
1212ee67178SXianjun Jiao  dhclient sdr0
1222ee67178SXianjun Jiao  ```
12370cedb22SXianjun Jiao- Use openwifi in ad-hoc mode: Please check **sdr-ad-hoc-up.sh**, **sdr-ad-hoc-join.sh** and [this app note](./doc/app_notes/ad-hoc-two-sdr.md).
12470cedb22SXianjun Jiao- Use openwifi in monitor mode: Please check **monitor_ch.sh** and [this app note](./doc/app_notes/inject_80211.md).
125b73660adSXianjun Jiao- The Linux native Wi-Fi tools/Apps (iwconfig/ifconfig/iwlist/iw/hostapd/wpa_supplicant/etc) can run over openwifi NIC in the same way as commercial Wi-Fi chip.
12670cedb22SXianjun Jiao- **sdrctl** is a dedicated tool to access openwifi driver/FPGA, please check [project document](./doc/README.md) for more information.
127b73660adSXianjun Jiao
128b73660adSXianjun Jiao## Update FPGA
129b73660adSXianjun Jiao
13070cedb22SXianjun Jiao(Check [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md) for more convenient way of updating FPGA and driver files)
13170cedb22SXianjun Jiao
13270cedb22SXianjun JiaoSince the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to always copy the latest files in the [user_space](./user_space) directory on to the board. Then update the fpga bitstream and driver (see next section) on to the board.
133b73660adSXianjun Jiao
13420dd8379SJiao Xianjun- Install Vivado/SDK 2018.3 (Vivado Design Suite - HLx Editions - 2018.3 Full Product Installation. If you don't need to generate new FPGA bitstream, WebPack version without license is enough)
135b73660adSXianjun Jiao- Setup environment variables (use absolute path):
1362ee67178SXianjun Jiao  ```
13720dd8379SJiao Xianjun  export XILINX_DIR=your_Xilinx_install_directory
13820dd8379SJiao Xianjun  (Example: export XILINX_DIR=/opt/Xilinx. The Xilinx directory should include sth like: Downloads, SDK, Vivado, xic)
139abdb610fSJiao Xianjun  export OPENWIFI_HW_DIR=your_openwifi-hw_directory
14020dd8379SJiao Xianjun  (The directory where you store the open-sdr/openwifi-hw repo via git clone)
141b73660adSXianjun Jiao  export BOARD_NAME=your_board_name
1422ee67178SXianjun Jiao  ```
143abdb610fSJiao Xianjun- Pick the FPGA bitstream from openwifi-hw, and generate BOOT.BIN and transfer it on board via ssh channel:
1442ee67178SXianjun Jiao  ```
145febc5adfSXianjun Jiao  For Zynq 7000:
146abdb610fSJiao Xianjun
147abdb610fSJiao Xianjun  cd openwifi/user_space; ./boot_bin_gen.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME
148febc5adfSXianjun Jiao
149febc5adfSXianjun Jiao  For Zynq MPSoC (like zcu102 board):
150abdb610fSJiao Xianjun  cd openwifi/user_space; ./boot_bin_gen_zynqmp.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME
151febc5adfSXianjun Jiao
152abdb610fSJiao Xianjun  cd openwifi/kernel_boot/boards/$BOARD_NAME/output_boot_bin; scp ./BOOT.BIN [email protected]:
1532ee67178SXianjun Jiao  ```
154b73660adSXianjun Jiao- On board: Put the BOOT.BIN into the BOOT partition.
1552ee67178SXianjun Jiao  ```
156b73660adSXianjun Jiao  mount /dev/mmcblk0p1 /mnt
157b73660adSXianjun Jiao  cp ~/BOOT.BIN /mnt
158f4c9b072SXianjun Jiao  cd /mnt
159f4c9b072SXianjun Jiao  sync
160f4c9b072SXianjun Jiao  cd ~
161b73660adSXianjun Jiao  umount /mnt
16289e3e0fbSXianjun Jiao  ```
163b73660adSXianjun Jiao  **Power cycle** the board to load new FPGA bitstream.
1642ee67178SXianjun Jiao
16540773b78SXianjun Jiao  To load FPGA dynamically without rebooting/power-cycle, check [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md).
16640773b78SXianjun Jiao
167b73660adSXianjun Jiao## Update Driver
1682ee67178SXianjun Jiao
16970cedb22SXianjun Jiao(Check [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md) for more convenient way of updating FPGA and driver files)
17070cedb22SXianjun Jiao
17170cedb22SXianjun JiaoSince the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to always copy the latest files in the [user_space](./user_space) directory on to the board. Then update the fpga bitstream (see previous section) and driver on to the board.
17270cedb22SXianjun Jiao
173b73660adSXianjun Jiao- Prepare Analog Devices Linux kernel source code (only need to run once):
1742ee67178SXianjun Jiao  ```
175abdb610fSJiao Xianjun  cd openwifi/user_space; ./prepare_kernel.sh $XILINX_DIR ARCH_BIT build
176febc5adfSXianjun Jiao  (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
1772ee67178SXianjun Jiao  ```
178f773d8deSJiao Xianjun  **Note**: In Ubuntu, gcc-10 might have issue ('yylloc' error), so use gcc-9 if you encounter error.
179b73660adSXianjun Jiao- Compile the latest openwifi driver
1802ee67178SXianjun Jiao  ```
181abdb610fSJiao Xianjun  cd openwifi/driver; ./make_all.sh $XILINX_DIR ARCH_BIT
182febc5adfSXianjun Jiao  (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
183bca2c023SJiao Xianjun  (More arguments (max 5) beyond above two will be converted to "#define argument" in pre_def.h for conditional compiling)
1842ee67178SXianjun Jiao  ```
185b73660adSXianjun Jiao- Copy the driver files to the board via ssh channel
1862ee67178SXianjun Jiao  ```
187abdb610fSJiao Xianjun  cd openwifi/driver; scp `find ./ -name \*.ko` [email protected]:openwifi/
188b73660adSXianjun Jiao  ```
18940773b78SXianjun Jiao  Now you can use **wgd.sh** on board to load the new openwifi driver. **wgd.sh** also tries to reload FPGA img if system_top.bit.bin presents in the same directory.
19040773b78SXianjun Jiao  Find more information in [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md).
19140773b78SXianjun Jiao
19219bec082SJiao Xianjun  **Note**: If you have symbol or version error while loadng the driver, it could be because the kernel in the SD card image is too old. In this case, you need to follow [[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)] to generate your new SD card image.
1939e8d5e4aSJiao Xianjun
194b73660adSXianjun Jiao## Update sdrctl
195b73660adSXianjun Jiao- Copy the sdrctl source files to the board via ssh channel
196b73660adSXianjun Jiao  ```
197abdb610fSJiao Xianjun  cd openwifi/user_space/sdrctl_src; scp `find ./ -name \*` [email protected]:openwifi/sdrctl_src/
198b73660adSXianjun Jiao  ```
199b73660adSXianjun Jiao- Compile the sdrctl **on board**:
200b73660adSXianjun Jiao  ```
201b73660adSXianjun Jiao  cd ~/openwifi/sdrctl_src/ && make && cp sdrctl ../ && cd ..
202b73660adSXianjun Jiao  ```
203b73660adSXianjun Jiao## Easy Access and etc
2049e8d5e4aSJiao Xianjun
20570cedb22SXianjun Jiao- Check [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md) for more convenient way of updating FPGA and driver files.
206b73660adSXianjun Jiao- FPGA and driver on board update scripts
207981758c0SXianjun Jiao  - Setup [ftp server](https://ubuntu.com/server/docs/service-ftp) on PC, allow anonymous and change ftp root directory to the openwifi directory.
208b73660adSXianjun Jiao  - On board:
209b73660adSXianjun Jiao  ```
210b73660adSXianjun Jiao  ./sdcard_boot_update.sh $BOARD_NAME
2119e8d5e4aSJiao Xianjun  (Above command downloads uImage, BOOT.BIN and devicetree.dtb, then copy them into boot partition. Remember to power cycle)
2129e8d5e4aSJiao Xianjun  ./wgd.sh remote
2139e8d5e4aSJiao Xianjun  (Above command downloads driver files, and brings up sdr0)
214b73660adSXianjun Jiao  ```
215b73660adSXianjun Jiao- Access the board disk/rootfs like a disk:
216b73660adSXianjun Jiao   - On PC: "File manager --> Connect to Server...", input: sftp://[email protected]/root
217b73660adSXianjun Jiao   - Input password "openwifi"
2189e8d5e4aSJiao Xianjun
219b73660adSXianjun Jiao## Build openwifi Linux img from scratch
220f4c9b072SXianjun Jiao- Install the devicetree compiler -- dtc. (For Ubuntu: sudo apt install device-tree-compiler)
221f4c9b072SXianjun Jiao- Install the mkimage tool. (For Ubuntu: sudo apt install u-boot-tools)
222f4c9b072SXianjun Jiao- Download [2019_R1-2020_06_22.img.xz](http://swdownloads.analog.com/cse/2019_R1-2020_06_22.img.xz) from [Analog Devices Wiki](https://wiki.analog.com/resources/tools-software/linux-software/zynq_images). Burn it to a SD card.
223b73660adSXianjun Jiao- Insert the SD card to your Linux PC. Find out the mount point (that has two sub directories BOOT and rootfs), and setup environment variables (use absolute path):
2242ee67178SXianjun Jiao  ```
225b73660adSXianjun Jiao  export SDCARD_DIR=sdcard_mount_point
22620dd8379SJiao Xianjun  export XILINX_DIR=your_Xilinx_install_directory
227abdb610fSJiao Xianjun  export OPENWIFI_HW_DIR=your_openwifi-hw_directory
228b73660adSXianjun Jiao  export BOARD_NAME=your_board_name
229b73660adSXianjun Jiao  ```
230b73660adSXianjun Jiao- Run script to update SD card:
231b73660adSXianjun Jiao  ```
232abdb610fSJiao Xianjun  cd openwifi/user_space; ./update_sdcard.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME $SDCARD_DIR
233b73660adSXianjun Jiao  ```
2349d56afc0SJiao Xianjun- Config your board to SD card boot mode (check the board manual). Insert the SD card to the board. Power on.
2359d56afc0SJiao Xianjun- Login to the board from your PC (PC Ethernet should have IP 192.168.10.1) with one time password **analog**.
2369d56afc0SJiao Xianjun  ```
2379d56afc0SJiao Xianjun  ssh [email protected]
2389d56afc0SJiao Xianjun  ```
2399d56afc0SJiao Xianjun- Setup routing/NAT **on the PC** for your board -- this internet connection is **important** for post installation/config.
2409d56afc0SJiao Xianjun  ```
2419d56afc0SJiao Xianjun  sudo sysctl -w net.ipv4.ip_forward=1
242a2ffb301SXianjun Jiao  sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE
2439d56afc0SJiao Xianjun  sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
2449d56afc0SJiao Xianjun  ```
245a2ffb301SXianjun Jiao  **ethX** is the PC NIC name connecting the board ethernet. **NICY** is the PC NIC name connecting internet (WiFi or another ethernet).
2469d56afc0SJiao Xianjun
2479d56afc0SJiao Xianjun  If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC.
248fe92f915SJiao Xianjun- Test the connectivity. Run on board (in the ssh session):
249fe92f915SJiao Xianjun  ```
250fe92f915SJiao Xianjun  route add default gw 192.168.10.1
251fe92f915SJiao Xianjun  ping IP_YOU_KNOW_ON_YOUR_NETWORK
252fe92f915SJiao Xianjun  ```
253fe92f915SJiao Xianjun  If there is issue with the connectivity (ping can not reach the target), it needs to be solved before going to the next step.
2549d56afc0SJiao Xianjun- Run **one time** script on board to complete post installation/config (After this, password becomes **openwifi**)
2559d56afc0SJiao Xianjun  ```
2569d56afc0SJiao Xianjun  cd ~/openwifi && ./post_config.sh
2579d56afc0SJiao Xianjun  ```
2589d56afc0SJiao Xianjun- Now you can start from [Quick start](#Quick-start) (Skip the image download and burn step)
2592ee67178SXianjun Jiao
260b73660adSXianjun Jiao## Special note for 11b
261e17fdc17Smmehari
262e17fdc17SmmehariOpenwifi only applies OFDM as its modulation scheme and as a result, it is not backward compatible with 802.11b clients or modes of operation. This is usually the case during beacon transmission, connection establishment, and robust communication.
263e17fdc17Smmehari
264e17fdc17SmmehariAs a solution to this problem, openwifi can be fully controlled only if communicating with APs/clients instantiated using hostapd/wpa_supplicant userspace programs respectively.
265e17fdc17Smmehari
266e17fdc17SmmehariFor hostapd program, 802.11b rates can be suppressed using configuration commands (i.e. supported_rates, basic_rates) and an example configuration file is provided (i.e. hostapd-openwifi.conf). One small caveat to this one comes from fullMAC Wi-Fi cards as they must implement the *NL80211_TXRATE_LEGACY* NetLink handler at the device driver level.
267e17fdc17Smmehari
268e17fdc17SmmehariOn the other hand, the wpa_supplicant program on the client side (commercial Wi-Fi dongle/board) cannot suppress 802.11b rates out of the box in 2.4GHz band, so there will be an issue when connecting openwifi (OFDM only). A patched wpa_supplicant should be used at the client side.
269e17fdc17Smmehari```
270b1633ad3SJiao Xianjunsudo apt-get install libssl1.0-dev
271abdb610fSJiao Xianjuncd openwifi/user_space; ./build_wpa_supplicant_wo11b.sh
272e17fdc17Smmehari```
273b73660adSXianjun Jiao## Porting guide
274e17fdc17Smmehari
275fbcc0b46SJiao XianjunThis section explains the porting work by showing the differences between openwifi and Analog Devices reference design. openwifi is based on 2019_R1 of [HDL Reference Designs](https://github.com/analogdevicesinc/hdl).
276b73660adSXianjun Jiao- Open the fmcomms2 + zc706 reference design at hdl/projects/fmcomms2/zc706 (Please read Analog Devices help)
277b73660adSXianjun Jiao- Open the openwifi design zc706_fmcs2 at openwifi-hw/boards/zc706_fmcs2 (Please read openwifi-hw repository)
278b73660adSXianjun Jiao- "Open Block Design", you will see the differences between openwifi and the reference design. Both in "diagram" and in "Address Editor".
279b1dd94e3Sluz paz- The address/interrupts of FPGA blocks hooked to the ARM bus should be put/aligned to the devicetree file openwifi/kernel_boot/boards/zc706_fmcs2/devicetree.dts. Linux will parse the devicetree.dtb when booting to know information of attached device (FPGA blocks in our case).
280b73660adSXianjun Jiao- We use dtc command to get devicetree.dts converted from devicetree.dtb in [Analog Devices Linux image](https://wiki.analog.com/resources/tools-software/linux-software/zynq_images), then do modification according to what we have added/modified to the reference design.
281b73660adSXianjun Jiao- Please learn the script in [[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)] to understand how we generate devicetree.dtb, BOOT.BIN and Linux kernel uImage and put them together to build the full SD card image.
282b73660adSXianjun Jiao
2836aae74b0SLina Ceballos## License
2846aae74b0SLina Ceballos
2856aae74b0SLina CeballosThis project is available as open source under the terms of the AGPL 3.0 Or later. However, some elements are being licensed under GPL 2-0 or later and BSD 3 license . For accurate information, please check individual files.
286