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

📄 transfer.c

📁 zlg/fs源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	endpoint_info *epi_ptr;
	INT8U transfer_direction;
	INT16U	transfer_size;
	INT8U err;
	epi_ptr = &(dvi_ptr->epi_info[0]);							// 获取默认端点描述信息结构指针
	transfer_direction = dev_req->bmRequestType>>7;		// 请求数据传输方向
	transfer_size = dev_req->wLength;						// 请求数据长度

	err = Control_Setup(dev_req, epi_ptr);					//建立阶段
	if (0 != err) {
		return (err|0x0000);
	}

	if (transfer_direction & 0x01) {							//控制读
		if (transfer_size) {
			err = Control_In(data_ptr, transfer_size, epi_ptr);		//数据阶段
			if (0 != err) {
				return (err|0x0000);
			}
		}
		USB_Delay(200);
		err = Control_Out(data_ptr, 0, epi_ptr);				//交换阶段
		if (0 != err) {
			return (err|0x0000);
		}		
	}
	else {												//控制写
		if (transfer_size) {
			err = Control_Out(data_ptr, transfer_size, epi_ptr);	//数据阶段
			if (0 != err) {
				return (err|0x0000);
			}
		}
		USB_Delay(200);
		err = Control_In(data_ptr, 0, epi_ptr);				//交换阶段
		if (0 != err) {
			return (err|0x0000);
		}
	}

	return 0;
	
}

INT8U Bulk_Out(	INT8U *data_ptr,
				INT32U size,
				endpoint_info *epi_ptr)
{
	INT8U uc_Data0Addr;
	INT8U uc_Data1Addr;
	INT8U uc_TranLen;
	INT8U uc_UnTranLen;
	INT8U uc_Cmd;
	INT8U uc_Result;
	INT8U uc_Timeout;
	INT8U uc_Intr;
	//INT8U uc_BufLen;
	INT8U uc_Addr;
	INT8U uc_Toggle;
	
	uc_Timeout = 0;
	uc_Toggle = 0;
	uc_Data0Addr = EP0_Buf;
	uc_Data1Addr = uc_Data0Addr+ epi_ptr->endpoint_descriptor.wMaxPacketSize;
	
	uc_Addr = uc_Data0Addr;
	uc_TranLen = m_MIN(epi_ptr->endpoint_descriptor.wMaxPacketSize, size);
	uc_Cmd = sDATA0_WR;
	SL811BufWrite(uc_Addr, data_ptr, uc_TranLen);
	SL811Write(EP0Status, ((epi_ptr->endpoint_descriptor.bEndpointAddress&0x0F)|PID_OUT));					// PID + EP address
	SL811Write(EP0Counter, epi_ptr->dvi_ptr->address);									// USB address
	SL811Write(EP0Address, uc_Addr);												// buffer address, start with "data0"
	SL811Write(EP0XferLen, uc_TranLen);												// data transfer length
	SL811Write(IntStatus,INT_CLEAR); 													// clear interrupt status
	SL811Write(EP0Control, uc_Cmd);														// Enable ARM and USB transfer start here
		
WaitForOver:
	
	while(1) {
		uc_Intr = SL811Read(IntStatus);							// wait for interrupt to be done, and 
		if((uc_Intr & USB_RESET) || (uc_Intr & INSERT_REMOVE))			// proceed to parse result from slave 
		{													// device.
			return 0xff;										// flag true, so that main loop will 
		}													// know this condition and exit gracefully
		if(uc_Intr & USB_A_DONE)								
			break;											// interrupt done !!!
	}

	SL811Write(IntStatus, INT_CLEAR);
	USB_Delay(50);
	uc_Result = SL811Read(EP0Status);
	uc_UnTranLen = SL811Read(EP0Counter);

	if (uc_Result & EP0_ACK) {
		size -= uc_TranLen;
		data_ptr += uc_TranLen;
		uc_Toggle = !uc_Toggle;
		if (size) {
			uc_Addr = (uc_Toggle&1)?uc_Data1Addr:uc_Data0Addr;
			uc_TranLen = m_MIN(size, epi_ptr->endpoint_descriptor.wMaxPacketSize);
			uc_Cmd ^= 0x40;
			uc_Cmd |= 0x20;
			SL811BufWrite(uc_Addr, data_ptr, uc_TranLen);
			SL811Write(EP0XferLen, uc_TranLen);
			SL811Write(EP0Address, uc_Addr);
			SL811Write(IntStatus, INT_CLEAR);
			SL811Write(EP0Control, uc_Cmd);
			goto WaitForOver;
		}
		else {
			return 0;
		}
		
	}
	
	if (uc_Result & EP0_STALL) {
		return 0;
	}
	
	// EP0_OVERFLOW, EP0_ERROR, EP0_SEQUENCE, EP0_SETUP, EP0_STALL, EP0_TIMEOUT, EP0_NAK
	return 0xff;			
	
}

