From 243158ecec16359de3b644ce36c0ee8f19abcea0 Mon Sep 17 00:00:00 2001 From: F5OEO Date: Tue, 27 Feb 2018 17:09:38 +0000 Subject: [PATCH] Frequency ramp is working with DMA --- src/dma.cpp | 20 ++++++++++---------- src/fmdmasync.cpp | 4 ++-- src/gpio.cpp | 2 ++ src/v2rpitx.cpp | 11 +++++------ 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/dma.cpp b/src/dma.cpp index b63e827..9eca49d 100644 --- a/src/dma.cpp +++ b/src/dma.cpp @@ -11,8 +11,8 @@ extern "C" #define BUS_TO_PHYS(x) ((x)&~0xC0000000) -dma::dma(int Channel,uint32_t CBSize,uint32_t UserMemSize) -{ +dma::dma(int Channel,uint32_t CBSize,uint32_t UserMemSize) // Fixme! Need to check to be 256 Aligned for UserMem +{ channel=Channel; mbox.handle = mbox_open(); if (mbox.handle < 0) @@ -29,17 +29,17 @@ dma::dma(int Channel,uint32_t CBSize,uint32_t UserMemSize) fprintf(stderr,"%d Size NUM PAGES %d PAGE_SIZE %d\n",MemoryRequired,NumPages,PAGE_SIZE); mbox.mem_ref = mem_alloc(mbox.handle, NumPages* PAGE_SIZE, PAGE_SIZE, mem_flag); /* TODO: How do we know that succeeded? */ - fprintf(stderr,"mem_ref %x\n", mbox.mem_ref); + //fprintf(stderr,"mem_ref %x\n", mbox.mem_ref); mbox.bus_addr = mem_lock(mbox.handle, mbox.mem_ref); - fprintf(stderr,"bus_addr = %x\n", mbox.bus_addr); + //fprintf(stderr,"bus_addr = %x\n", mbox.bus_addr); mbox.virt_addr = (uint8_t *)mapmem(BUS_TO_PHYS(mbox.bus_addr), NumPages* PAGE_SIZE); - fprintf(stderr,"virt_addr %p\n", mbox.virt_addr); + //fprintf(stderr,"virt_addr %p\n", mbox.virt_addr); virtbase = (uint8_t *)((uint32_t *)mbox.virt_addr); - fprintf(stderr,"virtbase %p\n", virtbase); + //fprintf(stderr,"virtbase %p\n", virtbase); cbarray = (dma_cb_t *)virtbase; // We place DMA Control Blocks (CB) at beginning of virtual memory - fprintf(stderr,"cbarray %p\n", cbarray); + //fprintf(stderr,"cbarray %p\n", cbarray); usermem= (unsigned int *)(virtbase+CBSize*sizeof(dma_cb_t)); // user memory is placed after - fprintf(stderr,"usermem %p\n", usermem); + //fprintf(stderr,"usermem %p\n", usermem); dma_reg.gpioreg[DMA_CS+channel*0x40] = BCM2708_DMA_RESET; usleep(100); @@ -73,9 +73,9 @@ void dma::GetRpiInfo() dma::~dma() { - + /* unmapmem(mbox.virt_addr, NumPages * PAGE_SIZE); - + */ mem_unlock(mbox.handle, mbox.mem_ref); mem_free(mbox.handle, mbox.mem_ref); diff --git a/src/fmdmasync.cpp b/src/fmdmasync.cpp index 630fc9e..e048b4d 100644 --- a/src/fmdmasync.cpp +++ b/src/fmdmasync.cpp @@ -26,7 +26,7 @@ void fmdmasync::SetDmaAlgo() cbp->length = 4; cbp->stride = 0; cbp->next = mem_virt_to_phys(cbp + 1); - fprintf(stderr,"cbp : sample %x src %x dest %x next %x\n",samplecnt,cbp->src,cbp->dst,cbp->next); + //fprintf(stderr,"cbp : sample %x src %x dest %x next %x\n",samplecnt,cbp->src,cbp->dst,cbp->next); cbp++; @@ -38,7 +38,7 @@ void fmdmasync::SetDmaAlgo() cbp->length = 4; cbp->stride = 0; cbp->next = mem_virt_to_phys(cbp + 1); - fprintf(stderr,"cbp : sample %x src %x dest %x next %x\n",samplecnt,cbp->src,cbp->dst,cbp->next); + //fprintf(stderr,"cbp : sample %x src %x dest %x next %x\n",samplecnt,cbp->src,cbp->dst,cbp->next); cbp++; } diff --git a/src/gpio.cpp b/src/gpio.cpp index f447093..5bfbe0c 100644 --- a/src/gpio.cpp +++ b/src/gpio.cpp @@ -232,6 +232,7 @@ pwmgpio::pwmgpio():gpio(GetPeripheralBase()+PWM_BASE,PWM_LEN) pwmgpio::~pwmgpio() { + gpioreg[PWM_CTL] = 0; gpioreg[PWM_DMAC] = 0; } @@ -265,6 +266,7 @@ int pwmgpio::SetFrequency(uint64_t Frequency) uint32_t FreqFractionnal=(uint32_t) (4096*(Freqresult-(double)FreqDivider)); if((FreqDivider>4096)||(FreqDivider<2)) fprintf(stderr,"Frequency out of range\n"); clk.gpioreg[PWMCLK_DIV] = 0x5A000000 | ((FreqDivider)<<12) | FreqFractionnal; + usleep(10); clk.gpioreg[PWMCLK_CNTL]= 0x5A000000 | (Mash << 9) | pllnumber|(1 << 4) ; //4 is STAR CLK return 0; diff --git a/src/v2rpitx.cpp b/src/v2rpitx.cpp index 97e0cd8..08a11f3 100644 --- a/src/v2rpitx.cpp +++ b/src/v2rpitx.cpp @@ -14,19 +14,18 @@ int main(int argc, char* argv[]) generalio.enableclk(); pwmgpio pwm; - pwm.SetPllNumber(clk_plld,1); - pwm.SetFrequency(300000); + pwm.SetPllNumber(clk_osc,1); + pwm.SetFrequency(10000); pwm.SetMode(0); //clk.SetFrequency(89100000); - fmdmasync fmtest(14,16); + fmdmasync fmtest(14,400); fmtest.start(); for(int i=0;i<10000;i++) { - usleep(100); - printf("cb -> %x\n",fmtest.getcbposition()); + } - sleep(5); + sleep(10); fmtest.stop(); /*