📄 usb2uart.c
字号:
if(!usb_flags.flags.not_end)
{
switch(MSB(Control_Data.DeviceRequest.wValue))
{
case HID_DESCRIPTOR:
#ifdef debug
Prints(" 获取HID描述符.\r\n");
#endif
Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
//Control_Data.pData=(uint8 *)(&hid_descriptor);
break;
case REPORT_DESCRIPTOR:
#ifdef debug
Prints(" 获取报告描述符.\r\n");
#endif
break;
case PHYSICAL_DESCRIPTOR:
#ifdef debug
Prints(" 获取物理描述符.\r\n");
#endif
break;
default:
Prints(" 获取其它描述符..................描述符索引为:");
PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
Prints("\r\n");
DispLineInf();
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;
}
}
/******************************************************************************/
//#define debug3
/***************设置串口的数据阶段*********************************/
void SetLineCodingD(void)
{
#ifdef debug3
Prints("设置串口属性数据阶段");
#endif
read_endpoint_buff(0,7,(uint8*)&LineCoding); //读出7字节的控制值
LineCoding.dwDTERate=SWAP32(SetUartBitRate(SWAP32(LineCoding.dwDTERate))); //设置波特率
LineCoding.bCharFormat=0; //1位停止位
LineCoding.bParityType=0; //无校验位
LineCoding.bDataBits=8; //8位数据格式
}
/*******************************************************************/
//#define debug1
/************************终端点0输出中断处理************************************/
void endp0_out(void)
{
#ifdef debug1
Prints("ep0 out status,last-status,status: ");
PrintHex(read_endpoint_status(0));
#endif
Last_Status.Register=read_last_status(0);
#ifdef debug1
PrintHex(Last_Status.Register);
PrintHex(read_endpoint_status(0));
Prints("\r\n");
#endif
if(Last_Status.Status.setup_packet) //setup包
{
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);
select_endpoint(0);
clear_buffer();
Control_Data.wLength=Control_Data.DeviceRequest.wLength;
usb_flags.flags.not_end=0;
usb_flags.flags.usb_endp0_in=1;
if(Control_Data.DeviceRequest.bmRequestType&0x80)
{
usb_flags.flags.setup_packet_in=1;
usb_flags.flags.setup_packet_out=0;
return;
}
else
{
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.setup_packet_out=1;
if(Control_Data.wLength!=0)
{
usb_flags.flags.usb_endp0_in=0;
}
return;
}
}
else
{
if(usb_flags.flags.setup_packet_out)
{
usb_flags.flags.usb_endp0_in=1;
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
#ifdef debug
Prints("USB标准输出请求:数据阶段.\r\n");
#endif
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: /*ClearFeatureD(0);*/break;
case SET_FEATURE: /*SetFeatureD(0);*/break;
case SET_ADDRESS: /*SetUsbAddressD();*/break; //set_address
case SET_DESCRIPTOR: /*SetDescriptorD();*/break; //set_descriptor
case SET_CONFIGURATION: /*SetConfigurationD();*/ break; //set_configurat
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: /*ClearFeatureD(1);*/break;
case SET_FEATURE: /*SetFeatureD(1);*/break;
case SET_INTERFACE: /*SetInterfaceD();*/break;
default: break;
}
break;
case 2: //到端点
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: /*ClearFeature(2);*/break;
case SET_FEATURE: /*SetFeature(2);*/break;
default: break;
}
break;
default: break;
}
break;
case 0x20: //类请求
#ifdef debug
Prints("USB类输出请求:数据阶段.\r\n");
#endif
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: /*SetReportD();*/ break; //设置报告
case SET_IDLE: /*SetIdleD();*/ break; //设置空闲
case SET_PROTOCOL: /*SetProtocol();*/ break; //设置协议
case SET_CONTROL_LINE_STATE: /*SetControlLineStateD();*/ break; //设置控制线状态
case SET_LINE_CODING: SetLineCodingD(); 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: //用户请求
#ifdef debug
Prints("USB用户输出请求:数据阶段.\r\n");
#endif
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;
}
}
}
else
{
select_endpoint(0);
clear_buffer();
// Prints("端点0输出数据:");
//read_endpoint_buff(0,16,buffer);
}
}
}
/******************************************************************************/
/***********************获取报告*********************************************/
void get_report(void)
{
#ifdef debug
Prints(" 获取报告.\r\n");
#endif
}
/******************************************************************************/
/**********************获取空闲状态*********************************************/
void get_idle(void)
{
#ifdef debug
Prints(" 获取空闲.\r\n");
#endif
write_endpoint_buff(1,1,&idle);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/*************************获取协议**********************************************/
void get_protocol(void)
{
#ifdef debug
Prints(" 获取协议.\r\n");
#endif
write_endpoint_buff(1,1,&protocol);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/***********************设置报告***********************************************/
void set_report(void)
{
#ifdef debug
Prints(" 设置报告.\r\n");
#endif
}
/******************************************************************************/
/***********************设置空闲***********************************************/
void set_idle(void)
{
#ifdef debug
Prints(" 设置空闲.\r\n");
#endif
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)
{
#ifdef debug
Prints(" 设置协议.\r\n");
#endif
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;
}
/******************************************************************************/
/**********************获取当前串口设置*****************************/
void GetLineCoding(void)
{
#ifdef debug
Prints(" 获取串口设置.\r\n");
#endif
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,7,(uint8 *)&LineCoding);
usb_flags.flags.usb_endp0_in=0;
}
/*******************************************************************/
/**********************设置控制线状态******************************/
void SetControlLineState(void)
{
#ifdef debug
Prints(" 设置控制线状态.\r\n");
#endif
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
RTS=!((Control_Data.DeviceRequest.wValue)&0x2);
DTR=!((Control_Data.DeviceRequest.wValue)&0x1);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/*******************************************************************/
/*******************************************************************/
void SetLineCoding(void)
{
#ifdef debug
Prints(" 设置串口属性.\r\n");
#endif
while(select_endpoint(1)&0x01); //等待端点1发送完毕
write_endpoint_buff(1,0,0); //返回0长度的状态包
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/*******************************************************************/
/*******************************************************************/
void SendBreak(void)
{
#ifdef debug
Prints(" 设置break time\r\n");
#endif
if(Control_Data.DeviceRequest.wValue==0)
{
TXD=1;
}
if(Control_Data.DeviceRequest.wValue==0xFFFF)
{
TXD=0;
}
while(select_endpoint(1)&0x01); //等待端点1发送完毕
write_endpoint_buff(1,0,0); //返回0长度的状态包
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/*******************************************************************/
#define DCD P1_0
#define DSR P1_1
#define CTS P1_2
#define RING P1_3
/*******************************************************************/
void SerialState(void)
{
uint16 state;
#ifdef debug
Prints(" 获取串口状态.\r\n");
#endif
state=0;
if(DCD)
{
state|=0x01;
}
if(DSR)
{
state|=0x02;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -