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

📄 chap9.c

📁 AVR单片机 C语言程序设计经典实用
💻 C
字号:


#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "initial.h"
#include "pdiusbd12.h"
#include "endpointfun.h"
#include "descriptor.h"
#include "chap9.h"



 void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};



void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}


//*************
void reserved(void)
{
	stall_ep0();				
}

//*****************
void init_unconfig(void)
{
	D12_SetEndpointEnable(0);	
}


//************************
void init_config(void)
{
	D12_SetEndpointEnable(1);	
}

//*************************
void single_transmit(uchar * buf, uchar len)
{
	if( len <= 16)	
    {		
		D12_WriteEndpoint(1, len, buf);
	}
}

//****************
void code_transmit(const uchar *pRomData, uint len)
{
	ControlData.wCount = 0;								
	if(ControlData.wLength > len)
		ControlData.wLength = len;						

	ControlData.pData = pRomData;						
	if( ControlData.wLength >= 16) {		
		const_WriteEndpoint(1, 16, ControlData.pData);	
		ControlData.wCount += 16;						

		DISABLE;  //EA=0;
		bEPPflags.bits.control_state = USB_TRANSMIT;					
		ENABLE;  //EA=1;
	}
	else {
		const_WriteEndpoint(1, ControlData.wLength, pRomData);		
		ControlData.wCount += ControlData.wLength;					

		DISABLE;  //EA=0;
		bEPPflags.bits.control_state = USB_IDLE;					
		ENABLE;  //EA=1;
	}
}



void get_status(void)
{
	uchar endp, txdat[2], c;							
	uchar bRecipient = ControlData.DeviceRequest.bmRequestType & 0x1F;	
																	
	if(bRecipient ==0x00)
	{					
		if(bEPPflags.bits.remote_wakeup == 1)			
			txdat[0] = 3;										
		else
			txdat[0] = 1;									
		txdat[1]=0;											
		single_transmit(txdat, 2);								
	} 
	else if(bRecipient ==0x01)
	{			
		txdat[0]=0;
		txdat[1]=0;
		single_transmit(txdat, 2);
									
	} 
	else if(bRecipient ==0x02)
	{			
		endp = (uchar)(ControlData.DeviceRequest.wIndex & 0x03);
		if(ControlData.DeviceRequest.wIndex & 0x80)
			c = D12_SelectEndpoint(endp*2 + 1);			
		else
			c = D12_SelectEndpoint(endp*2);			
		if(c & 0x02)
			txdat[0] = 1;								
		else
			txdat[0] = 0;							
		txdat[1] = 0;
		single_transmit(txdat, 2);						

	} 
	else
		stall_ep0();		
}



void clear_feature(void)
{
	uchar endp;												
	uchar bRecipient = ControlData.DeviceRequest.bmRequestType & 0x1F ;
															
	if(bRecipient ==0x00 && ControlData.DeviceRequest.wValue == 0x0001)
	{
		DISABLE;   //EA=0;								
		bEPPflags.bits.remote_wakeup = 0;					
		ENABLE; //EA=1;
		single_transmit(0, 0);								
	}

	else if(bRecipient == 0x02 && ControlData.DeviceRequest.wValue == 0x0000)
	{	
		endp = (uchar)(ControlData.DeviceRequest.wIndex & 0x03);
		if(ControlData.DeviceRequest.wIndex & 0x80)
			D12_SetEndpointStatus(endp*2 + 1, 0);	
		else
			D12_SetEndpointStatus(endp*2, 0);		
		single_transmit(0, 0);					
	} 
	else
		stall_ep0();						
}

*
void set_feature(void)
{
	uchar endp;											
	uchar bRecipient = ControlData.DeviceRequest.bmRequestType & 0x1F;
															
									
	if(bRecipient ==0x00 && ControlData.DeviceRequest.wValue == 0x0001)
	{	
		DISABLE;  //EA=0;
		bEPPflags.bits.remote_wakeup = 1;		
		ENABLE ; //EA=1;
		single_transmit(0, 0);					
	}	

	else if(bRecipient ==0x02 && ControlData.DeviceRequest.wValue == 0x0000) 
	{	
		endp = (uchar)(ControlData.DeviceRequest.wIndex & 0x03);
		if (ControlData.DeviceRequest.wIndex & 0x80)
			D12_SetEndpointStatus(endp*2 + 1, 1);
		else
			D12_SetEndpointStatus(endp*2, 1);		
		single_transmit(0, 0);				
	} 
	else
		stall_ep0();	
}


void set_address(void)
{
	D12_SetAddress((uchar)(ControlData.DeviceRequest.wValue & 0x7F), 1);

	single_transmit(0, 0);	
	
}



void get_descriptor(void)
{
	uchar bDescriptor = MSB(ControlData.DeviceRequest.wValue);	

	if (bDescriptor == 0x01)	
	{						
		code_transmit((const uchar *) & DeviceDescr, 0x12);
		
	}
	else if (bDescriptor == 0x02) 
	{		
		if (ControlData.DeviceRequest.wLength > 0x2E)
		{ 
			ControlData.DeviceRequest.wLength = 0x2E;
		}

		code_transmit((const uchar *) & (usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
			    												
	 }
	else
		stall_ep0();	
	
}


void get_configuration(void)
{
	uchar c = bEPPflags.bits.configuration;	
	single_transmit( &c, 1);				
}



void set_configuration(void)
{
	if (ControlData.DeviceRequest.wValue == 0) 
	{	
		single_transmit(0, 0);							
		DISABLE ; //EA=0;
		bEPPflags.bits.configuration = 0;					
		ENABLE ; //EA=1;
		init_unconfig();									
	} 
	else if(ControlData.DeviceRequest.wValue == 1) 
	{	
		single_transmit(0, 0);							
		init_unconfig();									
		init_config();										
		DISABLE ; //EA=0;
		bEPPflags.bits.configuration = 1;					
		ENABLE ; //EA=1;
	}
	else
		stall_ep0();						
}

void control_handler(void)
{
	uchar type, req;
	type = ControlData.DeviceRequest.bmRequestType & 0x60;
												
	req = ControlData.DeviceRequest.bRequest & 0x0F;
	if (type == 0)
		(*StandardDeviceRequest[req])();		
	else
		stall_ep0();											
}

void get_interface(void)
{
	uchar txdat = 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 + -