📄 d12_command.c
字号:
#include"mytype.h"
#include "d12_command.h"
#include"d12_value.h"
#include"port.h"
#include"my_usb.h"
#include "uar.h"
extern USB_FLAGS usb_flags;
extern INT_REG Interrupt_Register;
extern CONTROL_DATA_BUFF Control_Data;
//缓冲
//交换数据时用的指针
uint8 idle; //空闲状态
uint8 protocol; //当前协议
/***************************断开USB连接****************************************/
void disconnect_usb(void)
{
write_command(Set_Mode);
write_data(0x0e);
write_data(0x47);
del(100);
}
/*******************************连接USB**************************************/
void connect_usb(void)
{
write_command(Set_Mode); //初始化USBD12
write_data(0x1e); //连接USB
write_data(0x47); //设置频率
}
/******************************************************************************/
/*************************端点使能******************************************/
void set_endpoint_enable(void)
{
write_command(Set_Endpoint_Enable);
write_data(0x01);
}
/******************************************************************************/
/****************************读端点最后状态**********************************/
uint8 read_last_status(uint8 endp)
{
write_command(Read_Last_Status+endp);
return read_data();
}
/******************************************************************************/
/************************读USB中断寄存器**************************************/
void read_interrupt_register(void)
{
write_command(Read_Interrupt_Register);
Interrupt_Register.value[0]=read_data();
Interrupt_Register.value[1]=read_data();
}
/******************************************************************************/
/****************************USB总线复位处理***********************************/
void usb_bus_reset(void)
{usb_flags.value=0;
set_endpoint_enable();
Prints("USB总线复位.\r\0");
}
/******************************************************************************/
/*****************************USB总线挂起处理**********************************/
void usb_bus_suspend(void)
{ Prints("USB总线挂起.\r\0");
}
/******************************************************************************/
/************************设置USB地址*******************************************/
void set_addr_enable(uint8 addr)
{
write_command(Set_Address);
write_data(0x80|addr);
Prints("USB地址:\0");
PrintHex(addr);
Prints("\r\0");
}
/******************************************************************************/
/****************************选择终端点*************************************/
uint8 select_endpoint(uint8 endp)
{
write_command(Select_EndPoint+endp);
return read_data();
}
/******************************************************************************/
void error(uint8 number)
{
number=0;
}
/************************清缓冲,在读取缓冲数据后调用**************************/
void clear_buffer(void)
{
write_command(Clear_Buffer);
}
/******************************************************************************/
/***********************缓冲区数据有效,在写缓冲后调用**************************/
void validate_buffer(void)
{
write_command(Validate_Buffer);
}
/******************************************************************************/
/****************************设置端点状态**************************************/
void set_endpoint_status(uint8 endp,uint8 status)
{
write_command(0x40+endp);
write_data(!status);
}
/******************************************************************************/
/***************************应答建立包************************************/
void ack_setup(uint8 endp)
{
select_endpoint(endp);
write_command(Ack_Setup);
}
/******************************************************************************/
/*****************************读端点状态**************************************/
uint8 read_endpoint_status(uint8 endp)
{
write_command(0x80+endp);
return read_data();
}
/******************************************************************************/
/*************************读终端点缓冲****************************************/
uint8 read_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
uint8 i,j;
if(!(select_endpoint(endp)&0x01)){error(0); return 0;}
if((read_endpoint_status(endp)&0x60)!=0x60) //两个缓冲没有都满,才能清中断
{
read_last_status(endp); //清中断
}
write_command(Read_Buffer);
read_data();
j=read_data();
if(j>len)
j=len;
for(i=0;i<j;i++)
{
USB_RD=0;
*(buff+i)=USB_DATA;
USB_RD=1;
}
if(endp)
{
select_endpoint(endp);
clear_buffer();
}
return j;
}
/******************************************************************************/
/*************************写终端点缓冲*****************************************/
uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
uint8 i;
read_last_status(endp);
select_endpoint(endp);
write_command(Write_Buffer);
write_data(0);
write_data(len);
for(i=0;i<len;i++)
{
USB_DATA=*(buff+i);
USB_WR=0;
USB_WR=1;
}
USB_DATA=0xFF;
validate_buffer();
return len;
}
/******************************************************************************/
//以下为第9章节协议
/***************************设置地址***************************************/
void set_usb_address(void)//???
{
Control_Data.wLength=0;
Control_Data.pData=0;
usb_flags.Status.set_addr=1;
set_addr_enable((uint8) Control_Data.DeviceRequest.wValue);
}
/******************************************************************************/
/**************************获取状态响应*****************************************/
void get_status(uint8 receiver)
{
uint8 status[2];
switch (receiver)
{
case 0: //获取设备状态
status[0]=0x00;
status[1]=0x00;
break;
case 1: //获取接口状态
status[0]=0x00;
status[0]=0x00;
break;
case 2: //获取端点状态
status[0]=0x00;
status[1]=0x00;
break;
}
Control_Data.wLength=2;
Control_Data.pData=&status;
}
/******************************************************************************/
/*********************清除特性*******************************************/
void clear_feature(uint8 receiver)
{
receiver=0;
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/
/*******************设置特性**************************************************/
void set_feature(uint8 receiver)
{
receiver=0;
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/
/*****************************设置描述*****************************************/
void set_descriptor(void)
{Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/
/***************************设置配置*******************************************/
void set_configuration(void)
{
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/
/************************获取配置状态******************************************/
void get_configuration(void)
{
uint8 value=0x01;
Control_Data.wLength=1;
Control_Data.pData=&value;
}
/******************************************************************************/
/****************************设置接口************************************/
void set_interface(void)
{
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/
/***************************获取接口状态***************************************/
void get_interface(void)
{
uint8 value=0x01;
Control_Data.wLength=1;
Control_Data.pData=&value;
}
/******************************************************************************/
uint16 i;
/***********************获取描述符*********************************************/
void get_descriptor(void)
{
//if(!usb_flags.Status.not_end)//如果已经结束则再次重新写入要的内容,如果还没有结束则转到以后的语句再次写没有发完的东东.
switch(MSB(Control_Data.DeviceRequest.wValue))
{
case DEVICE_DESCRIPTOR:
Control_Data.wLength=sizeof(DEVICE_DESCRIPTOR_STRUCT);
Control_Data.pData=(uint8 *)(&device_descriptor);
break;
case CONFIGURATION_DESCRIPTOR:
Control_Data.wLength=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
break;
case STRING_DESCRIPTOR:
switch(LSB(Control_Data.DeviceRequest.wValue))
{
case 0:
Control_Data.wLength=LANGUAGE_ID[0];
Control_Data.pData=LANGUAGE_ID;
break;
case 1:
Control_Data.wLength=ManufacturerString[0];
Control_Data.pData=ManufacturerString;
break;
case 2:
Control_Data.wLength=ProducterString[0];
Control_Data.pData=ProducterString;
break;
case 3:
Control_Data.wLength=device_serial_number[0];
Control_Data.pData=device_serial_number;
break;
default: break;
}
break;
default:
break;
}
}
/******************************************************************************/
/*********************发到接口的获取描述符**************************************/
void get_descriptor_interface(void)
{
//if(!usb_flags.Status.not_end)
switch(MSB(Control_Data.DeviceRequest.wValue))
{
case HID_DESCRIPTOR:
Control_Data.wLength=sizeof(HID_DESCRIPTOR_STRUCT);
// Control_Data.pData=(uint8 *)(&hid_descriptor);
break;
case REPORT_DESCRIPTOR:
Control_Data.wLength=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:
break;
default:
break;
}
}
/******************************************************************************/
/***********************获取报告*********************************************/
void get_report(void)
{
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/
/**********************获取空闲状态*********************************************/
void get_idle(void)
{
Control_Data.wLength=1;
Control_Data.pData=&idle;
}
/******************************************************************************/
/*************************获取协议**********************************************/
void get_protocol(void)
{Control_Data.wLength=1;
Control_Data.pData= &protocol;
}
/******************************************************************************/
/***********************设置报告***********************************************/
void set_report(void)
{
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/
/***********************设置空闲***********************************************/
void set_idle(void)
{
while(select_endpoint(1)&0x01);
Control_Data.wLength=0;
Control_Data.pData=0;
idle=Control_Data.DeviceRequest.wValue;
}
/******************************************************************************/
/**********************设置协议**************************************************/
void set_protocol(void)
{
while(select_endpoint(1)&0x01);
Control_Data.wLength=0;
Control_Data.pData=0;
protocol=Control_Data.DeviceRequest.wValue;
}
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -