67 lines
1.1 KiB
C
67 lines
1.1 KiB
C
/*
|
|
* Copyright (c) 2024 Vogl Electronic GmbH
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/drivers/spi.h>
|
|
#include <zephyr/drivers/spi/rtio.h>
|
|
#include <zephyr/sys/byteorder.h>
|
|
#include <zephyr/sys_clock.h>
|
|
|
|
#include "spi_context.h"
|
|
#include <soc.h>
|
|
|
|
static inline uint8_t get_dfs_value(const struct spi_config *config)
|
|
{
|
|
switch (SPI_WORD_SIZE_GET(config->operation)) {
|
|
case 8:
|
|
return 1;
|
|
case 16:
|
|
return 2;
|
|
case 24:
|
|
return 3;
|
|
case 32:
|
|
return 4;
|
|
default:
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
static inline void litex_spi_tx_put(uint8_t len, uint32_t *txd, const uint8_t *tx_buf)
|
|
{
|
|
switch (len) {
|
|
case 4:
|
|
*txd = sys_get_be32(tx_buf);
|
|
break;
|
|
case 3:
|
|
*txd = sys_get_be24(tx_buf);
|
|
break;
|
|
case 2:
|
|
*txd = sys_get_be16(tx_buf);
|
|
break;
|
|
default:
|
|
*txd = *tx_buf;
|
|
break;
|
|
}
|
|
}
|
|
|
|
static inline void litex_spi_rx_put(uint8_t len, uint32_t *rxd, uint8_t *rx_buf)
|
|
{
|
|
switch (len) {
|
|
case 4:
|
|
sys_put_be32(*rxd, rx_buf);
|
|
break;
|
|
case 3:
|
|
sys_put_be24(*rxd, rx_buf);
|
|
break;
|
|
case 2:
|
|
sys_put_be16(*rxd, rx_buf);
|
|
break;
|
|
default:
|
|
*rx_buf = *rxd;
|
|
break;
|
|
}
|
|
}
|