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

📄 chap9.c

📁 AVR单片机控制的PDIUSBD12原程序
💻 C
字号:
//********************************
//标准设备请求处理chap9.c
//编译环境WinAVRGCC
//2007-01-9
//Hjxiang
//********************************
//标准C头文件
#include <stdint.h>
#include <stdlib.h>
//AVR头文件
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
//自定义头文件
#include "usb.h"
#include "d12ic.h"
#include "chap9.h"

/**********************************
USB标准请求程序调用到的子程序
**********************************/
//保留子程序
void reserved(void)
{
	stall_ep0();				//返回STALL
}
//进入地址状态,禁止0除外的所有端点
void init_unconfig(void)
{
	D12_SetEndpointEnable(0);	//禁止除0外的所有端点
}
//配置处理,允许端点收发
void init_config(void)
{
	D12_SetEndpointEnable(1);	//允许端点收发
}
//通过端点索引1发送数据(Data类型)
void single_transmit(unsigned char *buf,unsigned char len)
{
	if(len <= EP0_PACKET_SIZE)
	{
		D12_WriteEndpoint(1,len,buf);
	}
}
//通过端点索引1发送数据(CODE类型)
void code_transmit(unsigned char *pRomData,unsigned short len)
{
	ControlData.wCount=0;
	if(ControlData.wLength>len)
		ControlData.wLength=len;				//发送数据长度控制
	ControlData.pData=pRomData;
	if(ControlData.wLength>=EP0_PACKET_SIZE)
	{
		D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);
		ControlData.wCount += EP0_PACKET_SIZE;
		DISABLE;
		bEPPflags.bits.control_state=USB_TRANSMIT;	//标志发送状态
		ENABLE;
	}
	else
	{
		D12_WriteEndpoint(1,ControlData.wLength,pRomData);
		ControlData.wCount += ControlData.wLength;
		DISABLE;
		bEPPflags.bits.control_state=USB_IDLE;	//标志发送状态	
		ENABLE;
	}
}
/**********************************
USB标准请求服务子程序
**********************************/
//获取状态
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);				//读取输入端点状态
				else
					c=D12_SelectEndpoint(endp*2);					//读取输出端点状态
				if(c & D12_STALL)
					txdat[0]=1;										//端点禁止
				else
					txdat[0]=0;										//端点有效
				txdat[1]=0;
				single_transmit(txdat,2);							//发送数据
			}
			else
				stall_ep0();										//非标准请求,发STALL
}
//清除特性
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)
				D12_SetEndpointStatus(endp*2+1,0);					//清除输入端点STALL特性
			else
				D12_SetEndpointStatus(endp*2,0);					//清除输出端点STALL特性
			single_transmit(0,0);									//发送响应
		}
		else
			stall_ep0();										//没有该请求,返回STALL			
}
//设置特性
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)
				D12_SetEndpointStatus(endp*2+1,1);
			else
				D12_SetEndpointStatus(endp*2,1);					//设置输出端点禁止
			single_transmit(0,0);									//发送响应
		}
		else
			stall_ep0();										//没有该请求,返回STALL			
}
//设置地址
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 = ControlData.DeviceRequest.wValue;
	if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
	{
		//获取设备描述符
		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;
			//获取配置描述符+配置描述符+接口描述符+端点描述符
			code_transmit((unsigned char *) & ConfigDescr,ControlData.DeviceRequest.wLength);
		}
		else
		stall_ep0();										//没有该请求,返回STALL		
}
//获取配置
void get_configuration(void)
{
	unsigned char c=bEPPflags.bits.configuration;
	single_transmit(&c,1);
}
//设置配置
void set_configuration(void)
{
	if(ControlData.DeviceRequest.wValue==0)
	{
		//配置值不对,设备进入未配置状态
		single_transmit(0,0);						//发送响应
		DISABLE;
		bEPPflags.bits.configuration=0;				//标记未配置
		ENABLE;
		init_unconfig();							//进入地址状态,禁止0除外的所有端点
	}
	else
		if(ControlData.DeviceRequest.wValue==1)
		{
			//
			single_transmit(0,0);						//发送响应
			init_unconfig();							//进入地址状态,禁止0除外的所有端点
			init_config();								//配置处理,允许端点收发
			DISABLE;
			bEPPflags.bits.configuration=1;				//标记配置
			ENABLE;
		}
		else
			stall_ep0();								//没有该请求,返回STALL
}
//获取接口信息
void get_interface(void)
{
	unsigned char 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();								//没有该请求,返回STALL
}

⌨️ 快捷键说明

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