# wafer v1.1.3 - Table of Contents > Wafer is an Elixir library to make writing drivers for i2c and SPI connected peripherals and interacting with GPIO pins easier. ## Pages - [Wafer](readme.md) - [Change Log](changelog.md) ## Modules - [Wafer](Wafer.md): Welcome to Wafer. The funkiest way to write hardware drivers. - [Wafer.Chip](Wafer.Chip.md): A `Chip` is a physical peripheral with registers which can be read from and written to. - [Wafer.Conn](Wafer.Conn.md): Defines a behaviour for connecting to a peripheral. - [Wafer.DLL](Wafer.DLL.md): Implements a safe bytewise data-link-layer which allows the transmission and receiption of arbitrary erlang terms in tiny packets. - [Wafer.DLL.Rx](Wafer.DLL.Rx.md): Bytewise reception buffer for our data link layer. - [Wafer.DLL.Tx](Wafer.DLL.Tx.md): A bytewise transmission buffer for our data link layer. - [Wafer.DeviceID](Wafer.DeviceID.md): Allows devices to generate a unique identifier. - [Wafer.Driver.Circuits.GPIO](Wafer.Driver.Circuits.GPIO.md): A connection to a native GPIO pin via Circuits' GPIO driver. - [Wafer.Driver.Circuits.GPIO.Dispatcher](Wafer.Driver.Circuits.GPIO.Dispatcher.md): This module implements a simple dispatcher for GPIO interrupts when using `Circuits.GPIO`. - [Wafer.Driver.Circuits.I2C](Wafer.Driver.Circuits.I2C.md): A connection to a chip via Circuits' I2C driver. - [Wafer.Driver.Circuits.SPI](Wafer.Driver.Circuits.SPI.md): A connection to a chip via Circuits's SPI driver. - [Wafer.Driver.Fake](Wafer.Driver.Fake.md): This module provides a fake driver which you can use in your tests. - [Wafer.Format](Wafer.Format.md): Handy functions for formatting bytes, especially for debugging. - [Wafer.GPIO](Wafer.GPIO.md): A `GPIO` is a physical pin which can be read from and written to. - [Wafer.Guards](Wafer.Guards.md): Handy guards which you can use in your code to assert correct values. - [Wafer.I2C](Wafer.I2C.md): A protocol for interacting with I2C devices directly. Most of the time you'll want to use the `Chip` protocol for working with registers, but this is provided for consistency's sake. - [Wafer.InterruptRegistry](Wafer.InterruptRegistry.md): This module provides Wafer's interrupt registry. This allows multiple subscribers to be subscribed to interrupts from many different pins. - [Wafer.Registers](Wafer.Registers.md): This module provides helpful macros for specifying the registers used to communicate with your device. - [Wafer.Release](Wafer.Release.md): A protocol for releasing connections. The opposite of `Conn`'s `acquire/1`. - [Wafer.SPI](Wafer.SPI.md): A (very simple) protocol for interacting with SPI connected devices. - [Wafer.Twiddles](Wafer.Twiddles.md): Handy functions for dealing with bits and bytes in the wild.