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