/* * Copyright (c) 2023 Trackunit Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include "bmi323.h" #include #include 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};