예제 #1
0
UartDevice::UartDevice(const Initializer &initializer)
    : m_rx_buf{new RxBuffer},
m_rx_isr(initializer.config.rx_isr),
m_tx_buf(new TxBuffer(initializer.config.tx_buf_size)),
m_is_tx_idle(true),
//m_tx_dma_channel(initializer.config.tx_dma_channel),
m_dma(nullptr),
m_uart(nullptr)
{
    Uart::Config &&uart_config = initializer.GetUartConfig();
    uart_config.rx_isr = std::bind(&UartDevice::OnRxFull, this, placeholders::_1);
    if (!IsUseDma())
    {
        uart_config.tx_isr = std::bind(&UartDevice::OnTxEmpty, this,
                                       placeholders::_1);
    }
    m_uart = Uart(uart_config);

    if (IsUseDma())
    {
        m_dma_config.reset(new Dma::Config);
        m_dma_config->src.addr = nullptr; // temp
        m_dma_config->src.offset = 1;
        m_dma_config->src.size = Dma::Config::TransferSize::k1Byte;
        m_dma_config->src.major_offset = 0;
        m_dma_config->major_count = 0;
        m_uart.ConfigTxAsDmaDst(m_dma_config.get());
        m_dma_config->complete_isr = std::bind(&UartDevice::OnTxDmaComplete,
                                               this, placeholders::_1);
    }

    m_uart.SetEnableRxIrq(true);
}