Zerowi: bare-metal WiFi driver for the Raspberry Pi

Running Linux on the Raspberry Pi offers many advantages, but raw speed isn’t one of them; it can be difficult to achieve a high data throughput when the Operating System (OS) keeps intervening. So for some demanding applications, it may be desirable to run without an OS, in ‘bare-metal’ mode.

This isn’t easy, since it is necessary to program all the functionality from scratch. There are various projects on the Web to provide console I/O and USB support, but I haven’t found any bare-metal WiFi drivers. This project rectifies that omission, providing some C code that has been written from scratch to drive the WiFi chips on the Raspberry Pi, and similar boards and modules. Due to the complexity of the development process, the project is split into several parts:

Part 1: resources. The hardware and software resources used in the project

Part 2: SDIO. A description of the SDIO interface between the CPU and wireless chip.

Part 3: initialisation. The subsystems within the chip, and how to initialise them.

Part 4: loading firmware. Loading the Cypress firmware into the WiFi CPU, and getting it running.

Part 5: IOCTLs. Control & configure the subsystems, and scan for wireless networks.

Part 6: Networking. Join a network, with WPA or WPA2 security

Source code: on GitHub.

Bluetooth: the wireless chip does have a Bluetooth capability, but I’m afraid this project is focused on WiFi only.

I have also created a driver for the CYW43439 chip on the Raspberry Pi Pico W, which uses an SPI interface, see my PicoWi project here.

Copyright (c) Jeremy P Bentham 2020. Please credit this blog if you use the information or software in it.