📄 chap_9.c
字号:
#include <stdio.h>
#include <string.h>
#include <msp430x13x.h>
#include "chap_9.h"
#include "mainloop.h"
#include "usb100.h"
#include "d12ci.h"
#include "epphal.h"
extern void single_transmit(unsigned char * buf, unsigned char len);
extern void code_transmit(unsigned char * pRomData, unsigned short len);
extern void stall_ep0(void);
extern void init_unconfig(void);
extern void init_config(void);
#define NUM_ENDPOINTS 4
#define CONFIG_DESCRIPTOR_LENGTH 0x2e
/*sizeof(USB_CONFIGURATION_DESCRIPTOR) \
+ sizeof(USB_INTERFACE_DESCRIPTOR) \
+ (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
*/
extern CONTROL_XFER ControlData;
extern IO_REQUEST ioRequest;
extern EPPFLAGS bEPPflags;
/*
const USB_DEVICE_DESCRIPTOR DeviceDescr =
{
0x12,
0x01,
0x0100,
0xDC,
0,
0,
0x10,
0x0471,
0x0666,
0x0100,
0,
0,
0,
25
};
*/
/*
const USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
0x09,
0x02,
SWAP(CONFIG_DESCRIPTOR_LENGTH),
//0x2E,
//0x002E,
//0x00,
1,
1,
0,
0x60,
0xf0 //??
};
const USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
0x09,
0x04,
0,
0,
NUM_ENDPOINTS,
0xDC,
0xA0,
0xB0,
0
};
//Endpoint1 IN
const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
0x07,
0x05,
0X81,
USB_ENDPOINT_TYPE_INTERRUPT,
SWAP(EP1_PACKET_SIZE),
//EP1_PACKET_SIZE,
//0,
10
};
//Endpoint1 OUT
const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
0x07,
0x05,
0X01,
USB_ENDPOINT_TYPE_INTERRUPT,
SWAP(EP1_PACKET_SIZE),
//EP1_PACKET_SIZE,
//0,
10
};
//Endpoint2 IN
const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
0x07,
0x05,
0X82,
USB_ENDPOINT_TYPE_BULK,
SWAP(EP2_PACKET_SIZE),
//EP2_PACKET_SIZE,
//0,
10
};
//Endpoint2 OUT
const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
0x07,
0x05,
0x02,
USB_ENDPOINT_TYPE_BULK,
SWAP(EP2_PACKET_SIZE),
//EP2_PACKET_SIZE,
//0,
10
};
*/
const char DeviceDescr[] =
{
0x12,
0x01,
0x00,
0x01,
0xDC,
0,
0,
0x10,
0x71,
0x04,
0x66,
0x06,
0x00,
0x01,
0,
0,
0,
25
};
const char ConfigDescr[] =
{
0x09,
0x02,
0x2E,
0x00,
//0x2E,
1,
1,
0,
0xA0,
0x32,
//const USB_INTERFACE_DESCRIPTOR InterfaceDescr =
0x09,
0x04,
0,
0,
NUM_ENDPOINTS,
0xDC,
0xA0,
0xB0,
0,
//Endpoint1 IN
//const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
//{
0x07,
0x05,
0X81,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,
0,
10,
//};
//Endpoint1 OUT
//const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
//{
0x07,
0x05,
0X01,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,
0,
10,
//};
//Endpoint2 IN
//const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
//{
0x07,
0x05,
0X82,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
0,
10,
//};
//Endpoint2 OUT
//const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
//{
0x07,
0x05,
0x02,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
0,
10
};
void get_status(void)
{
unsigned char endp,txdat[2];
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
unsigned char c;
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); //Read input endpoint status
else
c = D12_SelectEndpoint(endp * 2); //Read output endpoint status
if(c & D12_STALL)
txdat[0] = 1;
else
txdat[0] = 0;
txdat[1] = 0;
single_transmit(txdat, 2);
}
else stall_ep0();
}
void clear_feature(void)
{
unsigned char endp;
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
_DINT();
bEPPflags.bits.remote_wakeup = 0;
_EINT();
single_transmit(0, 0);
}
else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
//Clear Stalled Feature of Endpoint, resume
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp * 2 + 1, 0);
else
{
D12_SetEndpointStatus(endp * 2, 0);
}
single_transmit(0, 0);
}
else
{
stall_ep0();
}
}
void set_feature(void)
{
unsigned char endp;
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
_DINT();
bEPPflags.bits.remote_wakeup = 1;
_EINT();
single_transmit(0, 0);
}
else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
//Clear Stalled Feature of Endpoint, resume
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp * 2 + 1, 1);
else
D12_SetEndpointStatus(endp * 2, 1);
single_transmit(0, 0);
}
else
stall_ep0();
}
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
single_transmit(0, 0); //Send response
}
void get_descriptor(void)
{
//Read Descriptor type
unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
{
//Get Device descriptor
code_transmit((unsigned char *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
}
else if(bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
{
//if(ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
// ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
//Get Configuration descriptor + Interface descriptor + Endpoint descriptor
code_transmit((unsigned char *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
}
else
stall_ep0();
}
void get_configuration(void)
{
unsigned char c = bEPPflags.bits.configuration;
single_transmit(&c, 1);
}
void set_configuration(void)
{
if(ControlData.DeviceRequest.wValue == 0)
{
//Configuration value is not proper. Device is in no-config state
single_transmit(0, 0);
_DINT();
bEPPflags.bits.configuration = 0;
_EINT();
init_unconfig(); //进入地址状态,禁止0除外的所有端点
}
else if(ControlData.DeviceRequest.wValue == 1)
{
//Configrate device
single_transmit(0, 0);
init_unconfig(); //进入地址状态,禁止0除外的所有端点
init_config(); //配置处理,允许端点收发
_DINT();
bEPPflags.bits.configuration = 1;
_EINT();
}
else
{
stall_ep0();
}
}
void get_interface(void)
{
unsigned char txdat = 0; //Only one interface
single_transmit(&txdat, 1);
}
void set_interface(void)
{
if(ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
{
single_transmit(0, 0);
}
else
{
stall_ep0();
}
}
void reserved(void)
{
stall_ep0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -