2025-08-22 08:07:21 +02:00

211 lines
6.2 KiB
C

/*
*
* Copyright (c) [2020] by InvenSense, Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#ifndef _SYSTEM_INTERFACE_H_
#define _SYSTEM_INTERFACE_H_
#include "imu/inv_imu_transport.h"
/*
* Board
*/
/** @brief Initialize board.
* @return 0 on success, negative value on error.
*/
int si_board_init();
/*
* UART
*/
#define SI_UART_ID_FTDI 0
#define SI_UART_ID_EDBG 1
typedef uint32_t inv_uart_num_t;
/** @brief Configure UART to transmit characters.
* Baudrate: 921600
* Flow control: None
* @param[in] id UART to configure.
* @param[in] level Trace level (enum inv_msg_level).
* @return 0 on success, negative value on error.
*/
int si_config_uart_for_print(inv_uart_num_t id, int level);
/** @brief Configure UART to transmit binary data.
* Baudrate: 2000000
* Flow control: RTS/CTS
* @param[in] id UART to configure.
* @return 0 on success, negative value on error.
*/
int si_config_uart_for_bin(inv_uart_num_t id);
/** @brief Get user command from UART.
* @param[in] id UART to read from.
* @param[out] cmd User command if one has been sent, 0 otherwise.
* @return 0 on success, negative value on error.
*/
int si_get_uart_command(inv_uart_num_t id, char *cmd);
/*
* I/O for IMU device
*/
/** @brief Configure I/O for IMU device.
* @param[in] serif_type Serial interface type to be used.
* @return 0 on success, negative value on error.
*/
int si_io_imu_init(uint32_t serif_type);
/** @brief Read register(s) implementation for IMU device.
* @param[in] serif Serial interface.
* @param[in] reg Register address to be read.
* @param[out] buf Output data from the register.
* @param[in] len Number of byte to be read.
* @return 0 on success, negative value on error.
*/
int si_io_imu_read_reg(struct inv_imu_serif *serif, uint8_t reg, uint8_t *buf, uint32_t len);
/** @brief Write register(s) implementation for IMU device.
* @param[in] serif Serial interface.
* @param[in] reg Register address to be written.
* @param[in] buf Input data to write.
* @param[in] len Number of byte to be written.
* @return 0 on success, negative value on error.
*/
int si_io_imu_write_reg(struct inv_imu_serif *serif, uint8_t reg, const uint8_t *buf, uint32_t len);
/*
* Timers
*/
/** @brief Initialize timers IP.
* @return 0 on success, negative value on error.
*/
int si_init_timers();
/** @brief Sleep function implementation.
* @param[in] us Time to sleep in microseconds.
*/
void si_sleep_us(uint32_t us);
/** @brief Get current time function implementation.
* @return The current time in us or 0 if get_time_us pointer is null.
*/
uint64_t si_get_time_us();
/** @brief Start a periodic timer.
* @param[in] period_us Period of the timer in us.
* @param[in] callback Function to be called when period expires.
* @param[out] ch Channel number of the timer.
* @return 0 on success, negative value on error.
*/
int si_start_periodic_timer(const uint32_t period_us, void callback(void *context), int *ch);
/** @brief Stop a periodic timer.
* @param[in] ch Channel number of the timer.
* @return 0 on success, negative value on error.
*/
int si_stop_periodic_timer(int ch);
/*
* GPIO
*/
#define SI_GPIO_INT1 0
#define SI_GPIO_INT2 1
/** @brief Initializes GPIO module to trigger callback when interrupt from IMU fires.
* @param[in] int_num Interrupt pin (`SI_GPIO_INT1` or `SI_GPIO_INT2`).
* @param[in] int_cb Callback to be called when interrupt fires.
* @return 0 on success, negative value on error.
*/
int si_init_gpio_int(unsigned int_num, void (*int_cb)(void *context, unsigned int_num));
/** @brief Initializes GPIO module to initializes FSYNC output pin and trigger callback at
* a given frequency to allow user to toggle FSYNC pin at regular interval to emulate
* camera module.
* @param[in] freq Frequency at which fsync_timer_cb should be called (0 if no timer is to be enabled)
* @param[in] fsync_timer_cb Callback to be called when FSYNC timer expires.
* @return 0 on success, negative value on error.
*/
int si_start_gpio_fsync(uint32_t freq, void (*fsync_timer_cb)(void *context));
/** @brief Stop FSYNC module.
* @return 0 on success, negative value on error.
*/
int si_stop_gpio_fsync();
/** @brief Toggles GPIO FSYNC output pin.
*/
void si_toggle_gpio_fsync();
/*
* Common
*/
/** @brief Disable core interrupts.
*/
void si_disable_irq();
/** @brief Enable core interrupts.
*/
void si_enable_irq();
/*
* Error codes
*/
/** @brief In case of error, print message, file and line and block program execution.
* @param[in] rc Error code (rc).
*/
#define SI_CHECK_RC(rc) \
do { \
} while (0);
/** @brief Check return code from driver and print message if it is an error.
* @param[in] rc Return code from the driver.
* @return Error code (rc).
*/
int si_print_error_if_any(int rc);
/*
* Message
*/
enum inv_msg_level {
INV_MSG_LEVEL_OFF = 0,
INV_MSG_LEVEL_ERROR,
INV_MSG_LEVEL_WARNING,
INV_MSG_LEVEL_INFO,
INV_MSG_LEVEL_VERBOSE,
INV_MSG_LEVEL_DEBUG,
INV_MSG_LEVEL_MAX
};
#define INV_MSG(level, ...) inv_msg(level, __VA_ARGS__)
/** @brief Display a message.
* @param[in] level Level for the message
* @param[in] str Message string
* @param[in] ... Optional arguments
* @return none
*/
void inv_msg(int level, const char *str, ...);
#endif /* !_SYSTEM_INTERFACE_H_ */