Pārlūkot izejas kodu

更新CPU工程驱动代码逻辑
1.优化CPU工程CRC驱动代码逻辑(动态获取释放sema锁逻辑修改为获取一次不释放,MCU访问通过access module驱动)
2.优化CPU工程SDMMC驱动代码逻辑。
(sdmmc0路的sema锁原为获取一次不释放,现修改为动态获取,考虑MCU进入休眠前可能会打断CPU对emmc的操作,
从而导致唤醒后emmc初始化时间相对较长,可在进入休眠前,获取sdmmc0锁,保证CPU对emmc的操作完整,再进行休眠)

helen 4 mēneši atpakaļ
vecāks
revīzija
6e6e730c7f

+ 1 - 0
amt630hv160-freertos-beta/ArkmicroFiles/libcpu-amt630hv160/include/sdmmc.h

@@ -240,6 +240,7 @@ struct ark_mmc_obj
     uint32_t             base;
     int					 softreset_id;
 	int					 clk_id;
+	int					 sema_id;
     uint32_t             power_pin_gpio;
 	uint32_t				fifoth_val;
 	uint32_t				prev_blksz;

+ 4 - 4
amt630hv160-freertos-beta/ArkmicroFiles/libcpu-amt630hv160/source/crc.c

@@ -131,9 +131,9 @@ u32 CRC_Calc(const void *buf, u32 len, u32 init,
 		len /= 4;
 	}
 
-	if (sema_take(SEMA_GATE_CRC, portMAX_DELAY) != pdPASS) {
-		return 0xffffffff;
-	}
+//	if (sema_take(SEMA_GATE_CRC, portMAX_DELAY) != pdPASS) {
+//		return 0xffffffff;
+//	}
 
 	CRC->INIT = init;
 	CRC->CTRL |= CRC_CTL_INIT_EN;
@@ -171,7 +171,7 @@ u32 CRC_Calc(const void *buf, u32 len, u32 init,
 	if (widthopt == CRC_DATA_WIDTH32)
 		CRC->CTRL &= ~CRC_CTL_WIDTH32_START;
 
-	sema_give(SEMA_GATE_CRC);
+//	sema_give(SEMA_GATE_CRC);
 
 	return result;
 }

+ 12 - 2
amt630hv160-freertos-beta/ArkmicroFiles/libcpu-amt630hv160/source/sdio/mmcsd_core.c

@@ -107,12 +107,22 @@ int mmcsd_dev_is_sdio_card(int driver_id)
 
 void mmcsd_host_lock(struct mmcsd_host *host)
 {
-    xSemaphoreTake(host->bus_lock, portMAX_DELAY);
+	struct mmc_driver *mmc_drv = (struct mmc_driver*)host->private_data;
+	struct ark_mmc_obj *mmc_obj = (struct ark_mmc_obj*)mmc_drv->priv;
+
+	xSemaphoreTake(host->bus_lock, portMAX_DELAY);
+	if (mmc_obj->id == 0)
+		sema_take(SEMA_GATE_SDMMC0, portMAX_DELAY);
 }
 
 void mmcsd_host_unlock(struct mmcsd_host *host)
 {
-    xSemaphoreGive(host->bus_lock);
+	struct mmc_driver *mmc_drv = (struct mmc_driver*)host->private_data;
+	struct ark_mmc_obj *mmc_obj = (struct ark_mmc_obj*)mmc_drv->priv;
+	if (mmc_obj->id == 0)
+		sema_give(SEMA_GATE_SDMMC0);
+
+	xSemaphoreGive(host->bus_lock);
 }
 
 void mmcsd_req_complete(struct mmcsd_host *host)

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

@@ -6,6 +6,7 @@
 #include "sdmmc.h"
 #include "mmcsd_core.h"
 #include "os_adapt.h"
+#include "sema.h"
 
 #ifdef SDMMC_SUPPORT
 
@@ -1659,7 +1660,9 @@ int ark_mmc_probe(struct ark_mmc_obj *mmc_obj)
 int mmc_init(void)
 {
 #ifdef SDMMC0_SUPPORT
+	sema_take(SEMA_GATE_SDMMC0, portMAX_DELAY);
 	ark_mmc_probe(&mmc0_obj);
+	sema_give(SEMA_GATE_SDMMC0);
 #endif
 
 #ifdef SDMMC1_SUPPORT

+ 2 - 2
amt630hv160-freertos-beta/ArkmicroFiles/libcpu-amt630hv160/source/sema.c

@@ -172,7 +172,6 @@ void sema_init(void)
 	sema_take(SEMA_GATE_UART0, portMAX_DELAY);
 	sema_take(SEMA_GATE_UART1, portMAX_DELAY);
 	sema_take(SEMA_GATE_DMA, portMAX_DELAY);
-	sema_take(SEMA_GATE_SDMMC0, portMAX_DELAY);
 	sema_take(SEMA_GATE_SDMMC1, portMAX_DELAY);
 	sema_take(SEMA_GATE_SPI0, portMAX_DELAY);
 	sema_take(SEMA_GATE_SPI2, portMAX_DELAY);
@@ -186,6 +185,7 @@ void sema_init(void)
 	sema_take(SEMA_GATE_MFC, portMAX_DELAY);
 	sema_take(SEMA_GATE_WRAP, portMAX_DELAY);
 	sema_take(SEMA_GATE_ETH, portMAX_DELAY);
+	sema_take(SEMA_GATE_CRC, portMAX_DELAY);
 	sema_take(SEMA_GATE_DDRRDC, portMAX_DELAY);
 	sema_take(SEMA_GATE_SRAMRDC, portMAX_DELAY);
 	sema_take(SEMA_GATE_ITU, portMAX_DELAY);
@@ -214,7 +214,7 @@ void sema_init(void)
 #endif
 
 	//dynamic
-//	sema_take(SEMA_GATE_CRC, portMAX_DELAY);
+	//sema_take(SEMA_GATE_SDMMC0, portMAX_DELAY);
 
 	// mcu use module
 //	sema_take(SEMA_GATE_ADC0, portMAX_DELAY);