From 420778fcee054257d540cf24fbf1b1e3f9fc0d9f Mon Sep 17 00:00:00 2001
From: graydon <weidong.gao@cretone.cn>
Date: 星期三, 28 二月 2024 10:36:07 +0800
Subject: [PATCH] 合并近期修改。

---
 src/tob.h              |    1 
 src/protocol.h         |   20 ++++++
 lib/aer.dlb            |    0 
 drv/spi.c              |   56 +++++++++++++++---
 src/messageproc.cpp    |   31 ++++++++--
 src/f2f.c              |    5 +
 src/main.cpp           |    3 
 drv/board.c            |    1 
 src/ModuleExport.h     |    3 +
 src/ModuleExport.cpp   |    1 
 lib/ModuleProcLibs.dlb |    0 
 11 files changed, 98 insertions(+), 23 deletions(-)

diff --git a/drv/board.c b/drv/board.c
index 22764bf..c4590f2 100644
--- a/drv/board.c
+++ b/drv/board.c
@@ -5,7 +5,6 @@
  *      Author: graydon
  */
 #include <stdio.h>
-#include <drivers/spi/adi_spi.h>
 #include <services/int/adi_int.h>
 #include <services/spu/adi_spu.h>
 #include <services/pwr/adi_pwr.h>
diff --git a/drv/spi.c b/drv/spi.c
index ff03291..fbdd4f9 100644
--- a/drv/spi.c
+++ b/drv/spi.c
@@ -21,35 +21,46 @@
 #define MSIZE 0
 #define PSIZE 0
 
-volatile unsigned char 	SPI_Tx_BUFFER[SPI_BUFFER_SIZE];
-volatile unsigned char 	SPI_Rx_BUFFER[SPI_BUFFER_SIZE];
+ADI_CACHE_ALIGN volatile unsigned char 	SPI_Tx_BUFFER[SPI_BUFFER_SIZE];
+ADI_CACHE_ALIGN volatile unsigned char 	SPI_Rx_BUFFER[SPI_BUFFER_SIZE];
 //
 volatile short SPIRxDone =1;
 volatile short SPITxDone =1;
+volatile unsigned short SPIRxCnt =0, SPITxCnt=0;
+
 static void SPIDMA_Handler(uint32_t iid, void* arg)
 {
 	if(iid == INTR_SPI2_RXDMA){
 		*pREG_DMA27_STAT |= ENUM_DMA_STAT_IRQDONE ;
+		*pREG_DMA26_STAT |= ENUM_DMA_STAT_IRQDONE ;
+
 		GPIO_SetOutPut(GPIOA, GPIO_Pin12|GPIO_Pin13, GPIO_HIGH);
 		GPIO_SetOutPut(GPIOB, GPIO_Pin5, GPIO_HIGH);
 
 		GPIO_SetOutPut(GPIOC, GPIO_Pin4|GPIO_Pin7, GPIO_HIGH);
 
+		SPIRxCnt ++ ;
 		SPIRxDone = 1;
-		SPITxDone = 1;
 	}
 //	else if(iid == INTR_SPI2_TXDMA) {
 //		*pREG_DMA26_STAT |= ENUM_DMA_STAT_IRQDONE ;
-//		GPIO_SetOutPut(GPIOC, GPIO_Pin4, GPIO_HIGH);
+//		GPIO_SetOutPut(GPIOA, GPIO_Pin12|GPIO_Pin13, GPIO_HIGH);
+//		GPIO_SetOutPut(GPIOB, GPIO_Pin5, GPIO_HIGH);
+//
+//		GPIO_SetOutPut(GPIOC, GPIO_Pin4|GPIO_Pin7, GPIO_HIGH);
+//
+//		SPITxCnt++;
 //		SPITxDone = 1;
 //	}
-//	adi_int_ClearPending(iid);
+	adi_int_ClearPending(iid);
 }
