MotorControlModuleSDFM_TMS3.../Projects/EFC_UsbDriver/include/efc_usb/loader.h
2024-06-07 11:04:32 +03:00

133 lines
6.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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_ */