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

📄 d12_setup.c

📁 D12固件程序
💻 C
字号:
#include "io8515v.h"
#include "d12head.h"
#include "d12setup.h"

TRANSMIT_STRUCT XmtBuff;
///int bconfig;

void Setup_control(void)
{
	char i,j,*p;
	D12_COMMAND = 0x00;// 选择端点0(指针指向0位置)
	cwait;
	D12_COMMAND = 0xf0;// 读标准控制码
	cwait1;
	i = D12_DATA;
	cwait1;
	i = D12_DATA;//长度
	cwait1;
	j = D12_DATA;
	csram;
	p = XmtBuff.b;
	*(p++) = j;
	for(i=0;i<7;i++)
	{
	   j = D12_DATA;
	   csram;
	   asm("st Z+,%j");
	}
	D12_COMMAND = 0x01;// 选择端点 1(指针指向0位置)
	cwait;
	D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
	csram;
	i = XmtBuff.b[1];
	if(XmtBuff.b[0] & 0x40)//厂商请求跳转表
	{
	   //if (i <= 0x0f)
	   {
		   //(*VendorDeviceRequest[i])();
	   }
	}
	else
	{
	   if (i <= 0x0B)//标准请求跳转表
	   {
		   (*StandardDeviceRequest[i])();
	  }
	}
	D12_COMMAND = 0x00;// 选择端点0(指针指向0位置)
	cwait;
	D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
	cwait;
	D12_COMMAND = 0xf2;// 清 OUT 缓冲区
}

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包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
	csram;
}

void get_status(void)
{
	XmtBuff.b[1] = 0x00;
	switch (XmtBuff.b[0])
	{
	case 0x80://返回设备状态
			  //发送两个字节数据:第一字节D1为1支持远程唤醒,D0为0是总线供电,其它位为0;第二字节为0。
		XmtBuff.b[0] = 0x03;
		break;
	case 0x81://返回接口状态
		//发送两个字节数据:第一字节为0;第二字节为0。
		//XmtBuff.b[5] 为接口号
		XmtBuff.b[0] = 0x00;
		break;
	case 0x82://返回端点状态
		//发送两个字节数据:第一字节D0为1端点处于暂停,否则D0为0,其它位为0;第二字节为0。
		//XmtBuff.b[5] D7为方向,D3~0为端点号
		XmtBuff.b[0] = 0x00;
		break;
	}
	XmtBuff.p_p=0;
	XmtBuff.wrLength = 2;
	XmtBuff.p = XmtBuff.b;
	USB_submit();
}

void clear_feature(void)
{
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();
}

void set_feature(void)
{
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();
}
void set_address(void)
{
char j;
	j = 0x80 | XmtBuff.b[2];
	D12_COMMAND = 0xd0;//设置新地址使能
	cwait;
	D12_DATA = j;
	csram;
	XmtBuff.wrLength = 0;
	USB_submit();
}

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

void get_configuration(void)
{
	XmtBuff.b[0] = 1;//返回是否被配置(非 0 为配置)
	XmtBuff.wrLength = 16;
	XmtBuff.p_p=0;
	XmtBuff.p = XmtBuff.b;
	USB_submit();
	///D12_COMMAND = 0x05;
	///cwait;
	///D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
}

void set_configuration(void)
{
char j;
int u;
	if (XmtBuff.b[0] == 0x00)
	{
		XmtBuff.wrLength = 0;
		USB_submit();
		j = XmtBuff.b[2];
		D12_COMMAND = 0xd8;
		if(j == 0x00)
		{
			D12_DATA = 0x00;  // 停止普通/同步端点
		}else if(j == 0x01)
		{
			D12_DATA = 0x01;  // 使能普通/同步端点
			cwait;
///			bconfig=1;
			
			    D12_COMMAND=0x05;
				D12_COMMAND=0xf0;
				D12_DATA=0;
				D12_DATA=64;
				for( u=0;u<64;u++)
					D12_DATA=u;
				D12_COMMAND=0xfa;
			//D12_COMMAND = 0x05;
			//cwait;
			//D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
			
		}
		csram;
   }
	else
		void_function();
}

void get_interface(void)
{
	XmtBuff.b[0] = 0;
	XmtBuff.wrLength = 1;
	XmtBuff.p_p=0;
	XmtBuff.p = XmtBuff.b;
	USB_submit();
}

void set_interface(void)
{
	XmtBuff.wrLength = 0;
	USB_submit();
}

void USB_submit(void)
{
char i,j,k;
	if(16>XmtBuff.wrLength)
	{
		j = XmtBuff.wrLength;
	}else
	{
		j = 16;
	}
	D12_COMMAND = 1;// 选择 IN 端点(指针指向0位置)
	cwait;
	D12_COMMAND = 0xf0;// 写缓冲区
	cwait;
	D12_DATA = 0x00;
	cwait;
	D12_DATA = j;
	csram;
	if(XmtBuff.p_p)
	{
		for(i=0;i<j ;i++)
		{
			 k = *(XmtBuff.pp+i);
			 D12_DATA = k;
			 csram;
		}
		XmtBuff.pp += j;
	}else
	{
	 	for(i=0;i<j;i++)
		{
			k = *(XmtBuff.p++);
			D12_DATA = k;
			csram;
		}
	}
	XmtBuff.wrLength -= j;
	D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
	csram;
}

⌨️ 快捷键说明

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