Tasmota/lib/lib_i2c/BME68x-Sensor-API/examples/common/common.c

192 lines
5.7 KiB
C

/**
* Copyright (C) 2021 Bosch Sensortec GmbH. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#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);
}