📄 d12api.c
字号:
/*********************发到接口的获取描述符**************************************/
void get_descriptor_interface(void)
{
Prints(" 获取描述符(从接口)..............................",1);
if(!usb_flags.flags.not_end)
{
switch(MSB(Control_Data.DeviceRequest.wValue))
{
case HID_DESCRIPTOR:
Prints(" 获取HID描述符................................",1);
Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
//Control_Data.pData=(uint8 *)(&hid_descriptor);
break;
case REPORT_DESCRIPTOR:
Prints(" 获取报告描述符................................",1);
Control_Data.wCount=SWAP16(sizeof(MouseReportDescriptor));
Control_Data.pData=(uint8 *)(MouseReportDescriptor);
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
break;
case PHYSICAL_DESCRIPTOR:
Prints(" 获取物理描述符................................",1);
break;
default:
Prints(" 获取其它描述符..................描述符索引为:",0);
PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
Prints("",1);
break;
}
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
}
//写数据到D12输入端点
if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
{
write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
else usb_flags.flags.usb_endp0_in=0;
return;
}
else
{
write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.usb_endp0_in=0;
return;
}
}
/******************************************************************************/
/************************终端点0输出中断处理************************************/
void endp0_out(void)
{
Last_Status.Register=read_last_status(0);
if(Last_Status.Status.setup_packet)
{
Control_Data.wLength=0;
Control_Data.wCount=0;
if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
{
set_endpoint_status(0,0);
set_endpoint_status(1,0);
return;
}
Control_Data.DeviceRequest.wValue=SWAP16(Control_Data.DeviceRequest.wValue);
Control_Data.DeviceRequest.wIndex=SWAP16(Control_Data.DeviceRequest.wIndex);
Control_Data.DeviceRequest.wLength=SWAP16(Control_Data.DeviceRequest.wLength);
ack_setup(0);
ack_setup(1);
Control_Data.wLength=Control_Data.DeviceRequest.wLength;
usb_flags.flags.not_end=0;
usb_flags.flags.usb_endp0_in=1;
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.setup_packet_out=0;
if(Control_Data.DeviceRequest.bmRequestType&0x80){usb_flags.flags.setup_packet_in=1;return;}
else {usb_flags.flags.setup_packet_out=1;return;}
}
else
{
select_endpoint(0);
clear_buffer();
}
}
/******************************************************************************/
/***********************获取报告*********************************************/
void get_report(void)
{
Prints(" 获取报告................................",1);
}
/******************************************************************************/
/**********************获取空闲状态*********************************************/
void get_idle(void)
{
Prints(" 获取空闲................................",1);
write_endpoint_buff(1,1,&idle);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/*************************获取协议**********************************************/
void get_protocol(void)
{
Prints(" 获取协议................................",1);
write_endpoint_buff(1,1,&protocol);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/***********************设置报告***********************************************/
void set_report(void)
{
Prints(" 设置报告................................",1);
}
/******************************************************************************/
/***********************设置空闲***********************************************/
void set_idle(void)
{
Prints(" 设置空闲................................",1);
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
idle=Control_Data.DeviceRequest.wValue;
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/**********************设置协议**************************************************/
void set_protocol(void)
{
Prints(" 设置协议................................",1);
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
protocol=Control_Data.DeviceRequest.wValue;
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/****************************终端点0输入处理**************************************/
void endp0_in(void)
{
read_last_status(1);
//如果是输入请求包
if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
Prints("USB标准请求................................",1);
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(0);break;
case 6: get_descriptor();break;
case 8: get_configuration();break;
default:break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(1);break;
case 6: get_descriptor_interface();break;
case 10: get_interface();break;
default: break;
}
break;
case 2: //到端点
{
if(Control_Data.DeviceRequest.bRequest==0)get_status(2);
}
default: break;
}
break;
case 0x20: //类请求
Prints("USB类请求................................",1);
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
default:break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case GET_REPORT: get_report(); break; //获取报告
case GET_IDLE: get_idle(); break; //获取空闲状态
case GET_PROTOCOL: get_protocol(); break; //获取协议
default: break;
}
break;
case 2: //到端点
{
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
}
default: break;
}
break;
case 0x40: //用户请求
Prints("USB用户请求................................",1);
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 2: //到端点
{
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
}
default: break;
}
}
return;
}
//如果是输出请求包
if(usb_flags.flags.setup_packet_out)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
Prints("USB标准请求................................",1);
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(0);break;
case SET_FEATURE: set_feature(0);break;
case SET_ADDRESS: set_usb_address();break; //set_address
case SET_DESCRIPTOR: set_descriptor();break; //set_descriptor
case SET_CONFIGURATION: set_configuration(); break; //set_configurat
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(1);break;
case SET_FEATURE: set_feature(1); break;
case SET_INTERFACE: set_interface();break;
default: break;
}
break;
case 2: //到端点
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(2);break;
case SET_FEATURE: set_feature(2);break;
default: break;
}
break;
default: break;
}
break;
case 0x20: //类请求
Prints("USB类请求................................",1);
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //接收者为设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //接收者为接口
switch (Control_Data.DeviceRequest.bRequest)
{
case SET_REPORT: set_report(); break; //设置报告
case SET_IDLE: set_idle(); break; //设置空闲
case SET_PROTOCOL: set_protocol(); break; //设置协议
default: break;
}
break;
case 2: //接收者为端点
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 3: //其它接收者
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}break;
default: break;
}
break;
case 0x40: //用户请求
Prints("USB用户请求................................",1);
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //接收者为设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //接收者为接口
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 2: //接收者为端点
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 3: //其它接收者
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
default: break;
}
}
}
}
/******************************************************************************/
/**********************端点1输出***********************************************/
/*void endp1_out(void)
{
Prints("端点1输出................................",1);
}*/
/******************************************************************************/
/*************************端点1输入*****************************************/
/*void endp1_in(void)
{
Prints("端点1输入................................",1);
}*/
/******************************************************************************/
/***************************端点2输出****************************************/
void endp2_out(void)
{
uint8 i,j;
j=read_endpoint_buff(4,64,buffer);
P2=~buffer[0];
Prints("端点2输出................................",1);
Prints(" 端点2的数据是 ",0);
for(i=0;i<j;i++)
{
PrintHex(buffer[i]);
if(i==16)Prints("",1);
}
Prints("",1);
}
/******************************************************************************/
//用来返回数据的缓冲
uint8 idata InBuffer[64];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -