В чем может быть причина того, что DMA arm (pl081) не смог передать полные данные с подчиненного периферийного устройства? и DMA не удалось скопировать функцию обратного вызова, а также - PullRequest
0 голосов
/ 23 января 2019

Я работаю над драйвером устройства ядра Linux , хотел использовать DMA (ARM-PL081) для приема данных из периферийного fifo в буфер ядра, выделенный dma_alloc_coherent () . конфигурация приемного канала выглядит следующим образом:

#define HSRX_DMA_BUFFER_SIZE    PAGE_SIZE

struct hsrx_dmarx_data *dmarx = &hsrx_local->dmarx;
struct dma_chan *rxchan = dmarx->chan;
struct hsrx_sgbuf *sgbuf = &hsrx_local->dmarx.sgbuf_a;
struct dma_slave_config rx_conf = {
    .src_addr = (dma_addr_t)hsrx_local->phy_rx_addr,
    .src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
    .direction = DMA_DEV_TO_MEM,
    .src_maxburst = 32,
    .device_fc = false,
};

dma_addr_t dma_addr;
sg->buf = dma_alloc_coherent(chan->device->dev,
        HSRX_DMA_BUFFER_SIZE, &dma_addr, GFP_KERNEL);

rxdesc = dmaengine_prep_slave_sg(rxchan, &sgbuf->sg, 1,
        DMA_DEV_TO_MEM,
        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);

if (!rxdesc) {
    goto err_busy;
}
rxdesc->callback = hsrx_dma_callback;
rxdesc->callback_param = hsrx_local;

dmarx->cookie = dmaengine_submit(rxdesc);
if (dma_submit_error(dmarx->cookie)) {
    dev_err(hsrx_local->dev, "DMA submit failed\n");
    goto err_submit;
}

dma_async_issue_pending(rxchan);

при отправке и выдаче канала DMA. Функция обратного вызова DMA не вызывается и не может выполнить более одной пакетной передачи.

  1. Как заставить DMA работать для нескольких пакетных передач?
  2. что может быть причиной того, что функция обратного вызова DMA не начала вызываться?
  3. или какая-либо важная последовательность отсутствует в PMA Engine DMA?

Любая помощь или указатели будут глубоко оценены.

Спасибо.

...