xref: /openwifi/README.md (revision 51d17680a61b40d6596e2267f531e28acd16cbed)
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
12*51d17680SJiao Xianjun[[Download img and Quick start](#Download-img-and-Quick-start)]
13*51d17680SJiao Xianjun
14f4c9b072SXianjun 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.
15525f977bSJiao Xianjun
16a2ffb301SXianjun Jiao[[Project document](doc/README.md)]
17a2ffb301SXianjun Jiao[[Application notes](doc/app_notes/README.md)]
18dc7c18bfSJiao Xianjun[[Videos](doc/videos.md)]
194046c688SJiao Xianjun[[Publications and How to Cite](doc/publications.md)]
20a2ffb301SXianjun Jiao[[maillist](https://lists.ugent.be/wws/subscribe/openwifi)]
212ee67178SXianjun Jiao
221ee5906aSJiao 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).
232ee67178SXianjun Jiao
242ee67178SXianjun Jiao**Features:**
252ee67178SXianjun Jiao
2694c4a85fSJiao Xianjun- 802.11a/g/n [[IEEE 802.11n (Wi-Fi 4)](doc/app_notes/ieee80211n.md)]
2781493bdcSJiao Xianjun- 20MHz bandwidth; [70 MHz to 6 GHz frequency range](doc/README.md#let-openwifi-work-at-arbitrary-frequency)
2881493bdcSJiao Xianjun- Mode tested: [Ad-hoc](doc/app_notes/ad-hoc-two-sdr.md); [Station; AP](doc/app_notes/ap-client-two-sdr.md), Monitor
2981493bdcSJiao Xianjun- [DCF (CSMA/CA) low MAC layer in FPGA (10us SIFS is achieved)](doc/app_notes/frequent_trick.md)
30a2ffb301SXianjun Jiao- [802.11 packet injection and fuzzing](doc/app_notes/inject_80211.md)
31d14d06e5SXianjun Jiao- [CSI](doc/app_notes/csi.md): Channel State Information, freq offset, equalizer to computer
32b49db4c5SXianjun Jiao- [CSI fuzzer](doc/app_notes/csi_fuzzer.md): Create artificial channel response in WiFi transmitter
33a816a273SJiao Xianjun- [CSI radar](doc/app_notes/radar-self-csi.md): Moving detection. Joint radar and communication
34d14d06e5SXianjun 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)]
3581493bdcSJiao Xianjun- [Configurable channel access priority parameters](doc/app_notes/frequent_trick.md):
3681493bdcSJiao Xianjun  - CCA threshold, receiver sensitivity, etc
37b73660adSXianjun Jiao  - duration of RTS/CTS, CTS-to-self
38b73660adSXianjun Jiao  - SIFS/DIFS/xIFS/slot-time/CW/etc
3981493bdcSJiao 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)
4081493bdcSJiao Xianjun- Easy to change bandwidth and [frequency](doc/README.md#let-openwifi-work-at-arbitrary-frequency):
41b73660adSXianjun Jiao  - 2MHz for 802.11ah in sub-GHz
42b73660adSXianjun Jiao  - 10MHz for 802.11p/vehicle in 5.9GHz
43a2ffb301SXianjun Jiao- **802.11ax** under development
442ee67178SXianjun Jiao
45e91d8a29SJiao Xianjun**Performance (best case: aggregation/AMPDU on):**
46e91d8a29SJiao Xianjun- iperf: TCP 40~50Mbps; UDP 50Mbps
477eea2988SXianjun Jiao- EVM -38dB; MCS0 sensitivity -92dBm; MCS7 -73dBm. (FMCOMMS2 2.4GHz; cable and OTA test)
482ee67178SXianjun Jiao
492ba8d921SJiao Xianjun**Supported SDR platforms:**
502ee67178SXianjun Jiao
517eea2988SXianjun Jiaoboard_name|Description|Vivado license
527eea2988SXianjun Jiao----------|-----------|--------------
537eea2988SXianjun 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)|Need
547eea2988SXianjun 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)|**NO** need
557eea2988SXianjun Jiaoadrv9364z7020|[ADRV9364-Z7020 + ADRV1CRR-BOB](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/adrv9364-z7020.html)|**NO** need
567eea2988SXianjun Jiaoadrv9361z7035|[ADRV9361-Z7035 + ADRV1CRR-BOB/FMC](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/ADRV9361-Z7035.html)|Need
577eea2988SXianjun 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)|**NO** need
587eea2988SXianjun Jiaoantsdr|[MicroPhase](https://github.com/MicroPhase/) enhanced ADALM-PLUTO [Notes](kernel_boot/boards/antsdr/notes.md)|**NO** need
599ccab282SJiao Xianjune310v2|[MicroPhase](https://github.com/MicroPhase/) new antsdr [Notes](kernel_boot/boards/e310v2/README.md)|**NO** need
607eea2988SXianjun Jiaoantsdr_e200|[MicroPhase](https://github.com/MicroPhase/) enhanced ADALM-PLUTO (smaller/cheaper) [Notes](kernel_boot/boards/antsdr_e200/README.md)|**NO** need
617eea2988SXianjun Jiaosdrpi|[HexSDR](https://github.com/HexSDR/) SDR in Raspberry Pi size [Notes](kernel_boot/boards/sdrpi/notes.md)|**NO** need
627eea2988SXianjun Jiaozcu102_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)|Need
637eea2988SXianjun Jiaoneptunesdr|Low cost Zynq 7020 + AD9361 board|**NO** need
649e696164SXianjun Jiao
65bfa0a5cdSXianjun Jiao- Check [Porting guide](#Porting-guide) for your new board if it isn't in the list.
667eea2988SXianjun Jiao- board_name is used to identify FPGA design in openwifi-hw/boards/ and FPGA image in openwifi-hw-img/boards
67b73660adSXianjun 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.
682ee67178SXianjun Jiao
692fe83152SJiao Xianjun[[Download img and Quick start](#Download-img-and-Quick-start)]
70b73660adSXianjun Jiao[[Basic operations](#Basic-operations)]
71b73660adSXianjun Jiao[[Update FPGA](#Update-FPGA)]
72b73660adSXianjun Jiao[[Update Driver](#Update-Driver)]
73b73660adSXianjun Jiao[[Update sdrctl](#Update-sdrctl)]
74b73660adSXianjun Jiao[[Easy Access and etc](#Easy-Access-and-etc)]
752ee67178SXianjun Jiao
76b73660adSXianjun Jiao[[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)]
77b73660adSXianjun Jiao[[Special note for 11b](#Special-note-for-11b)]
78b73660adSXianjun Jiao[[Porting guide](#Porting-guide)]
79d9e94a69SJiao Xianjun[[Project document](doc/README.md)]
8075890522SJiao Xianjun[[Application notes](doc/app_notes/README.md)]
812ee67178SXianjun Jiao
822fe83152SJiao Xianjun## Download img and Quick start
834a79bc8cSXianjun Jiao- Download [openwifi img](https://drive.google.com/file/d/12egFLT9TclmY8m3vCMHmUuSne3qK0SWc/view?usp=sharing), unzip and burn it into a SD card (>=16GB). After this operation, the SD card should have two partitions: BOOT and rootfs. To flash the SD card, SD card tool software (such as Startup Disk Creator in Ubuntu) or dd command can be used:
847eea2988SXianjun Jiao  ```
857eea2988SXianjun Jiao  sudo dd bs=512 count=31116288 if=openwifi-xyz.img of=/dev/your_sdcard_dev
867eea2988SXianjun Jiao  (To have correct count value, better to check the .img file actual situation by "fdisk -l img_filename")
877eea2988SXianjun Jiao  ```
887eea2988SXianjun Jiao- Config the **correct files in the BOOT partition** according to the **board you have** by operation on your computer:
897eea2988SXianjun Jiao  - Copy files in **BOOT/openwifi/board_name** to the base directory of BOOT partition.
907eea2988SXianjun Jiao  - Delete the **rootfs/root/kernel_modules** directory (if exist).
91d34b41adSJiao Xianjun  - Delete the **rootfs/etc/network/interfaces.new** directory (if exist).
927eea2988SXianjun Jiao- Insert the SD card to the board. Configure the board in SD booting mode. Connect antennas. Power on.
939d56afc0SJiao Xianjun- Login to the board from your PC (PC Ethernet should have IP 192.168.10.1) with password **openwifi**.
942ee67178SXianjun Jiao  ```
952ee67178SXianjun Jiao  ssh [email protected]
962ee67178SXianjun Jiao  ```
97bfa0a5cdSXianjun Jiao- If not successful, check [known issue](doc/known_issue/notter.md)
9840773b78SXianjun Jiao- Then, run openwifi AP and the on board webserver
999d56afc0SJiao Xianjun  ```
10085e48aeaSJiao Xianjun  raspi-config --expand-rootfs (Only needed when your SD card > 16GB. Run and reboot)
10175dada42SJiao Xianjun  ./openwifi/setup_once.sh (Reboot the board. Only need to run once for new board)
10240773b78SXianjun Jiao  cd openwifi
10340773b78SXianjun Jiao  ./wgd.sh
10440773b78SXianjun Jiao  ./fosdem.sh
10540773b78SXianjun Jiao  (Use "./wgd.sh 1" to enable experimental AMPDU aggregation on top of 11n)
106f4c9b072SXianjun Jiao  (Use "./fosdem-11ag.sh" to force 11a/g mode)
1079d56afc0SJiao Xianjun  ```
1080fae09a8SJiao Xianjun  **NOTE** adrv9361z7035 has ultra low TX power in 5GHz. Move **CLOSER** when you use that board in 5GHz!!!
1091cde89d9SXianjun Jiao- After you see the "openwifi" SSID on your device (Phone/Laptop/etc), connect it (If not get 192.168.13.* IP automatically, check [known issue](doc/known_issue/notter.md)). Browser to 192.168.13.1 on your device, you should see the webpage hosted by the webserver on board.
1109d56afc0SJiao Xianjun  - Note 1: If your device doesn't support 5GHz (ch44), please change the **hostapd-openwifi.conf** on board and re-run fosdem.sh.
1117eea2988SXianjun Jiao  - Note 2: After ~2 hours, the Viterbi decoder will halt (Xilinx Evaluation License). Just reload FPGA ([method](doc/app_notes/drv_fpga_dynamic_loading.md)) or simply 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)
1120a9ca3b0SDaniel Bovensiepen Li- To give the Wi-Fi client internet access, configure routing/NAT **on the PC**:
113b73660adSXianjun Jiao  ```
114b73660adSXianjun Jiao  sudo sysctl -w net.ipv4.ip_forward=1
115a2ffb301SXianjun Jiao  sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE
1162ee67178SXianjun Jiao  sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
117b73660adSXianjun Jiao  ```
118a2ffb301SXianjun Jiao  **ethX** is the PC NIC name connecting the board ethernet. **NICY** is the PC NIC name connecting internet (WiFi or another ethernet).
1192ee67178SXianjun Jiao
120b73660adSXianjun Jiao  If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC.
12122dd0cc4SXianjun 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)].
122b73660adSXianjun Jiao
123b73660adSXianjun Jiao## Basic operations
124b73660adSXianjun 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.
125b73660adSXianjun Jiao- Bring up the openwifi NIC sdr0:
126b73660adSXianjun Jiao  ```
127b73660adSXianjun Jiao  cd ~/openwifi && ./wgd.sh
128f4c9b072SXianjun Jiao  (Use "./wgd.sh 1" to enable experimental AMPDU aggregation)
129b73660adSXianjun Jiao  ```
130b73660adSXianjun Jiao- Use openwifi as client to connect other AP (Change wpa-connect.conf on board firstly):
131b73660adSXianjun Jiao  ```
1322ee67178SXianjun Jiao  route del default gw 192.168.10.1
133b73660adSXianjun Jiao  wpa_supplicant -i sdr0 -c wpa-connect.conf &
1342ee67178SXianjun Jiao  dhclient sdr0
1352ee67178SXianjun Jiao  ```
13670cedb22SXianjun 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).
13770cedb22SXianjun Jiao- Use openwifi in monitor mode: Please check **monitor_ch.sh** and [this app note](./doc/app_notes/inject_80211.md).
138b73660adSXianjun 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.
13970cedb22SXianjun Jiao- **sdrctl** is a dedicated tool to access openwifi driver/FPGA, please check [project document](./doc/README.md) for more information.
140b73660adSXianjun Jiao
141b73660adSXianjun Jiao## Update FPGA
142b73660adSXianjun Jiao
1437eea2988SXianjun 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 without rebooting/power-cycle)
14470cedb22SXianjun Jiao
14570cedb22SXianjun 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.
146b73660adSXianjun Jiao
147ef526178SXianjun Jiao- Install Vivado 2021.1. Make sure install Vitis as well. You should have this directory: your_Xilinx_install_directory/Vitis (NOT Vitis_HLS!)
148ef526178SXianjun Jiao  - If the Vitis is not installed, you can add it by running "Xilinx Design Tools --> Add Design Tools for Devices 2021.1" from Xilinx program group/menu in your OS start menu.
149b73660adSXianjun Jiao- Setup environment variables (use absolute path):
1502ee67178SXianjun Jiao  ```
15120dd8379SJiao Xianjun  export XILINX_DIR=your_Xilinx_install_directory
152ef526178SXianjun Jiao  (Example: export XILINX_DIR=/opt/Xilinx. The Xilinx directory should include sth like: Downloads, Vitis, etc.)
1537eea2988SXianjun Jiao  export OPENWIFI_HW_IMG_DIR=your_openwifi-hw-img_directory
1547eea2988SXianjun Jiao  (The directory where you get the open-sdr/openwifi-hw-img repo via git clone)
155b73660adSXianjun Jiao  export BOARD_NAME=your_board_name
1562ee67178SXianjun Jiao  ```
1573c5b6d1aSXianjun Jiao- Pick the FPGA bitstream from openwifi-hw-img, generate system_top.bit.bin and transfer it on board via ssh channel:
1582ee67178SXianjun Jiao  ```
1597eea2988SXianjun Jiao  cd openwifi/user_space; ./boot_bin_gen.sh $XILINX_DIR $BOARD_NAME $OPENWIFI_HW_IMG_DIR/boards/$BOARD_NAME/sdk/system_top.xsa
1603c5b6d1aSXianjun Jiao  scp ./system_top.bit.bin [email protected]:openwifi/
1612ee67178SXianjun Jiao  ```
1623c5b6d1aSXianjun Jiao- Now the system_top.bit.bin is onboard in /root/openwifi/ directory. When wgd.sh runs onboard from that directory, it will discover the FPGA img file system_top.bit.bin and load it before loading driver .ko files.
16340773b78SXianjun Jiao
164b73660adSXianjun Jiao## Update Driver
1652ee67178SXianjun Jiao
1667eea2988SXianjun 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 without rebooting/power-cycle)
16770cedb22SXianjun Jiao
16870cedb22SXianjun 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.
16970cedb22SXianjun Jiao
170b73660adSXianjun Jiao- Prepare Analog Devices Linux kernel source code (only need to run once):
1712ee67178SXianjun Jiao  ```
17258faac27SJiao Xianjun  sudo apt install flex bison libssl-dev device-tree-compiler u-boot-tools -y
173ef526178SXianjun Jiao  cd openwifi/user_space; ./prepare_kernel.sh $XILINX_DIR ARCH_BIT
174febc5adfSXianjun Jiao  (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
1752ee67178SXianjun Jiao  ```
176b73660adSXianjun Jiao- Compile the latest openwifi driver
1772ee67178SXianjun Jiao  ```
178abdb610fSJiao Xianjun  cd openwifi/driver; ./make_all.sh $XILINX_DIR ARCH_BIT
179febc5adfSXianjun Jiao  (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
180bca2c023SJiao Xianjun  (More arguments (max 5) beyond above two will be converted to "#define argument" in pre_def.h for conditional compiling)
1812ee67178SXianjun Jiao  ```
182b73660adSXianjun Jiao- Copy the driver files to the board via ssh channel
1832ee67178SXianjun Jiao  ```
184abdb610fSJiao Xianjun  cd openwifi/driver; scp `find ./ -name \*.ko` [email protected]:openwifi/
185b73660adSXianjun Jiao  ```
18640773b78SXianjun 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.
18740773b78SXianjun Jiao  Find more information in [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md).
18840773b78SXianjun Jiao
1897eea2988SXianjun Jiao  **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 put the linux kernel image generated by prepare_kernel.sh (check [[Update Driver](#Update-Driver)]) to the BOOT partition of SD card. The kernel image file name: adi-linux/arch/arm/boot/uImage (32bit); adi-linux-64/arch/arm64/boot/Image (64bit).
1909e8d5e4aSJiao Xianjun
191b73660adSXianjun Jiao## Update sdrctl
192b73660adSXianjun Jiao- Copy the sdrctl source files to the board via ssh channel
193b73660adSXianjun Jiao  ```
194abdb610fSJiao Xianjun  cd openwifi/user_space/sdrctl_src; scp `find ./ -name \*` [email protected]:openwifi/sdrctl_src/
195b73660adSXianjun Jiao  ```
196b73660adSXianjun Jiao- Compile the sdrctl **on board**:
197b73660adSXianjun Jiao  ```
1987eea2988SXianjun Jiao  cd ~/openwifi/sdrctl_src/ && make clean && make && cp sdrctl ../ && cd ..
199b73660adSXianjun Jiao  ```
200b73660adSXianjun Jiao## Easy Access and etc
2019e8d5e4aSJiao Xianjun
2027eea2988SXianjun 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 without rebooting/power-cycle.
203b73660adSXianjun Jiao- FPGA and driver on board update scripts
204981758c0SXianjun Jiao  - Setup [ftp server](https://ubuntu.com/server/docs/service-ftp) on PC, allow anonymous and change ftp root directory to the openwifi directory.
205b73660adSXianjun Jiao  - On board:
206b73660adSXianjun Jiao  ```
207b73660adSXianjun Jiao  ./sdcard_boot_update.sh $BOARD_NAME
2089e8d5e4aSJiao Xianjun  (Above command downloads uImage, BOOT.BIN and devicetree.dtb, then copy them into boot partition. Remember to power cycle)
2099e8d5e4aSJiao Xianjun  ./wgd.sh remote
2109e8d5e4aSJiao Xianjun  (Above command downloads driver files, and brings up sdr0)
211b73660adSXianjun Jiao  ```
212b73660adSXianjun Jiao- Access the board disk/rootfs like a disk:
213b73660adSXianjun Jiao   - On PC: "File manager --> Connect to Server...", input: sftp://[email protected]/root
214b73660adSXianjun Jiao   - Input password "openwifi"
2159e8d5e4aSJiao Xianjun
216b73660adSXianjun Jiao## Build openwifi Linux img from scratch
217ef526178SXianjun Jiao- For the latest ADI Kuiper image, please check [kuiper.md](./doc/img_build_instruction/kuiper.md)
2182ee67178SXianjun Jiao
219b73660adSXianjun Jiao## Special note for 11b
220e17fdc17Smmehari
221e17fdc17SmmehariOpenwifi 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.
222e17fdc17Smmehari
223e17fdc17SmmehariAs a solution to this problem, openwifi can be fully controlled only if communicating with APs/clients instantiated using hostapd/wpa_supplicant userspace programs respectively.
224e17fdc17Smmehari
225e17fdc17SmmehariFor 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.
226e17fdc17Smmehari
227e17fdc17SmmehariOn 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.
228e17fdc17Smmehari```
229b1633ad3SJiao Xianjunsudo apt-get install libssl1.0-dev
230abdb610fSJiao Xianjuncd openwifi/user_space; ./build_wpa_supplicant_wo11b.sh
231e17fdc17Smmehari```
232b73660adSXianjun Jiao## Porting guide
233e17fdc17Smmehari
234ef526178SXianjun JiaoThis section explains the porting work by showing the differences between openwifi and Analog Devices reference design. openwifi is based on 2021_r1 of [HDL Reference Designs](https://github.com/analogdevicesinc/hdl).
235b73660adSXianjun Jiao- Open the fmcomms2 + zc706 reference design at hdl/projects/fmcomms2/zc706 (Please read Analog Devices help)
236b73660adSXianjun Jiao- Open the openwifi design zc706_fmcs2 at openwifi-hw/boards/zc706_fmcs2 (Please read openwifi-hw repository)
237b73660adSXianjun Jiao- "Open Block Design", you will see the differences between openwifi and the reference design. Both in "diagram" and in "Address Editor".
238b1dd94e3Sluz 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).
239b73660adSXianjun 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.
240ef526178SXianjun 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, Linux kernel and put them together to build the full SD card image.
241b73660adSXianjun Jiao
2426aae74b0SLina Ceballos## License
2436aae74b0SLina Ceballos
2446aae74b0SLina 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.
245