drivers: spi_bitbang: Add support for SPI_TRANSFER_LSB flag
Add support for sending and receiving the least significant bit first for the spi_bitbang driver. This driver can now be used with SPI_TRANFER_LSB flag. Signed-off-by: Michal Morsisko <morsisko@gmail.com>
This commit is contained in:
parent
f4267ecce4
commit
b76b2bbc8c
1 changed files with 10 additions and 6 deletions
|
|
@ -37,8 +37,7 @@ static int spi_bitbang_configure(const struct spi_bitbang_config *info,
|
|||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
if (config->operation & (SPI_TRANSFER_LSB | SPI_LINES_DUAL
|
||||
| SPI_LINES_QUAD)) {
|
||||
if (config->operation & (SPI_LINES_DUAL | SPI_LINES_QUAD)) {
|
||||
LOG_ERR("Unsupported configuration");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
|
@ -125,6 +124,7 @@ static int spi_bitbang_transceive(const struct device *dev,
|
|||
int clock_state = 0;
|
||||
int cpha = 0;
|
||||
bool loop = false;
|
||||
bool lsb = false;
|
||||
|
||||
if (SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPOL) {
|
||||
clock_state = 1;
|
||||
|
|
@ -135,6 +135,9 @@ static int spi_bitbang_transceive(const struct device *dev,
|
|||
if (SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_LOOP) {
|
||||
loop = true;
|
||||
}
|
||||
if (spi_cfg->operation & SPI_TRANSFER_LSB) {
|
||||
lsb = true;
|
||||
}
|
||||
|
||||
/* set the initial clock state before CS */
|
||||
gpio_pin_set_dt(&info->clk_gpio, clock_state);
|
||||
|
|
@ -157,8 +160,8 @@ static int spi_bitbang_transceive(const struct device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
int shift = data->bits - 1;
|
||||
uint16_t r = 0;
|
||||
uint8_t i = 0;
|
||||
int b = 0;
|
||||
bool do_read = false;
|
||||
|
||||
|
|
@ -166,7 +169,8 @@ static int spi_bitbang_transceive(const struct device *dev,
|
|||
do_read = true;
|
||||
}
|
||||
|
||||
while (shift >= 0) {
|
||||
while (i < data->bits) {
|
||||
const int shift = lsb ? i : (data->bits - 1 - i);
|
||||
const int d = (w >> shift) & 0x1;
|
||||
|
||||
b = 0;
|
||||
|
|
@ -198,9 +202,9 @@ static int spi_bitbang_transceive(const struct device *dev,
|
|||
b = d;
|
||||
}
|
||||
|
||||
r = (r << 1) | (b ? 0x1 : 0x0);
|
||||
r |= (b ? 0x1 : 0x0) << shift;
|
||||
|
||||
--shift;
|
||||
++i;
|
||||
}
|
||||
|
||||
if (spi_context_rx_buf_on(ctx)) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue