📄 usbmainold.c
字号:
#include <reg52.h>
#include <absacc.h>
#include "usbmain.h"
#include "USB100.h"
#include "trans232.h"
extern unsigned char xdata KGL[4000][7]; //开关量数组
extern unsigned int xdata index_KGL; //开关量数组行下标
extern unsigned char xdata pljssj; //疲劳驾驶时间
extern unsigned char xdata tcxxsj; //停车休息时间
/*
extern unsigned char xdata KGL0[400][12]; //开关量0数组
extern unsigned int xdata index_KGL0; //开关量0数组行下标
extern unsigned char xdata KGL1[400][12]; //开关量1数组
extern unsigned int xdata index_KGL1; //开关量1数组行下标
extern unsigned char xdata KGL2[400][12]; //开关量2数组
extern unsigned int xdata index_KGL2; //开关量2数组行下标
extern unsigned char xdata KGL3[400][12]; //开关量3数组
extern unsigned int xdata index_KGL3; //开关量3数组行下标
extern unsigned char xdata KGL4[400][12]; //开关量4数组
extern unsigned int xdata index_KGL4; //开关量4数组行下标
extern unsigned char xdata KGL5[400][12]; //开关量5数组
extern unsigned int xdata index_KGL5; //开关量5数组行下标
*/
extern unsigned char xdata flag_wr_full,flag_wr_empty;
extern unsigned char xdata FLAG_INIT;
extern unsigned char xdata down_time[10][5];
extern unsigned char xdata drvr_drv_time[300][28];
extern unsigned char xdata num_10[10][18];
extern unsigned int xdata index_drv_time,trstimes_temp; //上一数组的行下标
extern unsigned char xdata index_dw_tm;
extern unsigned char xdata ini_info[5];
unsigned char xdata verify=0;
extern unsigned char xdata tzxs[3];
extern unsigned long int xdata CANSHU;
extern unsigned char xdata MAXSPEED;
extern unsigned long xdata temp_long;
extern unsigned char xdata vin[41];
extern unsigned char xdata ID_product[20]; //产品ID号
extern void Clr_WDog();
extern void Delay(unsigned int c);
extern unsigned char xdata cur_id[25];
extern unsigned char xdata id1[11][25];
extern unsigned char xdata index_id1; //上一数组的行下标
extern bit FL_RUN;
extern bit FL_RECORDER;
extern unsigned char xdata sec_data[10][326];
extern unsigned char xdata sec_hang;
extern unsigned char xdata overtime_rec[21][28] ;
extern unsigned char xdata num_ovrec;
extern unsigned char xdata stop_3day[11] ;
extern unsigned char xdata day_three[3][3] ;
extern unsigned char xdata index_threeday;
sbit P11=P1^1;
sbit P10=P1^0;
extern unsigned char xdata lichen_360h[3] ;
extern unsigned char xdata lichen_2d[3] ;
extern unsigned char xdata MainEpBuf[128] ; //接收数据
extern unsigned char xdata MainEpBuf2[512] ; //发送数据
extern unsigned char xdata MainEpBuf3[8] ; //枚举
extern unsigned char xdata MainEpBuf4[16] ; //EP1传送
extern unsigned char xdata OLD_YEAR;
extern unsigned char xdata OLD_MONTH;
extern unsigned char xdata OLD_DAY;
extern unsigned char xdata OLD_HOUR;
extern unsigned char xdata OLD_MIN;
extern unsigned char xdata OLD_SEC;
#define TMIAO XBYTE[0X8000]
#define TFEN XBYTE[0X8002]
#define TSHI XBYTE[0X8004]
#define TRI XBYTE[0X8007]
#define TYUE XBYTE[0X8008]
#define TNIAN XBYTE[0X8009]
#define TCLKA XBYTE[0X800A]
#define TCLKB XBYTE[0X800B]
sbit WDI = P1^2 ; //看门狗
extern unsigned char xdata * xdata ptr_minaero;
extern unsigned char xdata * xdata ptr_stp_min;
extern unsigned char xdata * xdata ptr_temp;
extern unsigned int xdata addr_ptr_minaero;
extern unsigned int xdata times_num;
extern unsigned char xdata j_temp,k_temp,l_temp;
extern unsigned int xdata temp1_all;
extern unsigned int xdata tmpadd_start_rec;
extern unsigned char xdata temp_date[5];
extern void Clr_WDog();
//usb设备请求
unsigned char xdata trs_cnt_tot _at_ 0x6510;
unsigned char xdata trs_cnt _at_ 0x6511;
unsigned int xdata trs_cnt_byte _at_ 0x6512; //分次传速度数据时,计算每次传的字节数
unsigned int xdata trs_fst_time _at_ 0x6514;
unsigned int xdata trs_hang _at_ 0x6516; //传流水记录时的行下标
unsigned int xdata trs_cnt_size _at_ 0x8017 ; // usb大数据量传输计算桢数用; 占用8000资源
unsigned int xdata len_tmp_rec _at_ 0x8019 ; //当前桢纪录长度; 在传输时复用记录当前数据个数;
unsigned int xdata len_tmp_data _at_ 0x801b ; //当前桢数据长度
unsigned char xdata trs_jy _at_ 0x805d; //校样位;
unsigned char last_cnt=0; //枚举延时用
extern unsigned char xdata flag_trans ;
CONTROL_XFER xdata ControlData;
EPPFLAGS xdata bEPPflags;
/*####################################################################################//
#//////////////////////////////////////////////////////////////////////////////////////#
#///////////////////////// ///////////////////////////////#
#///////////////////////// USB ///////////////////////////////#
#///////////////////////// ///////////////////////////////#
#//////////////////////////////////////////////////////////////////////////////////////#
//####################################################################################*/
/**********************************************/
/***************** *******************/
/*************** 描述符 *****************/
/****************** *******************/
/**********************************************/
//设备描述符
code USB_DEVICE_DESCRIPTOR DeviceDescr =
{
sizeof(USB_DEVICE_DESCRIPTOR),
USB_DEVICE_DESCRIPTOR_TYPE,
SWAP(0x0110),
USB_CLASS_CODE_TEST_CLASS_DEVICE,
0,
0,
EP0_PACKET_SIZE,
SWAP(0x0471), //VID
SWAP(0x0666), //PID
SWAP(0x0100),
0, //Manufactory
0, //Product
0, //Serial Number
1 //Number of possible configurations 《数据改动》
};
//配置描述符
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
sizeof(USB_CONFIGURATION_DESCRIPTOR),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
SWAP(CONFIG_DESCRIPTOR_LENGTH),
1,
1,
0, //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0x60, //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0xf0
};
//接口描述符;
code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
sizeof(USB_INTERFACE_DESCRIPTOR),
USB_INTERFACE_DESCRIPTOR_TYPE,
0,
0,
NUM_ENDPOINTS,
USB_CLASS_CODE_TEST_CLASS_DEVICE,
USB_SUBCLASS_CODE_TEST_CLASS_D12,
USB_PROTOCOL_CODE_TEST_CLASS_D12,
0
};
//端点描述符---端点1输入;
code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x81,
USB_ENDPOINT_TYPE_INTERRUPT,
SWAP(16), //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10
};
//端点描述符---端点1输出;
code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x1,
USB_ENDPOINT_TYPE_INTERRUPT,
SWAP(16), //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10
};
//端点描述符---端点2输入;
code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
USB_ENDPOINT_TYPE_BULK,
SWAP(EP2_PACKET_SIZE),
10
};
//端点描述符---端点2输出;
code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x2,
USB_ENDPOINT_TYPE_BULK,
SWAP(EP2_PACKET_SIZE),
10
};
//USB标准设备请求入口地址指针表
code void (*StandardDeviceRequest[])(void) =
{
get_status,
clear_feature,
reserved,
set_feature,
reserved,
set_address,
get_descriptor,
reserved,
get_configuration,
set_configuration,
get_interface,
set_interface,
reserved,
reserved,
reserved,
reserved
};
/**********************************************/
/***************** *******************/
/*************** 设备请求 *****************/
/****************** *******************/
/**********************************************/
/*标准设备请求共11个命令,此处只用到其中9个,分别是:get_status,clear_feature,set_feature,set_address,
get_descriptor,get_configuration,set_configuration,get_interface,set_interface, */
/*
typedef union _epp_flags
{
struct _flags
{
unsigned char timer : 1;
unsigned char bus_reset : 1;
unsigned char suspend : 1;
unsigned char setup_packet : 1;
unsigned char remote_wakeup : 1;
unsigned char in_isr : 1;
unsigned char control_state : 1;
unsigned char configuration : 1;
unsigned char verbose : 2;
unsigned char ep1_rxdone : 1;
unsigned char ep2_rxdone : 1;
unsigned char ep2_txdone : 1;
unsigned char dma_state : 2;
unsigned char power_down : 1; // Smart Board
} bits;
unsigned short value;
} EPPFLAGS;
typedef struct _device_request
{
unsigned char bmRequestType ;
unsigned char bRequest;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength;
} DEVICE_REQUEST;
typedef struct _control_xfer
{
DEVICE_REQUEST DeviceRequest;
unsigned short wLength;
unsigned short wCount;
unsigned char * pData;
unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
} CONTROL_XFER;
*/
//-------------------------------------------------------------------------------------------get_status()获取状态
void get_status(void)
{
unsigned char endp, txdat[2];
//ControlData.DeviceRequest.bmRequestType为请求类型,USB_RECIPIENT定义为:0x1F
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
//从bRecipient的低5个位可得出接收方
unsigned char c;
Clr_WDog(); //清w-dog
//USB_RECIPIENT_DEVICE定义为0X00
if (bRecipient == USB_RECIPIENT_DEVICE)
{ //返回设备状态;
if(bEPPflags.bits.remote_wakeup == 1)
txdat[0] = 3; //支持远程唤醒和自供电;
else
txdat[0] = 1; //不支持远程唤醒,自供电;
txdat[1]=0;
single_transmit(txdat, 2); //发送数据;
}
else if (bRecipient == USB_RECIPIENT_INTERFACE)
{ //返回接口状态;
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2); //发送数据;
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT)
{ //返回端点状态;
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
c = D12_SelectEndpoint(endp*2 + 1); ///* Control-out */ 读取输入端点状态;
else
c = D12_SelectEndpoint(endp*2); ///* Control-out */ 读取输出端点状态;
if(c & D12_STALL)
txdat[0] = 1; //端点禁止;
else
txdat[0] = 0; //端点有效;
txdat[1] = 0;
single_transmit(txdat, 2); //发送数据;
} else
stall_ep0(); //非标准请求,发STALL;
}
//-----------------------------------------------------------------------------------clear_feature()清除特性
void clear_feature(void)
{
unsigned char endp; //读取请求类型中的接受方;
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
Clr_WDog(); //清w-dog
if (bRecipient == USB_RECIPIENT_DEVICE
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{ //清除远程唤醒特性;
DISABLE;
bEPPflags.bits.remote_wakeup = 0;
ENABLE;
single_transmit(0, 0); //返回应答;
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{ //清除端点禁止特性,恢复其使用;
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
// clear TX stall for IN on EPn. 清除输入端点STALL特性;
D12_SetEndpointStatus(endp*2 + 1, 0);
else
// clear RX stall for OUT on EPn. 清除输出端点STALL特性;
D12_SetEndpointStatus(endp*2, 0);
single_transmit(0, 0); //发送响应;
}
else
stall_ep0(); //没有该请求,返回STALL;
}
//-----------------------------------------------------------------------------------------set_feature()设置特性
void set_feature(void)
{
unsigned char endp; //读取请求类型中的接受方;
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
Clr_WDog(); //清w-dog
if (bRecipient == USB_RECIPIENT_DEVICE
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{ //设置远程唤醒特性;
DISABLE;
bEPPflags.bits.remote_wakeup = 1;
ENABLE;
single_transmit(0, 0); //发送响应;
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
// clear TX stall for IN on EPn. 设置输入端禁止;
D12_SetEndpointStatus(endp*2 + 1, 1);
else
// clear RX stall for OUT on EPn. 设置输出端禁止;
D12_SetEndpointStatus(endp*2, 1);
single_transmit(0, 0); //发送响应;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -