Преглед изворни кода

更新CPU工程:优化spi nand falsh的读数据速度,提升至10MB/s左右

helen пре 1 недеља
родитељ
комит
852905c2ef

+ 3 - 1
amt630hv160-freertos-beta/ArkmicroFiles/libcpu-amt630hv160/source/dwspi.c

@@ -968,8 +968,10 @@ static void dwspi_jedec252_reset(const dw_spi_obj_t *dw_spi_obj)
 static void dw_spi_dma_complete_callback(void *param, unsigned int mask)
 {
 	struct dw_spi *dws = param;
+	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
 
-	xQueueSendFromISR(dws->xfer_done, NULL, 0);
+	xQueueSendFromISR(dws->xfer_done, NULL, &xHigherPriorityTaskWoken);
+	 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 static int dw_spi_dma_init(struct dw_spi *dws)

+ 23 - 10
amt630hv160-freertos-beta/lib/sfud/port/sfud_port.c

@@ -85,6 +85,9 @@ static const sfud_spi_cfg_t spi_cfg_tab[] = {
 };
 
 static char log_buf[256];
+#if defined(SFUD_USING_QSPI) || defined(SNFUD_USING_QSPI)
+static int qspi_mode = 0;
+#endif
 
 void sfud_log_debug(const char *file, const long line, const char *format, ...);
 
@@ -227,14 +230,18 @@ static sfud_err qspi_read(const sfud_spi *spi, uint32_t addr, sfud_qspi_read_cmd
 	slave = spi->user_data;
 	configASSERT(slave);
 
-	//xSemaphoreTake(slave->xMutex, portMAX_DELAY);
+	if (qspi_mode == 0) {
+		result = enter_qspi_mode(spi);
+		if (result == SFUD_SUCCESS) {
+			qspi_mode = 1;
+		}
+	}
 
+	xSemaphoreTake(slave->xMutex, portMAX_DELAY);
 retry:
 	align_size = read_size & ~(ARCH_DMA_MINALIGN - 1);
 	left_size = read_size & (ARCH_DMA_MINALIGN - 1);
 	if (align_size) {
-		enter_qspi_mode(spi);
-
 		/* initial message */
 		qspi_message.message.recv_buf = read_buf;
 		qspi_message.message.length = align_size;
@@ -248,11 +255,9 @@ retry:
 		qspi_message.dummy_cycles = qspi_read_cmd_format->dummy_cycles;
 		qspi_message.qspi_data_lines = qspi_read_cmd_format->data_lines;
 
-		xSemaphoreTake(slave->xMutex, portMAX_DELAY);
 		/* transfer message */
 		result = slave->qspi_read(slave, &qspi_message);
-		xSemaphoreGive(slave->xMutex);
-		exit_qspi_mode(spi);
+
 		if (result) {
 			if (retries++ < 3) {
 				goto retry;
@@ -264,7 +269,6 @@ retry:
 	}
 
 	if (left_size) {
-		xSemaphoreTake(slave->xMutex, portMAX_DELAY);
 		uint8_t cmd_data[5], cmd_size;
 		int i;
 
@@ -279,11 +283,10 @@ retry:
 			cmd_data[i] = (addr >> ((cmd_size - (i + 1)) * 8)) & 0xFF;
 
 		result = spi->wr(spi, cmd_data, cmd_size, read_buf + align_size, left_size);
-		xSemaphoreGive(slave->xMutex);
 	}
 
 __exit:
-	//xSemaphoreGive(slave->xMutex);
+	xSemaphoreGive(slave->xMutex);
 
 	return result;
 }
@@ -379,7 +382,17 @@ sfud_err sfud_spi_port_init(sfud_flash *flash) {
 	flash->retry.times = 60 * 10000;
 	flash->spi.flash = flash;
 
-	return result;
+#if defined(SFUD_USING_QSPI) || defined(SNFUD_USING_QSPI)
+	result = enter_qspi_mode(&flash->spi);
+	if (result != SFUD_SUCCESS) {
+		printf("Set %s qspi mode failed\n", flash->spi.name);
+		qspi_mode = 0;
+	} else {
+		qspi_mode = 1;
+	}
+#endif
+
+	return SFUD_SUCCESS;
 }
 
 /**

+ 21 - 9
amt630hv160-freertos-beta/lib/sfud/src/snfud.c

@@ -7,11 +7,15 @@
 #include "snfud_def.h"
 #include "FreeRTOS.h"
 #include "task.h"
+#include "timer.h"
 
 #if DEVICE_TYPE_SELECT == SPI_NAND_FLASH
 #define SNF_GET_CHIP(flash)			((flash)->user_data)
 #define SNF_SET_CHIP(chip, flash)	(flash)->user_data = chip
 #define SNFUD_ASSERT(EXPR) if (!(EXPR)) {printf("ERR: [func:%s line:%d] Assert(%s) fail.\n", __func__, __LINE__, #EXPR); while (1);}
+#define SNFUD_RETRY_PROCESS(delay, retry, result)			\
+    if (retry-- == 0) {result = SFUD_ERR_TIMEOUT; break;}	\
+    else {snf_delay_us(delay);}
 
 
 enum {
@@ -185,6 +189,13 @@ static sfud_err snf_qspi_fast_read_enable(sfud_flash *flash, uint8_t data_line_w
 }
 #endif /* SNFUD_USING_QSPI */
 
+static void snf_delay_us(unsigned int us) {
+	int time = get_timer(0);
+	while (get_timer(0) - time < us) {
+		taskYIELD();
+	}
+}
+
 static int snf_reg_read(const sfud_flash *flash, uint8_t opcode, uint8_t *value)
 {
 	int result = SFUD_SUCCESS;
@@ -260,19 +271,21 @@ static sfud_err snf_wait_read_busy(const sfud_flash *flash, uint8_t *status)
 
 	chip = SNF_GET_CHIP(flash);
 	if (!chip->priv_info || !chip->priv_info->crbsyBit) {
-		return snf_wait_busy(flash, status);
+		read_busy_bit = SNFUD_STATUS_REG_BUSY;
+	} else {
+		read_busy_bit = (1 << chip->priv_info->crbsyBit);
 	}
-	read_busy_bit = chip->priv_info->crbsyBit;
 
+	snf_delay_us(45);	//delay 45 us.
 	while (1) {
-		result = snf_reg_read(flash, SNFUD_CMD_STATUS_REG, status);
+		result = snf_reg_read(flash, SNFUD_CMD_STATUS_REG, status);		// spend 7~8us
 		if (result == SFUD_SUCCESS) {
-			if (!(*status & (1 << read_busy_bit))) {
+			if (!(*status & read_busy_bit)) {
 				return SFUD_SUCCESS;
 			}
 		}
 		/* retry counts */
-		SFUD_RETRY_PROCESS(flash->retry.delay, retry_times, result);
+		SNFUD_RETRY_PROCESS(10, retry_times, result);	//delay 10us every time.
 	}
 
 	return SFUD_ERR_TIMEOUT;
@@ -661,7 +674,7 @@ static int snf_write_physical_blcok(snfud_flash_chip *chip, uint32_t phy_blk, ui
 		if (result != SFUD_SUCCESS) {
 			SFUD_INFO("%s write page fail, result:%d.", __func__, result);
 			return result;
-		}			
+		}
 		curr_page++;
 		remain -= write_size;
 		pdata += write_size;
@@ -692,7 +705,7 @@ static int snf_read_physical_blcok(snfud_flash_chip *chip, uint32_t phy_blk, uin
 		if (result != SFUD_SUCCESS) {
 			SFUD_INFO("%s read page fail, result:%d", __func__, result);
 			return result;
-		}			
+		}
 		curr_page++;
 		remain -= read_size;
 		pdata += read_size;
@@ -1284,7 +1297,7 @@ sfud_err snfud_chip_erase(const sfud_flash *flash)
 	if (flash->spi.unlock) {
 		flash->spi.unlock(&flash->spi);
 	}
-	
+
 	SFUD_INFO("%s done.", __func__);
 
 	return result;
@@ -1585,7 +1598,6 @@ sfud_err snfud_read_one(const sfud_flash *flash, uint32_t addr, size_t size, uin
 	snf_part_info *part;
 	uint8_t status;
 	uint32_t blk;
-	
 
 	SNFUD_ASSERT(flash);
 	/* must be call this function after initialize OK */