?? kchap9.c
字號:
#include <stdio.h>
#include <string.h>
#include "khal.h"
#include "kd12ci.h"
#include "kmain.h"
#include "kUSB100.h"
#include "kchap9.h"
//以下定義的是一些外部函數//
extern void single_transmit(unsigned char * buf, unsigned char len);
extern void code_transmit(unsigned char code * 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 sizeof(USB_CONFIGURATION_DESCRIPTOR) \
+ sizeof(USB_INTERFACE_DESCRIPTOR) \
+ (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
extern CONTROL_XFER ControlData;
extern IO_REQUEST idata ioRequest;
extern EPPFLAGS bEPPflags;
//以下定義一些結構體類型的變量///
code USB_DEVICE_DESCRIPTOR DeviceDescr = //設備描述符//
{
sizeof(USB_DEVICE_DESCRIPTOR), //描述符大小
USB_DEVICE_DESCRIPTOR_TYPE, //描述符類型
SWAP(0x0200), //USB版本號碼
USB_CLASS_CODE_TEST_CLASS_DEVICE, //類別碼
0, //子類別
0, //協議碼
EP0_PACKET_SIZE, //端點0的最大信息包大小
SWAP(0x0471), //VID廠商ID
SWAP(0x0666), //PID產品ID
SWAP(0x0100), //設備版本號碼
0, //Manufactory制造者的字符串描述符索引值
0, //Product 產品的字符串描述符索引值
0, //Serial Number序號的字符串描述符索引值
25 //可能配置的數目
};
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr = //配置描述符
{
sizeof(USB_CONFIGURATION_DESCRIPTOR),//描述符大小
USB_CONFIGURATION_DESCRIPTOR_TYPE,//配置描述符類型
SWAP(CONFIG_DESCRIPTOR_LENGTH), //此配置傳回的所有數據大小
1, //此配置支持的接口數目
1, //Set_Configuration與Get_Configuration要求的標識符
0, //此配置的字符串描述符的索引值
0x60, //自身電源/總線電源設置
0xf0 //需要總線電源
};
code USB_INTERFACE_DESCRIPTOR InterfaceDescr = //接口描述符
{
sizeof(USB_INTERFACE_DESCRIPTOR), //描述符大小
USB_INTERFACE_DESCRIPTOR_TYPE, //描述符類型
0, //識別此接口的數字
0, //用來選擇一個替代設置的數值
NUM_ENDPOINTS, //出了端點0外,支持的端點數目
USB_CLASS_CODE_TEST_CLASS_DEVICE, //類別碼
USB_SUBCLASS_CODE_TEST_CLASS_D12, //子類別碼
USB_PROTOCOL_CODE_TEST_CLASS_D12, //協議碼
0 //此接口的字符串描述符的索引值
};
code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = //發送端點1描述符
{
sizeof(USB_ENDPOINT_DESCRIPTOR), //描述符大小
USB_ENDPOINT_DESCRIPTOR_TYPE, //端點描述符類型
0x81, //端點數目與方向
USB_ENDPOINT_TYPE_INTERRUPT, //支持的傳輸類型
SWAP(EP1_PACKET_SIZE), //支持的最大信息包大小
10 //最大遲延/輪詢時距
};
code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr = //接受端點1描述符
{
sizeof(USB_ENDPOINT_DESCRIPTOR),//描述符大小
USB_ENDPOINT_DESCRIPTOR_TYPE, //端點描述符類型
0x1, //端點數目與方向
USB_ENDPOINT_TYPE_INTERRUPT, //支持的傳輸類型
SWAP(EP1_PACKET_SIZE), //支持的最大信息包大小
10 //最大遲延/輪詢時距
};
code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr = //發送端點2描述符
{
sizeof(USB_ENDPOINT_DESCRIPTOR), //描述符大小
USB_ENDPOINT_DESCRIPTOR_TYPE, //端點描述符類型
0x82, //端點數目與方向
USB_ENDPOINT_TYPE_BULK, //支持的傳輸類型
SWAP(EP2_PACKET_SIZE), //支持的最大信息包大小
10 //最大遲延/輪詢時距
};
code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr = //接受端點2描述符
{
sizeof(USB_ENDPOINT_DESCRIPTOR), //描述符大小
USB_ENDPOINT_DESCRIPTOR_TYPE, //端點描述符類型
0x2, //端點數目與方向
USB_ENDPOINT_TYPE_BULK, //支持的傳輸類型
SWAP(EP2_PACKET_SIZE), //支持的最大信息包大小
10 //最大遲延/輪詢時距
};
//以上定義了一些結構體類型的變量//
//*************************************************************************
// USB Protocol LayerUSB協議層
//*************************************************************************
*/
void reserved(void)
{
stall_ep0();
}
// USB standard device requestsUSB標準設備請求
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); /* Control-in */
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();
}
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) {
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.
D12_SetEndpointStatus(endp*2 + 1, 0);
else
// clear RX stall for OUT on EPn.
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) {
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);
} else
stall_ep0();
}
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
single_transmit(0, 0);
}
void get_descriptor(void)
{
unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
}
else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
code_transmit((unsigned char code *)&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) {
//* put device in unconfigured state
single_transmit(0, 0);
DISABLE;
bEPPflags.bits.configuration = 0;
ENABLE;
init_unconfig();
} else if (ControlData.DeviceRequest.wValue == 1) {
// Configure device
single_transmit(0, 0);
init_unconfig();
init_config();
DISABLE;
bEPPflags.bits.configuration = 1;
ENABLE;
} else
stall_ep0();
}
void get_interface(void)
{
unsigned char txdat = 0; // Only/Current interface = 0
single_transmit(&txdat, 1);
}
void set_interface(void)
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
single_transmit(0, 0);
else
stall_ep0();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -