Skip to content

Commit

Permalink
Unify spi_master headers (#24857)
Browse files Browse the repository at this point in the history
* Move default config to .c file

* Explicitly define PAL modes for boards with custom init

* Unify spi_master headers
  • Loading branch information
fauxpark authored Jan 26, 2025
1 parent 0747f88 commit ee63d39
Show file tree
Hide file tree
Showing 12 changed files with 183 additions and 175 deletions.
8 changes: 4 additions & 4 deletions docs/drivers/spi.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Start an SPI transaction.
#### Arguments {#api-spi-start-arguments}
- `pin_t slavePin`
The QMK pin to assert as the slave select pin, eg. `B4`.
The GPIO pin connected to the desired device's `SS` line.
- `bool lsbFirst`
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
- `uint8_t mode`
Expand All @@ -106,7 +106,7 @@ Start an SPI transaction.
#### Return Value {#api-spi-start-return}
`false` if the supplied parameters are invalid or the SPI peripheral is already in use, or `true`.
`true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use.
---
Expand All @@ -131,7 +131,7 @@ Read a byte from the selected SPI device.
#### Return Value {#api-spi-read-return}
`SPI_STATUS_TIMEOUT` if the timeout period elapses, or the byte read from the device.
`SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device.
---
Expand Down Expand Up @@ -159,7 +159,7 @@ Receive multiple bytes from the selected SPI device.
#### Arguments {#api-spi-receive-arguments}
- `uint8_t *data`
A pointer to the buffer to read into.
A pointer to a buffer to read into.
- `uint16_t length`
The number of bytes to read. Take care not to overrun the length of `data`.
Expand Down
116 changes: 116 additions & 0 deletions drivers/spi_master.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
// Copyright 2025 QMK
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <stdint.h>
#include <stdbool.h>
#include "gpio.h"

/**
* \file
*
* \defgroup spi_master SPI Master API
*
* \brief API to communicate with SPI devices.
* \{
*/

// Hardware SS pin is defined in the header so that user code can refer to it
#ifdef __AVR__
# if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
# define SPI_SS_PIN B0
# elif defined(__AVR_ATmega32A__)
# define SPI_SS_PIN B4
# elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
# define SPI_SS_PIN B2
# endif
#endif

typedef int16_t spi_status_t;

#define SPI_STATUS_SUCCESS (0)
#define SPI_STATUS_ERROR (-1)
#define SPI_STATUS_TIMEOUT (-2)

#define SPI_TIMEOUT_IMMEDIATE (0)
#define SPI_TIMEOUT_INFINITE (0xFFFF)

#ifdef __cplusplus
extern "C" {
#endif

typedef struct spi_start_config_t {
pin_t slave_pin;
bool lsb_first;
uint8_t mode;
uint16_t divisor;
bool cs_active_low;
} spi_start_config_t;

/**
* \brief Initialize the SPI driver. This function must be called only once, before any of the below functions can be called.
*/
void spi_init(void);

/**
* \brief Start an SPI transaction.
*
* \param slavePin The GPIO pin connected to the desired device's `SS` line.
* \param lsbFirst Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
* \param mode The SPI mode to use.
* \param divisor The SPI clock divisor.
*
* \return `true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use.
*/
bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor);

bool spi_start_extended(spi_start_config_t *start_config);

/**
* \brief Write a byte to the selected SPI device.
*
* \param data The byte to write.
*
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, or `SPI_STATUS_SUCCESS`.
*/
spi_status_t spi_write(uint8_t data);

/**
* \brief Read a byte from the selected SPI device.
*
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device.
*/
spi_status_t spi_read(void);

/**
* \brief Send multiple bytes to the selected SPI device.
*
* \param data A pointer to the data to write from.
* \param length The number of bytes to write. Take care not to overrun the length of `data`.
*
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
*/
spi_status_t spi_transmit(const uint8_t *data, uint16_t length);

/**
* \brief Receive multiple bytes from the selected SPI device.
*
* \param data A pointer to a buffer to read into.
* \param length The number of bytes to read. Take care not to overrun the length of `data`.
*
* \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
*/
spi_status_t spi_receive(uint8_t *data, uint16_t length);

/**
* \brief End the current SPI transaction. This will deassert the slave select pin and reset the endianness, mode and divisor configured by `spi_start()`.
*
*/
void spi_stop(void);

#ifdef __cplusplus
}
#endif

