kopia lustrzana https://github.com/F5OEO/rpitx
Frequency ramp is working with DMA
rodzic
0841c37522
commit
243158ecec
20
src/dma.cpp
20
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);
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
/*
|
||||
|
|
Ładowanie…
Reference in New Issue