+
 
 static void DMAConfig(SPIStatus status)
 {
+	adi_osal_EnterCriticalRegion();
 	if(status == SPI_TX) {
-		*pREG_DMA26_CFG 		= (MSIZE<<8) | (PSIZE<<4) | 4 ;
+		*pREG_DMA26_CFG 		= (MSIZE<<8) | (PSIZE<<4) |  4  ;
 		*pREG_DMA26_XCNT 	= 	SPI_BUFFER_SIZE;
 		*pREG_DMA26_XMOD 	= 	1;
 		*pREG_DMA26_ADDRSTART= 	(uint32_t)SPI_Tx_BUFFER|MP_OFFSET;
@@ -68,6 +79,30 @@
 		*pREG_SPI2_RXCTL |= (1<<0);
 
 	}
+
+	if(status == SPI_TRX) {
+		*pREG_SPI2_CTL =0 ;
+		*pREG_SPI2_STAT = 0xffffffff;
+		*pREG_DMA26_STAT = 0xffffffff;
+		*pREG_DMA27_STAT = 0xffffffff;
+
+		*pREG_DMA26_CFG 		= (MSIZE<<8) | (PSIZE<<4) | 4  ;
+		*pREG_DMA26_XCNT 	= 	SPI_BUFFER_SIZE;
+		*pREG_DMA26_XMOD 	= 	1;
+		*pREG_DMA26_ADDRSTART= 	(uint32_t)SPI_Tx_BUFFER|MP_OFFSET;
+		*pREG_DMA26_CFG	   |= 	1 ;
+
+		*pREG_DMA27_CFG 		= (1<<1)| (MSIZE<<8) | (PSIZE<<4)  | (1<<20) | 4 ;
+		*pREG_DMA27_XCNT 	= 	SPI_BUFFER_SIZE;
+		*pREG_DMA27_XMOD 	= 	1;
+		*pREG_DMA27_ADDRSTART= 	(uint32_t)SPI_Rx_BUFFER|MP_OFFSET;
+		*pREG_DMA27_CFG	   |= 	1 ;
+
+		*pREG_SPI2_CTL= (MASTER<<1)|(0<<3)|(CPHA<<4)|(CPOL<<5)|(1<<6)|(1<<8)|(BITS<<9)|(1<<0);
+		*pREG_SPI2_TXCTL = (5<<4) | (1<<0);
+		*pREG_SPI2_RXCTL = (1<<4) | (1<<0);
+	}
+	adi_osal_ExitCriticalRegion();
 }
 
 void SPI_xfer(int8_t* rx, int8_t* tx, uint32_t len)
@@ -94,7 +129,7 @@
 	*pREG_SPI2_CTL = (MASTER<<1)|(0<<3)|(CPHA<<4)|(CPOL<<5)|(1<<6)|(1<<8)|(BITS<<9);
 
 
-	*pREG_SPI2_TXCTL =  (1<<4);
+	*pREG_SPI2_TXCTL =  (5<<4);
 	*pREG_SPI2_RXCTL =  (1<<4);
 
 
@@ -109,11 +144,10 @@
 
 	//SPI2_SetTransMode(status);
 	adi_sec_SetPriority(INTR_SPI2_RXDMA, 44);
-	//interruptcb(INTR_SPI2_RXDMA, SPIDMA_Handler);
 	//adi_int_InstallHandler(INTR_SPI2_TXDMA, SPIDMA_Handler, 0, true);
 	adi_int_InstallHandler(INTR_SPI2_RXDMA, SPIDMA_Handler, 0, true);
 
-	*pREG_SPI2_CTL 	|= (1<<0);
+	//*pREG_SPI2_CTL 	|= (1<<0);
 	//*pREG_SPI2_TXCTL |= (1<<0);
 	//*pREG_SPI2_RXCTL |= (1<<0);
 
@@ -146,8 +180,8 @@
 		GPIO_SetOutPut(GPIOC, GPIO_Pin7, GPIO_LOW);
 		break;
 	case SPI_TRX:
-		DMAConfig(SPI_TX);SPITxDone = 0 ;
-		DMAConfig(SPI_RX);SPIRxDone = 0 ;
+		//DMAConfig(SPI_RX);SPIRxDone = 0 ;
+		DMAConfig(SPI_TRX);SPITxDone = SPIRxDone = 0 ;
 		GPIO_SetOutPut(GPIOA, GPIO_Pin12|GPIO_Pin13, GPIO_LOW);
 		GPIO_SetOutPut(GPIOB, GPIO_Pin5, GPIO_LOW);
 		GPIO_SetOutPut(GPIOC, GPIO_Pin4|GPIO_Pin7, GPIO_LOW);
diff --git a/lib/ModuleProcLibs.dlb b/lib/ModuleProcLibs.dlb
index ebcfda5..a207298 100644
--- a/lib/ModuleProcLibs.dlb
+++ b/lib/ModuleProcLibs.dlb
Binary files differ
diff --git a/lib/aer.dlb b/lib/aer.dlb
index fed6e66..c1baa3c 100644
--- a/lib/aer.dlb
+++ b/lib/aer.dlb
Binary files differ
diff --git a/src/ModuleExport.cpp b/src/ModuleExport.cpp
index d9d3233..fdf4d00 100644
--- a/src/ModuleExport.cpp
+++ b/src/ModuleExport.cpp
@@ -68,6 +68,7 @@
 //		modules.push_back(ModuleEntry("Echo", ModuleType::Echo, EchoCreate, utrue));
 //		modules.push_back(ModuleEntry("Pitch", ModuleType::Pitch, PitchCreate, utrue));
 
+		modules.push_back(ModuleEntry("UnLooping", ModuleType::UnLooping, DummyCreate, ufalse));
 	}
 }
 
diff --git a/src/ModuleExport.h b/src/ModuleExport.h
index eed644b..038b1f7 100644
--- a/src/ModuleExport.h
+++ b/src/ModuleExport.h
@@ -67,6 +67,9 @@
 	Reverb = 128,     //混响
 	Echo,            //回声
 	Pitch,          //变音
+
+	//解循环模块
+	UnLooping = 256,
 };
 
 class ModuleEntry {
diff --git a/src/f2f.c b/src/f2f.c
index 1b9e960..d95a2fa 100644
--- a/src/f2f.c
+++ b/src/f2f.c
@@ -87,6 +87,7 @@
 }
 
 #define CHANNEL_OF(c) (2*((c)&(codec->slot_num-1))+ (c)/codec->slot_num)
+#define OFFSET(j) (j<codec->channel_num?CHANNEL_OF(j): CHANNEL_OF(j-codec->channel_num+codec->slot_num))
 /*
  * sec 排列方式: 0,16,1,17,2,18,...,15,31
  */
@@ -103,7 +104,7 @@
 			if(codec->enable_sec){
 				for(u32 j = 0; channel < mInputNum && j < codec->channel_num*2 ;j ++,channel++) {
 					if(mRxChannel[channel] != NULL)
-						floatData(mRxChannel[channel], dataPtr + CHANNEL_OF(j),codec->slot_num*2, SAMPLE_NUM);
+						floatData(mRxChannel[channel], dataPtr + OFFSET(j),codec->slot_num*2, SAMPLE_NUM);
 				}
 			}
 			else{
@@ -130,7 +131,7 @@
 			if(codec->enable_sec){
 				for(u32 j = 0; channel < mOutputNum && j < codec->channel_num*2 ;j ++,channel++) {
 					if(mTxChannel[channel] != NULL)
-						fixData(dataPtr + CHANNEL_OF(j), mTxChannel[channel], codec->slot_num*2, SAMPLE_NUM);
+						fixData(dataPtr +OFFSET(j), mTxChannel[channel], codec->slot_num*2, SAMPLE_NUM);
 				}
 			}
 			else{
diff --git a/src/main.cpp b/src/main.cpp
index 664a604..fdb1a25 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -23,7 +23,8 @@
 
 
 u32 g_level_report_interval = LEVEL_REPORT_TIME(200);
-
+eErrStatus err_status =DSP_NO_ERR;
+u32 g_spiQ_drop_cnt =0;
 u8  mDspIndex = 0;
 ubool  TopoLoading = ufalse;
 ubool  HandShakeSuccesful = ufalse;
diff --git a/src/messageproc.cpp b/src/messageproc.cpp
index e371790..21fbd87 100644
--- a/src/messageproc.cpp
+++ b/src/messageproc.cpp
@@ -27,8 +27,12 @@
 
 s32 Message::Send(MSG* pmsg )
 {
+	extern u32 g_spiQ_drop_cnt;
 	u32 ret=  txQueue->Push(*pmsg);
-
+	if(ret == 0) {
+		g_spiQ_drop_cnt++;
+		set_error(DSP_SPIQ_OVERRANGE);
+	}
 	return ret;
 }
 
@@ -36,6 +40,7 @@
 {
 	static u8* bin = NULL;
 	extern ubool  TopoLoading ;
+	extern eErrStatus err_status;
 
 	if(pmsg->pktNo == 0 && bin != NULL ) {
 		sram_free(SRAM_DDR, bin);
@@ -52,10 +57,14 @@
 		u32 size = (pmsg->totalPkts -1)*MSG_DATA_LEN+pmsg->dataLen;
 		uLongf realsize = size*10;
 		Bytef* uncompress_ptr = (Bytef*)sram_malloc(SRAM_DDR, mem_any ,realsize);
+		ErrStatus err = ErrStatus::ERR_PARAM;
 
 		if(uncompress_ptr){
 			if(tob && uncompress(uncompress_ptr, &realsize, (Bytef*)bin, size) == Z_OK) {
-				tob->toCtrl(uncompress_ptr, realsize);
+				err = tob->toCtrl(uncompress_ptr, realsize);
+			}
+			if(err != ErrStatus::SUCCESS){
+				set_error(DSP_PRESET_INVALID);
 			}
 			sram_free(SRAM_DDR, uncompress_ptr);
 		}
@@ -89,6 +98,7 @@
 	memcpy(bin+pmsg->pktNo*MSG_DATA_LEN, pmsg->data , pmsg->dataLen);
 	if(pmsg->pktNo == pmsg->totalPkts -1) {
 		ToB* tob = ToB::GetInstance();
+		ErrStatus err = ErrStatus::SUCCESS;
 		size = (pmsg->totalPkts -1)*MSG_DATA_LEN+pmsg->dataLen;
 
 		SetTxRxNullBufferPtr();
@@ -96,11 +106,14 @@
 
 		if(tob) {
 			tob->toClear();
-			tob->CreateModule(bin, size);
+			err = tob->CreateModule(bin, size);
 		}
+		if(err != ErrStatus::SUCCESS) {
+			set_error(DSP_TOPO_INVALID);
+		}
+
 		sram_free(SRAM_DDR, bin);
 		bin = NULL;
-
 		if(TopoRequest) {
 			Send(MsgType::MSG_TOPO_RES, 0 ,0) ;
 			TopoRequest = ufalse;
@@ -168,11 +181,17 @@
 {
 	struct DSPStatus* status = (struct DSPStatus*)pmsg->data;
 	extern ufloat cpu_utility();
+	extern u32 g_spiQ_drop_cnt;
+	ToB* tob = ToB::GetInstance();
 
 	status->mCpu =  cpu_utility()*100; //all modules execute time.;
 	status->mInternalUnUsedMem = space_unused();
 	status->mExternalUnUsedMem = sram_free_space(SRAM_DDR,mem_any);
-	status->mDDRPassed = 1;
+	status->mSPIQDropCnt = g_spiQ_drop_cnt;
+	status->mErrStatus = err_status;
+	status->mLevelPacketsNum = tob?tob->GetLevelPacketNum():0;
+	status->mModuleCnt = tob?tob->GetModuleNum():0;
+
 
 	pmsg->Enc(MsgType::MSG_DSP_STATUS_RES, 0, sizeof(struct DSPStatus));
 
@@ -221,7 +240,7 @@
 {
 	u32 status = 0;
 
-	if(SPITxDone) {
+	if(SPIRxDone) {
 		RxMessageHandler((MSG*)SPI_Rx_BUFFER);
 		if(txQueue->Count() > 0) {
 			txQueue->Pop(*(MSG*)SPI_Tx_BUFFER);
diff --git a/src/protocol.h b/src/protocol.h
index 566aa15..75d2e55 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -40,6 +40,9 @@
 
 	MSG_MODULE_CPU_REQ,
 	MSG_MODULE_CPU_RES,
+
+	MSG_SPI_RESET_REQ,
+	MSG_SPI_RESET_RES,
 };
 
 
@@ -129,13 +132,26 @@
 };
 
 
+typedef enum {
+	DSP_NO_ERR,
+	DSP_TOPO_INVALID,
+	DSP_PRESET_INVALID,
+	DSP_NO_TOPO,
+	DSP_SPIQ_OVERRANGE,
+}eErrStatus;
+extern eErrStatus err_status;
+#define set_error(err_no) err_status = err_no
+
 struct DSPStatus{
 	unsigned int mCpu;
 	unsigned int mInternalUnUsedMem;
 	unsigned int mExternalUnUsedMem;
-	unsigned char mDDRPassed;
-	unsigned char pad[3];
 
+	unsigned char mLevelPacketsNum;
+	unsigned char mErrStatus;
+	unsigned char pad[2];
+	unsigned short mSPIQDropCnt;
+	unsigned short mModuleCnt;
 	//.....
 };
 #endif /* PROTOCOL_H_ */
diff --git a/src/tob.h b/src/tob.h
index 31cb19a..82c5d6a 100644
--- a/src/tob.h
+++ b/src/tob.h
@@ -42,6 +42,7 @@
 	u32 GetLevels(Message* handle , MSG* msg);
 	u32 GetModuleCPU(Message* handle , MSG* pmsg);
 	u16 GetModuleNum() {return mModuleNum;}
+	u16 GetLevelPacketNum() {return mLevelPacketNum;}
 };
 
 #endif

--
Gitblit v1.9.3