Jelajahi Sumber

update:dma多块传输并没有提高传输效率,传输量大时也不太稳定,不过能提高开发效率,保留代码但是不开放
add:spiflash解除锁定

alienwalker 4 tahun lalu
induk
melakukan
69905a69cd

+ 59 - 3
bsp/air105/hal/core_dma.c

@@ -20,15 +20,20 @@
  */
 
 #include "user.h"
+//#define __MUTLI_BLOCKS__
 typedef struct
 {
 	const DMA_TypeDef *RegBase;
 	const uint32_t Index;
 	CBFuncEx_t CB;
 	void *pData;
+#ifdef __MUTLI_BLOCKS__
+	LLI *Linklist;
+#endif
 	uint8_t TxDir;
 }DMAChannal_struct;
 
+
 /************ operation definition for DMA  DMA_CTL_H REGISTER ************/
 #define DMA_CTL_BLOCK_TS_Pos								(0)
 #define DMA_CTL_BLOCK_TS_Mask								(0x0fffU<<DMA_CTL_BLOCK_TS_Pos)
@@ -258,11 +263,18 @@ int DMA_StartStream(uint8_t Stream, const void *Data, uint32_t Len, CBFuncEx_t C
 
 void DMA_ForceStartStream(uint8_t Stream, const void *Data, uint32_t Len, CBFuncEx_t CB, void *pUserData, uint8_t NeedIrq)
 {
+	uint32_t Blocks = 0, i;
 	DMA_TypeDef *hwDMA = hwDMAChannal[Stream].RegBase;
 	volatile uint32_t tmpChannelxBit = hwDMAChannal[Stream].Index;
 	DMA->ChEnReg_L = (tmpChannelxBit << 8);
 	while(DMA->ChEnReg_L & tmpChannelxBit) {;}
-
+#ifdef __MUTLI_BLOCKS__
+	if (hwDMAChannal[Stream].Linklist)
+	{
+		free(hwDMAChannal[Stream].Linklist);
+		hwDMAChannal[Stream].Linklist = NULL;
+	}
+#endif
 	if (hwDMAChannal[Stream].TxDir)
 	{
 		hwDMA->SAR_L = (uint32_t)Data;
@@ -271,8 +283,7 @@ void DMA_ForceStartStream(uint8_t Stream, const void *Data, uint32_t Len, CBFunc
 	{
 		hwDMA->DAR_L = (uint32_t)Data;
 	}
-	hwDMA->CTL_H &= ~DMA_CTL_BLOCK_TS_Mask;
-	hwDMA->CTL_H |= Len;
+
 
 	tmpChannelxBit = (tmpChannelxBit << 8) + tmpChannelxBit;
 	if (NeedIrq)
@@ -292,6 +303,44 @@ void DMA_ForceStartStream(uint8_t Stream, const void *Data, uint32_t Len, CBFunc
 	{
 		hwDMAChannal[Stream].CB = DMA_DummyCB;
 	}
+	hwDMA->CTL_L &= ~(BIT(28)|BIT(27));
+	hwDMA->CTL_H &= ~DMA_CTL_BLOCK_TS_Mask;
+	hwDMA->LLP_L = 0;
+#ifdef __MUTLI_BLOCKS__
+	if (Len > 4000)
+	{
+		Blocks = (Len / 4000) + 1;
+		hwDMAChannal[Stream].Linklist = zalloc(Blocks * sizeof(LLI));
+		hwDMA->CTL_L |= (BIT(28)|BIT(27));
+		for(i = 0; i < (Blocks - 1); i++)
+		{
+			hwDMAChannal[Stream].Linklist[i].CTL_L = hwDMA->CTL_L;
+			hwDMAChannal[Stream].Linklist[i].SAR = hwDMAChannal[Stream].TxDir?((uint32_t)Data + i * 4000):hwDMA->SAR_L;
+			hwDMAChannal[Stream].Linklist[i].DAR = hwDMAChannal[Stream].TxDir?hwDMA->DAR_L:((uint32_t)Data + i * 4000);
+			hwDMAChannal[Stream].Linklist[i].LLP = &hwDMAChannal[Stream].Linklist[i + 1];
+			hwDMAChannal[Stream].Linklist[i].CTL_H = 4000;
+		}
+		hwDMAChannal[Stream].Linklist[Blocks - 1].CTL_L = hwDMA->CTL_L;
+		hwDMAChannal[Stream].Linklist[Blocks - 1].SAR = hwDMAChannal[Stream].TxDir?((uint32_t)Data + (Blocks - 1) * 4000):hwDMA->SAR_L;
+		hwDMAChannal[Stream].Linklist[Blocks - 1].DAR = hwDMAChannal[Stream].TxDir?hwDMA->DAR_L:((uint32_t)Data + (Blocks - 1) * 4000);
+		hwDMAChannal[Stream].Linklist[Blocks - 1].LLP = 0;
+		hwDMAChannal[Stream].Linklist[Blocks - 1].CTL_H = Len - (Blocks - 1) * 4000;
+		hwDMA->LLP_L = &hwDMAChannal[Stream].Linklist[0];
+	}
+	else
+#endif
+	{
+		hwDMA->CTL_H |= Len;
+		DMA->ChEnReg_L = tmpChannelxBit;
+	}
+
+}
+
+void DMA_ForceStartStreamMultiBlocks(uint8_t Stream)
+{
+	DMA_TypeDef *hwDMA = hwDMAChannal[Stream].RegBase;
+	volatile uint32_t tmpChannelxBit = hwDMAChannal[Stream].Index;
+	tmpChannelxBit = (tmpChannelxBit << 8) + tmpChannelxBit;
 	DMA->ChEnReg_L = tmpChannelxBit;
 }
 
@@ -317,6 +366,13 @@ void DMA_StopStream(uint8_t Stream)
 	DMA->ClearSrcTran_L = tmpChannelxBit;
 	DMA->ClearDstTran_L = tmpChannelxBit;
 	DMA->ClearErr_L = tmpChannelxBit;
+#ifdef __MUTLI_BLOCKS__
+	if (hwDMAChannal[Stream].Linklist)
+	{
+		free(hwDMAChannal[Stream].Linklist);
+		hwDMAChannal[Stream].Linklist = NULL;
+	}
+#endif
 }
 
 uint32_t DMA_GetRemainingDataLength(uint8_t Stream)

+ 1 - 1
bsp/air105/include/FreeRTOSConfig.h

@@ -82,7 +82,7 @@
 #define configSUPPORT_STATIC_ALLOCATION   0
 #define configCPU_CLOCK_HZ                (SystemCoreClock)
 #define configTICK_RATE_HZ                ((TickType_t)100)
-#define configMINIMAL_STACK_SIZE          ((uint16_t)512)
+#define configMINIMAL_STACK_SIZE          ((uint16_t)256)
 #define configTOTAL_HEAP_SIZE             ((size_t)(32 * 1024))
 #define configMAX_TASK_NAME_LEN           (16)
 #define configUSE_TRACE_FACILITY          0

+ 4 - 1
bsp/common/src/core_service.c

@@ -159,7 +159,10 @@ static void prvHW_Task(void* params)
 //			SPI_Transfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size, 2);
 
 			SPI_BlockTransfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size);
-//			DBG("%u, %u", Draw->Size, (uint32_t)(GetSysTickUS() - StartUS));
+//			if (Draw->Size > 38000)
+//			{
+//				DBG("%u, %u", Draw->Size, (uint32_t)(GetSysTickUS() - StartUS));
+//			}
 			prvService.LCDDrawDoneByte += Draw->Size;
 			free(Draw->Data);
 			GPIO_Output(Draw->CSPin, 1);

+ 1 - 0
bsp/device/include/dev_spiflash.h

@@ -86,6 +86,7 @@ typedef struct
 void SPIFlash_Init(SPIFlash_CtrlStruct *Ctrl, void *Config);
 int32_t SPIFlash_ID(SPIFlash_CtrlStruct *Ctrl);
 int32_t SPIFlash_ReadSR(SPIFlash_CtrlStruct *Ctrl);
+int32_t SPIFlash_WriteSR(SPIFlash_CtrlStruct *Ctrl, uint8_t SR);
 int32_t SPIFlash_CheckBusy(SPIFlash_CtrlStruct *Ctrl);
 uint8_t SPIFlash_WaitOpDone(SPIFlash_CtrlStruct *Ctrl);
 int32_t SPIFlash_WriteEnable(SPIFlash_CtrlStruct *Ctrl);

+ 26 - 0
bsp/device/src/dev_spiflash.c

@@ -175,6 +175,21 @@ void SPIFlash_Init(SPIFlash_CtrlStruct *Ctrl, void *LFSConfig)
 	Ctrl->ProgramTime = 3;
 	Ctrl->EraseSectorTime = 400;
 	Ctrl->EraseBlockTime = 2400;
+	SPIFlash_ReadSR(Ctrl);
+	if (Ctrl->FlashSR != 0xff && Ctrl->FlashSR != 0x0)
+	{
+		if (!Ctrl->SPIError)
+		{
+			SPIFlash_WriteEnable(Ctrl);
+			SPIFlash_WriteSR(Ctrl, 0);
+			SPIFlash_ReadSR(Ctrl);
+			while(Ctrl->FlashSR & SPIFLASH_SR_BUSY)
+			{
+				SPIFlash_ReadSR(Ctrl);
+			}
+		}
+	}
+
 
 }
 
@@ -214,6 +229,9 @@ int32_t SPIFlash_ID(SPIFlash_CtrlStruct *Ctrl)
 				}
 			}
 		}
+		return -ERROR_DEVICE_BUSY;
+
+
 	}
 	return ERROR_NONE;
 }
@@ -397,6 +415,14 @@ int32_t SPIFlash_WriteEnable(SPIFlash_CtrlStruct *Ctrl)
 	return 0;
 }
 
+int32_t SPIFlash_WriteSR(SPIFlash_CtrlStruct *Ctrl, uint8_t SR)
+{
+	Ctrl->Tx[0] = SPIFLASH_CMD_WRSR;
+	Ctrl->Tx[1] = SR;
+	SPIFlash_SpiBlockXfer(Ctrl, Ctrl->Tx, Ctrl->Rx, 2);
+	return 0;
+}
+
 int32_t SPIFlash_Read(SPIFlash_CtrlStruct *Ctrl, uint32_t Address, uint8_t *Buf, uint32_t Length, uint8_t FastRead)
 {
 #ifdef __BUILD_OS__