/** \} */
3 changes: 3 additions & 0 deletions keyboards/darkproject/kd83a_bfg_edition/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
/* SPI Config for LED Driver */
#define SPI_DRIVER SPIDQ
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

#define AW20216S_CS_PIN_1 A15
#define AW20216S_CS_PIN_2 B15
Expand Down
3 changes: 3 additions & 0 deletions keyboards/darkproject/kd87a_bfg_edition/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
/* SPI Config for LED Driver */
#define SPI_DRIVER SPIDQ
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

#define AW20216S_CS_PIN_1 A15
#define AW20216S_CS_PIN_2 B15
Expand Down
3 changes: 3 additions & 0 deletions keyboards/gmmk/gmmk2/p96/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
/* SPI Config for LED Driver */
#define SPI_DRIVER SPIDQ
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

#define AW20216S_CS_PIN_1 A15
#define AW20216S_CS_PIN_2 B15
Expand Down
3 changes: 3 additions & 0 deletions keyboards/jukaie/jk01/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
/* SPI Config for LED Driver */
#define SPI_DRIVER SPIDQ
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

#define AW20216S_CS_PIN_1 A15
#define AW20216S_CS_PIN_2 B15
Expand Down
3 changes: 3 additions & 0 deletions keyboards/projectd/65/projectd_65_ansi/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
/* SPI Config for LED Driver */
#define SPI_DRIVER SPIDQ
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

#define AW20216S_CS_PIN_1 A15
#define AW20216S_EN_PIN C13
3 changes: 3 additions & 0 deletions keyboards/projectd/75/ansi/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
/* SPI Config for LED Driver */
#define SPI_DRIVER SPIDQ
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

#define AW20216S_CS_PIN_1 A15
#define AW20216S_CS_PIN_2 B15
Expand Down
3 changes: 3 additions & 0 deletions keyboards/projectd/75/iso/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
/* SPI Config for LED Driver */
#define SPI_DRIVER SPIDQ
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

#define AW20216S_CS_PIN_1 A15
#define AW20216S_CS_PIN_2 B15
Expand Down
68 changes: 0 additions & 68 deletions platforms/avr/drivers/spi_master.h

This file was deleted.

43 changes: 42 additions & 1 deletion platforms/chibios/drivers/spi_master.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,49 @@
*/

#include "spi_master.h"
#include "chibios_config.h"
#include <ch.h>
#include <hal.h>

#include "timer.h"
#ifndef SPI_DRIVER
# define SPI_DRIVER SPID2
#endif

#ifndef SPI_SCK_PIN
# define SPI_SCK_PIN B13
#endif

#ifndef SPI_SCK_PAL_MODE
# ifdef USE_GPIOV1
# define SPI_SCK_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
# else
# define SPI_SCK_PAL_MODE 5
# endif
#endif

#ifndef SPI_MOSI_PIN
# define SPI_MOSI_PIN B15
#endif

#ifndef SPI_MOSI_PAL_MODE
# ifdef USE_GPIOV1
# define SPI_MOSI_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
# else
# define SPI_MOSI_PAL_MODE 5
# endif
#endif

#ifndef SPI_MISO_PIN
# define SPI_MISO_PIN B14
#endif

#ifndef SPI_MISO_PAL_MODE
# ifdef USE_GPIOV1
# define SPI_MISO_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
# else
# define SPI_MISO_PAL_MODE 5
# endif
#endif

static bool spiStarted = false;
#if SPI_SELECT_MODE == SPI_SELECT_MODE_NONE
Expand Down
Loading

0 comments on commit ee63d39

Please sign in to comment.