⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dmadebug.c

📁 基于USB2.0芯片 ISP1581 的扫描仪固件源码,USB驱动模块
💻 C
📖 第 1 页 / 共 2 页
字号:
         //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 + -