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

📄 usbimpl.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:

	if (type == USB_STANDARD_REQUEST)
		(*StandardDeviceRequest[req])();
#ifdef _HID_DEVICE
	else if (type == USB_CLASS_REQUEST	//class request & receive is interface
			&& ControlData.DevRequest.bmRequestType&0x1)
		(*HidDeviceReuest[req])();
#endif //_HID_DEVICE
	else if (type == USB_VENDOR_REQUEST)
		(*VendorDeviceRequest[req])();
	else
		stall_ep0();
}

/*
//*************************************************************************
// USB standard device requests
//*************************************************************************
*/
void get_status(void)
{
	//send 2B to pc
	u8 endp, txdat[2];
	u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;
	u8 c;

//	PRINT("get_status ");
	if (bRecipient == USB_RECIPIENT_DEVICE) 
	{
//		if(bEppflags.flags.remote_wakeup == 1)
//			txdat[0] = 3;
//		else
//			txdat[0] = 1;
		txdat[0] = 0; //bus power, don't support remote wakeup
		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 = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DevRequest.wIndex & 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;	//ep stall
		else
			txdat[0] = 0;	//ep work
		txdat[1] = 0;
		single_transmit(txdat, 2);
	} 
	else
		stall_ep0();
}

void clear_feature(void)
{
	u8 endp;
	u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;

//   	PRINT("clear_feature ");

	if (bRecipient == USB_RECIPIENT_DEVICE
		&& ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
	{
//		DISABLE_INTERRUPT;
//		bEppflags.flags.remote_wakeup = 0;
//		ENABLE_INTERRUPT;
		single_transmit(0, 0);
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
		&& ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL) 
	{
		endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DevRequest.wIndex & (u8)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)
{
	u8 endp;
	u8 bRecipient = ControlData.DevRequest.bmRequestType & USB_RECIPIENT;

//	PRINT("set_feature ");

	if (bRecipient == USB_RECIPIENT_DEVICE
		&& ControlData.DevRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) 
	{
//		DISABLE_INTERRUPT;
//		bEppflags.flags.remote_wakeup = 1;
//		ENABLE_INTERRUPT;
		single_transmit(0, 0);
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
		&& ControlData.DevRequest.wValue == USB_FEATURE_ENDPOINT_STALL) 
	{
		endp = (u8)(ControlData.DevRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DevRequest.wIndex & (u8)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)
{
	PRINT("set_address ");

	D12_SetAddressEnable((u8)(ControlData.DevRequest.wValue &
		DEVICE_ADDRESS_MASK), 1);
	single_transmit(0, 0);
}
void get_descriptor(void)
{
	u8 bDescriptor = ControlData.DevRequest.wValue>>8;

//	PRINT("get_descriptor:");
	if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
	{
		PRINT("device ");
		code_transmit((u8 code *)&DeviceDescr, sizeof(DEVICE_DESCRIPTOR));
	} 
	else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) 
	{
		PRINT("Config ");
		code_transmit((u8 code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
	} 
	else if (bDescriptor == USB_INTERFACE_DESCRIPTOR_TYPE)
	{
		PRINT("interface ");
		code_transmit((u8 code *)&InterfaceDescr, sizeof(INTERFACE_DESCRIPTOR));
	}
#ifdef _HID_DEVICE
	else if (bDescriptor == USB_HID_DESCRIPTOR_TYPE)
	{
		PRINT("hid ");
		code_transmit((u8 code *)&HidDescr, sizeof(HID_DESCRIPTOR));
	}
	else if (bDescriptor == USB_REPORT_DESCRIPTOR_TYPE)
	{
		PRINT("report ");
		code_transmit((u8 code *)szHidReport, 0x34);
	}
#endif //_HID_DEVICE
	else if(bDescriptor == USB_STRING_DESCRIPTOR_TYPE) //获取字符描述符
	{
		PRINT("string");
		switch(LSB(ControlData.DevRequest.wValue))  //获取描述符索引
		{
		case 0:
			PRINT("0 ");
			code_transmit((u8 code *)&StringLANGID, StringLANGID[0]);
			break;
		case 1:
			PRINT("1 ");
			code_transmit((u8 code *)&szManufacturer, szManufacturer[0]);
			break;
		case 2:
			PRINT("2 ");
			code_transmit((u8 code *)&szProduct, szProduct[0]);
			break;
		case 3:
			PRINT("3 ");
			code_transmit((u8 code *)&szSerialNumber, szSerialNumber[0]);
			break;
		case 4:
			PRINT("4 ");
			code_transmit((u8 code *)&szConfiguration, szConfiguration[0]);
			break;
		case 5:
			PRINT("5 ");
			code_transmit((u8 code *)&szInterface, szInterface[0]);
			break;
		case 6:
			PRINT("6 ");
			code_transmit((u8 code *)&szUserInfo, szUserInfo[0]);
			break;
		default:
			PRINT("default ");
			code_transmit((u8 code *)&StringLANGID, 4);
			break;
		}
	}
	else
	{
		stall_ep0();
	}
}
void get_configuration(void)
{
	u8 c = bEppflags.flags.config;
//	PRINT("get_config ");
	single_transmit(&c, 1);
}

void set_configuration(void)
{
	PRINT("set_config ");
	if (ControlData.DevRequest.wValue == 0) 
	{
		/* put device in unconfigured state */
		single_transmit(0, 0);
		DISABLE_INTERRUPT;
		bEppflags.flags.config = 0;
		ENABLE_INTERRUPT;
		init_unconfig();
	} 
	else if (ControlData.DevRequest.wValue == 1) 
	{
		/* Configure device */
		single_transmit(0, 0);
		init_unconfig();
		init_config();
		DISABLE_INTERRUPT;
		bEppflags.flags.config = 1;
		ENABLE_INTERRUPT;
	} else
		stall_ep0();
}
void get_interface(void)
{
	u8 txdat = 0; /* Only/Current interface = 0 */
//	PRINT("get_interface ");

	single_transmit(&txdat, 1);
}

void set_interface(void)
{
	PRINT("set_interface ");
	if (ControlData.DevRequest.wValue == 0 
		&& ControlData.DevRequest.wIndex == 0)
		single_transmit(0, 0);
	else
		stall_ep0();
}

///////////////////////////////////////////////////////////////
//		follow is custom request, read_write_register commmand code is 0xC
/*
void get_firmware_version()
{
	u8 i = 0x1;
	PRINT("get_firmware_version");

	D12_WriteEndpointBuffer(1, &i, 1);
}

void get_buffer_size()
{
	u8 i[4] = {0, 0, 0, 0};

	PRINT("get_buffer_size");

	i[0] = EP1_PACKET_SIZE;
	D12_WriteEndpointBuffer(1, i, 4);
}

void trans_data()
{
	u8 len, epstatus;
	PRINT("trans_data");

	if (ControlData.buffer[5] == 0x81)
	{
		//device to pc
		D12_WriteEndpointBuffer(3, Ep1Buf, ControlData.buffer[3]);
	}
	if (ControlData.buffer[5] == 0x80)
	{
		epstatus = D12_ReadEndpointStatus(2);
		epstatus &= 0x60;
		if (epstatus == 0x60)
			len = D12_ReadEndpointBuffer(4, Ep1Buf, EP1_PACKET_SIZE);
	}
	single_transmit(0, 0);
}
*/
//custom request
void read_write_register()
{
//	u8 i, len, epstatus;
/*
	PRINT("read_write_register");

	if (ControlData.DevRequest.bmRequestType & (u8)USB_ENDPOINT_DIRECTION_MASK)
	{
		if (ControlData.DevRequest.wIndex == GET_FIRMWARE_VERSION
			&& ControlData.DevRequest.wValue == 0
			&& ControlData.DevRequest.wLength == 1)
			get_firmware_version();	//get firmware version, transform 1byte
		else if (ControlData.DevRequest.wIndex == GET_BUFFER_SIZE
				&& ControlData.DevRequest.wValue == 0
				&& ControlData.DevRequest.wLength == 4)
			get_buffer_size();	//get buffer size, transform 4 bytes
		else
			stall_ep0();
	}
	else
	{
		if (ControlData.DevRequest.wIndex == TRANS_REQUEST 
			&& ControlData.DevRequest.wValue == 0
			&& ControlData.DevRequest.wLength == 6)
			trans_data();	//transform data, 6 bytes
		else
			stall_ep0();
	}
	*/
}

//////////////////////////////////////////////////////////
//follow code is used for hid device
#ifdef _HID_DEVICE
void get_report()
{
	PRINT("get_report ");

	code_transmit(szHidReport, 52);
}

void get_idle()
{
	PRINT("get_idle ");
}

void get_protocol()
{
	PRINT("get_idle ");
}

void set_report()
{
	PRINT("set_report ");
}

void set_idle()
{
	PRINT("set_idle ");
	stall_ep0();
}

void set_protocol()
{
	PRINT("set_protocol ");
}
#endif //_HID_DEVICE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -