Procházet zdrojové kódy

update:sdhc恢复的时候波特率低了,导致恢复速度变慢
fix:sdhc恢复的时候有内存泄露

alienwalker před 3 roky
rodič
revize
aff16b738b

+ 0 - 72
bsp/air105/test/test_sdcard.c

@@ -1,72 +0,0 @@
-#include "user.h"
-
-static int32_t prvEventCB(void *pData, void *pParam)
-{
-	DBG("!");
-	return 0;
-}
-
-void prvSDHC_Test(void *p)
-{
-	int i, ok;
-	uint32_t *Buf = malloc(65536);
-	uint32_t *Buf2 = malloc(65536);
-	SDHC_SPICtrlStruct SDHC;
-	memset(&SDHC, 0, sizeof(SDHC));
-	SDHC.SpiID = SPI_ID0;
-	SDHC.CSPin = GPIOC_13;
-	SDHC.IsSpiDMAMode = 0;
-//	SDHC.NotifyTask = Task_GetCurrent();
-//	SDHC.TaskCB = prvEventCB;
-    SDHC.SDHCReadBlockTo = 5 * CORE_TICK_1MS;
-    SDHC.SDHCWriteBlockTo = 25 * CORE_TICK_1MS;
-    SDHC.IsPrintData = 0;
-    GPIO_Iomux(GPIOC_12,2);
-    GPIO_Iomux(GPIOC_14,2);
-    GPIO_Iomux(GPIOC_15,2);
-    GPIO_Config(SDHC.CSPin, 0, 1);
-    SPI_MasterInit(SDHC.SpiID, 8, SPI_MODE_0, 400000, NULL, NULL);
-#ifdef __BUILD_OS__
-    SDHC.RWMutex = OS_MutexCreateUnlock();
-#endif
-    SDHC_SpiInitCard(&SDHC);
-    if (SDHC.IsInitDone)
-    {
-    	ok = 1;
-    	SPI_SetNewConfig(SDHC.SpiID, 24000000, SPI_MODE_0);
-    	SDHC_SpiReadCardConfig(&SDHC);
-    	DBG("卡容量 %ublock", SDHC.Info.LogBlockNbr);
-    	for(i = 0; i < 16384; i++)
-    	{
-    		Buf[i] = i;
-    	}
-    	SDHC_SpiWriteBlocks(&SDHC, Buf, 0x1000, 128);
-    	SDHC_SpiReadBlocks(&SDHC, Buf2, 0x1000, 128);
-    	for(i = 0; i < 16384; i++)
-    	{
-    		if (Buf[i] != Buf2[i])
-    		{
-    			DBG("error %u,%u,%u", i, Buf[i], Buf2[i]);
-    			ok = 0;
-    			break;
-    		}
-    	}
-    	if (ok)
-    	{
-    		DBG("TEST OK!");
-    	}
-    }
-
-	while(1)
-	{
-		Task_DelayMS(1000);
-
-	}
-}
-
-void SDHC_TestInit(void)
-{
-	Task_Create(prvSDHC_Test, NULL, 1024, SERVICE_TASK_PRO, "sdhc task");
-}
-
-//INIT_TASK_EXPORT(SDHC_TestInit, "3");

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

@@ -105,7 +105,6 @@ typedef struct
 	Buffer_Struct CacheBuf;
 	HANDLE NotifyTask;						//设置了NotifyTask,则会在大量传输SPI数据时,休眠任务但是仍然能接收Event并在CB中处理
 	CBFuncEx_t TaskCB;
-	HANDLE RWMutex;
 	uint32_t Size;							//flash的大小KB
 	uint32_t OCR;
 	DBuffer_Struct *SCSIDataBuf;

+ 17 - 11
bsp/device/src/dev_sdhc_spi.c

@@ -61,6 +61,8 @@ enum
 	SDCARD_STATE_WRITE,
 };
 
