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

📄 chap_9.c

📁 是ISP1581 单片机 应用源码
💻 C
📖 第 1 页 / 共 3 页
字号:
//***********************************************************************
//									     								                  *
//                P H I L I P S   P R O P R I E T A R Y          		   *
//                                                                      *
//          COPYRIGHT (c)   1999 BY PHILIPS SINGAPORE (APIC).    		   *
//                    --  ALL RIGHTS RESERVED  --                 		*	
//                                                                      *
// 	File Name	:       USBDebug.c                                    *
// 	Author		:       Albert Goh					 					      *
// 	Created		:      	3 March 2000                               	*
//                  	                                                   *
//***********************************************************************
//***********************************************************************
//                                                                      *
// USBDebug has the ability to test the USB core in Bus enumeration or  *
// in CBI/bulk mode.                                                  	*
//                                                                      *
//***********************************************************************
//***********************************************************************
//                                                                      *
//  Module History														            *
//  **************														            *
//																		                  *
//  Date   	Version			Author				Changes					      *
//  ====	   =======			======				=======					      *
//  030300	  0.1 			Albert				Created    				      *
//                                                                      *
//***********************************************************************

//***********************************************************************
//*																		               *
//*	                     Include Files Definition						   *
//*																		               *
//***********************************************************************

#include "standard.h"
#include "Kernel.h"
#include "D14.h"
#include "usb.h"
#include "global.h"
#include "chap_9.h"
#include "init.h"
#include "reqcode.h"



//USB标准请求
code void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_config,
	set_config,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};



//***********************************************************************
//*																		               *
//*	                     Routine Definition								   *
//*																		               *
//***********************************************************************

//***********************************************************************
//*										    							               *
//*	Routine 	:  USB Debug Mode                                 		   *
//*	Input		:  USB Interrupt Register 								         *
//*	Output	:  None                                					   *
//*	Function	:  Branch to respective ISR                  			   *
//*																		               *
//***********************************************************************

void USB_Debug_Mode(void)
{
	//端点0接收到setup包处理      
   	if(USB_Int_Flag.BITS.EP0SETUP)
	{
		EA_DISABLE;
		USB_Setup();
		EA_ENABLE;
	}
	
	//挂起处理
	if(USB_Int_Flag.BITS.SUSP)
	{		
		//清除挂起标志
		EA_DISABLE;
		USB_Int_Flag.BITS.SUSP = 0;
		EA_ENABLE;
		//ISP1581进入挂起状态           
		D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 1;
		D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 0;
	}
	
	//挂起恢复处理
	if(USB_Int_Flag.BITS.RESUME)
	{
		//清除恢复标志
		EA_DISABLE;
		USB_Int_Flag.BITS.RESUME = 0;         
		EA_ENABLE;
		//产生一个恢复信号
		D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 1;
		D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 0;
   	}
	
	//高速状态
	if(USB_Int_Flag.BITS.HS_STAT)
	{
		//清除高速状态标志
		EA_DISABLE;
		USB_Int_Flag.BITS.HS_STAT = 0;
		EA_ENABLE;
		if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
		{
			//切换高速指示
			HS_FS_LED = HIGH_SPEED_LED;
			//设置高速模式状态
			Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
			//重新配置高速端点
			Init_Endpoint();

//			PIO_Count = 64;
			PIO_Count = 512;
		}
	}
}


//***********************************************************************
//*										    							*
//*	Routine 	:                                                		*
//*	Input		: None                   								*
//*	Output		: None                                					*
//*	Function	:                                            			*
//*																		*
//***********************************************************************
//建立包处理
void USB_Setup(void)
{
	unsigned char type, req;

	//清除EP0SETUP中断标志
	USB_Int_Flag.BITS.EP0SETUP = 0;	  
	//清除总线复位标志
   	Kernel_Flag.BITS.Bus_Reset = 0;
	//选择端点0SETUP缓冲区
	D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
	
	//读取USB请求
	//读取请求类型
	USB_Device_Request.bmRequestType =  D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	//读取请求号
	USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	//读取16bit请求数据
	USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	USB_Device_Request.wValue <<= 8;
	USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	//读取16bit请求索引
	USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	USB_Device_Request.wIndex <<= 8;
	USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	//读取16bit长度
	USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	USB_Device_Request.wLength <<= 8;
	USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
	
	//长度处理(高低8位对调)
	Temp = USB_Device_Request.wLength;
	USB_Device_Request.wLength = 0;
	USB_Device_Request.wLength = (UC) Temp;
	USB_Device_Request.wLength <<= 8;
	Temp >>= 8;
	USB_Device_Request.wLength |= Temp;
	
	type = USB_Device_Request.bmRequestType & 0x60;
	req = USB_Device_Request.bRequest & 0x0f;

	//厂商请求
	if (type == 0x40)
	{
		Vendor_Specific_Command();//厂商请求处理
	}
	else if (type == 0x00)
		(*StandardDeviceRequest[req])();//调用标准请求
}

