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

📄 usb.c.bak

📁 motorola jw32 usb 源码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
                UEP0CSR_DVALID_OUT=0;
                SetupBuffer.bRequest = REQUEST_COMPLETE;
                UEP0CSR=0x00;
		    }
	    }
}
//MOUSE end
BYTE SendUsbMsData(unsigned char *buffer,unsigned char length)
{
    uchar n,i;
	uchar *dest;
    DisableInterrupts;
    if(UEP1CSR_DVALID)                  //前一次送数未取走返回失败
    {
    	  EnableInterrupts;
       return FAIL;
    }
    n=length;
    if(n>16)
    {
    	    EnableInterrupts;
        return FAIL;
     }

    dest =(unsigned char *)0x1000;
    for(i=0;i<n;i++)
    {
        *dest=buffer[i];
        dest++;
    }
    UEP1DSR=n;                       //发送字节数
    UEP1CSR_DVALID=1;
    UsbIdleFlag = 0;
 //   LED^=1  ;
    EnableInterrupts;
    return SUCCESS;
}
//keyboard end
BYTE SendUsbKbData(unsigned char *buffer,unsigned char length)
{
    uchar n,i;
	uchar *dest;
				DisableInterrupts;
    if(UEP2CSR_DVALID)                  //前一次送数未取走返回失败
    {
    	    EnableInterrupts;
        return FAIL;
      }

    n=length;
    if(n>16)
    {
    	    EnableInterrupts;
        return FAIL;
     }
    dest =(unsigned char *)0x1010;
    for(i=0;i<n;i++)
    {
        *dest=buffer[i];
        dest++;
    }
    UEP2DSR=n;                       //发送字节数
    UEP2CSR_DVALID=1;
    EnableInterrupts;
    return SUCCESS;
}
//joystick end
BYTE SendUsbjk1Data(unsigned char *buffer,unsigned char length)
{
    uchar n,i;
	uchar *dest;
				DisableInterrupts;
    if(UEP3CSR_DVALID)                  //前一次送数未取走返回失败
    {
        EnableInterrupts;
        return FAIL;
      }

    n=length;
    if(n>16)
    {
    	    EnableInterrupts;
        return FAIL;
     }
    dest =(unsigned char *)0x1020;
    for(i=0;i<n;i++)
    {
        *dest=buffer[i];
        dest++;
    }
    UEP3DSR=n;                       //发送字节数
    UEP3CSR_DVALID=1;
    EnableInterrupts;
    return SUCCESS;
}
//joystick2 end
BYTE SendUsbjk2Data(unsigned char *buffer,unsigned char length)
{
    uchar n,i;
	uchar *dest;
				DisableInterrupts;
    if(UEP4CSR_DVALID)                  //前一次送数未取走返回失败
    {
        EnableInterrupts;
        return FAIL;
      }

    n=length;
    if(n>16)
    {
    	    EnableInterrupts;
        return FAIL;
     }
    dest =(unsigned char *)0x1030;
    for(i=0;i<n;i++)
    {
        *dest=buffer[i];
        dest++;
    }
    UEP4DSR=n;                       //发送字节数
    UEP4CSR_DVALID=1;
    EnableInterrupts;
    return SUCCESS;
}
//output
/*void handleOUT3(void)
{
    uchar n,i;
	uchar *dest;

    if(UEP3CSR_DVALID==0)
        return;

    n=UEP3DSR;

    dest =(unsigned char *)0x1020;
    for(i=0;i<n;i++)
    {
       In_Packet[i] =*dest;
        dest++;
    }

    UEP3CSR_DVALID=0;
    return;
}
*/
interrupt 2 void USB_System_Interrupt(void)
{                                       //USB系统中断
//    uchar n;
//	uchar *dest;

    if(USBSR_SETUP)                     //SETUP中断
    {
        if(USIMR_SETUPIE)
            return;
    }
	if(USBSR_SUSPND)                    //挂起中断
	{
	    if(USIMR_SUSPNDIE)
	    {
	        USBSR_SUSPND=0;             //;Clear SUSPEND flag
	        USBCR_USBCLKEN=0;
          USB_Status=0x01;          //suspend
          PCTL=0;                   //warning:Must close pll.for reduce power to 100ua.in case of
          return;                   //can not wake up from suspend
       }
    }
	if(USBSR_RESUMEF)                   //恢复中断
	{
	    //if(USIMR_RESUMEFIE)  //from pc wakeup
	    {
	        USBSR_RESUMEF=0;            //;Clear RESUMEF flag
	        if(USB_Status==0x01)
	        {
	        	 Wait_x_us_8MHz_Bus(5);
             PLL_Start();
	       		 USBCR_USBCLKEN=1;
	       		 USB_Status  = 0x02;
	       	}
            return;
        }
    }
	if(USBSR_CONFIG_CHG)                //配置中断
	{
	    ///if(USIMR_CONFIG_CHGIE)
	    {
	        if(USBSR_CONFIG)
	        {                           //端点1
	            UEP1DSR=0;
	            UEP1CSR=UEP1CSR_DVALID_MASK;

	                                    //端点2
	            UEP2DSR=0;
	            UEP2CSR=UEP2CSR_DVALID_MASK;
	                                    //端点3
	            UEP3DSR=0;
	            UEP3CSR=UEP3CSR_DVALID_MASK;
	                                    //端点4
	            UEP4DSR=0;
	            UEP4CSR=UEP4CSR_DVALID_MASK;

	        }
	        USBSR_CONFIG_CHG=0;         //;Clear CONFIG_CHG flag
            return;
        }
    }
	if(USBSR_USBRST)                    //复位中断
	{
	   // if(USIMR_USBRSTIE)
	    {
	        USBSR_USBRST=0;             //;Clear USBRST flag
	        USB_Status=0x04;            //;Set Software Flag
	        USB_EN();

            return;
        }
    }
    if(USBSR_SOF)
    {
       // if(USIMR_SOFIE)
        {
            USBSR_SOF=0;                //;Clear SOF flag
        }
    }

}

