#ifndef KSZS_REG_ACC_SPI_H
#define KSZS_REG_ACC_SPI_H

#include "kszsw_reg_acc.h"

#define KSZSW_MAX_SPI_FREQ 50000000

/***************************************************************************//**
   Тип функции, реализующей обмен по интерфейсу SPI для доступа к регистрам свича KSZ.
   Реализация должна быть выполнена в пользовательском проекта,
   т.к. зависит от конкретного подключения.

   Обмен включает в себя передачу сперва заголовка, затем данных.
   При передаче заголовка принимаемые данные отбрасываются.
   При передаче данных обмен идет двусторонний и принимаемые данные сохраняются.

   @param[in] ctx         Указатель на пользовательский контекст. Передается то же
                          значение, что и было задано при регистрации данной функции
                          с помощью kszsw_reg_acc_spi_init().
   @param[in] tx_hdr      Значения заголовка обмена для передачи размером на tx_hdr_len байт.
   @param[in] hdr_len     Длина заголовока в байтах
   @param[in] tx_data     Данные для передачи размером на data_len байт.
   @param[out] rx_data    Массив для сохранения принятых данных размером на data_len байт (если NULL - отбрасываются)
   @param[in] data_len    Количество байт на прием и передачу для стадии обмена данными.
   @return                Код ошибки.
*******************************************************************************/
typedef t_lip_errs (*t_kszsw_reg_spi_exchange)(void *ctx, const uint8_t *tx_hdr, int hdr_len, const uint8_t *tx_data, uint8_t *rx_data, int data_len);


/** Контекст доступа к регистрам свича через SPI */
typedef struct {
    void *exchange_ctx; /** Указатель на пользовательский контекст, передается
                            как есть при вызове функций обратного вызова */
    t_kszsw_reg_spi_exchange exchange_cb; /** Функция обрабтного вызова с реализацией
                                              обмена SPI для доступа к регистру свича */
} t_kszsw_reg_acc_spi_ctx;

/** Инициализация интерфейса доступа к регистрам свича через SPI */
void kszsw_reg_acc_spi_init(t_kszsw_reg_acc *reg_acc, t_kszsw_reg_acc_spi_ctx *ctx);

#endif // KSZS_REG_ACC_SPI_H
