Просмотр исходного кода

update:sdhc写入任务独立出来,变成外部存储介质读写任务

alienwalker 3 лет назад
Родитель
Сommit
b910b7a61a

+ 1 - 0
bsp/air105/hal/core_spi.c

@@ -1127,6 +1127,7 @@ void SPI_SetNewConfig(uint8_t SpiID, uint32_t Speed, uint8_t NewMode)
 	SPI_TypeDef *SPI;
 	uint32_t div;
 	if (prvSPI[SpiID].IsBusy) return;
+	if (NewMode == 0xff) {NewMode = prvSPI[SpiID].SpiMode;}
 	if ((prvSPI[SpiID].TargetSpeed == Speed) && (prvSPI[SpiID].SpiMode == NewMode))
 	{
 		return;

+ 1 - 0
bsp/common/include/core_service.h

@@ -46,6 +46,7 @@ void Core_ServiceInit(void);
 void Core_LCDDraw(LCD_DrawStruct *Draw);
 void Core_LCDDrawBlock(LCD_DrawStruct *Draw);
 void Core_CameraDraw(LCD_DrawStruct *Draw);
+void Core_WriteSDHC(void *pSDHC, void *pData);
 void Core_DecodeQR(uint8_t *ImageData, uint16_t ImageW, uint16_t ImageH,  CBDataFun_t CB);
 uint32_t Core_LCDDrawCacheLen(void);
 

+ 55 - 11
bsp/common/src/core_service.c

@@ -41,6 +41,8 @@ enum
 {
 	SERVICE_LCD_DRAW = SERVICE_EVENT_ID_START + 1,
 	SERVICE_CAMERA_DRAW,
+	SERVICE_SDHC_WRITE,
+	SERVICE_SPIFLASH_WRITE,
 	SERVICE_DECODE_QR,
 	SERVICE_SCAN_KEYBOARD,
 	SERVICE_ENCODE_JPEG_START,
@@ -53,8 +55,9 @@ typedef struct
 {
 	tje_write_func *JPEGEncodeWriteFun;
 	void *JPEGEncodeWriteParam;
-	HANDLE HardwareHandle;
+	HANDLE LCDHandle;
 	HANDLE ServiceHandle;
+	HANDLE StorgeHandle;
 	HANDLE UserHandle;
 	uint64_t LCDDrawRequireByte;
 	uint64_t LCDDrawDoneByte;
@@ -117,7 +120,7 @@ static void prv_CoreJpegSave(void* context, void* data, int size)
 
 }
 
-static void prvHW_Task(void* params)
+static void prvLCD_Task(void* params)
 {
 	uint64_t StartUS;
 	OS_EVENT Event;
@@ -132,7 +135,7 @@ static void prvHW_Task(void* params)
 	}
 	while(1)
 	{
-		Result = Task_GetEvent(prvService.HardwareHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
+		Result = Task_GetEvent(prvService.LCDHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
 		switch(Event.ID)
 		{
 		case SERVICE_LCD_DRAW:
@@ -213,7 +216,33 @@ static void prvHW_Task(void* params)
 	}
 }
 
-
+static void prvStorge_Task(void* params)
+{
+	OS_EVENT Event;
+	uint32_t *Param;
+	SDHC_SPICtrlStruct *pSDHC;
+	while(1)
+	{
+		Task_GetEventByMS(prvService.StorgeHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
+		switch(Event.ID)
+		{
+		case SERVICE_SDHC_WRITE:
+			pSDHC = (SDHC_SPICtrlStruct *)Event.Param1;
+			if (pSDHC->WaitFree)
+			{
+				DBG("sdhc wait reboot");
+				free(Event.Param2);
+				free(Event.Param3);
+				break;
+			}
+			Param = (uint32_t *)Event.Param3;
+			SDHC_SpiWriteBlocks(pSDHC, Event.Param2, Param[0], Param[1]);
+			free(Event.Param2);
+			free(Event.Param3);
+			break;
+		}
+	}
+}
 
 static void prvService_Task(void* params)
 {
@@ -385,7 +414,7 @@ uint32_t Core_LCDDrawCacheLen(void)
 void Core_LCDDraw(LCD_DrawStruct *Draw)
 {
 	prvService.LCDDrawRequireByte += Draw->Size;
-	Task_SendEvent(prvService.HardwareHandle, SERVICE_LCD_DRAW, Draw, 0, 0);
+	Task_SendEvent(prvService.LCDHandle, SERVICE_LCD_DRAW, Draw, 0, 0);
 }
 
 void Core_LCDDrawBlock(LCD_DrawStruct *Draw)
@@ -424,7 +453,15 @@ void Core_LCDDrawBlock(LCD_DrawStruct *Draw)
 
 void Core_CameraDraw(LCD_DrawStruct *Draw)
 {
-	Task_SendEvent(prvService.HardwareHandle, SERVICE_CAMERA_DRAW, Draw, 0, 0);
+	Task_SendEvent(prvService.LCDHandle, SERVICE_CAMERA_DRAW, Draw, 0, 0);
+}
+
+void Core_WriteSDHC(void *pSDHC, void *pData)
+{
+	uint32_t *Param = malloc(8);
+	Param[0] =((SDHC_SPICtrlStruct *)pSDHC)->CurBlock;
+	Param[1] = ((SDHC_SPICtrlStruct *)pSDHC)->EndBlock - ((SDHC_SPICtrlStruct *)pSDHC)->CurBlock;
+	Task_SendEvent(prvService.StorgeHandle, SERVICE_SDHC_WRITE, pSDHC, pData, Param);
 }
 
 void Core_DecodeQR(uint8_t *ImageData, uint16_t ImageW, uint16_t ImageH,  CBDataFun_t CB)
@@ -530,7 +567,7 @@ static void prvCore_PrintTaskStack(HANDLE TaskHandle)
 
 void Core_PrintServiceStack(void)
 {
-	prvCore_PrintTaskStack(prvService.HardwareHandle);
+	prvCore_PrintTaskStack(prvService.LCDHandle);
 	prvCore_PrintTaskStack(prvService.UserHandle);
 	prvCore_PrintTaskStack(prvService.ServiceHandle);
 }
@@ -552,14 +589,14 @@ void Core_DebugMem(uint8_t HeapID, const char *FuncName, uint32_t Line)
 	}
 }
 
-void Core_HWTaskInit(void)
+void Core_LCDTaskInit(void)
 {
-	prvService.HardwareHandle = Task_Create(prvHW_Task, NULL, 2 * 1024, HW_TASK_PRO, "HW task");
+	prvService.LCDHandle = Task_Create(prvLCD_Task, NULL, 2 * 1024, HW_TASK_PRO, "lcd task");
 }
 
 void Core_ServiceInit(void)
 {
-	prvService.ServiceHandle = Task_Create(prvService_Task, NULL, 4 * 1024, SERVICE_TASK_PRO, "Serv task");
+	prvService.ServiceHandle = Task_Create(prvService_Task, NULL, 4 * 1024, SERVICE_TASK_PRO, "service task");
 }
 
 void Core_UserTaskInit(void)
@@ -570,7 +607,14 @@ void Core_UserTaskInit(void)
 #endif
 }
 
-INIT_TASK_EXPORT(Core_HWTaskInit, "0");
+void Core_StorgeTaskInit(void)
+{
+	prvService.StorgeHandle = Task_Create(prvStorge_Task, NULL, 1024, SERVICE_TASK_PRO, "storge task");
+}
+
+
+INIT_TASK_EXPORT(Core_LCDTaskInit, "0");
 INIT_TASK_EXPORT(Core_ServiceInit, "1");
+INIT_TASK_EXPORT(Core_StorgeTaskInit, "2");
 INIT_TASK_EXPORT(Core_UserTaskInit, "5");
 #endif

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

@@ -113,6 +113,7 @@ typedef struct
 	uint32_t PreEndBlock;
 	uint32_t CurBlock;
 	uint32_t EndBlock;
+	uint32_t SpiSpeed;
 	uint16_t WriteWaitCnt;
 	uint8_t CSPin;
 	uint8_t SpiID;

+ 4 - 55
bsp/device/src/dev_sdhc_spi.c

@@ -84,8 +84,6 @@ extern const uint8_t prvCore_MSCModeSense6data[MODE_SENSE6_LEN];
 /* USB Mass storage sense 10  Data */
 extern const uint8_t prvCore_MSCModeSense10data[MODE_SENSE10_LEN];
 
-static void prvSDHC_WriteBlocksBackground(void *pSDHC, void *pData);
-
 static int32_t prvSDHC_SCSIInit(uint8_t LUN, void *pUserData)
 {
 	SDHC_SPICtrlStruct *pSDHC = pUserData;
@@ -233,7 +231,7 @@ static int32_t prvSDHC_SCSIWrite(uint8_t LUN, uint8_t *Data, uint32_t Len, void
 	{
 		pData = pSDHC->CacheBuf.Data;
 		memset(&pSDHC->CacheBuf, 0, sizeof(pSDHC->CacheBuf));
-		prvSDHC_WriteBlocksBackground(pSDHC, pData);
+		Core_WriteSDHC(pSDHC, pData);
 	}
 	return ERROR_NONE;
 }
@@ -604,6 +602,7 @@ void SDHC_SpiInitCard(void *pSDHC)
 	Ctrl->SDHCState = 0xff;
 	Ctrl->Info.CardCapacity = 0;
 	Ctrl->WriteWaitCnt = 40;
+	SPI_SetNewConfig(Ctrl->SpiID, 400000, 0xff);
 	GPIO_Output(Ctrl->CSPin, 0);
 	SDHC_SpiXfer(Ctrl, Ctrl->TempData, 20);
 	GPIO_Output(Ctrl->CSPin, 1);
@@ -642,6 +641,7 @@ WAIT_INIT_DONE:
 		goto INIT_DONE;
 	}
 	Ctrl->OCR = BytesGetBe32(Ctrl->ExternResult);
+	SPI_SetNewConfig(Ctrl->SpiID, Ctrl->SpiSpeed, 0xff);
 //	SD_DBG("sdcard init OK OCR:0x%08x!", Ctrl->OCR);
 	return;
 INIT_DONE:
@@ -965,7 +965,7 @@ void *SDHC_SpiCreate(uint8_t SpiID, uint8_t CSPin)
 	Ctrl->RWMutex = OS_MutexCreateUnlock();
 #endif
 //	Ctrl->IsPrintData = 1;
-
+	Ctrl->SpiSpeed = 24000000;
 	return Ctrl;
 }
 
@@ -1001,55 +1001,4 @@ uint8_t SDHC_IsReady(void *pSDHC)
 	}
 }
 