+static HANDLE prvRWMutex;
+
 static const uint8_t prvSDHC_StandardInquiryData[STANDARD_INQUIRY_DATA_LEN] =
 {
 		0x00, //磁盘设备
@@ -595,7 +597,7 @@ SDHC_SPIREADBLOCKDATA_DONE:
 static void SDHC_Recovery(SDHC_SPICtrlStruct *Ctrl)
 {
 	memset(Ctrl->TempData, 0xfd, 512);
-	SPI_SetNewConfig(Ctrl->SpiID, 2400000, 0xff);
+	SPI_SetNewConfig(Ctrl->SpiID, 12000000, 0xff);
 	GPIO_Output(Ctrl->CSPin, 0);
 	SDHC_SpiXfer(Ctrl, Ctrl->TempData, 512);
 	GPIO_Output(Ctrl->CSPin, 1);
@@ -612,7 +614,6 @@ void SDHC_SpiInitCard(void *pSDHC)
 	uint8_t i;
 	uint64_t OpEndTick;
 	SDHC_SPICtrlStruct *Ctrl = (SDHC_SPICtrlStruct *)pSDHC;
-	SDHC_Recovery(Ctrl);
 	Ctrl->IsInitDone = 0;
 	Ctrl->SDHCState = 0xff;
 	Ctrl->Info.CardCapacity = 0;
@@ -856,7 +857,7 @@ void SDHC_SpiReadBlocks(void *pSDHC, uint8_t *Buf, uint32_t StartLBA, uint32_t B
 	uint8_t error = 1;
 	SDHC_SPICtrlStruct *Ctrl = (SDHC_SPICtrlStruct *)pSDHC;
 #ifdef __BUILD_OS__
-	if (OS_MutexLockWtihTime(Ctrl->RWMutex, 1000))
+	if (OS_MutexLockWtihTime(prvRWMutex, 1000))
 	{
 		DBG("mutex wait timeout!");
 		return;
@@ -910,7 +911,7 @@ SDHC_SPIREADBLOCKS_CHECK:
 		goto SDHC_SPIREADBLOCKS_START;
 	}
 #ifdef __BUILD_OS__
-	OS_MutexRelease(Ctrl->RWMutex);
+	OS_MutexRelease(prvRWMutex);
 #endif
 	return;
 SDHC_SPIREADBLOCKS_ERROR:
@@ -918,7 +919,7 @@ SDHC_SPIREADBLOCKS_ERROR:
 	Ctrl->IsInitDone = 0;
 	Ctrl->SDHCError = 1;
 #ifdef __BUILD_OS__
-	OS_MutexRelease(Ctrl->RWMutex);
+	OS_MutexRelease(prvRWMutex);
 #endif
 	return;
 }
@@ -928,7 +929,7 @@ void SDHC_SpiWriteBlocks(void *pSDHC, const uint8_t *Buf, uint32_t StartLBA, uin
 	uint8_t Retry = 0;
 	SDHC_SPICtrlStruct *Ctrl = (SDHC_SPICtrlStruct *)pSDHC;
 #ifdef __BUILD_OS__
-	if (OS_MutexLockWtihTime(Ctrl->RWMutex, 1000))
+	if (OS_MutexLockWtihTime(prvRWMutex, 1000))
 	{
 		DBG("mutex wait timeout!");
 		return;
@@ -956,7 +957,7 @@ SDHC_SPIREADBLOCKS_START:
 		goto SDHC_SPIREADBLOCKS_START;
 	}
 #ifdef __BUILD_OS__
-	OS_MutexRelease(Ctrl->RWMutex);
+	OS_MutexRelease(prvRWMutex);
 #endif
 	return;
 SDHC_SPIREADBLOCKS_ERROR:
@@ -964,7 +965,7 @@ SDHC_SPIREADBLOCKS_ERROR:
 	Ctrl->IsInitDone = 0;
 	Ctrl->SDHCError = 1;
 #ifdef __BUILD_OS__
-	OS_MutexRelease(Ctrl->RWMutex);
+	OS_MutexRelease(prvRWMutex);
 #endif
 	return;
 }
@@ -977,7 +978,10 @@ void *SDHC_SpiCreate(uint8_t SpiID, uint8_t CSPin)
 	Ctrl->SDHCReadBlockTo = 50 * CORE_TICK_1MS;
 	Ctrl->SDHCWriteBlockTo = 50 * CORE_TICK_1MS;
 #ifdef __BUILD_OS__
-	Ctrl->RWMutex = OS_MutexCreateUnlock();
+	if (!prvRWMutex)
+	{
+		prvRWMutex = OS_MutexCreateUnlock();
+	}
 #endif
 //	Ctrl->IsPrintData = 1;
 	Ctrl->SpiSpeed = 24000000;
@@ -987,11 +991,13 @@ void *SDHC_SpiCreate(uint8_t SpiID, uint8_t CSPin)
 void SDHC_SpiRelease(void *pSDHC)
 {
 	SDHC_SPICtrlStruct *Ctrl = (SDHC_SPICtrlStruct *)pSDHC;
+
+	SDHC_Recovery(Ctrl);
 	OS_DeInitBuffer(&Ctrl->CacheBuf);
 #ifdef __BUILD_OS__
-	OS_MutexRelease(Ctrl->RWMutex);
+	OS_MutexRelease(prvRWMutex);
 	Ctrl->WaitFree = 1;
-	Task_DelayMS(10);
+	Task_DelayMS(50);
 #endif
 	DBG("free %x", pSDHC);
 }