📄 dmadebug.c
字号:
//initialize DMA transfer counter according to the
//host requirement
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = (UC) bytecount;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = (UC) (bytecount >> 8);
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = 0;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = 0;
//start DMA transfer
// sri DMA_Start = GDMA_Start;
}
//check the type of transfer mode selected
switch(USB_Device.BITS.DMA_Test_Mode)
{
case GDMA_Test :
D14_Cntrl_Reg.D14_DMA_COMMAND = GDMA_Write_Command;
break;
case MDMA_Test :
D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Write_Command;
break;
case PIO_Test :
do
{
//Check for Out Token ACK interrupt
while(!USB_Int_Flag.BITS.EP2RX)
{
if(USB_Int_Flag.BITS.SUSP ||
Kernel_Flag.BITS.Bus_Reset ||
USB_Int_Flag.BITS.EP0SETUP)
break;
}
USB_Int_Flag.BITS.EP2RX = 0;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
//Read in FIFO data
if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
{
for(Count_PIO = 0 ; Count_PIO < PIO_Count ; Count_PIO++)
Endpt_FIFO[Count_PIO] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
}
else
{
for(Count_PIO = 0 ; Count_PIO < PIO_Count ; Count_PIO++)
Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
}
bytecount -= PIO_Count;
}while(bytecount);
break;
default :
break;
}
//check for end of transfer or permature termination
while(!DMA_Int_Flag.BITS.DMA_DONE && !DMA_Int_Flag.BITS.INT_EOT)
{
//if transfer mode is PIO mode, exit
if(USB_Device.BITS.DMA_Test_Mode == PIO_Test)
break;
//Exit function when bus reset or suspend detected
if(USB_Int_Flag.BITS.SUSP || Kernel_Flag.BITS.Bus_Reset ||
USB_Int_Flag.BITS.EP0SETUP)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_RESET;
DMA_Init();
break;
}
}
//transfer done,reset internal variables
DMA_Int_Flag.BITS.DMA_DONE = 0;
DMA_Int_Flag.BITS.INT_EOT = 0;
//stop DMA oontroller and initialize
//reset sequence
//DMA_Start = GDMA_Stop;
}
else
{
if(USB_Device.BITS.DMA_Test_Mode != PIO_Test)
{
DMA_Reset = 1;
DMA_Reset = 0;
DMA_Reset = 1;
//check if external DMA controller in master mode
if(Type & 0x01)
//set to read mode (MASTER MODE)
DMA_Wr_Rd = GDMA_Read;
else
//set to write mode (SLAVE MODE)
DMA_Wr_Rd = GDMA_Write;
//check if reset procedure done
//if not goto reset process
if(!Kernel_Flag.BITS.In_Reset_Done)
{
//reset DMA controller
// sri DMA_Start = GDMA_Stop;
//DMA_Reset = 0;
//DMA_Reset = 1;
Kernel_Flag.BITS.Out_Reset_Done = 0;
Kernel_Flag.BITS.In_Reset_Done = 1;
}
//initialize endpoint index
D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 5;
//set the transfer counter according to the host requirement
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = (UC) bytecount;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = (UC) (bytecount >> 8);
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = 0;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = 0;
//start DMA transfer
// sri DMA_Start = GDMA_Start;
}
//check for the DMA controller setting
switch(USB_Device.BITS.DMA_Test_Mode)
{
case GDMA_Test :
D14_Cntrl_Reg.D14_DMA_COMMAND = GDMA_Read_Command;
break;
case MDMA_Test :
D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Read_Command;
break;
case PIO_Test :
do
{
//initialize endpoint index
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
//Write data to FIFO
if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
{
for(Count_PIO = 0 ; Count_PIO < PIO_Count ; Count_PIO++)
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Endpt_FIFO[Count_PIO];
}
else
{
for(Count_PIO = 0 ; Count_PIO < PIO_Count ; Count_PIO++)
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Count_PIO;
}
//Check for In Token ACK
while(!USB_Int_Flag.BITS.EP2TX)
{
if(USB_Int_Flag.BITS.SUSP ||
Kernel_Flag.BITS.Bus_Reset ||
USB_Int_Flag.BITS.EP0SETUP)
break;
}
USB_Int_Flag.BITS.EP2TX = 0;
bytecount -= PIO_Count;
}while(bytecount);
break;
default :
break;
}
//check for end of data transfer
while(!DMA_Int_Flag.BITS.DMA_DONE)
{
if(USB_Device.BITS.DMA_Test_Mode == PIO_Test)
break;
if(USB_Int_Flag.BITS.SUSP || Kernel_Flag.BITS.Bus_Reset ||
USB_Int_Flag.BITS.EP0SETUP)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_RESET;
DMA_Init();
break;
}
}
//stop DMA controller
//sri Oct 29,2003 DMA_Start = GDMA_Stop;
D14_Cntrl_Reg.D14_SCRATCH_REGISTER = 0x55;
//transfewr done,reset internal variables
DMA_Int_Flag.BITS.DMA_DONE = 0;
Count_PIO = 0;
/* sri Oct 29,2003
while(!USB_Int_Flag.BITS.EP0SETUP)
{
Count_PIO++;
if(Count_PIO == 2000)
{
RESET_IDE = 1;
break;
}
}*/
}
Kernel_Flag.BITS.Transfer_Start = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -