Я работаю над драйвером устройства ядра 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 не вызывается и не может выполнить более одной пакетной передачи.
- Как заставить DMA работать для нескольких пакетных передач?
- что может быть причиной того, что функция обратного вызова DMA не начала вызываться?
- или какая-либо важная последовательность отсутствует в PMA Engine DMA?
Любая помощь или указатели будут глубоко оценены.
Спасибо.