97 lines
2.2 KiB
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};
|