📄 chap_9.c
字号:
/*
//*************************************************************************
//
// P H I L I P S P R O P R I E T A R Y
//
// COPYRIGHT (c) 2000-2002 BY PHILIPS SINGAPORE.
// -- ALL RIGHTS RESERVED --
//
// File Name: CHAP_9.C
// Created: Feb. 1, 2000
// Modified: May 28, 2002
// Revision: 1.0
//
//*************************************************************************
*/
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include "SysCnfg.h"
#include "BasicTyp.h"
#include "DcCommon.h"
#include "Hal4Sys.h"
#include "Hal4ISA.h"
#include "Hal4IKit.h"
#include "Hal4D13.h"
#include "D13_Reg.h"
#include "D13_DcS.h"
#include "usb100.h"
#include "chap_9.h"
#include "OTGSvc.h"
/*
//*************************************************************************
// Public Data
//*************************************************************************
*/
// Task Control Block
extern DC_TCB D13TaskControlBlock;
// USB Device Info
extern USB_DEV_INFO D13_DevInfo;
// USB Default Control Pipe
extern CONTROL_XFER DCPCtrlXfer;
extern OTG_TCB OtgTcb;
extern BOOL ISP1362_PCIKIT;
/*
//*************************************************************************
// USB Device Descriptor
//*************************************************************************
*/
#define NUM_CONFIGURATION 1
#define NUM_INTERFACE 1
#define NUM_ENDPOINTS 4
#define USB_CLASS_CODE_TEST_CLASS_DEVICE 0xFF
#define USB_SUBCLASS_CODE_TEST_CLASS_D13 0x00
#define USB_PROTOCOL_CODE_TEST_CLASS_D13 0x00
#define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) + \
NUM_INTERFACE * sizeof(USB_INTERFACE_DESCRIPTOR) + \
(NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR) + \
sizeof(USB_OTG_DESCRIPTOR))
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
sizeof(USB_DEVICE_DESCRIPTOR),
USB_DEVICE_DESCRIPTOR_TYPE,
SWAP(0x110), //usb spec1.1
0,
0,
0,
EP0_PACKET_SIZE,
SWAP(0x0471),
SWAP(0x1A62), //0x1A61: ISA kit, 0x1A62: PCI kit, 0X1A65: Cotulla kit
SWAP(0x0100),
STR_INDEX_MANUFACTURER,
STR_INDEX_PRODUCT,
// STR_INDEX_SERIALNUMBER,
0,
1
};
USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
sizeof(USB_CONFIGURATION_DESCRIPTOR),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
SWAP(CONFIG_DESCRIPTOR_LENGTH),
1, //NO OF I/F: 1,
1,
STR_INDEX_CONFIGURATION,
0xC0,// no remote wakeup
0x01 // 2mA
};
USB_INTERFACE_DESCRIPTOR InterfaceDescr0 =
{
sizeof(USB_INTERFACE_DESCRIPTOR),
USB_INTERFACE_DESCRIPTOR_TYPE,
0, //InterfaceNumber
0, //Alternate Setting
NUM_ENDPOINTS, // No of Endpoints
USB_CLASS_CODE_UNKNOWN,
USB_SUBCLASS_CODE_UNKNOWN,
USB_PROTOCOL_CODE_UNKNOWN,
STR_INDEX_INTERFACE
};
USB_ENDPOINT_DESCRIPTOR EP_Descr[NUM_ENDPOINTS] =
{
// EP01 Interrupt Out
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x01,
USB_ENDPOINT_TYPE_INTERRUPT,
SWAP(NONISO_FIFOSIZE_8),
1
},
// EP02 Interrupt In
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
USB_ENDPOINT_TYPE_INTERRUPT,
SWAP(NONISO_FIFOSIZE_8),
1
},
// EP03 Bulk Out
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x03,
USB_ENDPOINT_TYPE_BULK,
SWAP(NONISO_FIFOSIZE_8),
0
},
// EP04 Bulk IN
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x84,
USB_ENDPOINT_TYPE_BULK,
SWAP(NONISO_FIFOSIZE_8),
0
/* },
// EP05 ISO OUT
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x05,
USB_ENDPOINT_TYPE_ISOCHRONOUS,
SWAP(ISO_FIFOSIZE_16),
1
},
// EP06 ISO IN
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x86,
USB_ENDPOINT_TYPE_ISOCHRONOUS,
SWAP(ISO_FIFOSIZE_16),
1
*/ }
};
USB_OTG_DESCRIPTOR OTG_Descr =
{
sizeof(USB_OTG_DESCRIPTOR),
USB_OTG_DESCRIPTOR_TYPE,
0x03 //b1:srp_support b0:hnp_support
};
USB_STRING_LANGUAGE_DESCRIPTOR strLanguage =
{
sizeof(USB_STRING_LANGUAGE_DESCRIPTOR),
// sizeof(strLanguage),
USB_STRING_DESCRIPTOR_TYPE,
SWAP(0x0409)
};
USB_STRING_INTERFACE_DESCRIPTOR strInterface =
{
sizeof(USB_STRING_INTERFACE_DESCRIPTOR),
USB_STRING_DESCRIPTOR_TYPE,
{
'I',0,
'n',0,
't',0,
'e',0,
'r',0,
'f',0,
'a',0,
'c',0,
'e',0,
'0',0,
'0',0
}
};
USB_STRING_CONFIGURATION_DESCRIPTOR strConfiguration =
{
sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR),
USB_STRING_DESCRIPTOR_TYPE,
{
'C',0,
'o',0,
'n',0,
'f',0,
'i',0,
'g',0,
'0',0,
'0',0
}
};
USB_STRING_SERIALNUMBER_DESCRIPTOR strSerialNum =
{
sizeof(strSerialNum),
USB_STRING_DESCRIPTOR_TYPE,
{
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'8',0,
'8',0,
'8',0,
'8',0
}
};
USB_STRING_PRODUCT_DESCRIPTOR strProduct =
{
sizeof(USB_STRING_PRODUCT_DESCRIPTOR),
USB_STRING_DESCRIPTOR_TYPE,
{
'P', 0,
'H', 0,
'I', 0,
'L', 0,
'I', 0,
'P', 0,
'S', 0,
' ', 0,
'I', 0,
'S', 0,
'P', 0,
'1', 0,
'3', 0,
'6', 0,
'2', 0,
'-', 0,
'O', 0,
'T', 0,
'G', 0,
' ', 0,
'P', 0,
'C', 0,
'I', 0,
' ', 0,
'B', 0,
'O', 0,
'A', 0,
'R', 0,
'D', 0,
' ', 0
}
};
USB_STRING_MANUFACTURER_DESCRIPTOR strManufacturer =
{
sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR),
USB_STRING_DESCRIPTOR_TYPE,
{
'P', 0,
'H', 0,
'I', 0,
'L', 0,
'I', 0,
'P', 0,
'S', 0,
' ', 0,
'S', 0,
'e', 0,
'm', 0,
'i', 0,
'c', 0,
'o', 0,
'n', 0,
'd', 0,
'u', 0,
'c', 0,
't', 0,
'o', 0,
'r', 0,
's', 0,
' ', 0
}
};
/*
//*************************************************************************
// USB Protocol Layer
//*************************************************************************
*/
/*
//*************************************************************************
// USB standard device requests
//*************************************************************************
*/
void Chap9_GetStatus(void)
{
UCHAR byEndp;
UCHAR TxBuff[2];
UCHAR byTemp;
if( DIR_D2H == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
0 == DCPCtrlXfer.DeviceRequest.wValue && \
2 == DCPCtrlXfer.DeviceRequest.wLength )
{
switch(DCPCtrlXfer.DeviceRequest.bmRequestType.Recipient)
{
case USB_RECIPIENT_DEVICE:
if(0 != DCPCtrlXfer.DeviceRequest.wIndex)
{
Chap9sup_StallEP0InControlRead();
return;
}
TxBuff[1]=0;
// if( 1 == D13_DevInfo.bits.remote_wakeup )
// TxBuff[0] = DEVSTS_SELFPOWERED|DEVSTS_REMOTEWAKEUP; /* remote wakeup and Self-powered */
// else
TxBuff[0] = DEVSTS_SELFPOWERED; /* Self-powered*/
Chap9sup_SingleTransmitEP0((PUSHORT)TxBuff, 2);
break;
case USB_RECIPIENT_INTERFACE:
if( NUM_INTERFACE <= DCPCtrlXfer.DeviceRequest.wIndex || \
( 0 != DCPCtrlXfer.DeviceRequest.wIndex && DEVSTATE_ADDRESS != D13_DevInfo.bits.DevState) \
)
{
Chap9sup_StallEP0InControlRead();
return;
}
TxBuff[0]=0;
TxBuff[1]=0;
Chap9sup_SingleTransmitEP0((PUSHORT)TxBuff, 2);
break;
case USB_RECIPIENT_ENDPOINT:
byEndp = (UCHAR)(DCPCtrlXfer.DeviceRequest.wIndex & MAX_ENDPOINTS);
if( NUM_ENDPOINTS < byEndp || \
( 0 != DCPCtrlXfer.DeviceRequest.wIndex && DEVSTATE_ADDRESS == D13_DevInfo.bits.DevState) \
)
{
Chap9sup_StallEP0InControlRead();
return;
}
byTemp = D13_GetEndpointStatusWOInteruptClear( D13_Endp2EndpIndex(byEndp) );
TxBuff[1] = 0;
if(byTemp & D13REG_EPSTS_STALL)
TxBuff[0] = ENDPSTS_HALT; /* Halt */
else
TxBuff[0] = 0;
Chap9sup_SingleTransmitEP0((PUSHORT)TxBuff, 2);
break;
default:
Chap9sup_StallEP0InControlRead();
break;
}
}
else
{
Chap9sup_StallEP0InControlRead();
}
}
void Chap9_ClearFeature(void)
{
UCHAR byEndp;
USHORT wFeature = DCPCtrlXfer.DeviceRequest.wValue;
if( DIR_H2D == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
0 == DCPCtrlXfer.DeviceRequest.wLength )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -