zephyr/drivers/sensor/bosch/bmi323/bmi323_spi.c

97 lines
2.2 KiB
C

/*
* Copyright (c) 2023 Trackunit Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "bmi323.h"
#include <zephyr/device.h>
#include <zephyr/drivers/spi.h>
static int bosch_bmi323_spi_read_words(const void *context, uint8_t offset, uint16_t *words,
uint16_t words_count)
{
const struct spi_dt_spec *spi = (const struct spi_dt_spec *)context;
uint8_t address[2];
struct spi_buf transmit_buffer;
struct spi_buf_set transmit_buffer_set;
struct spi_buf receive_buffers[2];
struct spi_buf_set receive_buffers_set;
int ret;
address[0] = offset | 0x80;
address[1] = 0x00;
transmit_buffer.buf = address;
transmit_buffer.len = sizeof(address);
transmit_buffer_set.buffers = &transmit_buffer;
transmit_buffer_set.count = 1;
receive_buffers[0].buf = NULL;
receive_buffers[0].len = 2;
receive_buffers[1].buf = words;
receive_buffers[1].len = (words_count * 2);
receive_buffers_set.buffers = receive_buffers;
receive_buffers_set.count = 2;
ret = spi_transceive_dt(spi, &transmit_buffer_set, &receive_buffers_set);
k_usleep(2);
return ret;
}
static int bosch_bmi323_spi_write_words(const void *context, uint8_t offset, uint16_t *words,
uint16_t words_count)
{
const struct spi_dt_spec *spi = (const struct spi_dt_spec *)context;
uint8_t address;
struct spi_buf transmit_buffers[2];
struct spi_buf_set transmit_buffer_set;
int ret;
address = offset & 0x7F;
transmit_buffers[0].buf = &address;
transmit_buffers[0].len = 1;
transmit_buffers[1].buf = words;
transmit_buffers[1].len = (words_count * 2);
transmit_buffer_set.buffers = transmit_buffers;
transmit_buffer_set.count = 2;
ret = spi_write_dt(spi, &transmit_buffer_set);
k_usleep(2);
return ret;
}
static int bosch_bmi323_spi_init(const void *context)
{
const struct spi_dt_spec *spi = (const struct spi_dt_spec *)context;
uint16_t sensor_id;
int ret;
if (spi_is_ready_dt(spi) == false) {
return -ENODEV;
}
ret = bosch_bmi323_spi_read_words(spi, 0, &sensor_id, 1);
if (ret < 0) {
return ret;
}
k_usleep(1500);
return 0;
}
const struct bosch_bmi323_bus_api bosch_bmi323_spi_bus_api = {
.read_words = bosch_bmi323_spi_read_words,
.write_words = bosch_bmi323_spi_write_words,
.init = bosch_bmi323_spi_init};