📄 usb.c.bak
字号:
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 + -