⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap9.c

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 C
字号:
//============================================================================//
// 文件名:    chap9.c
// 描  述:   处理USB协议的相关代码,用于PC机枚举USB外设时用
// 日  期:   2003/04/03
// 库文件:   NONE
//=============================================================================//
#include "usbmain.h"
#include "usb11.h"
#include "D12CI.H"
#include "chap9.h"

extern void single_transmit(unsigned int * buf, unsigned int len);
extern void code_transmit(unsigned int * pRomData, unsigned long int len);
extern void stall_ep0(void);
extern void init_unconfig(void);
extern void init_config(void);
extern void init_config(void);
extern CONTROL_XFER ControlData;
extern EPPFLAGS bEPPflags;
#define NUM_ENDPOINTS	4
#define CONFIG_DESCRIPTOR_LENGTH    (unsigned long int)(sizeof(USB_CONFIGURATION_DESCRIPTOR)+ sizeof(USB_INTERFACE_DESCRIPTOR)+(NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR)))
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
	sizeof(USB_DEVICE_DESCRIPTOR),
    USB_DEVICE_DESCRIPTOR_TYPE,
    0x00010000,
    USB_CLASS_CODE_TEST_CLASS_DEVICE,
    0, 
    0,
	EP0_PACKET_SIZE,
    0x00040071,
    0x00060066,
    0x00010000,
    0, 			//Manufactory
    0,			//Product
    0,			//Serial Number
    25			//Number of possible configurations
};

USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
    sizeof(USB_CONFIGURATION_DESCRIPTOR),
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    CONFIG_DESCRIPTOR_LENGTH,
	1,
	1,
    0,
    0xa0,
	//0x60,
	0xf0
};

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
};

USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x81,
	USB_ENDPOINT_TYPE_INTERRUPT,
	EP1_PACKET_SIZE,
	10
};

USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x1,
	USB_ENDPOINT_TYPE_INTERRUPT,
	EP1_PACKET_SIZE,
	10
};

USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x82,
	USB_ENDPOINT_TYPE_BULK,
	EP2_PACKET_SIZE,
	10
};

USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x2,
	USB_ENDPOINT_TYPE_BULK,
	EP2_PACKET_SIZE,
	10
};

//=====================================================================
// 函数:    reserved
// 语法:    void reserved(void)
// 描述:    端点0禁通
// 参数:    无
// 返回:    无
//=====================================================================
void reserved(void)
{
	stall_ep0();
}
//=====================================================================
// 函数:    get_status
// 语法:    void get_status(void)
// 描述:    PC机获取USB设备的状态
// 参数:    无
// 返回:    无
//=====================================================================
void get_status(void)
{
	unsigned int endp, txdat[2];
	unsigned int bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
	unsigned int 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 int)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if(ControlData.DeviceRequest.wIndex & (unsigned int)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();
}
//=====================================================================
// 函数:    clear_feature
// 语法:    void clear_feature(void)
// 描述:    清除USB设备的特性
// 参数:    无
// 返回:    无
//=====================================================================
void clear_feature(void)
{
	unsigned int endp;
	unsigned int bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
	if(bRecipient == USB_RECIPIENT_DEVICE&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) 
	{
		Interrupt_Off();
		bEPPflags.bits.remote_wakeup = 0;
		Interrupt_On();
		single_transmit(0, 0);
	}
	else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
	{
		endp = (unsigned int)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if(ControlData.DeviceRequest.wIndex & (unsigned int)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();
}
//=====================================================================
// 函数:    set_feature
// 语法:    void set_feature(void)
// 描述:    设置USB设备的特性
// 参数:    无
// 返回:    无
//=====================================================================
void set_feature(void)
{
	unsigned int endp;
	unsigned int bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
	if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
	 {
		Interrupt_Off();
		bEPPflags.bits.remote_wakeup = 1;
		Interrupt_On();
		single_transmit(0, 0);
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) 
	{
		endp = (unsigned int)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (unsigned int)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();
}

//=====================================================================
// 函数:    set_address
// 语法:    void set_address(void)
// 描述:    设置USB设备的地址
// 参数:    无
// 返回:    无
//=====================================================================
void set_address(void)
{
	D12_SetAddressEnable((unsigned int)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
	single_transmit(0, 0);
}

//=====================================================================
// 函数:    get_descriptor
// 语法:    void get_descriptor(void)
// 描述:    获取描述符
// 参数:    无
// 返回:    无
//=====================================================================
void get_descriptor(void)
{   
	unsigned int bDescriptor = MSB(ControlData.DeviceRequest.wValue);
    if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)  //0x01
	{
		code_transmit((unsigned int *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
	} 
	else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
	{
		code_transmit((unsigned int *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
	} 
	else
		stall_ep0();
}
//=====================================================================
// 函数:    get_configuration
// 语法:    void get_configuration(void)
// 描述:    获取配置值
// 参数:    无
// 返回:    无
//=====================================================================
void get_configuration(void)
{
	unsigned int c = bEPPflags.bits.configuration;
	single_transmit(&c, 1);
}
//=====================================================================
// 函数:    set_configuration
// 语法:    void set_configuration(void)
// 描述:    设置配置值
// 参数:    无
// 返回:    无
//=====================================================================
void set_configuration(void)
{
	if (ControlData.DeviceRequest.wValue == 0)
	{
		//* put device in unconfigured state 
		single_transmit(0, 0);
		Interrupt_Off();
		bEPPflags.bits.configuration = 0;
		Interrupt_On();
		init_unconfig();
	} 
	else if (ControlData.DeviceRequest.wValue == 1) 
	{
		// Configure device 
		single_transmit(0, 0);
		init_unconfig();
		init_config();
		Interrupt_Off();
		bEPPflags.bits.configuration = 1;
		Interrupt_On();
	}
	else
		stall_ep0();
}
//=====================================================================
// 函数:    get_interface
// 语法:    void get_interface(void)
// 描述:    PC获取接口值
// 参数:    无
// 返回:    无
//=====================================================================
void get_interface(void)
{
	unsigned int txdat = 0;        // Only/Current interface = 0 
	single_transmit(&txdat, 1);
}

//=====================================================================
// 函数:    set_interface
// 语法:    void set_interface(void)
// 描述:    PC设置接口值
// 参数:    无
// 返回:    无
//=====================================================================
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 + -