📄 epsetup.c
字号:
#include"mytype.h"
#include "d12_command.h"
#include"d12_value.h"
#include"port.h"
#include"epmain.h"
#include"uar.h"
extern USB_FLAGS usb_flags;
extern INT_REG Interrupt_Register;
extern LAST_STATUS Last_Status;
extern CONTROL_DATA_BUFF Control_Data;
/************************终端点0输出中断处理************************************/
void endp0_out(void)
{uint16 i;
Prints("ep0_out\r\0");
Last_Status.value=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);
usb_flags.Status.control_state = USB_IDLE;
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);
select_endpoint(0);
clear_buffer();
usb_flags.Status.setup_packet=1;
Control_Data.wLength=Control_Data.DeviceRequest.wLength;
if(Control_Data.DeviceRequest.bmRequestType&0x80)
{
usb_flags.Status.control_state=USB_TRANSMIT;
}
else
{
usb_flags.Status.control_state=USB_RECEIVE;
}// set command with data
// else set command
}// if setup packet
// 接收内容
else if(usb_flags.Status.control_state==USB_RECEIVE) //正常的0端点写数据
{
i = read_endpoint_buff(0, EP0_PACKET_SIZE,Control_Data.dataBuffer + Control_Data.wCount); //从端点0接收数据
Control_Data.wCount +=i ; //统计已接收的字节数
if( i != EP0_PACKET_SIZE || Control_Data.wCount >= Control_Data.wLength)
{ //数据接收完毕
//通知control_handler()处理Setup包
usb_flags.Status.control_state = USB_IDLE; //设置为等待状态
}
}
else
usb_flags.Status.control_state = USB_IDLE;
}
/******************************************************************************/
/****************************终端点0输入处理**************************************/
void endp0_in( void)
{
uint16 i = Control_Data.wLength - Control_Data.wCount; //计算未发送的字节数
read_last_status(1); //清除中断寄存器标志位
Prints("ep0_in\r \0");
if (usb_flags.Status.control_state != USB_TRANSMIT)
{ //非发送状态
write_endpoint_buff(1,0,0);
Prints(" ep0_in错误返回\r\0");
return; //返回
}
if (Control_Data.wLength==0)
{ //非发送状态
write_endpoint_buff(1,0,0);
Prints(" ep0_in0长度写返回\r\0");
return; //返回
}
if( i >= EP0_PACKET_SIZE)
{ //未发送字节数大于16,发送16个字节
write_endpoint_buff(1, EP0_PACKET_SIZE, Control_Data.pData + Control_Data.wCount);
Control_Data.wCount += EP0_PACKET_SIZE;
usb_flags.Status.not_end=1;
usb_flags.Status.control_state = USB_TRANSMIT;
Prints(" 没有写完 \r\0");
}
else if( i != 0) { //发送所有未发送的字节
write_endpoint_buff(1, i, Control_Data.pData + Control_Data.wCount);
Control_Data.wCount += i;
usb_flags.Status.control_state = USB_IDLE; //置状态为等待状态
usb_flags.Status.not_end=0;
Prints(" 写完 \r\0");
}
else if (i == 0){
write_endpoint_buff(1, 0, 0); //发送完毕,发0个字节
usb_flags.Status.control_state = USB_IDLE;
usb_flags.Status.not_end=0;
Prints(" 写空白字 \r\0");
}
}
/******************************************************************************/
void call_c9(void)
{Prints("进入第九章\r\0");
//如果是输入请求包
if(usb_flags.Status.control_state==USB_TRANSMIT)
{Prints(" 输入包\r\0");
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
Prints(" 输入标准请求\r\0");
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: //类请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
default:break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case 01: get_report(); break; //获取报告
case 02: get_idle(); break; //获取空闲状态
case 03: get_protocol(); break; //获取协议
default: break;
}
break;
case 2: //到端点
{
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
}
default: break;
}
break;
case 0x40: //用户请求
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.Status.control_state==USB_RECEIVE)
{Prints(" 输出包\r\0");
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case 01: clear_feature(0);break;
case 03: set_feature(0);break;
case 05: set_usb_address();break; //set_address
case 07: set_descriptor();break; // //set_descriptor
case 0x09: set_configuration(); break; // //set_configurat
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case 01: clear_feature(1);break;
case 03: set_feature(1); break;
case 0x0B: set_interface();break;
default: break;
}
break;
case 2: //到端点
switch (Control_Data.DeviceRequest.bRequest)
{
case 01: clear_feature(2);break;
case 03: set_feature(2);break;
default: break;
}
break;
default: break;
}
break;
case 0x20: //类请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //接收者为设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //接收者为接口
switch (Control_Data.DeviceRequest.bRequest)
{
case 0x09: set_report(); break; //设置报告
case 0x0A: set_idle(); break; //设置空闲
case 0x0B: 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: //用户请求
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;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -