void IsrDma2(void) { U8 out_csr3; U32 dwEmptyCnt; U8 saveIndexReg=usbdevregs->INDEX_REG; usbdevregs->INDEX_REG=3; out_csr3=usbdevregs->OUT_CSR1_REG; ClearPending_my(BIT_DMA2); /* thisway.diy, 2006.06.22 * When the first DMA interrupt happened, it has received max (0x80000 + EP3_PKT_SIZE) bytes data from PC */ if (!totalDmaCount) totalDmaCount = dwWillDMACnt + EP3_PKT_SIZE; else totalDmaCount+=dwWillDMACnt; // dwUSBBufWritePtr = ((dwUSBBufWritePtr + dwWillDMACnt - USB_BUF_BASE) % USB_BUF_SIZE) + USB_BUF_BASE; /* thisway.diy, 2006.06.21 */ dwUSBBufWritePtr = ((dwUSBBufWritePtr + dwWillDMACnt - dwUSBBufBase) % dwUSBBufSize) + dwUSBBufBase; if(totalDmaCount>=downloadFileSize)// is last? { totalDmaCount=downloadFileSize; ConfigEp3IntMode(); if(out_csr3& EPO_OUT_PKT_READY) { CLR_EP3_OUT_PKT_READY(); } intregs->INTMSK|=BIT_DMA2; intregs->INTMSK&=~(BIT_USBD); } else { if((totalDmaCount+0x80000)<downloadFileSize) { dwWillDMACnt = 0x80000; } else { dwWillDMACnt = downloadFileSize - totalDmaCount; } // dwEmptyCnt = (dwUSBBufReadPtr - dwUSBBufWritePtr - 1 + USB_BUF_SIZE) % USB_BUF_SIZE; /* thisway.diy, 2006.06.21 */ dwEmptyCnt = (dwUSBBufReadPtr - dwUSBBufWritePtr - 1 + dwUSBBufSize) % dwUSBBufSize; if (dwEmptyCnt >= dwWillDMACnt) { ConfigEp3DmaMode(dwUSBBufWritePtr, dwWillDMACnt); } else { bDMAPending = 1; } } usbdevregs->INDEX_REG = saveIndexReg; }
void IsrDma2() { struct s3c24x0_interrupt *intregs = s3c24x0_get_base_interrupt(); struct s3c24x0_usb_device *usbdevregs = s3c24x0_get_base_usb_device(); U8 out_csr3; U32 dwEmptyCnt; U8 saveIndexReg = usbdevregs->INDEX_REG; usbdevregs->INDEX_REG = 3; out_csr3 = usbdevregs->OUT_CSR1_REG; ClearPending_my((int)BIT_DMA2); if (!totalDmaCount) totalDmaCount = dwWillDMACnt + EP3_PKT_SIZE; else totalDmaCount += dwWillDMACnt; dwUSBBufWritePtr = ((dwUSBBufWritePtr + dwWillDMACnt - dwUSBBufBase) % dwUSBBufSize) + dwUSBBufBase; if (totalDmaCount >= downloadFileSize) { /* last */ totalDmaCount = downloadFileSize; ConfigEp3IntMode(); if (out_csr3 & EPO_OUT_PKT_READY) CLR_EP3_OUT_PKT_READY(); /* 关闭DMA2中断并重新开启USBD中断 */ intregs->INTMSK |= BIT_DMA2; intregs->INTMSK &= ~(BIT_USBD); } else { if ((totalDmaCount + 0x80000) < downloadFileSize) dwWillDMACnt = 0x80000; else dwWillDMACnt = downloadFileSize - totalDmaCount; dwEmptyCnt = (dwUSBBufReadPtr - dwUSBBufWritePtr - 1 + dwUSBBufSize) % dwUSBBufSize; if (dwEmptyCnt >= dwWillDMACnt) ConfigEp3DmaMode(dwUSBBufWritePtr, dwWillDMACnt); } usbdevregs->INDEX_REG = saveIndexReg; }
void __irq IsrDma2(void) { U8 out_csr3; U32 nextTotalDmaCount; U8 saveIndexReg=rINDEX_REG; rINDEX_REG=3; out_csr3=rOUT_CSR1_REG; ClearPending(BIT_DMA2); totalDmaCount+=0x80000; if(totalDmaCount>=downloadFileSize)// is last? { totalDmaCount=downloadFileSize; ConfigEp3IntMode(); if(out_csr3& EPO_OUT_PKT_READY) { CLR_EP3_OUT_PKT_READY(); } rINTMSK|=BIT_DMA2; rINTMSK&=~(BIT_USBD); } else { if((totalDmaCount+0x80000)<downloadFileSize) { nextTotalDmaCount=totalDmaCount+0x80000; if((nextTotalDmaCount+0x80000)<downloadFileSize) { //for (2~n)th autoreload. rDIDST2=((U32)downloadAddress+nextTotalDmaCount-8); rDIDSTC2=(1<<2)|(0<<1)|(0<<0); rDCON2=rDCON2&~(0xfffff)|(0x80000); while(rEP3_DMA_TTC<0xfffff) { rEP3_DMA_TTC_L=0xff; rEP3_DMA_TTC_M=0xff; rEP3_DMA_TTC_H=0xf; //0xfffff; } } else { rDIDST2=((U32)downloadAddress+nextTotalDmaCount-8); rDIDSTC2=(0<<1)|(0<<0); rDCON2=rDCON2&~(0xfffff)|(downloadFileSize-nextTotalDmaCount); while(rEP3_DMA_TTC<0xfffff) { rEP3_DMA_TTC_L=0xff; rEP3_DMA_TTC_M=0xff; rEP3_DMA_TTC_H=0xf; //0xfffff; } } } else { // rDIDST2=((U32)downloadAddress+downloadFileSize-8); //for next autoreload. rDIDSTC2=(0<<1)|(0<<0); // reload is occurred when Curr_TC is 0 // rDCON2=rDCON2&~(0xfffff)|(0); //There is no 2nd autoreload. This will not be used. //rDMA_TX+=0x0; //USBD register } } rINDEX_REG=saveIndexReg; }