ソースを参照

更新CPU工程
1. 添加对几款spi nor flash型号的支持。
2. 优化spi nor flash写效率。
3. 优化ncm传输速率过慢且大包数据崩溃问题。
4. 启用sdmmc低功耗模式。
更新MCU工程(iram版本和sram-nos版本)
1. 添加部分spi nor flash支持。
2. 优化spi nor flash写效率。
3. 优化锁相环展频功能代码。

helen 2 週間 前
コミット
ba4affba19

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

@@ -150,7 +150,7 @@ int MMC_UpdateClockRegister(struct ark_mmc_obj *mmc_obj, int div)
     }
 
     /* enable clock */
-    writel(1, mmc_obj->base + SDMMC_CLKENA);
+    writel(0x10001, mmc_obj->base + SDMMC_CLKENA); //low power
 
     /* inform CIU */
     writel(1<<31 | 1<<21, mmc_obj->base + SDMMC_CMD);

+ 1 - 0
amt630hv160-freertos-beta/ArkmicroFiles/libcpu-amt630hv160/source/usb/udc/ether.c

@@ -362,6 +362,7 @@ int usb_data_rx_proc(struct eth_dev* dev, struct usb_request *req)
 			while(header != NULL) {
 		        struct pbuf *current = header;
 		        header = header->next;
+		        current->next = NULL;
 		        ncm_ethernetif_input(ncm_netif, current);
 	    	}
 			dev->rx_frames.next = NULL;

+ 10 - 1
amt630hv160-freertos-beta/lib/sfud/inc/sfud_flash_def.h

