📄 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 + -