//***********************************************************************
//*										    							*
//*	Routine 	:                                                		*
//*	Input		: None                   								*
//*	Output		: None                                					*
//*	Function	:                                            			*
//*																		*
//***********************************************************************
//厂商请求处理
void Vendor_Specific_Command(void)
{
	if(USB_Device_Request.bRequest == 0x0C)
	{
		switch (USB_Device_Request.wIndex)
		{
		case GET_FIRMWARE_VERSION  ://获取固件版本
			if(USB_Device_Request.wLength == 1)
			{
				//select endpoint
				D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
				//set the data length to 1 byte
				D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
				D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
				//sent 0x21 as data
				D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x21;//版本号
				wait_ep0tx();
				ep0out_ack();
//				ep0in_ack();
				break;
			}
			
		case SETUP_DMA_REQUEST :
			//Out Token Ack detected
			wait_ep0rx();
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
			//
			FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			//读取传输字节数
			Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			bytecount <<= 8;
			bytecount |= Temp;
			//读取传输方式
			FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			ep0in_ack();
			Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
			break;
			
		default :
			if(USB_Device_Request.bmRequestType == 0xC0)
			{
				ep0in_ack();
				break;				
			}
			if(USB_Device_Request.bmRequestType == 0x40)
			{	
				D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
				D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
				while(!USB_Int_Flag.BITS.EP0SETUP)
				{
					//读取ISP1581中断寄存器
					USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
					//回写ISP1581中断寄存器
					D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
					if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
						return;
				}
				USB_Int_Flag.BITS.EP0TX = 0;
				break;				
			}
		}
	}
}

//***********************************************************************
//*										    							*
//*	Routine 	:                                                		*
//*	Input		: None                   								*
//*	Output		: None                                					*
//*	Function	:                                            			*
//*																		*
//***********************************************************************

void	reserved(void)
{
}


//Get_Descriptor()获取描述符
void get_descriptor(void)
{

	switch(USB_Device_Request.wValue)
	{
	case  1://设备描述符
		//选择描述符
		if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
			Descriptor_Ptr = &Standard_Device_Descriptor[0];	//set pointer to device descriptor
		if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
			Descriptor_Ptr = &HS_Device_Descriptor[0];	//set pointer to device descriptor
		count = *Descriptor_Ptr;							//read in descriptor length
		//选择端点号
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
		//写下发送字节数
		D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 0x12;
		D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
		//send descriptor
		//发送描述符
		while(count != 0)
		{
			D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
			count--;
			Descriptor_Ptr++;
		}
		wait_ep0tx();
		ep0out_ack();
		break;
		
	case  2        :  //获取配置描述符
		USB_Int_Flag.BITS.EP0RX = 0;
		Temp = 64;
		Descriptor_Ptr = &Standard_Config_Descriptor[0];	//set pointer to configuration descriptor
		count = *Descriptor_Ptr;							//get configuration Descriptor length
		//选择端点号1
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
		//check if only configuration descriptor required
		//检查描述符长度,决定是只发送配置描述符还是描述符集合
		if(count >= USB_Device_Request.wLength)				//Send only Configuration descriptor
		{
			//写入发送字节数
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
			//send descriptor
			//发送描述符
			for(count = 0 ; count < USB_Device_Request.wLength ; count++)
			{
				D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
				Descriptor_Ptr++;
			}
			wait_ep0tx();
			ep0out_ack();
		}
		else //send Configuration,Interface and Endpoint descriptor
		{
			//发送描述符集合(配置+接口+端点)
			if(USB_Device_Request.wLength >= 32)
			{
				//写入配置描述符
				while(count != 0)
				{
					D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
					count--;
					Descriptor_Ptr++;
				}

⌨️ 快捷键说明

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