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

📄 dev_ep.c

📁 zlg/fs源代码
💻 C
字号:
#define DEV_EP_GLOBALS

#include "config.h"


#define		reqtype( x )					(x >> 8)
#define		request( x )					(x & 0xF)

device_instance gs_DeviceInfo[MAX_DEV_NUM];

void USB_Reset(void)
{
	unsigned char temp;
   	temp=SL811Read(CtrlReg);   
 	SL811Write(CtrlReg,temp|0x08);
	USB_Delay(125);
	SL811Write(CtrlReg,temp);    
}


void SL811_Init(void)
{	
	///////////////////////////////////////////////////////
	
	SL811_BusInit();
	
	SL811Write(CtrlReg,0x00);  //0x04
	USB_Delay(100);
	SL811Write(CtrlReg,0x01);
	
	SL811Write(cDATASet,0xe0);
	SL811Write(cSOFcnt,0xae);
			
	SL811Write(EP0Status,0x50);
	SL811Write(EP0Counter,0);
	SL811Write(EP0Control,0x01);
		
	SL811Write(IntEna,0x20);      		// USB-A, Insert/Remove, USB_Resume.
	
	SL811Write(IntStatus,INT_CLEAR);	// Clear Interrupt enable status
}


void USB_Check(device_instance *dvi_ptr)
{
	INT8U  uc_Intr;

	uc_Intr = SL811Read(IntStatus);

	if (uc_Intr & 0x40) {
		dvi_ptr->state = USB_DEVICE_STATE_REMOVED;
	}
	else {
		dvi_ptr->state = USB_DEVICE_STATE_ATTACHED;
	}
	SL811Write(IntStatus,INT_CLEAR);
	SL811Write(IntStatus,INSERT_REMOVE);
		
}	
	

device_instance * malloc_device_instance(void)
{
	INT8U i;
	
	device_instance *dvi_ptr;

	dvi_ptr = &gs_DeviceInfo[0];
	/*	初始化设备描述信息结构		*/
	dvi_ptr->state = USB_DEVICE_STATE_REMOVED;
	dvi_ptr->address	= 0;
	dvi_ptr->speed = 1;

	dvi_ptr->epi_info[0].endpoint_descriptor.wMaxPacketSize = DEFAULT_BUFFER_SIZE;
	dvi_ptr->epi_info[0].endpoint_descriptor.bEndpointAddress = 0;
	dvi_ptr->epi_info[0].endpoint_descriptor.bmAttributes = Ep_TransferType_Control;

	for (i=0; i<MAX_ENDPOINT_NUM; i++) {
		dvi_ptr->epi_info[i].dvi_ptr = dvi_ptr;
	}

	return dvi_ptr;
}


//*******************************************************************************
// 函数名称:std_request
// 输入参数:buff_ptr,传输数据缓冲区指针
//				   dvi_ptr,设备描述信息结构指针
//				   request,标准请求类型
//				   wValue,值
//				   wIndex,索引
//				   wLength,长度
// 输出参数:正常返回0,出错返回出错代码。
// 功能描述:发送和接收标准请求。
//*******************************************************************************
unsigned short std_request( unsigned char *buff_ptr, 
							device_instance *dvi_ptr, 
							unsigned short request, 
							unsigned short wValue, 
							unsigned short wIndex, 
							unsigned short wLength )
{
	USB_Device_Request	req;
	unsigned short		err;

	req.bmRequestType = reqtype( request );
	req.bRequest	= request( request );
	req.wValue = wValue;
	req.wIndex = wIndex;
	req.wLength = wLength;

	err	= Control_Transfer( &req, dvi_ptr, buff_ptr );	// 控制传输
	return err;	
}


INT16U USB_Enum(device_instance *dvi_ptr, INT8U addr)
{
	INT8U buffer[64];
	INT16U err;
	INT8U conf_wTotalLength;
	INT8U EndpointNum;
	INT8U i;
	std_conf_descriptor *std_conf_ptr;
	std_interface_descriptor *std_interface_ptr;
	std_endpoint_descriptor *std_endpoint_ptr;
	
	printf("USB emun start\n");
	
	printf("USB Reset\n");
	USB_Reset();
	
	/********************************************/	
	/*	获取设备描述符前8个字节 	*/
	/*		新地址							*/
	/********************************************/		
	printf("Get device descriptor first 8 Byte\n");
	err = std_request( buffer, dvi_ptr, std_Dv_request_GET_DESCRIPTOR, descriptor_type_DEVICE, 0x0000,8 );
	if ( err) {
		goto ERROR;
	}
	dvi_ptr->epi_info[0].endpoint_descriptor.wMaxPacketSize = ((std_dev_descriptor *)buffer)->bMaxPacketSize0;

	/********************************************/	
	/*	设备地址,为设备设置一个	*/
	/*		新地址							*/
	/********************************************/	
	printf("USB address set = %d\n",addr);
	//dvi_ptr->address = addr;
	err = std_request( buffer, dvi_ptr, std_Dv_request_SET_ADDRESS, addr, 0x0000, 0 );
	if (  err ) {
		goto ERROR;
	}
	dvi_ptr->address = addr;
	
	/********************************************/	
	/*	获取18字节的设备描述符		*/
	/*											*/
	/********************************************/
	printf("Get full device descriptor\n");
	err = std_request( buffer, dvi_ptr, std_Dv_request_GET_DESCRIPTOR, descriptor_type_DEVICE, 0x0000, 18 );
	if (err) {
		goto ERROR;
	}
	memcpy( (unsigned char *)(&(dvi_ptr->dev_descriptor)), buffer, sizeof( std_dev_descriptor ) );

	/********************************************/	
	/*	获取配置描述符前4字节			*/
	/*		从而获取配置描述符集长度*/
	/********************************************/
	printf("Get config descriptor first 4 bytes\n");
	err = std_request( buffer, dvi_ptr, std_Dv_request_GET_DESCRIPTOR, descriptor_type_CONFIGURATION, 0x0000, 4 ) ;
	if (err) {
		goto ERROR;
	}


	/********************************************/	
	/*	获取配置描述符集				*/
	/*											*/
	/********************************************/	
	printf("Get full config descriptor\n");
	conf_wTotalLength= ((std_conf_descriptor *)buffer)->wTotalLength;
	
	err = std_request(buffer, dvi_ptr, std_Dv_request_GET_DESCRIPTOR,  descriptor_type_CONFIGURATION, 0x0000, conf_wTotalLength ) ;
	if (err) {
		goto ERROR;
	}

		
	memcpy((INT8U *)(&(dvi_ptr->conf_descriptor)), buffer, 9);
	
	std_interface_ptr = (std_interface_descriptor *)(buffer + 9);
	memcpy ((INT8U *)(&(dvi_ptr->interfacef_descriptor)), std_interface_ptr, 9);
	EndpointNum = std_interface_ptr->bNumEndpoints;
	for (i=0; i<EndpointNum; i++) {
		std_endpoint_ptr = (std_endpoint_descriptor *)(buffer+9+9+i*7);
		memcpy	((INT8U *)(&(dvi_ptr->epi_info[i+1].endpoint_descriptor)),std_endpoint_ptr,7);
		//dvi_ptr->epi_info[i+1].endpoint_descriptor.bmAttributes = 1;
	}

	err = std_request(buffer, dvi_ptr, std_Dv_request_SET_CONFIGURATION, dvi_ptr->conf_descriptor.bConfigurationValue, 0x0000,0);
	if (err) {
		goto ERROR;
	}

	return 0;
	
ERROR:
	printf("USB Enum Error \n");
	return err;
}


⌨️ 快捷键说明

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