/*
 * __________________________________________________________________
 *
 * Copyright (C) [2023] 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 "uart.h"
#include "Invn/Drivers/Ixm42xxx/Ixm42xxxTransport.h"

/* TODO: Move that somewhere else */
#ifndef TO_MASK
#define TO_MASK(a) (1U << (unsigned)(a))
#endif

void config_uart(inv_uart_num_t log_uart_id);
void config_command_uart(inv_uart_num_t cmd_uart_id, void ext_interrupt_uart_main_cb(void *));

/** @brief I3C context definition
 */
typedef struct {
	int (*idd_io_hal_i3c_detect_soft_reset) (uint8_t, const uint8_t *);
} idd_io_hal_i3c_context_t;

/* /!\ When used, the below function be should called before inv_io_hal_board_init */
void inv_io_hal_configure_spi_speed(uint8_t spi_freq_mhz);
int inv_io_hal_init(struct inv_ixm42xxx_serif * serif);
int inv_io_hal_configure(struct inv_ixm42xxx_serif * serif);
int inv_io_hal_read_reg(struct inv_ixm42xxx_serif * serif, uint8_t reg, uint8_t * rbuffer, uint32_t rlen);
int inv_io_hal_write_reg(struct inv_ixm42xxx_serif * serif, uint8_t reg, const uint8_t * wbuffer, uint32_t wlen);

int akm_io_hal_init(void * serif);
int akm_io_hal_read_reg(void * serif, uint8_t reg, uint8_t * rbuffer, uint32_t rlen);
int akm_io_hal_write_reg(void * serif, uint8_t reg, const uint8_t * wbuffer, uint32_t wlen);


#endif /* !_SYSTEM_INTERFACE_H_ */
