Compile qcacld driver for RaspberryPi

Before compiling qcacld drivers for RaspberryPi, you have to prepare kernel. Here is official guide:

Install Raspbian Stretch Lite to sdcard

1. Download Raspbian Stretch Lite image from Raspberry official site

2. Unzip the image:


3. Write the sdcard Insert SD card and check the name

sudo fdisk -l

In our case, the sdcard was named /dev/mmcblk0, then

sudo dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/mmcblk0

4. Optional Enable ssh Mount the sdcard boot partition

sudo mount /dev/mmcblk0p1 /mnt

Create file, that enables ssh

sudo touch /mnt/ssh

Unmount the partition

sudo umount /mnt

Building the sources

1. Download sources

mkdir RaspberryPi_Beans; cd RaspberryPi_Beans
git clone
git clone -b rpi-4.11.y
git clone -b CNSS.LEA.NRT_3.0

2. Add toolchain to PATH

export PATH=$PATH:$PWD/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

3. Prepare Linux

cd linux
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

Enable nl80211 test mode

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
Networking support -> Wireless -> nl80211 testmode command

Save and exit.

4. Patch kernel

for i in ../qcacld-2.0/patches/kernel/v4.11/0* ; do patch -p1 < $i ; done

5. Build kernel

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j$(nproc)

6. Patch qcacld

cd ../qcacld-2.0/

Patch the sources

patch -p1 < patches/RaspberryPi/0001-destructor_rename.patch

7. Build qcacld

KERNEL_SRC=../linux/ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -j$(nproc)
cd ..

Booting image

1. Mount boot partition

sudo mount /dev/mmcblk0p1 /mnt

2. Transfer the kernel and device tree

cd linux
sudo cp /mnt/kernel7.img /mnt/kernel7-backup.img
sudo cp arch/arm/boot/zImage /mnt/kernel7.img
sudo cp arch/arm/boot/dts/*.dtb /mnt/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/overlays/
sudo cp arch/arm/boot/dts/overlays/README /mnt/overlays/

3. Edit /boot/config.txt

echo core_freq=250 | sudo tee --append /mnt/config.txt
echo dtoverlay=sdio,poll_once=false | sudo tee --append /mnt/config.txt

4. Unmount the partition

sudo umount /mnt

5. Install modules

sudo mount /dev/mmcblk0p2 /mnt
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/ modules_install
cd ../qcacld-2.0/
sudo cp *.ko /mnt/home/pi/
sudo cp -r firmware_bin/sdio/* /mnt/lib/firmware/
sudo umount /mnt

6. Boot the image

Insert the sdcard into Raspberry and power it up. Connect the device to the Raspberry and load module with command

sudo insmod wlan-sdio.ko

The interface should appear:

pi@raspberrypi:~ $ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
	link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
	link/ether b8:27:eb:53:d0:9c brd ff:ff:ff:ff:ff:ff
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DORMANT group default qlen 1000
	link/ether b8:27:eb:06:85:c9 brd ff:ff:ff:ff:ff:ff
8: wlan1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 3000
	link/ether c4:93:00:0f:7e:58 brd ff:ff:ff:ff:ff:ff
9: p2p0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 3000
	link/ether c6:93:00:90:7e:58 brd ff:ff:ff:ff:ff:ff