A59 -V1.1版本提交

This commit is contained in:
2024-10-10 17:41:53 +08:00
parent 16b6433a98
commit 5f032cd320
903 changed files with 171909 additions and 22876 deletions

View File

@ -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;