Frequency ramp is working with DMA

v2beta
F5OEO 2018-02-27 17:09:38 +00:00
rodzic 0841c37522
commit 243158ecec
4 zmienionych plików z 19 dodań i 18 usunięć

Wyświetl plik

@ -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);

Wyświetl plik

@ -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++;
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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();
/*