-#ifdef __BUILD_OS__
-
-static HANDLE prvTask;
-
-enum
-{
-
-	SDHC_WRITE = USB_APP_EVENT_ID_START + 1,
-};
-
-static void prvSDHC_Task(void* params)
-{
-	OS_EVENT Event;
-	uint32_t *Param;
-	SDHC_SPICtrlStruct *pSDHC;
-	while(1)
-	{
-		Task_GetEventByMS(prvTask, CORE_EVENT_ID_ANY, &Event, NULL, 0);
-		switch(Event.ID)
-		{
-		case SDHC_WRITE:
-			pSDHC = (SDHC_SPICtrlStruct *)Event.Param1;
-			if (pSDHC->WaitFree)
-			{
-				DBG("sdhc wait reboot");
-				free(Event.Param2);
-				free(Event.Param3);
-				break;
-			}
-			Param = (uint32_t *)Event.Param3;
-			SDHC_SpiWriteBlocks(pSDHC, Event.Param2, Param[0], Param[1]);
-			free(Event.Param2);
-			free(Event.Param3);
-			break;
-		}
-	}
-}
-
-static void prvSDHC_WriteBlocksBackground(void *pSDHC, void *pData)
-{
-	uint32_t *Param = malloc(8);
-	Param[0] =((SDHC_SPICtrlStruct *)pSDHC)->CurBlock;
-	Param[1] = ((SDHC_SPICtrlStruct *)pSDHC)->EndBlock - ((SDHC_SPICtrlStruct *)pSDHC)->CurBlock;
-	Task_SendEvent(prvTask, SDHC_WRITE, pSDHC, pData, Param);
-}
 
-void SDHC_TaskInit(void)
-{
-	prvTask = Task_Create(prvSDHC_Task, NULL, 1024, SERVICE_TASK_PRO, "sdhc task");
-}
-INIT_TASK_EXPORT(SDHC_TaskInit, "2");
-#endif