?? chap_9.c
字號:
void get_config(void)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Device_Config_Value;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
wait_ep0tx();
ep0out_ack();
}
//Clear_Feature特性清除
void clear_feature(void)
{
unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
//端點
if(bRecipient == 0x02 &&USB_Device_Request.wValue == 0x0000)
{
switch(USB_Device_Request.wIndex)
{
case 0x8000 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
break;
case 0x0000 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
break;
case 0x8100 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
break;
case 0x0100 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
break;
case 0x8200 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
break;
case 0x0200 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
break;
case 0x8300 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
break;
case 0x0300 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
break;
case 0x8400 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
break;
case 0x0400 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
break;
case 0x8500 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
break;
case 0x0500 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
break;
case 0x8600 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
break;
case 0x0600 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
break;
case 0x8700 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
break;
case 0x0700 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
break;
default :
break;
}
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
Kernel_Flag.BITS.Endpt_Stall = 0;
D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
ep0in_ack();
USB_Device.BITS.Halt = 0;
}
else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
{ //遠程喚醒
USB_Device.BITS.Remote_Wakeup = 0;
ep0in_ack();
}
else
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
while(!USB_Int_Flag.BITS.EP0SETUP)
{
//讀取ISP1581中斷寄存器
USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
//回寫ISP1581中斷寄存器
D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0TX = 0;
}
}
//Get_Status獲取設備狀態
void get_status(void)
{
if(USB_Device_Request.bmRequestType == 0x80)
{
//端點0IN返回0x01,0x00兩字節
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
//等待發送完畢
wait_ep0tx();
ep0out_ack();
}
if(USB_Device_Request.bmRequestType == 0x81)
{
//端點0IN返回0x00,0x00兩字節
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
wait_ep0tx();
ep0out_ack();
}
if(USB_Device_Request.bmRequestType == 0x82)
{
Temp = 0;
Temp = USB_Device.BITS.Halt;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = (UC) Temp;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = (UC) (Temp >> 8);
wait_ep0tx();
ep0out_ack();
}
}
//Set_Feature特性設置
//不支持測試模式
void set_feature(void)
{
unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
//端點
if(bRecipient == 0x02 && USB_Device_Request.wValue == 0x0000)
{
switch(USB_Device_Request.wIndex)
{
case 0x8000 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
break;
case 0x0000 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
break;
case 0x8100 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
break;
case 0x0100 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
break;
case 0x8200 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
break;
case 0x0200 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
break;
case 0x8300 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
break;
case 0x0300 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
break;
case 0x8400 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
break;
case 0x0400 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
break;
case 0x8500 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
break;
case 0x0500 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
break;
case 0x8600 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
break;
case 0x0600 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
break;
case 0x8700 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
break;
case 0x0700 :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
break;
default :
break;
}
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
Kernel_Flag.BITS.Endpt_Stall = 1;
D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
//D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
ep0in_ack();
USB_Device.BITS.Halt = 0;
}
else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
{ //遠程喚醒
USB_Device.BITS.Remote_Wakeup = 1;
ep0in_ack();
}
else
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
while(!USB_Int_Flag.BITS.EP0SETUP)
{
//讀取ISP1581中斷寄存器
USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
//回寫ISP1581中斷寄存器
D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0TX = 0;
}
}
//Get_Interface 獲取接口狀態
void get_interface(void)
{
if(USB_Device_Request.wValue != 0)
{
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
while(!USB_Int_Flag.BITS.EP0SETUP)
{
//讀取ISP1581中斷寄存器
USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
//回寫ISP1581中斷寄存器
D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0TX = 0;
}
else
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
if(!USB_Device.BITS.Alter_Interface)
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
else
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
wait_ep0tx();
ep0in_ack();
}
}
//Set_Interface 設置接口狀態
void set_interface(void)
{
if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0x0100)
USB_Device.BITS.Alter_Interface = 1;
if(USB_Device_Request.wIndex == 0x0100 && USB_Device_Request.wValue == 0)
USB_Device.BITS.Alter_Interface = 0;
if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0)
USB_Device.BITS.Alter_Interface = 0;
ep0in_ack();
}
//端點0IN狀態響應
void ep0in_ack(void)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
wait_ep0tx();
}
//端點0IN狀態響應
void wait_ep0tx(void)
{
//end of status stage
while(!USB_Int_Flag.BITS.EP0TX)
{
//讀取ISP1581中斷寄存器
USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
//回寫ISP1581中斷寄存器
D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0TX = 0;
}
//端點0OUT狀態響應
void ep0out_ack(void)
{
//設置狀態響應
//acknowledge status stage
D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
// D14_Cntrl_Reg.D14_CONTROL_FUNCTION.VALUE = 2;
wait_ep0rx();
}
//端點0OUT狀態響應
void wait_ep0rx(void)
{
while(!USB_Int_Flag.BITS.EP0RX)
{
//讀取ISP1581中斷寄存器
USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
//回寫ISP1581中斷寄存器
D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0RX = 0;
}
#pragma disable
/*
unsigned int read_endpoint(unsigned char endp,unsigned int len,unsigned char *buf)
{
unsigned int datalen;
D14_Cntrl_Reg.D14_ENDPT_INDEX = endp;
len = D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB;
len <<= 8;
len += D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB;
datalen=len;
while(datalen-- != 0)
{
*buf = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //fill up FIFO
buf++;
}
return len;
}
unsigned int write_endpoint(unsigned char endp,unsigned int len,unsigned char *buf)
{
unsigned int datalen;
D14_Cntrl_Reg.D14_ENDPT_INDEX = endp;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (unsigned char) len;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (unsigned char) (len>>8);
datalen=len;
while(datalen-- != 0)
{
D14_Cntrl_Reg.D14_DATA_PORT_LSB = *buf; //fill up FIFO
buf++;
}
return len;
}*/
void delay()
{
UC i,j;
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
void rt2_process()
{
UC i,j;
if(USB_Device_Request.wIndex==GET_SET_EEPROM_REQUEST)
{
USB_Device_Request.wValue=USB_Device_Request.wValue>>8;
if(bytecouter>8)
{
j=bytecouter/8;
for(i=0;i<j;i++)
{
ISendStr(0xa0,((UC)(USB_Device_Request.wValue+(i*8))),&Endpt_FIFO[i*8],8);
delay();
}
j=bytecouter%8;
ISendStr(0xa0,((UC)(USB_Device_Request.wValue+(i*8))),&Endpt_FIFO[i*8],j);
}
else
ISendStr(0xa0,(UC)USB_Device_Request.wValue,Endpt_FIFO,bytecouter);
}
for(i=0;i<64;i++)
Endpt_FIFO[i]=0;
ZLG7289_SendBuf(disp_buf1);
}
void tt2_process()
{
if(USB_Device_Request.wIndex==GET_SET_EEPROM_REQUEST)
{
USB_Device_Request.wValue=USB_Device_Request.wValue>>8;
IRcvStr(0xa0,(UC)USB_Device_Request.wValue,Endpt_FIFO,bytecouter);
ZLG7289_SendBuf(disp_buf0);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -