Texas Instruments TMS320DM357 Switch User Manual


 
1.6IndustryStandard(s)ComplianceStatement
Introduction
www.ti.com
Example4.ProgrammingtheUSBDMAController(continued)
//Incrementdescriptorcounter
tx_desc[ch]++;
}
//RoutinetostarttheRXDMAforagivenchannel
voidstart_rx_dma(intch){
intindex_save;
index_save=usbRegs->INDEX;//Savetheindextorestorelater
//Musthaveatleast3descriptorstoreceiveanything
if(rx_desc[ch]<2){error++;}else{
usbRegs->INDEX=ch+1;
usbRegs->RCPPICR=1;//EnableRxCPPIDMA
usbRegs->CHANNEL[ch].RCPPIDMASTATEW1=(Uint32)(&rx_bufferDesc[ch][0]);
CSL_FINS(usbRegs->PERI_RXCSR,USB_PERI_RXCSR_DMAEN,1);
//Updatethebuffercountregister.ThisADDStotheexistingvalue,doesnot
overwrite.
switch(ch){
case0:usbRegs->RBUFCNT0=rx_desc[ch];break;
case1:usbRegs->RBUFCNT1=rx_desc[ch];break;
case2:usbRegs->RBUFCNT2=rx_desc[ch];break;
case3:usbRegs->RBUFCNT3=rx_desc[ch];break;
}
}
usbRegs->INDEX=index_save;//Restoretheindextopreviousvalue
}
//FunctiontobuildRxDMAdescriptors
voidadd_rx_descriptor(intch,unsignedchar*outBuf,intbytes){
intindex_save;
index_save=usbRegs->INDEX;//Savetheindextorestorelater
if(bytes<1){bytes=64;error++;}
usbRegs->INDEX=ch+1;
//Linkpreviousbuffertothisoneifthisisnotthefirstdescriptorofthechannel
if(rx_desc[ch]>0)rx_bufferDesc[ch][4*(rx_desc[ch]-1)]=
(Uint32)(&rx_bufferDesc[ch][4*rx_desc[ch]]);
rx_bufferDesc[ch][4*rx_desc[ch]+0]=(Uint32)(0x00000000);//Nextdescriptor
rx_bufferDesc[ch][4*rx_desc[ch]+1]=(Uint32)outBuf;//Bufferaddress
rx_bufferDesc[ch][4*rx_desc[ch]+2]=(0x0000<<16)|bytes;//Rxbuffersizeinbytes
rx_bufferDesc[ch][4*rx_desc[ch]+3]=OWNER|0;//OWNER
rx_desc[ch]++;
usbRegs->INDEX=index_save;//Restoretheindextopreviousvalue
}
ThisdeviceconformstoUSB2.0SpecificationandOn-The-GoSupplementtotheUSB2.0Specification
Rev1.0a.
22UniversalSerialBus(USB)ControllerSPRUGH3November2008
SubmitDocumentationFeedback