Bläddra i källkod

v20230927.patch01

huangliang 3 månader sedan
förälder
incheckning
bd5b27d99d

+ 27 - 2
amt630h-freertos/ArkmicroFiles/libcpu-amt630h/source/dwspi.c

@@ -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,13 +724,35 @@ 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) {
+			if (dws->rx_dummy_buffer) {
+				vPortFree(dws->rx_dummy_buffer);
+				dws->rx_dummy_buffer = NULL;
+			}
+			dma_stop_channel(dws->dma_rx);
+		}
+		goto end;
+	}
+	if (dws->dma_mapped) {
+		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);
+	}
 
 	xfer_len += dws->len;
 	if (xfer_len < message->length) {
@@ -909,7 +934,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;

+ 7 - 2
amt630h-freertos/lib/sfud/port/sfud_port.c

@@ -142,6 +142,7 @@ static sfud_err qspi_read(const sfud_spi *spi, uint32_t addr, sfud_qspi_read_cmd
 	struct spi_slave *slave;
 	struct qspi_message qspi_message = {0};
 	uint32_t align_size, left_size;
+	uint32_t retries = 0;
 
 	configASSERT(spi);
 	configASSERT(qspi_read_cmd_format);
@@ -154,8 +155,9 @@ static sfud_err qspi_read(const sfud_spi *spi, uint32_t addr, sfud_qspi_read_cmd
 
     xSemaphoreTake(slave->xMutex, portMAX_DELAY);
 
-	align_size = read_size & ~3;
-	left_size = read_size & 3;
+retry:
+	align_size = read_size & ~31;
+	left_size = read_size & 31;
 	if (align_size) {
 		enter_qspi_mode(spi);
 
@@ -177,6 +179,9 @@ static sfud_err qspi_read(const sfud_spi *spi, uint32_t addr, sfud_qspi_read_cmd
 	    result = slave->qspi_read(slave, &qspi_message);
 		exit_qspi_mode(spi);
 	    if (result) {
+			if (retries++ < 3) {
+				goto retry;
+			}
 	        result = SFUD_ERR_READ;
 	        goto __exit;
 	    }

+ 1 - 1
amt630h-freertos/lib/sfud/src/sfud.c

@@ -419,7 +419,7 @@ sfud_err sfud_read(const sfud_flash *flash, uint32_t addr, size_t size, uint8_t
 
     if (result == SFUD_SUCCESS) {
 #ifdef SFUD_USING_QSPI
-        if (flash->read_cmd_format.instruction != SFUD_CMD_READ_DATA) {
+        if (size > 32 && flash->read_cmd_format.instruction != SFUD_CMD_READ_DATA) {
             result = spi->qspi_read(spi, addr, (sfud_qspi_read_cmd_format *)&flash->read_cmd_format, data, size);
         } else
 #endif