?? usbmainold.c
字號:
#include <reg52.h>
#include <absacc.h>
#include "usbmain.h"
#include "USB100.h"
#include "trans232.h"
extern unsigned char xdata KGL[4000][7]; //開關(guān)量數(shù)組
extern unsigned int xdata index_KGL; //開關(guān)量數(shù)組行下標(biāo)
extern unsigned char xdata pljssj; //疲勞駕駛時間
extern unsigned char xdata tcxxsj; //停車休息時間
/*
extern unsigned char xdata KGL0[400][12]; //開關(guān)量0數(shù)組
extern unsigned int xdata index_KGL0; //開關(guān)量0數(shù)組行下標(biāo)
extern unsigned char xdata KGL1[400][12]; //開關(guān)量1數(shù)組
extern unsigned int xdata index_KGL1; //開關(guān)量1數(shù)組行下標(biāo)
extern unsigned char xdata KGL2[400][12]; //開關(guān)量2數(shù)組
extern unsigned int xdata index_KGL2; //開關(guān)量2數(shù)組行下標(biāo)
extern unsigned char xdata KGL3[400][12]; //開關(guān)量3數(shù)組
extern unsigned int xdata index_KGL3; //開關(guān)量3數(shù)組行下標(biāo)
extern unsigned char xdata KGL4[400][12]; //開關(guān)量4數(shù)組
extern unsigned int xdata index_KGL4; //開關(guān)量4數(shù)組行下標(biāo)
extern unsigned char xdata KGL5[400][12]; //開關(guān)量5數(shù)組
extern unsigned int xdata index_KGL5; //開關(guān)量5數(shù)組行下標(biāo)
*/
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; //上一數(shù)組的行下標(biāo)
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]; //產(chǎn)品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; //上一數(shù)組的行下標(biāo)
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] ; //接收數(shù)據(jù)
extern unsigned char xdata MainEpBuf2[512] ; //發(fā)送數(shù)據(jù)
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設(shè)備請求
unsigned char xdata trs_cnt_tot _at_ 0x6510;
unsigned char xdata trs_cnt _at_ 0x6511;
unsigned int xdata trs_cnt_byte _at_ 0x6512; //分次傳速度數(shù)據(jù)時,計算每次傳的字節(jié)數(shù)
unsigned int xdata trs_fst_time _at_ 0x6514;
unsigned int xdata trs_hang _at_ 0x6516; //傳流水記錄時的行下標(biāo)
unsigned int xdata trs_cnt_size _at_ 0x8017 ; // usb大數(shù)據(jù)量傳輸計算楨數(shù)用; 占用8000資源
unsigned int xdata len_tmp_rec _at_ 0x8019 ; //當(dāng)前楨紀錄長度; 在傳輸時復(fù)用記錄當(dāng)前數(shù)據(jù)個數(shù);
unsigned int xdata len_tmp_data _at_ 0x801b ; //當(dāng)前楨數(shù)據(jù)長度
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 ///////////////////////////////#
#///////////////////////// ///////////////////////////////#
#//////////////////////////////////////////////////////////////////////////////////////#
//####################################################################################*/
/**********************************************/
/***************** *******************/
/*************** 描述符 *****************/
/****************** *******************/
/**********************************************/
//設(shè)備描述符
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 《數(shù)據(jù)改動》
};
//配置描述符
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
sizeof(USB_CONFIGURATION_DESCRIPTOR),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
SWAP(CONFIG_DESCRIPTOR_LENGTH),
1,
1,
0, //《數(shù)據(jù)改動》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0x60, //《數(shù)據(jù)改動》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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), //《數(shù)據(jù)改動》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10
};
//端點描述符---端點1輸出;
code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x1,
USB_ENDPOINT_TYPE_INTERRUPT,
SWAP(16), //《數(shù)據(jù)改動》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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標(biāo)準設(shè)備請求入口地址指針表
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
};
/**********************************************/
/***************** *******************/
/*************** 設(shè)備請求 *****************/
/****************** *******************/
/**********************************************/
/*標(biāo)準設(shè)備請求共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()獲取狀態(tài)
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)
{ //返回設(shè)備狀態(tài);
if(bEPPflags.bits.remote_wakeup == 1)
txdat[0] = 3; //支持遠程喚醒和自供電;
else
txdat[0] = 1; //不支持遠程喚醒,自供電;
txdat[1]=0;
single_transmit(txdat, 2); //發(fā)送數(shù)據(jù);
}
else if (bRecipient == USB_RECIPIENT_INTERFACE)
{ //返回接口狀態(tài);
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2); //發(fā)送數(shù)據(jù);
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT)
{ //返回端點狀態(tài);
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 */ 讀取輸入端點狀態(tài);
else
c = D12_SelectEndpoint(endp*2); ///* Control-out */ 讀取輸出端點狀態(tài);
if(c & D12_STALL)
txdat[0] = 1; //端點禁止;
else
txdat[0] = 0; //端點有效;
txdat[1] = 0;
single_transmit(txdat, 2); //發(fā)送數(shù)據(jù);
} else
stall_ep0(); //非標(biāo)準請求,發(fā)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); //返回應(yīng)答;
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{ //清除端點禁止特性,恢復(fù)其使用;
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); //發(fā)送響應(yīng);
}
else
stall_ep0(); //沒有該請求,返回STALL;
}
//-----------------------------------------------------------------------------------------set_feature()設(shè)置特性
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)
{ //設(shè)置遠程喚醒特性;
DISABLE;
bEPPflags.bits.remote_wakeup = 1;
ENABLE;
single_transmit(0, 0); //發(fā)送響應(yīng);
}
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. 設(shè)置輸入端禁止;
D12_SetEndpointStatus(endp*2 + 1, 1);
else
// clear RX stall for OUT on EPn. 設(shè)置輸出端禁止;
D12_SetEndpointStatus(endp*2, 1);
single_transmit(0, 0); //發(fā)送響應(yīng);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -