/* * eth_rx_dma.hpp * * Created on: 6 мар. 2023 г. * Author: sychev */ #ifndef FREE_RTOS_ETHERNET_ETH_RX_DMA_HPP_ #define FREE_RTOS_ETHERNET_ETH_RX_DMA_HPP_ #include #include #include "handler_store/handler_store.hpp" #include "semaphore/semaphore.hpp" #include "task/task.hpp" #include "ethernet/eth_frame.h" #include "ethernet_ip/eth_stack_iface.hpp" namespace free_rtos { class EthRxFlow { public: EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_stack); bool open(uint32_t id, int32_t enetDmaRxChId); bool is_open() {return open_;} void set_passive() { passive_mode_ = true; } private: friend void rxIsrHandler(void *appData); /// Обработчик прерывания по приему friend void rxTaskHandler(void *appData); ///Задача обработки принятых пакетов void rxProcessPktTask(); ///Функция обработки принятых пакетов private: enum SignalsId { e_signalRxPkt, /// Прием пакета e_signalTotal }; uint32_t id_; /// Идентификатор канала bool open_; /// Флаг того, что dma канал уже открыт Semaphore sem_[e_signalTotal]; /// Семафоры событий Task rx_task; /// Задача приема TEthFrameMacAddr& mac_addr_; /// mac адрес uint32_t rx_pkt_counter_; EthStackIface& eth_stack_; ///------------------------------------ uint32_t rx_start_flow_idx_; uint32_t rx_flow_idx_; EnetDma_RxChHandle dma_handle_; bool passive_mode_; /// Пассивный режим, пакеты принимаются, но не передаются в стек обработки }; } #endif /* FREE_RTOS_ETHERNET_ETH_RX_DMA_HPP_ */