interrupt 3 void USB_Endpoint_Interrupt(void)
{                                       //USB端点中断
    if(UEP0CSR_TFRC_IN)                 //端点0输入中断
    {
        //if(USBCR_TFC0IE)
        {
            UEP0CSR_TFRC_IN=0;
            handleIN();
            return;
        }
    }
    if(UEP0CSR_TFRC_OUT)           //端点0输出中断
    {
        //if(USBCR_TFC0IE)
        {
            UEP0CSR_TFRC_OUT=0;
            if(USBSR_SETUP)
            {
                USB_Processor();
            }
            else
            {
                if(UEP0CSR_DVALID_IN)
            	    if(!handleOUT());
         //   	    {
            	     //  UEP0CSR=0x00;
        //    	    }
            	    UEP0CSR_DVALID_OUT=0;

            }

            return;
        }
    }
//    LED^=1;
    if(UEP1CSR_TFRC)               //端点1中断
    {
       // if(USBCR_TFC1IE)
        {
            UEP1CSR_TFRC=0;
          	//LED_DATA^=1;
 						if(Queue_Get(In_PacketDev,MOUSE))//true buffer normal or false empty
            {
            if(	SendUsbMsData(In_PacketDev,MOUSELENGTH)) ;
            } else {
              UsbIdleFlag = 1;
            }
          //  return;
        }
    }
    else if(UEP2CSR_TFRC)               //端点2中断
    {
        //if(USBCR_TFC2IE)
        {
            UEP2CSR_TFRC=0;
            UEP2DSR=0;                       //发送字节数
            /*if(Queue_Get(In_PacketDev,KEYBOARD))//true buffer normal or false empty
            {
            	if(SendUsbKbData(In_PacketDev,6)) ;//kb length change
            }*/
          //  return;
        }
    }
    else if(UEP3CSR_TFRC)               //端点3中断
    {
        //if(USBCR_TFC3IE)
        {
            UEP3CSR_TFRC=0;

            //UEP3DSR=0;                       //发送字节数
//            UEP3CSR_DVALID=1;
//            handleOUT3();
           // return;
        }
    }
    else if(UEP4CSR_TFRC)               //端点4中断
    {
       // if(USBCR_TFC4IE)
        {
            UEP4CSR_TFRC=0;
        }
    }
}

void USBACK(uchar flag)
{
   uchar buffer[4];
    buffer[0]=0x07;
    buffer[1]='A';
    buffer[2]='k';
    if(flag ==FAIL)
    {
        buffer[3]=0x01;
    }
    //ok
   else
         buffer[3]=0x00;
  // SendUsbjkData(buffer,4);

}
//hid output
BYTE APPGetUsbData(unsigned char *buffer,unsigned char *length)
{
   uchar i;
    if(Inlength>*length)//return error,tell pc
    {
        return FAIL;
    }
   for(i=0;i<Inlength;i++)
    {
        buffer[i]=In_Packet[i];
    }
    *length = Inlength;
 /*  byte n,i;
	byte *dest;
	halWait(2);

	if(UEP0CSR_DVALID_OUT==0)
	{
			UEP0CSR=    UEP0CSR_DVALID_IN_MASK;
	    return FAIL;
	}
	LED^=1  ;
	 n=UEP0CSR>>4;
	 if(n<2)                    //接收字节数;
	 {
	    UEP0CSR=    UEP0CSR_DVALID_IN_MASK;
	    return FAIL;
	 }
     if(n>*length)//return error,tell pc
    {
         UEP0CSR=    UEP0CSR_DVALID_IN_MASK;
        return FAIL;
    }
    dest =(unsigned char *)&UE0D0;
   for(i=0;i<n;i++)
    {
        buffer[i]=*dest;
        dest++;
    }
    *length = n;
    UEP0CSR=    UEP0CSR_DVALID_IN_MASK;
*/
   	 return (SUCCESS);

}
//-----------------------------------------
//-----------------------------------------
void USB_Wakeup(void) {
	 USB_Status=0x02;
	 Wait_x_us_8MHz_Bus(5);
   PLL_Start();          //jc
   USBCR_USBCLKEN=1;
   USBCR_RESUME =1; //Enable Remote wakeup

}
//-----------------------------------------
BYTE UsbKbIsIdle()
{
	  if(UEP2CSR_DVALID)                  //前一次KB送数未取走返回失败
    {
        return 0;
    }
    return 1;
}
BYTE UsbMsIsIdle()
{
	  if(UEP1CSR_DVALID)                  //前一次ms送数未取走返回失败
    {
        return 0;
    }
    return 1;
	  
}

BYTE PutUsbData(BYTE *Buffer,BYTE Length,BYTE whichend)
{
     //PTC_PTC0^=1;
     BYTE i,flag;
    //if (!PCTL_BCS) USB_Wakeup();
    if(USB_Status==1) USB_Wakeup();////from device wakeup
    if(whichend == MAC_DEVICE_MOUSE)  //endpoint 1
    {
        if(Length>MOUSELENGTH)
        {
            return FAIL;
        }
        flag =0;
		for(i=0;i<Length;i++)
		{
			if(Buffer[i]!=In_PacketMs[i])
			{
					flag =1;
					In_PacketMs[i] = 	Buffer[i];
			}
		}
		if(flag==0)//no change
		{
		    for(i=0;i<Length;i++)
			{
				if(Buffer[i]!=0x00)
				{
                      break;
				}
			}
            if(i>=Length)//filter no change 0 data
            {
               return FAIL;
            }
		}
    	  if(UsbIdleFlag) {
    	  			 if(SendUsbMsData(Buffer,MOUSELENGTH))
    	  			 		return SUCCESS;
    	  }
    	DisableInterrupts;
      	if(Queue_Put(Buffer,MOUSE)==FALSE){
    				Queue_Init();
    				UsbIdleFlag=1;
    	}
    	EnableInterrupts;
    }
    else  if(whichend == MAC_DEVICE_KEYBOARD)//endpoint 2
    {        
				DisableInterrupts;
				if(Length<KEYBOARDLENGTH)
         {
         				if(InSize==3)          
         				{                      
         						Buffer[3]=0x00;  
                		Length=4;   
                }                    		
                if(SendUsbjk1Data(Buffer,Length)==FAIL)
                {
                    	;
                }
                 EnableInterrupts;
        		     return SUCCESS;
          }     
          Buffer++;
          Length--;//6	
          flag =0;
					for(i=0;i<Length;i++)
					{
						if(Buffer[i]!=In_PacketKb[i])
						{
								flag =1;
								In_PacketKb[i] = 	Buffer[i];
						}
					}
					 for(i=Length;i<8;i++)
           {                    	
                    		In_PacketKb[i]=0x00;                   	
           }
           Length=8;
					if(flag)
					{					
				      if(SendUsbKbData(In_PacketKb,Length))
				      {
				        	EnableInterrupts;
				        	return SUCCESS;
				      }
		      }
				  EnableInterrupts;
    }
     else  if(whichend == MAC_DEVICE_JOYSTICK0)//endpoint 2
     {
     		if(Length>7)
         {
            return FAIL;
        }
        if(SendUsbjk1Data(Buffer,Length)==FAIL)
        {
    				;
    		}
     }
      else  if(whichend == MAC_DEVICE_JOYSTICK1)//endpoint 2
     {
     		if(Length>7)
         {
            return FAIL;
        }

        if(SendUsbjk2Data(Buffer,Length)==FAIL)
        {
    				;
    		}
     }
    return SUCCESS;
}
//check usb kb queue whether have data to send
/*void Usb_KbQueueChk()
{
	if(Queue_State(KEYBOARD)!=EMPTY)
	{
		if(UEP2CSR_DVALID==0) //usb kb endpoint is idle
		{
			if(Queue_Get(In_PacketDev,KEYBOARD))//true buffer normal or false empty
		  {
		            	if(SendUsbKbData(In_PacketDev,6)) ;//kb length change
		  }
		}
	}

}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -