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

📄 endp0.c

📁 51+pdiusbd12做的usb键盘
💻 C
字号:
#include "function.h"
#include <stdio.h>
#include "global.h"


/******************************************/
//函数入口表//函数入口表//函数入口表
code void (* StandardDeviceRequest[])()=
{
	Get_Status,
	Clean_Feature,
	Reserved,
	Set_Feature,
	Reserved,
	Set_Address,
	Get_Descriptor,
	Set_Descriptor,
	Get_Configuration,
	Set_Configuration,
	Get_Interface,
	Set_Interface,
	Reserved
};
code void (* ClassRequest[])()=
{
	Reserved,
	Get_Report,
	Get_Idle,
	Get_Protocol,
	Reserved,
	Reserved,
	Reserved,
	Reserved,
	Reserved,
	Set_Report,
	Set_Idle,
	Set_Protocol,
	Reserved,
	Reserved,
	Reserved	
};

void Control_Handler()
{
	uchar type,req;
	type=((Control_Buffer.Device_Request.bmRequestType&0x60)>>5);
	req=(Control_Buffer.Device_Request.bRequest&0x0f);
	if(type==0)
		{printf("标请函数查询\n");(* StandardDeviceRequest[req])();}  //标准请求
	else if(type==1)
			{printf("类请求函数查询\n");(* ClassRequest[req])();}//类型请求
		else if(type==2)
			{}//厂商请求
}

void Endp0_rx()
{
	Last_Status=Read_Last_Status(0);
	if(Last_Status&0x20)         //如果有一个setup包
	{
		Control_Buffer.wLength=0;
		Control_Buffer.wCount=0;
		if(Read_Endp_Buffer(0,sizeof(Control_Buffer.Device_Request),(uchar*)(&Control_Buffer.Device_Request))!=8)//请求数据长度是否错误
		{
			Soft_Flag.Registerbit1.Control_Status=0;//传输状态为空闲
			set_endpoint_status(0,1);
			set_endpoint_status(0,1);
			Soft_Flag.Registerbit1.Endp1_In=0;//不允许端点1进行控制输入传输
			printf("出错,不应答!\n");
			return;	
		}
		Ack_Setup(0);	//对主机应答    控制事物处理的第三个时相	
		Ack_Setup(1);  //对主机应答		控制事物处理的第三个时相,其余两个时相由D12自动完成
		//Select_point(0);
		//Clean_Buffer();
		printf("setup包\n");
		Control_Buffer.Device_Request.wValue=SWAP(Control_Buffer.Device_Request.wValue);
		Control_Buffer.Device_Request.wIndex=SWAP(Control_Buffer.Device_Request.wIndex);
		Control_Buffer.Device_Request.wLength=SWAP(Control_Buffer.Device_Request.wLength);
		Control_Buffer.wLength=Control_Buffer.Device_Request.wLength;
	//////////////标志///////////////////
		Soft_Flag.Registerbit1.Endp1_In=1;   //准许端点1控制输入传输传输数据
		Soft_Flag.Registerbit1.Control_Status=0;//传输状态改为空闲,在正在传输的时候才改为传输,避免破坏数据指针
		Soft_Flag.Registerbit1.Pc_Rx=0;
		Soft_Flag.Registerbit1.Pc_Tx=0;
		if(Control_Buffer.Device_Request.bmRequestType&0x80)//从设备到主机
		{Soft_Flag.Registerbit1.Pc_Rx=1;Soft_Flag.Registerbit1.Pc_Tx=0;}
		else {Soft_Flag.Registerbit1.Pc_Tx=1;Soft_Flag.Registerbit1.Pc_Rx=0;}
	}
	else
	{
		printf("不是setup\n");
		Soft_Flag.Registerbit1.Control_Status=0;//传输状态为空闲
		Select_point(0);
		Clean_Buffer();
		Soft_Flag.Registerbit1.Endp1_In=0;//不允许端点1进行控制输入传输
		//return;
	}
	
	//////////////标志///////////////////
}




void Endp0_tx()
{
	Read_Last_Status(1);
	if(Soft_Flag.Registerbit1.Control_Status==0)
				Control_Handler();
	if(Soft_Flag.Registerbit1.Pc_Rx)
	{		
		if(Control_Buffer.wLength>=16)
			{
				Write_Endp_Buffer(1,16,Control_Buffer.pData+Control_Buffer.wCount);
				Control_Buffer.wLength=Control_Buffer.wLength-16;
				Control_Buffer.wCount=Control_Buffer.wCount+16;
				Soft_Flag.Registerbit1.Control_Status=1;
				printf("传输了16个字节\n");
				if(Soft_Flag.Registerbit1.Address==0)
				Soft_Flag.Registerbit1.Control_Status=0;
			}
		else 
			{
				Write_Endp_Buffer(1,Control_Buffer.wLength,Control_Buffer.pData+Control_Buffer.wCount);
				Soft_Flag.Registerbit1.Control_Status=0;
				Soft_Flag.Registerbit1.Endp1_In=0;    //端点1不能在发送数据,直到端点0受到发送数据的命令
				Soft_Flag.Registerbit1.Pc_Rx=0;
				printf("传输最后几个字节\n");
			}		
	}
	if(Soft_Flag.Registerbit1.Pc_Tx)
	{}	
}


void Main_rx()
{
	Read_Last_Status(4);
}


void Main_tx()
{
	Read_Last_Status(5);
	
}

⌨️ 快捷键说明

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