diff options
Diffstat (limited to 'platforms/chibios/drivers/spi_master.c')
| -rw-r--r-- | platforms/chibios/drivers/spi_master.c | 39 | 
1 files changed, 35 insertions, 4 deletions
diff --git a/platforms/chibios/drivers/spi_master.c b/platforms/chibios/drivers/spi_master.c index ce69e7f0ac..c3ab0623f0 100644 --- a/platforms/chibios/drivers/spi_master.c +++ b/platforms/chibios/drivers/spi_master.c @@ -20,7 +20,7 @@  static pin_t currentSlavePin = NO_PIN; -#if defined(K20x) || defined(KL2x) +#if defined(K20x) || defined(KL2x) || defined(RP2040)  static SPIConfig spiConfig = {NULL, 0, 0, 0};  #else  static SPIConfig spiConfig = {false, NULL, 0, 0, 0, 0}; @@ -42,10 +42,12 @@ __attribute__((weak)) void spi_init(void) {          palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), SPI_MOSI_PAL_MODE);          palSetPadMode(PAL_PORT(SPI_MISO_PIN), PAL_PAD(SPI_MISO_PIN), SPI_MISO_PAL_MODE);  #else -        palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), PAL_MODE_ALTERNATE(SPI_SCK_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST); -        palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), PAL_MODE_ALTERNATE(SPI_MOSI_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST); -        palSetPadMode(PAL_PORT(SPI_MISO_PIN), PAL_PAD(SPI_MISO_PIN), PAL_MODE_ALTERNATE(SPI_MISO_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST); +        palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), SPI_SCK_FLAGS); +        palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), SPI_MOSI_FLAGS); +        palSetPadMode(PAL_PORT(SPI_MISO_PIN), PAL_PAD(SPI_MISO_PIN), SPI_MISO_FLAGS);  #endif +        spiStop(&SPI_DRIVER); +        currentSlavePin = NO_PIN;      }  } @@ -167,7 +169,36 @@ bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor) {              spiConfig.SPI_CPOL = SPI_CPOL_High;              break;      } +#elif defined(MCU_RP) +    if (lsbFirst) { +        osalDbgAssert(lsbFirst == false, "RP2040s PrimeCell SPI implementation does not support sending LSB first."); +    } + +    // Motorola frame format and 8bit transfer data size. +    spiConfig.SSPCR0 = SPI_SSPCR0_FRF_MOTOROLA | SPI_SSPCR0_DSS_8BIT; +    // Serial output clock = (ck_sys or ck_peri) / (SSPCPSR->CPSDVSR * (1 + +    // SSPCR0->SCR)). SCR is always set to zero, as QMK SPI API expects the +    // passed divisor to be the only value to divide the input clock by. +    spiConfig.SSPCPSR = roundedDivisor; // Even number from 2 to 254 +    switch (mode) { +        case 0: +            spiConfig.SSPCR0 &= ~SPI_SSPCR0_SPO; // Clock polarity: low +            spiConfig.SSPCR0 &= ~SPI_SSPCR0_SPH; // Clock phase: sample on first edge +            break; +        case 1: +            spiConfig.SSPCR0 &= ~SPI_SSPCR0_SPO; // Clock polarity: low +            spiConfig.SSPCR0 |= SPI_SSPCR0_SPH;  // Clock phase: sample on second edge transition +            break; +        case 2: +            spiConfig.SSPCR0 |= SPI_SSPCR0_SPO;  // Clock polarity: high +            spiConfig.SSPCR0 &= ~SPI_SSPCR0_SPH; // Clock phase: sample on first edge +            break; +        case 3: +            spiConfig.SSPCR0 |= SPI_SSPCR0_SPO; // Clock polarity: high +            spiConfig.SSPCR0 |= SPI_SSPCR0_SPH; // Clock phase: sample on second edge transition +            break; +    }  #else      spiConfig.cr1 = 0;  | 
