/** * Copyright (C) 2021 Bosch Sensortec GmbH. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include "bme68x.h" #include "coines.h" #include "common.h" /******************************************************************************/ /*! Macro definitions */ /*! BME68X shuttle board ID */ #define BME68X_SHUTTLE_ID 0x93 /******************************************************************************/ /*! Static variable definition */ static uint8_t dev_addr; /******************************************************************************/ /*! User interface functions */ /*! * I2C read function map to COINES platform */ BME68X_INTF_RET_TYPE bme68x_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr) { uint8_t dev_addr = *(uint8_t*)intf_ptr; return coines_read_i2c(dev_addr, reg_addr, reg_data, (uint16_t)len); } /*! * I2C write function map to COINES platform */ BME68X_INTF_RET_TYPE bme68x_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, void *intf_ptr) { uint8_t dev_addr = *(uint8_t*)intf_ptr; return coines_write_i2c(dev_addr, reg_addr, (uint8_t *)reg_data, (uint16_t)len); } /*! * SPI read function map to COINES platform */ BME68X_INTF_RET_TYPE bme68x_spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr) { uint8_t dev_addr = *(uint8_t*)intf_ptr; return coines_read_spi(dev_addr, reg_addr, reg_data, (uint16_t)len); } /*! * SPI write function map to COINES platform */ BME68X_INTF_RET_TYPE bme68x_spi_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, void *intf_ptr) { uint8_t dev_addr = *(uint8_t*)intf_ptr; return coines_write_spi(dev_addr, reg_addr, (uint8_t *)reg_data, (uint16_t)len); } /*! * Delay function map to COINES platform */ void bme68x_delay_us(uint32_t period, void *intf_ptr) { coines_delay_usec(period); } void bme68x_check_rslt(const char api_name[], int8_t rslt) { switch (rslt) { case BME68X_OK: /* Do nothing */ break; case BME68X_E_NULL_PTR: printf("API name [%s] Error [%d] : Null pointer\r\n", api_name, rslt); break; case BME68X_E_COM_FAIL: printf("API name [%s] Error [%d] : Communication failure\r\n", api_name, rslt); break; case BME68X_E_INVALID_LENGTH: printf("API name [%s] Error [%d] : Incorrect length parameter\r\n", api_name, rslt); break; case BME68X_E_DEV_NOT_FOUND: printf("API name [%s] Error [%d] : Device not found\r\n", api_name, rslt); break; case BME68X_E_SELF_TEST: printf("API name [%s] Error [%d] : Self test error\r\n", api_name, rslt); break; case BME68X_W_NO_NEW_DATA: printf("API name [%s] Warning [%d] : No new data found\r\n", api_name, rslt); break; default: printf("API name [%s] Error [%d] : Unknown error code\r\n", api_name, rslt); break; } } int8_t bme68x_interface_init(struct bme68x_dev *bme, uint8_t intf) { int8_t rslt = BME68X_OK; struct coines_board_info board_info; if (bme != NULL) { int16_t result = coines_open_comm_intf(COINES_COMM_INTF_USB); if (result < COINES_SUCCESS) { printf( "\n Unable to connect with Application Board ! \n" " 1. Check if the board is connected and powered on. \n" " 2. Check if Application Board USB driver is installed. \n" " 3. Check if board is in use by another application. (Insufficient permissions to access USB) \n"); exit(result); } result = coines_get_board_info(&board_info); #if defined(PC) setbuf(stdout, NULL); #endif if (result == COINES_SUCCESS) { if ((board_info.shuttle_id != BME68X_SHUTTLE_ID)) { printf("! Warning invalid sensor shuttle \n ," "This application will not support this sensor \n"); exit(COINES_E_FAILURE); } } coines_set_shuttleboard_vdd_vddio_config(0, 0); coines_delay_msec(100); /* Bus configuration : I2C */ if (intf == BME68X_I2C_INTF) { printf("I2C Interface\n"); dev_addr = BME68X_I2C_ADDR_LOW; bme->read = bme68x_i2c_read; bme->write = bme68x_i2c_write; bme->intf = BME68X_I2C_INTF; coines_config_i2c_bus(COINES_I2C_BUS_0, COINES_I2C_STANDARD_MODE); } /* Bus configuration : SPI */ else if (intf == BME68X_SPI_INTF) { printf("SPI Interface\n"); dev_addr = COINES_SHUTTLE_PIN_7; bme->read = bme68x_spi_read; bme->write = bme68x_spi_write; bme->intf = BME68X_SPI_INTF; coines_config_spi_bus(COINES_SPI_BUS_0, COINES_SPI_SPEED_7_5_MHZ, COINES_SPI_MODE0); } coines_delay_msec(100); coines_set_shuttleboard_vdd_vddio_config(3300, 3300); coines_delay_msec(100); bme->delay_us = bme68x_delay_us; bme->intf_ptr = &dev_addr; bme->amb_temp = 25; /* The ambient temperature in deg C is used for defining the heater temperature */ } else { rslt = BME68X_E_NULL_PTR; } return rslt; } void bme68x_coines_deinit(void) { fflush(stdout); coines_set_shuttleboard_vdd_vddio_config(0, 0); coines_delay_msec(1000); /* Coines interface reset */ coines_soft_reset(); coines_delay_msec(1000); coines_close_comm_intf(COINES_COMM_INTF_USB); }