diff --git a/app/testrpitx.cpp b/app/testrpitx.cpp index 81a763d..3a81b9b 100644 --- a/app/testrpitx.cpp +++ b/app/testrpitx.cpp @@ -283,9 +283,9 @@ void SimpleTestAm(uint64_t Freq) void SimpleTestOOK(uint64_t Freq) { - int SR = 1000; + int SR = 10; //10 HZ int FifoSize = 21; //24 - ookburst ook(Freq, SR, 14, FifoSize); + ookburst ook(Freq, SR, 14, FifoSize,100); unsigned char TabSymbol[FifoSize] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0}; @@ -733,6 +733,6 @@ int main(int argc, char *argv[]) //SimpleTestBurstFsk(Freq); //SimpleTestOOKTiming(Freq); //AlectoOOK(Freq); - //RfSwitchOOK(Freq); - SimpleTestAtv(Freq); + RfSwitchOOK(Freq); + //SimpleTestAtv(Freq); } diff --git a/src/fskburst.cpp b/src/fskburst.cpp index fe1a5b3..84fa5ef 100644 --- a/src/fskburst.cpp +++ b/src/fskburst.cpp @@ -20,108 +20,124 @@ This program is free software: you can redistribute it and/or modify #include "util.h" #include - fskburst::fskburst(uint64_t TuneFrequency,uint32_t SymbolRate,float Deviation,int Channel,uint32_t FifoSize):bufferdma(Channel,FifoSize+3,2,1),freqdeviation(Deviation) - { - - clkgpio::SetAdvancedPllMode(true); - clkgpio::SetCenterFrequency(TuneFrequency,SymbolRate); // Write Mult Int and Frac : FixMe carrier is already there - clkgpio::SetFrequency(0); - disableclk(4); - syncwithpwm=false; - - if(syncwithpwm) - { - pwmgpio::SetPllNumber(clk_plld,1); - pwmgpio::SetFrequency(SymbolRate); - } - else - { - pcmgpio::SetPllNumber(clk_plld,1); - pcmgpio::SetFrequency(SymbolRate); - } - - //Should be obligatory place before setdmaalgo - Originfsel=clkgpio::gengpio.gpioreg[GPFSEL0]; - dbg_printf(1,"FSK Origin fsel %x\n",Originfsel); - - SetDmaAlgo(); - - - - } - - fskburst::~fskburst() - { - } - - void fskburst::SetDmaAlgo() +fskburst::fskburst(uint64_t TuneFrequency, float SymbolRate, float Deviation, int Channel, uint32_t FifoSize, size_t upsample,float RatioRamp) : bufferdma(Channel, FifoSize * upsample + 3, 2, 1), freqdeviation(Deviation), SR_upsample(upsample) { - - sampletab[buffersize*registerbysample-2]=(Originfsel & ~(7 << 12)) | (4 << 12); //Gpio Clk - sampletab[buffersize*registerbysample-1]=(Originfsel & ~(7 << 12)) | (0 << 12); //Gpio In - dma_cb_t *cbp = cbarray; - // We must fill the FIFO (PWM or PCM) to be Synchronized from start - // PWM FIFO = 16 - // PCM FIFO = 64 - if(syncwithpwm) - { - SetEasyCB(cbp++,0,dma_pwm,16+1); - } - else - { - SetEasyCB(cbp++,0,dma_pcm,64+1); - - } + clkgpio::SetAdvancedPllMode(true); + clkgpio::SetCenterFrequency(TuneFrequency, Deviation*10); // Write Mult Int and Frac : FixMe carrier is already there + clkgpio::SetFrequency(0); + disableclk(4); + syncwithpwm = false; + Ramp = SR_upsample * RatioRamp; //Ramp time = 10% - SetEasyCB(cbp++,buffersize*registerbysample-2,dma_fsel,1);//Enable clk - - - for (uint32_t samplecnt = 0; samplecnt < buffersize-2; samplecnt++) - { - - - // Write a frequency sample - SetEasyCB(cbp++,samplecnt*registerbysample,dma_pllc_frac,1);//FReq - - // Delay - SetEasyCB(cbp++,samplecnt*registerbysample,syncwithpwm?dma_pwm:dma_pcm,1); - - } - lastcbp=cbp; - - SetEasyCB(cbp,buffersize*registerbysample-1,dma_fsel,1);//Disable clk - - cbp->next = 0; // Stop DMA - - dbg_printf(2,"Last cbp : src %x dest %x next %x\n",cbp->src,cbp->dst,cbp->next); -} - void fskburst::SetSymbols(unsigned char *Symbols,uint32_t Size) + if (syncwithpwm) { - if(Size>buffersize-3) {dbg_printf(1,"Buffer overflow\n");return;} - - dma_cb_t *cbp=cbarray; - cbp+=2; // Skip the first 2 CB (initialisation) - for(unsigned int i=0;inext = 0; // Stop DMA + + dbg_printf(2, "Last cbp : src %x dest %x next %x\n", cbp->src, cbp->dst, cbp->next); +} +void fskburst::SetSymbols(unsigned char *Symbols, uint32_t Size) +{ + if (Size > buffersize - 3) + { + dbg_printf(1, "Buffer overflow\n"); + return; + } + + dma_cb_t *cbp = cbarray; + cbp += 2; // Skip the first 2 CB (initialisation) + + + + for (unsigned int i = 0; i < Size; i++) + { + for (size_t j = 0; j < SR_upsample - Ramp; j++) { - sampletab[i]=(0x5A<<24)|GetMasterFrac(freqdeviation*Symbols[i]); - cbp++;//SKIP FREQ CB + sampletab[i * SR_upsample + j] = (0x5A << 24) | GetMasterFrac(freqdeviation * Symbols[i]); + cbp++; //SKIP FREQ CB cbp->next = mem_virt_to_phys(cbp + 1); cbp++; } - cbp--; - cbp->next = mem_virt_to_phys(lastcbp); - - - dma::start(); - while(isrunning()) //Block function : return until sent completely signal + for (size_t j = 0 ; j < Ramp; j++) { - //dbg_printf(1,"GPIO %x\n",clkgpio::gengpio.gpioreg[GPFSEL0]); - usleep(100); + if (i < Size - 1) + { + sampletab[i * SR_upsample + j + SR_upsample - Ramp] = (0x5A << 24) | GetMasterFrac(freqdeviation * Symbols[i] + j* (freqdeviation * Symbols[i + 1] - freqdeviation * Symbols[i]) / (float)Ramp); + dbg_printf(2, "Ramp %f ->%f : %d %f\n",freqdeviation * Symbols[i],freqdeviation * Symbols[i+1], j,freqdeviation * Symbols[i] + j* (freqdeviation * Symbols[i + 1] - freqdeviation * Symbols[i]) / (float)Ramp); + } + else + { + sampletab[i * SR_upsample + j + SR_upsample -Ramp] = (0x5A << 24) | GetMasterFrac(freqdeviation * Symbols[i]); + } + cbp++; //SKIP FREQ CB + cbp->next = mem_virt_to_phys(cbp + 1); + cbp++; } - dbg_printf(1,"FSK burst end Tx\n",cbp->src,cbp->dst,cbp->next); - usleep(100);//To be sure last symbol Tx ? - } + cbp--; + cbp->next = mem_virt_to_phys(lastcbp); + dma::start(); + while (isrunning()) //Block function : return until sent completely signal + { + //dbg_printf(1,"GPIO %x\n",clkgpio::gengpio.gpioreg[GPFSEL0]); + usleep(100); + } + dbg_printf(1, "FSK burst end Tx\n", cbp->src, cbp->dst, cbp->next); + usleep(100); //To be sure last symbol Tx ? +} diff --git a/src/fskburst.h b/src/fskburst.h index 3a226d7..0f5f704 100644 --- a/src/fskburst.h +++ b/src/fskburst.h @@ -12,8 +12,10 @@ class fskburst:public bufferdma,public clkgpio,public pwmgpio,public pcmgpio uint32_t Originfsel; bool syncwithpwm; dma_cb_t *lastcbp; + size_t SR_upsample=0; + size_t Ramp=0; public: - fskburst(uint64_t TuneFrequency,uint32_t SymbolRate,float Deviation,int Channel,uint32_t FifoSize); + fskburst(uint64_t TuneFrequency,float SymbolRate,float Deviation,int Channel,uint32_t FifoSize,size_t upsample=1,float RatioRamp=0); ~fskburst(); void SetDmaAlgo(); diff --git a/src/ookburst.cpp b/src/ookburst.cpp index eddb755..75effea 100644 --- a/src/ookburst.cpp +++ b/src/ookburst.cpp @@ -20,139 +20,144 @@ This program is free software: you can redistribute it and/or modify #include "ookburst.h" #include "util.h" - - ookburst::ookburst(uint64_t TuneFrequency,uint32_t SymbolRate,int Channel,uint32_t FifoSize):bufferdma(Channel,FifoSize+2,2,1) - { - - clkgpio::SetAdvancedPllMode(true); - - clkgpio::SetCenterFrequency(TuneFrequency,0); // Bandwidth is 0 because frequency always the same - clkgpio::SetFrequency(0); - - syncwithpwm=false; - - if(syncwithpwm) - { - pwmgpio::SetPllNumber(clk_plld,1); - pwmgpio::SetFrequency(SymbolRate); - } - else - { - pcmgpio::SetPllNumber(clk_plld,1); - pcmgpio::SetFrequency(SymbolRate); - } - - - Originfsel=clkgpio::gengpio.gpioreg[GPFSEL0]; - SetDmaAlgo(); - - - - } - - ookburst::~ookburst() - { - } - - void ookburst::SetDmaAlgo() +ookburst::ookburst(uint64_t TuneFrequency, float SymbolRate, int Channel, uint32_t FifoSize, size_t upsample, float RatioRamp) : bufferdma(Channel, FifoSize * upsample + 2, 2, 1),SR_upsample(upsample) { - dma_cb_t *cbp=cbarray; - // We must fill the FIFO (PWM or PCM) to be Synchronized from start - // PWM FIFO = 16 - // PCM FIFO = 64 - if(syncwithpwm) + + clkgpio::SetAdvancedPllMode(true); + + clkgpio::SetCenterFrequency(TuneFrequency, 0); // Bandwidth is 0 because frequency always the same + clkgpio::SetFrequency(0); + + syncwithpwm = false; + Ramp = SR_upsample * RatioRamp; //Ramp time + + if (syncwithpwm) + { + pwmgpio::SetPllNumber(clk_plld, 1); + pwmgpio::SetFrequency(SymbolRate * (float)upsample); + } + else + { + pcmgpio::SetPllNumber(clk_plld, 1); + pcmgpio::SetFrequency(SymbolRate * float(upsample)); + } + + Originfsel = clkgpio::gengpio.gpioreg[GPFSEL0]; + SetDmaAlgo(); +} + +ookburst::~ookburst() +{ +} + +void ookburst::SetDmaAlgo() +{ + dma_cb_t *cbp = cbarray; + // We must fill the FIFO (PWM or PCM) to be Synchronized from start + // PWM FIFO = 16 + // PCM FIFO = 64 + if (syncwithpwm) + { + SetEasyCB(cbp++, 0, dma_pwm, 16 + 1); + } + else + { + SetEasyCB(cbp++, 0, dma_pcm, 64 + 1); + } + + for (uint32_t samplecnt = 0; samplecnt < buffersize - 2; samplecnt++) + { + + //Set Amplitude to FSEL for amplitude=0 + SetEasyCB(cbp++, samplecnt * registerbysample, dma_fsel, 1); + // Delay + SetEasyCB(cbp++, samplecnt * registerbysample, syncwithpwm ? dma_pwm : dma_pcm, 1); + } + lastcbp = cbp; + + // Last CBP before stopping : disable output + sampletab[buffersize * registerbysample - 1] = (Originfsel & ~(7 << 12)) | (0 << 12); //Disable Clk + SetEasyCB(cbp, buffersize * registerbysample - 1, dma_fsel, 1); + cbp->next = 0; // Stop DMA +} +void ookburst::SetSymbols(unsigned char *Symbols, uint32_t Size) +{ + if (Size > buffersize - 2) + { + dbg_printf(1, "Buffer overflow\n"); + return; + } + + dma_cb_t *cbp = cbarray; + cbp++; // Skip the first which is the Fiiling of Fifo + + for (unsigned i = 0; i < Size; i++) + { + for (size_t j = 0; j < SR_upsample - Ramp; j++) + { + sampletab[i * SR_upsample + j] = (Symbols[i] == 0) ? ((Originfsel & ~(7 << 12)) | (0 << 12)) : ((Originfsel & ~(7 << 12)) | (4 << 12)); + cbp++; //SKIP FSEL CB + cbp->next = mem_virt_to_phys(cbp + 1); + cbp++; + } + for (size_t j = 0; j < Ramp; j++) + { + if (i < Size - 1) { - SetEasyCB(cbp++,0,dma_pwm,16+1); + sampletab[i * SR_upsample + j + SR_upsample - Ramp] = (Symbols[i] == 0) ? ((Originfsel & ~(7 << 12)) | (0 << 12)) : ((Originfsel & ~(7 << 12)) | (4 << 12)); + } else { - SetEasyCB(cbp++,0,dma_pcm,64+1); - + sampletab[i * SR_upsample + j + SR_upsample - Ramp] = (Symbols[i] == 0) ? ((Originfsel & ~(7 << 12)) | (0 << 12)) : ((Originfsel & ~(7 << 12)) | (4 << 12)); } - - for (uint32_t samplecnt = 0; samplecnt < buffersize-2; samplecnt++) - { - - //Set Amplitude to FSEL for amplitude=0 - SetEasyCB(cbp++,samplecnt*registerbysample,dma_fsel,1); - // Delay - SetEasyCB(cbp++,samplecnt*registerbysample,syncwithpwm?dma_pwm:dma_pcm,1); - - - } - lastcbp=cbp; - // Last CBP before stopping : disable output - sampletab[buffersize*registerbysample-1]=(Originfsel & ~(7 << 12)) | (0 << 12); //Disable Clk - SetEasyCB(cbp,buffersize*registerbysample-1,dma_fsel,1); - cbp->next = 0; // Stop DMA - -} - void ookburst::SetSymbols(unsigned char *Symbols,uint32_t Size) - { - if(Size>buffersize-2) {dbg_printf(1,"Buffer overflow\n");return;} - - dma_cb_t *cbp=cbarray; - cbp++; // Skip the first which is the Fiiling of Fifo - - - for(unsigned i=0;inext = mem_virt_to_phys(cbp + 1); - - //dbg_printf(1,"cbp : sample %d pointer %p src %x dest %x next %x\n",i,cbp,cbp->src,cbp->dst,cbp->next); - cbp++; - + cbp++; } - - cbp--; - cbp->next = mem_virt_to_phys(lastcbp); - - - dma::start(); - - - while(isrunning()) //Block function : return until sent completely signal + } + + cbp--; + cbp->next = mem_virt_to_phys(lastcbp); + + dma::start(); + + while (isrunning()) //Block function : return until sent completely signal + { + usleep(100); + } + usleep(100); //To be sure last symbol Tx ? +} + +//****************************** OOK BURST TIMING ***************************************** +// SampleRate is set to 0.1MHZ,means 10us granularity, MaxMessageDuration in us +ookbursttiming::ookbursttiming(uint64_t TuneFrequency, size_t MaxMessageDuration) : ookburst(TuneFrequency, 1e5, 14, MaxMessageDuration / 10) +{ + m_MaxMessage = MaxMessageDuration; + ookrenderbuffer = new unsigned char[m_MaxMessage]; +} + +ookbursttiming::~ookbursttiming() +{ + if (ookrenderbuffer != nullptr) + delete[] ookrenderbuffer; +} + +void ookbursttiming::SendMessage(SampleOOKTiming *TabSymbols, size_t Size) +{ + size_t n = 0; + for (size_t i = 0; i < Size; i++) + { + for (size_t j = 0; j < TabSymbols[i].duration / 10; j++) { - usleep(100); - - } - usleep(100);//To be sure last symbol Tx ? - - } - - //****************************** OOK BURST TIMING ***************************************** - // SampleRate is set to 0.1MHZ,means 10us granularity, MaxMessageDuration in us - ookbursttiming::ookbursttiming(uint64_t TuneFrequency,size_t MaxMessageDuration):ookburst(TuneFrequency,1e5,14,MaxMessageDuration/10) - { - m_MaxMessage=MaxMessageDuration; - ookrenderbuffer=new unsigned char[m_MaxMessage]; - } - - ookbursttiming::~ookbursttiming() - { - if(ookrenderbuffer!=nullptr) - delete []ookrenderbuffer; - } - - void ookbursttiming::SendMessage(SampleOOKTiming *TabSymbols,size_t Size) - { - size_t n=0; - for (size_t i=0;i= m_MaxMessage) { - ookrenderbuffer[n++]=TabSymbols[i].value; - if(n>=m_MaxMessage) - { - dbg_printf(1,"OOK Message too long abort time(%d/%d)\n",n,m_MaxMessage); - return; - } - } + dbg_printf(1, "OOK Message too long abort time(%d/%d)\n", n, m_MaxMessage); + return; + } } - SetSymbols(ookrenderbuffer,n); } + SetSymbols(ookrenderbuffer, n); +} diff --git a/src/ookburst.h b/src/ookburst.h index 92fa9bc..9fd1c1a 100644 --- a/src/ookburst.h +++ b/src/ookburst.h @@ -12,8 +12,10 @@ class ookburst:public bufferdma,public clkgpio,public pwmgpio,public pcmgpio uint32_t Originfsel; bool syncwithpwm; dma_cb_t *lastcbp; + size_t SR_upsample=1; + size_t Ramp=0.0; public: - ookburst(uint64_t TuneFrequency,uint32_t SymbolRate,int Channel,uint32_t FifoSize); + ookburst(uint64_t TuneFrequency,float SymbolRate,int Channel,uint32_t FifoSize, size_t upsample=1,float RatioRamp=0.0); ~ookburst(); void SetDmaAlgo();