A59 -V1.1版本提交
This commit is contained in:
@ -160,6 +160,7 @@ struct dw_spi {
|
||||
void (*transfer_handler)(struct dw_spi *dws);
|
||||
u32 current_freq; /* frequency in hz */
|
||||
u32 current_qspi_freq;
|
||||
int xfer_ret;
|
||||
|
||||
/* DMA info */
|
||||
int dma_inited;
|
||||
@ -404,6 +405,7 @@ static void dma_transfer(struct dw_spi *dws)
|
||||
|
||||
dw_readl(dws, DW_SPI_ICR);
|
||||
int_error_stop(dws, "dma_transfer: fifo overrun/underrun");
|
||||
dws->xfer_ret = 1;
|
||||
xQueueSendFromISR(dws->xfer_done, NULL, 0);
|
||||
|
||||
return;
|
||||
@ -626,6 +628,7 @@ xfer_continue:
|
||||
if (ndf > 0xffff) ndf = 0xffff;
|
||||
|
||||
dws->dma_mapped = 1;
|
||||
dws->xfer_ret = 0;
|
||||
dws->rx = (u8*)message->recv_buf + xfer_len;
|
||||
dws->len = (ndf + 1) * dws->n_bytes;
|
||||
dws->rx_end = (u8*)dws->rx + dws->len;
|
||||
@ -721,11 +724,30 @@ xfer_continue:
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (dws->dma_mapped && dws->rx_dummy_buffer) {
|
||||
if (dws->xfer_ret) {
|
||||
dws->xfer_ret = 0;
|
||||
ret = -1;
|
||||
if (dws->dma_mapped)
|
||||
dma_stop_channel(dws->dma_rx);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (dws->dma_mapped) {
|
||||
/* Invalidate cache after dma read, rx and len must align to cacheline(32bytes) */
|
||||
portDISABLE_INTERRUPTS();
|
||||
if (dws->rx_dummy_buffer)
|
||||
CP15_invalidate_dcache_for_dma((uint32_t)dws->rx_dummy_buffer,
|
||||
(uint32_t)dws->rx_dummy_buffer + dws->len);
|
||||
else
|
||||
CP15_invalidate_dcache_for_dma((uint32_t)dws->rx, (uint32_t)dws->rx + dws->len);
|
||||
portENABLE_INTERRUPTS();
|
||||
|
||||
if (dws->rx_dummy_buffer) {
|
||||
memcpy(dws->rx, dws->rx_dummy_buffer, dws->len);
|
||||
vPortFree(dws->rx_dummy_buffer);
|
||||
dws->rx_dummy_buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
dma_stop_channel(dws->dma_rx);
|
||||
|
||||
@ -764,8 +786,7 @@ int dw_spi_setup(struct spi_slave *slave, struct spi_configuration *configuratio
|
||||
chip->qspi_clk_div = (DIV_ROUND_UP(dws->max_freq, configuration->qspi_max_hz) + 1) & 0xfffe;
|
||||
dws->current_freq = dws->max_freq / chip->clk_div;
|
||||
dws->current_qspi_freq = dws->max_freq / chip->qspi_clk_div;
|
||||
printf("spi max_freq %u, current freq %u, qspi_freq %u.\n", dws->max_freq,
|
||||
dws->current_freq, dws->current_qspi_freq);
|
||||
printf("spi max_freq %u, current freq %u, qspi_freq %u.\n", dws->max_freq, dws->current_freq, dws->current_qspi_freq);
|
||||
|
||||
gpio_direction_output(dws->cs_gpio,
|
||||
!(dws->slave.mode & SPI_CS_HIGH));
|
||||
@ -909,7 +930,7 @@ static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_message *message)
|
||||
cfg.direction = DMA_DEV_TO_MEM;
|
||||
cfg.src_addr = REGS_SPI0_BASE + DW_SPI_DR;
|
||||
//if (((u32)dws->rx/* | dws->len*/) & (ARCH_DMA_MINALIGN - 1)) {
|
||||
if ((u32)dws->rx & 3) {
|
||||
if ((u32)dws->rx & 31) {
|
||||
dws->rx_dummy_buffer = pvPortMalloc(dws->len);
|
||||
if (!dws->rx_dummy_buffer)
|
||||
return -ENOMEM;
|
||||
|
Reference in New Issue
Block a user