diff --git a/app/testrpitx.cpp b/app/testrpitx.cpp index 90041f7..c3e3354 100644 --- a/app/testrpitx.cpp +++ b/app/testrpitx.cpp @@ -23,6 +23,7 @@ void SimpleTest(uint64_t Freq) clk.print_clock_tree(); clk.SetPllNumber(clk_plld,1); clk.SetAdvancedPllMode(true); + //clk.Setppm(+7.7); clk.SetCenterFrequency(Freq,1000); double freqresolution=clk.GetFrequencyResolution(); double RealFreq=clk.GetRealFrequency(0); @@ -30,6 +31,7 @@ void SimpleTest(uint64_t Freq) int Deviation=0; clk.SetFrequency(000); clk.enableclk(4); + while(running) { clk.SetFrequency(000); @@ -37,9 +39,10 @@ void SimpleTest(uint64_t Freq) clk.SetFrequency(freqresolution); sleep(5); } - /*for(int i=0;i<100000;i+=1) + /* + for(int i=0;i<100000;i+=1) { - clk.SetFrequency(i); + clk.SetFrequency(0); usleep(1000); }*/ clk.disableclk(4); @@ -342,13 +345,13 @@ int main(int argc, char* argv[]) sigaction(i, &sa, NULL); } - //SimpleTest(Freq); + SimpleTest(Freq); //SimpleTestbpsk(Freq); //SimpleTestFileIQ(Freq); //SimpleTestDMA(Freq); //SimpleTestAm(Freq); //SimpleTestOOK(Freq); - SimpleTestBurstFsk(Freq); + //SimpleTestBurstFsk(Freq); } diff --git a/src/gpio.cpp b/src/gpio.cpp index 1826974..f898b4d 100644 --- a/src/gpio.cpp +++ b/src/gpio.cpp @@ -24,6 +24,8 @@ extern "C" #include "raspberry_pi_revision.h" #include "stdio.h" #include +#include +#include gpio::gpio(uint32_t base, uint32_t len) { @@ -62,7 +64,7 @@ dmagpio::dmagpio():gpio(GetPeripheralBase()+DMA_BASE,DMA_LEN) // ***************** CLK Registers ***************************************** clkgpio::clkgpio():gpio(GetPeripheralBase()+CLK_BASE,CLK_LEN) { - + SetppmFromNTP(); } clkgpio::~clkgpio() @@ -123,7 +125,7 @@ int clkgpio::SetClkDivFrac(uint32_t Div,uint32_t Frac) int clkgpio::SetMasterMultFrac(uint32_t Mult,uint32_t Frac) { - fprintf(stderr,"Master Mult %d Frac %d\n",Mult,Frac); + //fprintf(stderr,"Master Mult %d Frac %d\n",Mult,Frac); gpioreg[PLLA_CTRL] = (0x5a<<24) | (0x21<<12) | Mult; usleep(100); gpioreg[PLLA_FRAC]= 0x5A000000 | Frac ; @@ -136,7 +138,7 @@ int clkgpio::SetFrequency(double Frequency) { if(ModulateFromMasterPLL) { - double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/(double)(XOSC_FREQUENCY); + double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/((double)(XOSC_FREQUENCY)*(1-clk_ppm*1e-6)); // -ppm : compensate ppm uint32_t freqctl = FloatMult*((double)(1<<20)) ; int IntMultiply= freqctl>>20; // Need to be calculated to have a center frequency freqctl&=0xFFFFF; // Fractionnal is 20bits @@ -165,7 +167,7 @@ uint32_t clkgpio::GetMasterFrac(double Frequency) { if(ModulateFromMasterPLL) { - double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/(double)(XOSC_FREQUENCY); + double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/((double)(XOSC_FREQUENCY)*(1-clk_ppm*1e-6)); uint32_t freqctl = FloatMult*((double)(1<<20)) ; int IntMultiply= freqctl>>20; // Need to be calculated to have a center frequency freqctl&=0xFFFFF; // Fractionnal is 20bits @@ -457,6 +459,37 @@ void clkgpio::disableclk(int gpio) } +void clkgpio::Setppm(double ppm) +{ + clk_ppm=ppm-2.0; // -2 is empiric : FixMe +} + +void clkgpio::SetppmFromNTP() +{ + struct timex ntx; + int status; + //Calibrate Clock system (surely depends also on PLL PPM + // ===================================================== + + ntx.modes = 0; /* only read */ + status = ntp_adjtime(&ntx); + double ntp_ppm; + + if (status != TIME_OK) + { + fprintf(stderr,"Warning: NTP calibrate failed\n"); + + } + else + { + + ntp_ppm = (double)ntx.freq/(double)(1 << 16); + fprintf(stderr,"Info:NTP find ppm=%f\n",ntp_ppm); + if(fabs(ntp_ppm)<200) + Setppm(ntp_ppm); + } +} + // ************************************** GENERAL GPIO ***************************************************** generalgpio::generalgpio():gpio(GetPeripheralBase()+GENERAL_BASE,GENERAL_LEN) diff --git a/src/gpio.h b/src/gpio.h index 1fddce6..d6d206c 100644 --- a/src/gpio.h +++ b/src/gpio.h @@ -147,7 +147,8 @@ class clkgpio:public gpio uint64_t Pllfrequency; bool ModulateFromMasterPLL=false; uint64_t CentralFrequency=0; - generalgpio gengpio; + generalgpio gengpio; + double clk_ppm=0; public: int PllFixDivider=8; //Fix divider from the master clock in advanced mode @@ -168,6 +169,8 @@ class clkgpio:public gpio uint32_t GetMasterFrac(double Frequency); void enableclk(int gpio); void disableclk(int gpio); + void Setppm(double ppm); + void SetppmFromNTP(); };