blob: d896fe800f8b1573fd412f032056be862895bf3d [file] [log] [blame]
/*
* vl53l0x_platform.h - Linux kernel modules for
* STM VL53L0 FlightSense TOF sensor
*
* Copyright (C) 2016 STMicroelectronics Imaging Division.
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef _VL_PLATFORM_H_
#define _VL_PLATFORM_H_
#include <linux/delay.h>
#include "vl53l0x_def.h"
#include "vl53l0x_platform_log.h"
#include "stmvl53l0x-i2c.h"
#include "stmvl53l0x-cci.h"
#include "stmvl53l0x.h"
/**
* @file vl53l0x_platform.h
*
* @brief All end user OS/platform/application porting
*/
/**
* @defgroup VL_platform_group VL53L0 Platform Functions
* @brief VL53L0 Platform Functions
* @{
*/
/**
* @def PALDevDataGet
* @brief Get ST private structure @a struct VL_DevData_t data access
*
* @param Dev Device Handle
* @param field ST structure field name
* It maybe used and as real data "ref" not just as "get" for sub-structure item
* like PALDevDataGet(FilterData.field)[i] or
* PALDevDataGet(FilterData.MeasurementIndex)++
*/
#define PALDevDataGet(Dev, field) (Dev->Data.field)
/**
* @def PALDevDataSet(Dev, field, data)
* @brief Set ST private structure @a struct VL_DevData_t data field
* @param Dev Device Handle
* @param field ST structure field na*me
* @param data Data to be set
*/
#define PALDevDataSet(Dev, field, data) ((Dev->Data.field) = (data))
/**
* @defgroup VL_registerAccess_group PAL Register Access Functions
* @brief PAL Register Access Functions
* @{
*/
/**
* Lock comms interface to serialize all commands to a shared I2C interface
* for a specific device
* @param Dev Device Handle
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_LockSequenceAccess(struct vl_data *Dev);
/**
* Unlock comms interface to serialize all commands to a shared I2C interface
* for a specific device
* @param Dev Device Handle
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_UnlockSequenceAccess(struct vl_data *Dev);
/**
* Writes the supplied byte buffer to the device
* @param Dev Device Handle
* @param index The register index
* @param pdata Pointer to uint8_t buffer containing the data
* to be written
* @param count Number of bytes in the supplied byte buffer
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_WriteMulti(struct vl_data *Dev, uint8_t index,
uint8_t *pdata, uint32_t count);
/**
* Reads the requested number of bytes from the device
* @param Dev Device Handle
* @param index The register index
* @param pdata Pointer to the uint8_t buffer to store read data
* @param count Number of uint8_t's to read
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_ReadMulti(struct vl_data *Dev, uint8_t index,
uint8_t *pdata, uint32_t count);
/**
* Write single byte register
* @param Dev Device Handle
* @param index The register index
* @param data 8 bit register data
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_WrByte(struct vl_data *Dev, uint8_t index, uint8_t data);
/**
* Write word register
* @param Dev Device Handle
* @param index The register index
* @param data 16 bit register data
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_WrWord(struct vl_data *Dev, uint8_t index, uint16_t data);
/**
* Write double word (4 byte) register
* @param Dev Device Handle
* @param index The register index
* @param data 32 bit register data
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_WrDWord(struct vl_data *Dev, uint8_t index, uint32_t data);
/**
* Read single byte register
* @param Dev Device Handle
* @param index The register index
* @param data pointer to 8 bit data
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_RdByte(struct vl_data *Dev, uint8_t index, uint8_t *data);
/**
* Read word (2byte) register
* @param Dev Device Handle
* @param index The register index
* @param data pointer to 16 bit data
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_RdWord(struct vl_data *Dev, uint8_t index, uint16_t *data);
/**
* Read dword (4byte) register
* @param Dev Device Handle
* @param index The register index
* @param data pointer to 32 bit data
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_RdDWord(struct vl_data *Dev, uint8_t index, uint32_t *data);
/**
* Threat safe Update (read/modify/write) single byte register
*
* Final_reg = (Initial_reg & and_data) |or_data
*
* @param Dev Device Handle
* @param index The register index
* @param AndData 8 bit and data
* @param OrData 8 bit or data
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_UpdateByte(struct vl_data *Dev, uint8_t index,
uint8_t AndData, uint8_t OrData);
/** @} end of VL_registerAccess_group */
/**
* @brief execute delay in all polling API call
*
* A typical multi-thread or RTOs implementation is to sleep the task for
* some 5ms (with 100Hz max rate faster polling is not needed)
* if nothing specific is need you can define it as an empty/void macro
* @code
* #define VL_PollingDelay(...) (void)0
* @endcode
* @param Dev Device Handle
* @return VL_ERROR_NONE Success
* @return "Other error code" See ::int8_t
*/
int8_t VL_PollingDelay(struct vl_data *Dev);
/* usually best implemented as a real function */
/** @} end of VL_platform_group */
#endif /* _VL_PLATFORM_H_ */