INT8U Bulk_In(	INT8U *data_ptr,
				INT32U size,
				endpoint_info *epi_ptr)
{
	INT8U uc_Data0Addr;
	INT8U uc_Data1Addr;
	INT8U uc_TranLen;
	INT8U uc_UnTranLen;
	INT8U uc_Cmd;
	INT8U uc_Result;
	INT8U uc_Timeout;
	INT8U uc_Intr;
	//INT8U uc_BufLen;
	INT8U uc_Addr;
	INT8U uc_Toggle;
	uc_Timeout = 0;
	uc_Toggle = 0;
	uc_Data0Addr = EP0_Buf;
	uc_Data1Addr = uc_Data0Addr+ epi_ptr->endpoint_descriptor.wMaxPacketSize;
	
	uc_Addr = uc_Data0Addr;
	uc_TranLen = m_MIN(epi_ptr->endpoint_descriptor.wMaxPacketSize, size);
	uc_Cmd = sDATA0_RD;
	SL811Write(EP0Status, ((epi_ptr->endpoint_descriptor.bEndpointAddress&0x0F)|PID_IN));	// PID + EP address
	SL811Write(EP0Counter, epi_ptr->dvi_ptr->address);									// USB address
	SL811Write(EP0Address, uc_Addr);												// buffer address, start with "data0"
	SL811Write(EP0XferLen, uc_TranLen);												// data transfer length
	SL811Write(IntStatus,INT_CLEAR); 													// clear interrupt status
	SL811Write(EP0Control, uc_Cmd);														// Enable ARM and USB transfer start here
	
WaitForOver:
	
	while(1) {
		uc_Intr = SL811Read(IntStatus);							// wait for interrupt to be done, and 
		if((uc_Intr & USB_RESET) || (uc_Intr & INSERT_REMOVE))			// proceed to parse result from slave 
		{													// device.
			return 0xff;										// flag true, so that main loop will 
		}													// know this condition and exit gracefully
		if(uc_Intr & USB_A_DONE)								
			break;											// interrupt done !!!
	}

	SL811Write(IntStatus, INT_CLEAR);
	USB_Delay(50);
	uc_Result = SL811Read(EP0Status);
	uc_UnTranLen = SL811Read(EP0Counter);

	if (uc_Result & EP0_ACK) {
		SL811BufRead(((uc_Toggle&1)?uc_Data1Addr:uc_Data0Addr), data_ptr, uc_TranLen);
		data_ptr += uc_TranLen;
		size -= uc_TranLen;
		uc_Toggle = !uc_Toggle;
		if (size) {
			uc_Addr = (uc_Toggle&1)?uc_Data1Addr:uc_Data0Addr;
			uc_TranLen = m_MIN(size, epi_ptr->endpoint_descriptor.wMaxPacketSize);
			uc_Cmd ^= 0x40;
			uc_Cmd |= 0x20;
			SL811Write(EP0XferLen, uc_TranLen);
			SL811Write(EP0Address, uc_Addr);
			SL811Write(IntStatus, INT_CLEAR);
			SL811Write(EP0Control, uc_Cmd);
			goto WaitForOver;
		}
		else {
			return 0;
		}
		
	}

	
	if (uc_Result & EP0_STALL) {
		return 0;
	}

	// EP0_OVERFLOW, EP0_ERROR, EP0_SEQUENCE, EP0_SETUP
	return 0xff;		
}


INT16U Bulk_Transfer(	INT8U direction,
					INT8U *data_ptr,
					INT32U size,
					device_instance *dvi_ptr)
{
	endpoint_info *BulkIn_ptr;
	endpoint_info *BulkOut_ptr;
	INT16U err;
	INT8U i;


	if (DirectionPID_IN == direction) {
		for (i=1; i<MAX_ENDPOINT_NUM; i++) {
			if (dvi_ptr->epi_info[i].endpoint_descriptor.bmAttributes == 0x02
				&&(dvi_ptr->epi_info[i].endpoint_descriptor.bEndpointAddress&0x80)==0x80) {
				BulkIn_ptr = &(dvi_ptr->epi_info[i]);
				break;
			}
		}
		if (i == MAX_ENDPOINT_NUM) {
			return 0xff;
		}
		err = Bulk_In(data_ptr, size, BulkIn_ptr);
		if (err) {
			return err;
		}
	}
	else if(DirectionPID_OUT == direction) {
		for(i=1; i<MAX_ENDPOINT_NUM; i++) {
			if (dvi_ptr->epi_info[i].endpoint_descriptor.bmAttributes == 0x02
				&&(dvi_ptr->epi_info[i].endpoint_descriptor.bEndpointAddress&0x80)==0x00) {
				BulkOut_ptr = &(dvi_ptr->epi_info[i]);
				break;
			}
		}
		if (i == MAX_ENDPOINT_NUM) {
			return 0xff;
		}
		err = Bulk_Out(data_ptr, size, BulkOut_ptr);
		if (err) {
			return err;
		}
	}
	else {
		return 0xff;
	}

	return 0;
}

/*
INT8U Bulk_Write(	INT8U *data_ptr
					INT16U size_ptr
					endpoint_info *epi_ptr)
{
	INT8U data0_addr;
	INT8U data1_addr;
	data0_addr = EP0_Buf;
	data1_addr = data0_addr + epi_ptr->endpoint_descriptor.wMaxPacketSize;
	data0 = EP0_Buf;					// DATA0 buffer address
	data1 = data0 + (unsigned char)usbstack.wPayload;	// DATA1 buffer address
	
}

INT8U Bulk_Read(	INT8U *data_ptr
					INT16U size_ptr
					endpoint_info *epi_ptr)
{

}

INT8U Bulk_Transfer(	INT8U direction,
							INT8U *data_ptr,
							INT8U *size_ptr,
							transfer_instance *hTrInstance)
{
	
}			
*/

⌨️ 快捷键说明

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