133 lines
6.4 KiB
C
133 lines
6.4 KiB
C
/*
|
||
* loader.h
|
||
*
|
||
* Created on: 14 Sep 2023
|
||
*/
|
||
|
||
#ifndef INCLUDE_EFC_USB_LOADER_H_
|
||
#define INCLUDE_EFC_USB_LOADER_H_
|
||
|
||
#include <efc_usb/status.h>
|
||
|
||
/** @brief Пакет командного интерфейса */
|
||
struct /** @cond */ __attribute__((__packed__)) /** @endcond */
|
||
efc_usb_ld_cmd_packet {
|
||
union {
|
||
struct {
|
||
/** Размер данных в поле @c data */
|
||
uint16_t size : 16;
|
||
} bits;
|
||
uint32_t all;
|
||
} header; /**< Заголовок пакета */
|
||
|
||
/** Поле данных пакета (аргументы для Rx пакета или результаты для Tx пакета) */
|
||
uint8_t* data;
|
||
};
|
||
|
||
/**
|
||
* @brief Метод чтения FIFO последнего входящего командного пакета
|
||
*
|
||
* Метод производит прямое чтение принятых данных из аппаратного FIFO буфера USB модуля.
|
||
*
|
||
* @param buffer Буфер, в который будут записаны данные входящего пакета
|
||
* @param buffer_max_size Размер буфера
|
||
* @param received_data_size Вернет количество полученных байт
|
||
* @param data_size_avail Количество байт, которое остались непрочитанным в пакете
|
||
*
|
||
* @return @c true при успешном чтении; @c false при следующих случаях: @n
|
||
* - @c NULL аргумент;
|
||
* - Данные в буфере невалидны (принят или принимается новый пакет);
|
||
* - Драйвер не инциализирован или находится не в рабочем состоянии.
|
||
*
|
||
* @warning Операция чтения очищает FIFO буфер, повторное чтение тех же данных не возможно.
|
||
*/
|
||
efc_usb_status_t efc_usb_ld_data_recv(uint8_t* buffer, size_t buffer_max_size, size_t* received_data_size, size_t* data_size_avail);
|
||
|
||
/**
|
||
* @brief Метод записи командного пакета в FIFO буфер передатчика
|
||
*
|
||
* Метод позволяет поставить запрос на отправку командного пакета.
|
||
* При очередном IN запросе от хоста данные будут отправлены и будет возможно
|
||
* оставить новый запрос на отправку.
|
||
*
|
||
* @param tx_packet Буфер, в котором находятся данные исходящего пакета
|
||
*
|
||
* @return @c true при успешном выполнении; @c false при следующих случаях: @n
|
||
* - @c NULL аргумент;
|
||
* - Буфер драйвера еще занят;
|
||
* - Драйвер не инциализирован или находится не в рабочем состоянии.
|
||
*/
|
||
efc_usb_status_t efc_usb_ld_data_send(const uint8_t* header, size_t header_size, const uint8_t* data, size_t data_size);
|
||
|
||
/**
|
||
* @brief Обработчик сброса, инициированного хостом
|
||
*
|
||
* Вызывается после выполнения процедуры сброса состояния конфигурации дарайвера. @n
|
||
* - Буферы приёмника/передатчика считаются невалидными
|
||
* - Драйвер переводится в рабочее состояние
|
||
* - Обработка командного интерфейса включёна
|
||
*
|
||
* @param param Пользовательский параметр, передаваемый при вызове со стороны драйвера
|
||
*
|
||
* @return void
|
||
*
|
||
* @note Вызов производится из контекста обработчика прерывания
|
||
*/
|
||
typedef void (*efc_usb_ld_reset_handle_t) (void* param);
|
||
|
||
/**
|
||
* @brief Обработчик входящих командных пакетов
|
||
*
|
||
* Вызывается @b после получения и буферизации в FIFO @n
|
||
*
|
||
* В рамках обратного вызова пользователю необходимо считать буфер, используя функцию @ref efc_usb_sv_cmd_read,
|
||
* иначе данные могут быть перезаписаны асинхронно следующим входящим пакетом.
|
||
*
|
||
* @param param Пользовательский параметр, передаваемый при вызове со стороны драйвера
|
||
*
|
||
* @return void
|
||
*
|
||
* @note Вызов производится из контекста обработчика прерывания
|
||
*/
|
||
typedef void (*efc_usb_ld_cmd_rx_handle_t) (void* param);
|
||
|
||
/**
|
||
* @brief Обработчик исходящих командных пакетов
|
||
*
|
||
* Вызывается @b до буферизации в FIFO и отправки пакета @n
|
||
*
|
||
* По готовности данные могут быть записаны в буфер передатчика @ref efc_usb_sv_cmd_write.
|
||
*
|
||
* @param param Пользовательский параметр, передаваемый при вызове со стороны драйвера
|
||
*
|
||
* @return void
|
||
*
|
||
* @note Вызов производится из контекста обработчика прерывания
|
||
*/
|
||
typedef void (*efc_usb_ld_cmd_tx_handle_t) (void* param);
|
||
|
||
/** @brief Параметры командного интерфейса */
|
||
struct efc_usb_ld_cmd_config {
|
||
/** Обратный вызов приёмника командных пакетов */
|
||
efc_usb_ld_cmd_rx_handle_t rx_handle;
|
||
/** Параметр приёмника командных пакетов */
|
||
void* rx_handle_param;
|
||
/** Обратный вызов передатчика командных пакетов */
|
||
efc_usb_ld_cmd_tx_handle_t tx_handle;
|
||
/** Параметр передатчика командных пакетов */
|
||
void* tx_handle_param;
|
||
};
|
||
|
||
/** @brief Параметры конфигурации usb загрузчика */
|
||
struct efc_usb_ld_config {
|
||
/** Параметры командного интерфейса */
|
||
struct efc_usb_ld_cmd_config cmd;
|
||
|
||
/** Обратный вызов события сброса */
|
||
efc_usb_ld_reset_handle_t reset_handle;
|
||
/** Параметр обратного вызова события сброса */
|
||
void* reset_handle_param;
|
||
};
|
||
|
||
#endif /* INCLUDE_EFC_USB_LOADER_H_ */
|