@@ -147,7 +147,10 @@ typedef struct {
     {"A25L080", SFUD_MF_ID_AMIC, 0x30, 0x14, 1L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},                        \
     {"F25L004", SFUD_MF_ID_ESMT, 0x20, 0x13, 512L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20},                     \
     {"PCT25VF016B", SFUD_MF_ID_SST, 0x25, 0x41, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20},              \
-    {"W25H512JV", SFUD_MF_ID_WINBOND, 0x70, 0x20, 64L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, 					\
+    {"W25H512JV", SFUD_MF_ID_WINBOND, 0x70, 0x20, 64L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},                  \
+    {"GD55B01GF", SFUD_MF_ID_GIGADEVICE, 0x40, 0x1B, 128L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},              \
+    {"W25H01JV", SFUD_MF_ID_WINBOND, 0x90, 0x21, 128L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},                  \
+    {"W25H512JV-DTR", SFUD_MF_ID_WINBOND, 0x90, 0x20, 64L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},              \
 }
 #endif /* SFUD_USING_FLASH_INFO_TABLE */
 
@@ -200,6 +203,12 @@ typedef struct {
     {SFUD_MF_ID_GIGADEVICE, 0x47, 0x1A,  NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \
  	/* GD25Q256E */                                                                                \
     {SFUD_MF_ID_GIGADEVICE, 0x40, 0x19,  NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \
+    /* GD55B01GF */                                                                                \
+    {SFUD_MF_ID_GIGADEVICE, 0x40, 0x1B,  NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \
+    /* W25H01JV */                                                                                 \
+    {SFUD_MF_ID_WINBOND, 0x90, 0x21, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO},     \
+    /* W25H512JV-DTR */                                                                           \
+    {SFUD_MF_ID_WINBOND, 0x90, 0x20, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO},     \
 }
 #endif /* SFUD_USING_QSPI */
 

+ 8 - 0
amt630hv160-freertos-beta/lib/sfud/port/sfud_port.c

@@ -224,7 +224,15 @@ static void spi_unlock(const sfud_spi *spi)
 
 static void retry_delay_100us(void) {
 	/* 100 microsecond delay */
+
+#if 1
+	int time = get_timer(0);
+	while (get_timer(0) - time < 100) {
+		taskYIELD();
+	}
+#else
 	vTaskDelay((configTICK_RATE_HZ * 1 + 9999) / 10000);
+#endif
 }
 
 sfud_err sfud_spi_port_init(sfud_flash *flash) {

+ 45 - 30
amt630hv160-mcu/amt630hv160-mcu-iram/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_clk.c

@@ -21,19 +21,19 @@
 #define AHBPLL_FREQ				240000000	//240M
 #define GPUPLL_FREQ				500000000	//500M
 
-#define SYSPLL_SPRD_EN			0//1
-#define AHBPLL_SPRD_EN			0//1
-#define VPUPLL_SPRD_EN			0//1
-//spread spectrum permillage, for example: 5~50,范围越大,效果越好
+#define SYSPLL_SPRD_EN			0
+#define AHBPLL_SPRD_EN			0
+#define VPUPLL_SPRD_EN			0
+//spread spectrum permillage, for example: x~50,范围越大,效果越好
 //单次幅度为24M/P1/P2/REF
-//展频测试:固定P1=2 P2=1, REF=12
+//展频测试:固定P1=4, P2=1, REF=4
 #define SYSPLL_SPRD_PERM		5	//5~50
-#define AHBPLL_SPRD_PERM		5	//5~50
-#define VPUPLL_SPRD_PERM		3	//3~41
-//spread spectrum clock frequency,for example:20k~100k,越小越稳定(锁定),越大波形越倾斜
-#define SYSPLL_SPRD_FREQ		30000	//30k~100k
-#define AHBPLL_SPRD_FREQ		20000	//20k~100k
-#define VPUPLL_SPRD_FREQ		20000	//20k~100k
+#define AHBPLL_SPRD_PERM		7	//7~50
+#define VPUPLL_SPRD_PERM		4	//4~50
+//spread spectrum clock frequency,for example:1k~100k,越小越稳定(锁定),越大波形越倾斜
+#define SYSPLL_SPRD_FREQ		10000	//perm为5时, 1K <= fre <= 2M, perm为50时, 1K <= fre <= 352K
+#define AHBPLL_SPRD_FREQ		10000	//perm为7时, 1K <= fre <= 2M, perm为50时, 1K <= fre <= 240K
+#define VPUPLL_SPRD_FREQ		10000	//perm为4时, 1K <= fre <= 2M, perm为50时, 1K <= fre <= 181K
 
 static u32 ahb_clk_freq;
 static u32 apb_clk_freq;
@@ -122,16 +122,15 @@ static int CLK_SetSprd(u32 pllcfgreg, u32 sprd_permil, u32 sprd_freq)
 		return -1;
 	}
 
-	if (sprd_freq < 10000 || sprd_freq > 100000) {
-		printf("[%s], invalid freq config.\n", __func__);
-		return -1;
-	}
-
 	REFDIV = *(u32 *)pllcfgreg & 0x1f;
 	FBDIV = (*(u32 *)pllcfgreg >> 8) & 0xfff;
 	FBDIV1 = FBDIV * (1000 + sprd_permil) / 1000;
+/*
+* FBDIV1 >= FBDIV + 1, FBDIV1 <= 500
+* so, sprd_permil >= 1000 / FBDIV + 1, sprd_permil <= (500 - FBDIV) * 1000 / FBDIV
+*/
 	if (FBDIV1 < 16 || FBDIV1 > 500 || FBDIV1 == FBDIV) {
-		printf("FBDIV1 MIN: %d, MAX: %d.\n", (FBDIV + 1) * 1000 / (CLK_GetPLLFreq(SYSCTRL->VPUPLL_CFG) / 1000000), (500 - FBDIV) * 1000 / (CLK_GetPLLFreq(SYSCTRL->VPUPLL_CFG) / 1000000));
+		printf("sprd_permil MIN: %d, MAX: %d.\n", 1000 / FBDIV + 1, MIN((500 - FBDIV) * 1000 / FBDIV, 1000));
 		return -1;
 	}
 
@@ -142,18 +141,28 @@ static int CLK_SetSprd(u32 pllcfgreg, u32 sprd_permil, u32 sprd_freq)
 	}
 
 	max_offset = FBDIV1 - FBDIV;
-	unit_freq = HSE_Value / 4 / REFDIV * FBDIV; //default 4
-	sprd_val = unit_freq / max_offset / 2 / sprd_freq;
-	if (sprd_val & ~(0xfff)) {
-		printf("[%s], sprd_val para except.\n", __func__);
+	unit_freq = HSE_Value / REFDIV;
+	sprd_val = unit_freq / (max_offset * 2 + 1) / sprd_freq;
+/*
+ * sprd_permil fixed, so the coeff(unit_freq / (max_offset * 2 + 1)) is also fixed.
+ * 1 <= sprd_val <= 4096
+ * coeff / 4096 <= sprd_freq <= coeff
+*/
+	if ((sprd_val - 1) & (~(0xfff))) {
+		printf("sprd_val overrun.\n");
+		u32 coeff = unit_freq / (max_offset * 2 + 1);
+		printf("sprd_freq min:%d, max:%d.\n", coeff / 4096, coeff);
 		return -1;
 	}
 
+	//test
+	//printf("sprd_permil MIN: %d, MAX: %d.\n", MAX(1, 1000 / FBDIV + 1), MIN((500 - FBDIV) * 1000 / FBDIV, 1000));
+	//u32 coeff = unit_freq / (max_offset * 2 + 1);
+	//printf("sprd_freq min:%d, max:%d.\n", coeff / 4096, coeff);
+
 	val = *(u32 *)pllsprdcfgreg;
-	val &= ~(0x1 << 30);
-	val &= ~(0xfff << 16);
-	val |= (max_offset & 0xfff) << 16;
-	val |= sprd_val & 0xfff;
+	val &= ~((0x1 << 30) | (0xfff << 16) | (0xfff << 0));
+	val |= (((max_offset & 0xfff) << 16) | ((sprd_val - 1) & 0xfff));
 	*(u32 *)pllsprdcfgreg = val;
 	return 0;
 }
@@ -170,16 +179,16 @@ void CLK_SetFreq(u32 pllcfgreg, u64 freq, u8 ensprd)
 		if (ensprd) {
 			sprd_permil = SYSPLL_SPRD_PERM;
 			sprd_freq = SYSPLL_SPRD_FREQ;
-			refdiv = 12;
-		} else {
-			postdiv1 = 4;
+			refdiv = 4;
 		}
+		postdiv1 = 4;
 	} else if (pllcfgreg == (u32)&SYSCTRL->AHBPLL_CFG) {
 		SYSCTRL->AHBPLL_SPRD_CTL |= (1 << 30);
 		if (ensprd) {
 			sprd_permil = AHBPLL_SPRD_PERM;
 			sprd_freq = AHBPLL_SPRD_FREQ;
-			refdiv = 12;
+			refdiv = 4;
+			postdiv1 = 4;
 		} else {
 			postdiv1 = 3;
 		}
@@ -188,7 +197,8 @@ void CLK_SetFreq(u32 pllcfgreg, u64 freq, u8 ensprd)
 		if (ensprd) {
 			sprd_permil = VPUPLL_SPRD_PERM;
 			sprd_freq = VPUPLL_SPRD_FREQ;
-			refdiv = 12;
+			refdiv = 4;
+			postdiv1 = 4;
 		}
 	} else {
 		if (ensprd) {
@@ -197,6 +207,11 @@ void CLK_SetFreq(u32 pllcfgreg, u64 freq, u8 ensprd)
 		}
 	}
 
+	if (refdiv < 1 || refdiv> 4) {
+		printf("pll refdiv illegal, please reconfigure refdiv.\n");
+		while(1);
+	}
+
 	/* POSTDIV1 should >= POSTDIV2 */
 	fbdiv = (freq * postdiv1 * postdiv2 * refdiv / HSE_Value) & 0xfff; //freq / 2
 	if (fbdiv < 16 || fbdiv > 500) {

+ 11 - 3
amt630hv160-mcu/amt630hv160-mcu-iram/src/lib/sfud/port/sfud_port.c

@@ -28,7 +28,7 @@
 
 #include <sfud.h>
 #include <stdarg.h>
-
+#include "amt630hv160_lib.h"
 #include "spi.h"
 
 #define SFUD_SPI_MAX_HZ 50000000
@@ -222,8 +222,16 @@ static void spi_unlock(const sfud_spi *spi)
 }
 
 static void retry_delay_100us(void) {
-    /* 100 microsecond delay */
-    vTaskDelay((configTICK_RATE_HZ * 1 + 9999) / 10000);
+	/* 100 microsecond delay */
+
+#if 1
+	int time = TIMER_GetMicrosec(0);
+	while (TIMER_GetMicrosec(0) - time < 100) {
+		taskYIELD();
+	}
+#else
+	vTaskDelay((configTICK_RATE_HZ * 1 + 9999) / 10000);
+#endif
 }
 
 sfud_err sfud_spi_port_init(sfud_flash *flash) {

+ 45 - 30
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_clk.c

@@ -21,19 +21,19 @@
 #define AHBPLL_FREQ				240000000	//240M
 #define GPUPLL_FREQ				500000000	//500M
 
-#define SYSPLL_SPRD_EN			0//1
-#define AHBPLL_SPRD_EN			0//1
-#define VPUPLL_SPRD_EN			0//1
-//spread spectrum permillage, for example: 5~50,范围越大,效果越好
+#define SYSPLL_SPRD_EN			0
+#define AHBPLL_SPRD_EN			0
+#define VPUPLL_SPRD_EN			0
+//spread spectrum permillage, for example: x~50,范围越大,效果越好
 //单次幅度为24M/P1/P2/REF
-//展频测试:固定P1=2 P2=1, REF=12
+//展频测试:固定P1=4, P2=1, REF=4
 #define SYSPLL_SPRD_PERM		5	//5~50
-#define AHBPLL_SPRD_PERM		5	//5~50
-#define VPUPLL_SPRD_PERM		3	//3~41
-//spread spectrum clock frequency,for example:20k~100k,越小越稳定(锁定),越大波形越倾斜
-#define SYSPLL_SPRD_FREQ		30000	//30k~100k
-#define AHBPLL_SPRD_FREQ		20000	//20k~100k
-#define VPUPLL_SPRD_FREQ		20000	//20k~100k
+#define AHBPLL_SPRD_PERM		7	//7~50
+#define VPUPLL_SPRD_PERM		4	//4~50
+//spread spectrum clock frequency,for example:1k~100k,越小越稳定(锁定),越大波形越倾斜
+#define SYSPLL_SPRD_FREQ		10000	//perm为5时, 1K <= fre <= 2M, perm为50时, 1K <= fre <= 352K
+#define AHBPLL_SPRD_FREQ		10000	//perm为7时, 1K <= fre <= 2M, perm为50时, 1K <= fre <= 240K
+#define VPUPLL_SPRD_FREQ		10000	//perm为4时, 1K <= fre <= 2M, perm为50时, 1K <= fre <= 181K
 
 static u32 ahb_clk_freq;
 static u32 apb_clk_freq;
@@ -122,16 +122,15 @@ static int CLK_SetSprd(u32 pllcfgreg, u32 sprd_permil, u32 sprd_freq)
 		return -1;
 	}
 
-	if (sprd_freq < 10000 || sprd_freq > 100000) {
-		printf("[%s], invalid freq config.\n", __func__);
-		return -1;
-	}
-
 	REFDIV = *(u32 *)pllcfgreg & 0x1f;
 	FBDIV = (*(u32 *)pllcfgreg >> 8) & 0xfff;
 	FBDIV1 = FBDIV * (1000 + sprd_permil) / 1000;
+/*
+* FBDIV1 >= FBDIV + 1, FBDIV1 <= 500
+* so, sprd_permil >= 1000 / FBDIV + 1, sprd_permil <= (500 - FBDIV) * 1000 / FBDIV
+*/
 	if (FBDIV1 < 16 || FBDIV1 > 500 || FBDIV1 == FBDIV) {
-		printf("FBDIV1 MIN: %d, MAX: %d.\n", (FBDIV + 1) * 1000 / (CLK_GetPLLFreq(SYSCTRL->VPUPLL_CFG) / 1000000), (500 - FBDIV) * 1000 / (CLK_GetPLLFreq(SYSCTRL->VPUPLL_CFG) / 1000000));
+		printf("sprd_permil MIN: %d, MAX: %d.\n", 1000 / FBDIV + 1, MIN((500 - FBDIV) * 1000 / FBDIV, 1000));
 		return -1;
 	}
 
@@ -142,18 +141,28 @@ static int CLK_SetSprd(u32 pllcfgreg, u32 sprd_permil, u32 sprd_freq)
 	}
 
 	max_offset = FBDIV1 - FBDIV;
-	unit_freq = HSE_Value / 4 / REFDIV * FBDIV; //default 4
-	sprd_val = unit_freq / max_offset / 2 / sprd_freq;
-	if (sprd_val & ~(0xfff)) {
-		printf("[%s], sprd_val para except.\n", __func__);
+	unit_freq = HSE_Value / REFDIV;
+	sprd_val = unit_freq / (max_offset * 2 + 1) / sprd_freq;
+/*
+ * sprd_permil fixed, so the coeff(unit_freq / (max_offset * 2 + 1)) is also fixed.
+ * 1 <= sprd_val <= 4096
+ * coeff / 4096 <= sprd_freq <= coeff
+*/
+	if ((sprd_val - 1) & (~(0xfff))) {
+		printf("sprd_val overrun.\n");
+		u32 coeff = unit_freq / (max_offset * 2 + 1);
+		printf("sprd_freq min:%d, max:%d.\n", coeff / 4096, coeff);
 		return -1;
 	}
 
+	//test
+	//printf("sprd_permil MIN: %d, MAX: %d.\n", MAX(1, 1000 / FBDIV + 1), MIN((500 - FBDIV) * 1000 / FBDIV, 1000));
+	//u32 coeff = unit_freq / (max_offset * 2 + 1);
+	//printf("sprd_freq min:%d, max:%d.\n", coeff / 4096, coeff);
+
 	val = *(u32 *)pllsprdcfgreg;
-	val &= ~(0x1 << 30);
-	val &= ~(0xfff << 16);
-	val |= (max_offset & 0xfff) << 16;
-	val |= sprd_val & 0xfff;
+	val &= ~((0x1 << 30) | (0xfff << 16) | (0xfff << 0));
+	val |= (((max_offset & 0xfff) << 16) | ((sprd_val - 1) & 0xfff));
 	*(u32 *)pllsprdcfgreg = val;
 	return 0;
 }
@@ -170,16 +179,16 @@ void CLK_SetFreq(u32 pllcfgreg, u64 freq, u8 ensprd)
 		if (ensprd) {
 			sprd_permil = SYSPLL_SPRD_PERM;
 			sprd_freq = SYSPLL_SPRD_FREQ;
-			refdiv = 12;
-		} else {
-			postdiv1 = 4;
+			refdiv = 4;
 		}
+		postdiv1 = 4;
 	} else if (pllcfgreg == (u32)&SYSCTRL->AHBPLL_CFG) {
 		SYSCTRL->AHBPLL_SPRD_CTL |= (1 << 30);
 		if (ensprd) {
 			sprd_permil = AHBPLL_SPRD_PERM;
 			sprd_freq = AHBPLL_SPRD_FREQ;
-			refdiv = 12;
+			refdiv = 4;
+			postdiv1 = 4;
 		} else {
 			postdiv1 = 3;
 		}
@@ -188,7 +197,8 @@ void CLK_SetFreq(u32 pllcfgreg, u64 freq, u8 ensprd)
 		if (ensprd) {
 			sprd_permil = VPUPLL_SPRD_PERM;
 			sprd_freq = VPUPLL_SPRD_FREQ;
-			refdiv = 12;
+			refdiv = 4;
+			postdiv1 = 4;
 		}
 	} else {
 		if (ensprd) {
@@ -197,6 +207,11 @@ void CLK_SetFreq(u32 pllcfgreg, u64 freq, u8 ensprd)
 		}
 	}
 
+	if (refdiv < 1 || refdiv> 4) {
+		printf("pll refdiv illegal, please reconfigure refdiv.\n");
+		while(1);
+	}
+
 	/* POSTDIV1 should >= POSTDIV2 */
 	fbdiv = (freq * postdiv1 * postdiv2 * refdiv / HSE_Value) & 0xfff; //freq / 2
 	if (fbdiv < 16 || fbdiv > 500) {

+ 8 - 2
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/lib/sfud/port/sfud_port.c

@@ -198,8 +198,14 @@ __exit:
 #endif /* SFUD_USING_QSPI */
 
 static void retry_delay_100us(void) {
-    /* 100 microsecond delay */
-    TIMER_Mdelay((1000 * 1 + 9999) / 10000);
+	/* 100 microsecond delay */
+
+#if 1
+	int time = TIMER_GetMicrosec(0);
+	while (TIMER_GetMicrosec(0) - time < 100);
+#else
+	vTaskDelay((configTICK_RATE_HZ * 1 + 9999) / 10000);
+#endif
 }
 
 sfud_err sfud_spi_port_init(sfud_flash *flash) {