www.pudn.com > usbcode.rar > D12Setup.c


/*++ 
 
Module Name: 
 
         D12Setup.c 
 
Abstract: 
 
         Header file related to D12 module 
 
Environment: 
 
        ICCAVR 6.29 
 
Revision History: 
 
        04/23/2004      chenchi   created 
 
--*/ 
/******************************************************************/ 
#include "io8515v.h" 
#include "d12.h" 
#include "d12setup.h" 
 
TRANSMIT_STRUCT XmtBuff;//定义传输结构体变量 
 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:完成设备枚举 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  (*StandardDeviceRequest[i])(); 
  标准设备请求函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void Setup_control(void) 
{ 
	unsigned char i,j,*p; 
	D12_COMMAND = 0x00;//选择端点(指针指向0位置) 
	cwait; 
	D12_COMMAND = 0xf0;//读标准控制码 
	cwait1; 
	/**************************** 
	  缓冲区数据结构: 
	  字节1:保留,可为任意值 
	  字节2:数据字节的数目/长度 
	  字节3:数据字节1 
	  字节4:数据字节2 
	*****************************/ 
	i = D12_DATA;//字节1 
	cwait1; 
	i = D12_DATA;//字节2 
	cwait1; 
	j = D12_DATA;//数据字节 
	csram; 
	p = XmtBuff.b;//P指针指向传输缓冲区 
	*(p++) = j; 
	for(i=0;i<7;i++) 
	{ 
	   j = D12_DATA;//数据字节 
	   csram; 
	   asm("st Z+,%j"); 
	} 
	D12_COMMAND = 0x01;// 选择端点(指针指向0位置) 
	cwait; 
	D12_COMMAND = 0xf1;//应答SETUP包 
	csram; 
	i = XmtBuff.b[1]; 
	if (i <= 0x0B)//标准请求跳转表 
	{ 
		(*StandardDeviceRequest[i])(); 
	} 
	else{ 
		D12_COMMAND = 0x01;//选择端点(指针指向0位置) 
		cwait; 
		D12_COMMAND = 0xf0;// 写缓冲区 
		cwait; 
		/**************************** 
	  	  缓冲区数据结构: 
	  	  字节1:保留,可为任意值 
	  	  字节2:数据字节的数目/长度 
	  	  字节3:数据字节1 
	  	  字节4:数据字节2 
		*****************************/ 
		D12_DATA = 0x00;//字节1 
		cwait; 
		D12_DATA = 0x01;//字节2 
		csram; 
		D12_DATA = 0x00;//数据字节 
		csram; 
		D12_COMMAND = 0xfa;//设置 IN 缓冲区有效(满标志) 
		csram; 
	} 
	D12_COMMAND = 0x00;//选择端点(指针指向0位置) 
	cwait; 
	D12_COMMAND = 0xf1;//应答SETUP包 
	cwait; 
	D12_COMMAND = 0xf2;//清端点缓冲区 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:停止控制端点.应答枚举请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明:无 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void void_function(void) 
{ 
	D12_COMMAND = 0x40;//0端点停止(用于发送Stall包) 
	cwait; 
	D12_DATA = 0x01; 
	cwait; 
	D12_COMMAND = 0x41;//1//端点停止(用于发送Stall包) 
	cwait; 
	D12_DATA = 0x01; 
	cwait; 
	D12_COMMAND = 0xf1;//应答SETUP包 
	csram; 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void get_status(void) 
{ 
	XmtBuff.b[1] = 0x00; 
	switch (XmtBuff.b[0]) 
	{ 
	case 0x80: 
		break; 
	case 0x81: 
		XmtBuff.b[0] = 0x00; 
		break; 
	case 0x82: 
		XmtBuff.b[0] = 0x00; 
		break; 
	} 
	XmtBuff.p_p=0; 
	XmtBuff.wrLength = 2; 
	XmtBuff.p = XmtBuff.b; 
	USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void clear_feature(void) 
{ 
	unsigned char j; 
	switch (XmtBuff.b[0]) 
	{ 
	case 0x00://清设备唤醒功能 
		break; 
	case 0x01://清接口状态 
		break; 
	case 0x02://启用端点 
		//XmtBuff.b[5] D7为方向,D3~0为端点号 
		j = XmtBuff.b[5]; 
		if(j<0x80) 
		{ 
			j = 0x40+j*2; 
			D12_COMMAND = j;// 启用OUT端点 
			D12_DATA = 0x00; 
			csram; 
		} 
		else 
		{ 
			j = (j & 0x0f); 
			D12_COMMAND = 0x41+j*2;// 启用IN端点 
			D12_DATA = 0x00; 
			csram; 
		} 
		break; 
	} 
	XmtBuff.wrLength = 0; 
	USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void set_feature(void) 
{ 
	unsigned char j; 
	switch (XmtBuff.b[0]) 
	{ 
	case 0x00://设置设备唤醒功能 
		break; 
	case 0x01://设置接口状态 
		break; 
	case 0x02://停止端点 
		//XmtBuff.b[5] D7为方向,D3~0为端点号 
		j = XmtBuff.b[5]; 
		if(j<0x80) 
		{ 
			j = 0x40+j * 2; 
			D12_COMMAND = j;// 停止OUT端点 
			cwait; 
			D12_DATA = 0x01; 
			csram; 
		} 
		else 
		{ 
			j = j & 0x0f; 
			j = 0x41+j*2; 
			D12_COMMAND = j;// 停止IN端点 
			cwait; 
			D12_DATA = 0x01; 
			csram; 
		} 
		break; 
	} 
	XmtBuff.wrLength = 0; 
	USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void set_address(void) 
{ 
	unsigned char j; 
	j = 0x80 | XmtBuff.b[2]; 
	D12_COMMAND = 0xd0;//设置新地址使能 
	cwait; 
	D12_DATA = j; 
	csram; 
	XmtBuff.wrLength = 0; 
	USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void get_descriptor(void) 
{ 
	unsigned int i; 
	XmtBuff.p_p=1; 
	switch (XmtBuff.b[3]) 
	{ 
		case 0x01: //USB_DEVICE 
			XmtBuff.pp = device_descriptor; 
			XmtBuff.wrLength = sizeof(device_descriptor); 
			break; 
		case 0x02:// USB_CONFIGURATION 
			i = XmtBuff.b[7]; 
			i = ((i<<8) | XmtBuff.b[6]); 
			XmtBuff.pp = Configuration_Descriptor; 
			XmtBuff.wrLength = *(XmtBuff.pp+2); 
			if(i<16) 
				  XmtBuff.wrLength = XmtBuff.b[6]; 
			break; 
		case 0x03: //USB_STRING 
			switch(XmtBuff.b[2]) 
			{ 
			case 0x00 : 
				//XmtBuff.wrLength = sizeof(USBStringLanguageDescription); 
				//?XmtBuff.p = USBStringLanguageDescription; 
				break; 
			case 0x01 : 
				//?XmtBuff.wrLength = sizeof(USBStringDescription1); 
				//?XmtBuff.p = USBStringDescription1; 
			   break; 
			case 0x02 : 
				//?XmtBuff.wrLength = sizeof(USBStringDescription2); 
				//?XmtBuff.p = USBStringDescription2; 
			   break; 
			default   : 
				void_function(); 
				return; 
			} 
			break; 
		default : 
			void_function(); 
			return; 
	} 
	USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void get_configuration(void) 
{ 
	XmtBuff.b[0] = 1;//返回是否被配置(非 0 为配置) 
	XmtBuff.wrLength = 16; 
	XmtBuff.p_p=0; 
	XmtBuff.p = XmtBuff.b; 
	USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void set_configuration(void) 
{ 
	unsigned char j; 
	if (XmtBuff.b[0] == 0x00) 
	{ 
		j = XmtBuff.b[2]; 
		D12_COMMAND = 0xd8; 
		if(j == 0x00) 
		{ 
			D12_DATA = 0x00;  // 停止普通/同步端点 
		}else if(j == 0x01) 
		{ 
			D12_DATA = 0x01;  // 使能普通/同步端点 
			cwait; 
			D12_COMMAND = 0x03; 
			cwait; 
			D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志) 
			cwait; 
			D12_COMMAND = 0x05; 
			cwait; 
			D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志) 
		} 
		csram; 
   	} 
	else 
		void_function(); 
	XmtBuff.wrLength = 0; 
		USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:传输结构体 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void get_interface(void) 
{ 
	XmtBuff.b[0] = 0; 
	XmtBuff.wrLength = 1; 
	XmtBuff.p_p=0; 
	XmtBuff.p = XmtBuff.b; 
	USB_submit(); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:标准设备请求 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:传输结构体 
**调用的函数说明: 
  USB_submit(); 
  控制端点提交函数 
   
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void set_interface(void) 
{ 
	XmtBuff.wrLength = 0; 
	USB_submit(); 
}