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

📄 mainloop.c

📁 飞利浦公司usb2.0芯片isp1581的通用驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	{

// if possiblek check the setup again if there is any new setup came and overwrite the old one. (Jiang Qian)

		bISP1581flags.bits.At_IRQL1 = 0;
		LowerIRQL();
		/*
		// After Checking OverWritten Bit, It's sure that Setup Pkt Data is valid.
		*/
		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;
//		cprintf("brequest, x%xh, bmrequest x%xh \r\n",ControlData.DeviceRequest.bRequest, ControlData.DeviceRequest.bmRequestType);

		if (ControlData.DeviceRequest.bmRequestType & (UCHAR)USB_ENDPOINT_DIRECTION_MASK)
		{
			/* get command */
			RaiseIRQL();
			ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
				if((ControlData.DeviceRequest.bRequest == 0) & (ControlData.DeviceRequest.bmRequestType == 0xc0))
				{
					bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE; // WORKAROUND FIX CONTROL END WITH OUT 1(NO DATA).
#ifdef debug
					cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
				}
				else
				{
					bISP1581flags.bits.CONTROL_HANDLE_DONE = 1;
					bISP1581flags.bits.DCP_state = USBFSM4DCP_REQUESTPROC;
#ifdef debug
					cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
				}
			LowerIRQL();
		}
		else
		{
			/* set command */

			if (ControlData.DeviceRequest.wLength == 0)
			{
				/* Set command  without Data stage*/
				RaiseIRQL();
				ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
					bISP1581flags.bits.CONTROL_HANDLE_DONE = 1;
					bISP1581flags.bits.DCP_state = USBFSM4DCP_REQUESTPROC; // no such command now.
#ifdef debug
					cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
				LowerIRQL();
			}
			else
			{
				/*
				// Set command  with Data stage
				// get Data Buffer
				*/
				if(ControlData.DeviceRequest.wLength <= MAX_CONTROLDATA_SIZE)
				{
					/* set command with OUT token */
					RaiseIRQL();
					bISP1581flags.bits.DCP_state = USBFSM4DCP_DATAOUT;
#ifdef debug
					cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
					ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
					LowerIRQL();
				}
				else
				{
					RaiseIRQL();
					ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
					ISP1581_StallEP0InControlWrite();
					bISP1581flags.bits.DCP_state = USBFSM4DCP_STALL;
#ifdef debug
					cprintf("^_^%hx\n Unknow set up command\n", bISP1581flags.bits.DCP_state);
#endif
					LowerIRQL();
				}
			}
		}
	}
	else
	{
#ifdef debug
		cprintf("wrong setup command\r\n");
#endif
		bISP1581flags.bits.At_IRQL1 = 0;
		LowerIRQL();
		Chap9_StallEP0();
	}
}

void DeviceRequest_Handler(void)
{
	UCHAR type, req;

	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;

#ifdef debug
	//	cprintf("type = x%hx, req = x%hx\n", type, req);
#else
		help_devreq(type, req); /* print out device request */
#endif

	if ((type == USB_STANDARD_REQUEST) && (req < MAX_STANDARD_REQUEST))
		(*StandardDeviceRequest[req])();
	else if ((type == USB_CLASS_REQUEST) && (req <= MAX_CLASS_REQUEST))
		(*ClassDeviceRequest[req])();
	else if ((type == USB_VENDOR_REQUEST) && (req 	< MAX_VENDOR_REQUEST))
		(*VendorDeviceRequest[req])();
	else{
		Chap9_StallEP0();
	}
}

void help_devreq(UCHAR type, UCHAR req)
{
	UCHAR typ = type;
	typ >>= 5;

	if(type == USB_STANDARD_REQUEST) {
		cprintf("\n\r%s Request: %s ", _NAME_USB_REQUEST_TYPE[typ],
			_NAME_USB_STANDARD_REQUEST[req]);
//		cprintf("\n\rRequest Type = %s, Request = %s ", _NAME_USB_REQUEST_TYPE[typ],
//			_NAME_USB_STANDARD_REQUEST[req]);
	}
	else if(type == USB_VENDOR_REQUEST) {
		cprintf("\n\r%s Request: %s ", _NAME_USB_REQUEST_TYPE[typ],
			_NAME_USB_VENDOR_REQUEST[req]);
//		cprintf("\n\rRequest Type = %s, Request = %s ", _NAME_USB_REQUEST_TYPE[typ],
//			_NAME_USB_VENDOR_REQUEST[req]);
	}
	else if(type == USB_CLASS_REQUEST) {
		cprintf("\n\rRequest Type = %s, Request = %s ", _NAME_USB_REQUEST_TYPE[typ],
			_NAME_USB_CLASS_REQUEST[req]);
	}
	else {
		if(bISP1581flags.bits.verbose)
			cprintf("\n\rRequest Type = %s, bRequest = 0x%x ", _NAME_USB_REQUEST_TYPE[typ],
				req);
	}
}

void init_port(void)
{
	unsigned long phys;

	privateBuffer = (unsigned short far *)farmalloc(DMA_BUFFER_SIZE*2L);
	if(privateBuffer == NULL) {
		cprintf("Error allocation memory!\r\n");
		exit(1);
	}

	phys = (unsigned long)FP_SEG(privateBuffer)*16 + FP_OFF(privateBuffer);
	if( (phys&0x0ffffL) == 0 ) {
		dmaBuffer = phys;
	}
	else {
		phys &= 0xf0000L;
		phys += 0x10000;
		dmaBuffer = phys;
	}
	cprintf("privateBuffer allocated at %p, dmaBuffer at %lx; \r\n",
		privateBuffer, dmaBuffer);

	privateBuffer = (unsigned short far *)farmalloc(DMA_BUFFER_SIZE*2L);
	if(privateBuffer == NULL) {
		cprintf("Error allocation memory!\r\n");
		exit(1);
	}

	phys = (unsigned long)FP_SEG(privateBuffer)*16 + FP_OFF(privateBuffer);
	if( (phys&0x0ffffL) == 0 ) {
		isoBuffer = phys;
	}
	else {
		phys &= 0xf0000L;
		phys += 0x10000;
		isoBuffer = phys;
	}
	cprintf("privateBuffer for ISO allocated at %p, isoBuffer at %lx, \r\n",
		privateBuffer, isoBuffer);
}

void Initialize( void)
{
	init_port();
	Hal4Sys_AcquireFPGA();
	Hal4Sys_AcquireSerial();   /* AcquireSerial first to output debug info via UART */
	Hal4Sys_AcquireKeypad();
	Hal4Sys_ResetPCBA();
	Hal4Sys_AcquireLED();
	Hal4Sys_AcquireTimer0();

	ISP1581_Acquire();       /* Acquire ISP1581 last to let ISP1581 connect after complete initialisation */
}

void on_exit(void)
{
	UCHAR c;

	Hal4Sys_ControlISP1581Interrupt(FALSE);
	RaiseIRQL();
// debug, check dma state register
//	cprintf("\r\n dma state = %x", ISP1581_GetDMAState());
	ISP1581_Release();

	Hal4Sys_ReleaseTimer0();
	Hal4Sys_ReleaseLED();
	Hal4Sys_ReleaseKeypad();
	Hal4Sys_ReleaseSerial();
	Hal4Sys_ReleaseFPGA();

	disconnect_USB();

	outportb(0x20,0x20);
	LowerIRQL();

//free mem
	farfree(privateBuffer);
}


void disconnect_USB(void)
{
	/*
	// Initialize ISP1581 configuration
	*/
	ISP1581_SetTestMode(testmode_forcefs);
	//You may need some delay here if MPU is very fast.
	ISP1581_SetMode( mode_glintena\
					|mode_pwroff\
/*					|mode_wkupcs*/);
//					|mode_softct);
	cprintf("disconnect device, D+ pull up removed\r\n");
//	ISP1581_ResetDevice();
}

void connect_USB(void)
{
	UCHAR c;
	USHORT i;
	/*
	// reset event flags
	*/
	RaiseIRQL();
	bISP1581flags.value = 0;

	bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
	cprintf("Pull Resister connected, USB_STATES is ^_^%hx4", bISP1581flags.bits.DCP_state);

	ISP1581_Initiate();

	LowerIRQL();
}

void ISP1581_Initiate(void)
{
//	ISP1581_IntClearl(0xff);
//	ISP1581_IntClearh(0xff);
	ISP1581_SetAddressEnable(0x00, 0x01); // set address to 0 and enable it.
	ISP1581_SetMode( mode_glintena
//					|mode_wkupcs
					|mode_pwroff
					|mode_softct
					//|mode_clkaon
					);
	ISP1581_SetTestMode(0); // clear test mode
	ISP1581_SetIntConfig(0x0
					|intcfg_cdbgmod_as		// control interrupt on ack and stall
					|intcfg_ddbgmodin_a		// IN data interrupt on ack only
					|intcfg_ddbgmodout_asy	// OUT data on ack and stall and nyet intertupt
					//|intcfg_polh);   // level interrupt and active high
//					|intcfg_edgetrig
					);
	ISP1581_SetIntEnableLow(int_busreset|int_susp|int_resume
							|int_hs_stat|int_dma|int_ep0set
							|int_ep0rx|int_ep0tx
							|int_ep1rx|int_ep1tx
							|int_ep2rx|int_ep2tx
							);
	ISP1581_SetIntEnableHigh(int_ep3rx|int_ep3tx
							|int_ep4rx|int_ep4tx
							|int_ep5rx|int_ep5tx
							|int_ep6rx|int_ep6tx
							|int_ep7rx|int_ep7tx);
	ISP1581_ConfigEndpoint();		// default config as a full speed device
	ISP1581_SetDMAHDCfg(dmahd_dreqpolh/*|dmahd_dackpolh*/|dmahd_eotpolh/*|dmahd_readpolh|dmahd_writepolh*/);
	ISP1581_SetDMAConfig(/*dmacfg_width16|*/dmacfg_modediorw/*|dmacfg_modediorack*/|dmacfg_burst1);
}


void ISP1581_ConfigEndpoint(void)
{
	// disable all endpoint firsr;
	ISP1581_SetEndpointConfig(EPINDEX4EP01OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP01IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP02OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP02IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP03OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP03IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP04OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP04IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP05OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP05IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP06OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP06IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP07OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP07IN, 0);

	ISP1581_SetEPMAXSize(EPINDEX4EP01OUT, maxepsize_16);
	ISP1581_SetEPMAXSize(EPINDEX4EP01IN, maxepsize_16);
	switch(bISP1581flags.bits.ConnectSpeed)
	{
		case FullSpeed:
		{
			globe_variable.maxepsize_bulk = maxepsize_FS;
			break;
		}
		case HighSpeed:
		{
			globe_variable.maxepsize_bulk = maxepsize_HS;
			break;
		}
		default:
		{
			globe_variable.maxepsize_bulk = maxepsize_FS;
			break;
		}
	}
	ISP1581_SetEPMAXSize(EPINDEX4EP02OUT, globe_variable.maxepsize_bulk);
	ISP1581_SetEPMAXSize(EPINDEX4EP02IN, globe_variable.maxepsize_bulk);
	ISP1581_SetEPMAXSize(EPINDEX4EP03OUT, maxepsize_256);
	ISP1581_SetEPMAXSize(EPINDEX4EP03IN, maxepsize_256);
	ISP1581_SetEPMAXSize(EPINDEX4EP04OUT, maxepsize_0);
	ISP1581_SetEPMAXSize(EPINDEX4EP04IN, maxepsize_0);
	ISP1581_SetEPMAXSize(EPINDEX4EP05OUT, maxepsize_0);
	ISP1581_SetEPMAXSize(EPINDEX4EP05IN, maxepsize_0);
	ISP1581_SetEPMAXSize(EPINDEX4EP06OUT, maxepsize_0);
	ISP1581_SetEPMAXSize(EPINDEX4EP06IN, maxepsize_0);
	ISP1581_SetEPMAXSize(EPINDEX4EP07OUT, maxepsize_0);
	ISP1581_SetEPMAXSize(EPINDEX4EP07IN, maxepsize_0);


	// set endpoint type;
	ISP1581_SetEndpointConfig(EPINDEX4EP01OUT, eptype_bulk|eptype_enable/*|eptype_doublebuf*/);
	ISP1581_SetEndpointConfig(EPINDEX4EP01IN, eptype_bulk|eptype_enable);//|eptype_doublebuf);//|eptype_noempkt);
	ISP1581_SetEndpointConfig(EPINDEX4EP02OUT, eptype_bulk|eptype_enable|eptype_doublebuf);
	ISP1581_SetEndpointConfig(EPINDEX4EP02IN, eptype_bulk|eptype_enable|eptype_doublebuf|eptype_noempkt);
	ISP1581_SetEndpointConfig(EPINDEX4EP03OUT, eptype_iso|eptype_enable|eptype_doublebuf);
	ISP1581_SetEndpointConfig(EPINDEX4EP03IN, eptype_iso|eptype_enable|eptype_doublebuf);
	ISP1581_SetEndpointConfig(EPINDEX4EP04OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP04IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP05OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP05IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP06OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP06IN, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP07OUT, 0);
	ISP1581_SetEndpointConfig(EPINDEX4EP07IN, 0);
	ISP1581_ClearBuffer(EPINDEX4EP01OUT);
	ISP1581_ClearBuffer(EPINDEX4EP01IN);
	ISP1581_ClearBuffer(EPINDEX4EP02OUT);
	ISP1581_ClearBuffer(EPINDEX4EP02IN);
	ISP1581_ClearBuffer(EPINDEX4EP03OUT);
	ISP1581_ClearBuffer(EPINDEX4EP03IN);
}

void reconnect_USB(void)
{
	ULONG clk_cnt;
	/*
	// reconnect USB and On LED 1 second.
	*/
//	Hal4Sys_ControlLEDPattern(0x00);


	disconnect_USB();

/*	cprintf("Wait for 1 second ...\r\n");

	clk_cnt = Hal4Sys_ClockTicks;
	while(Hal4Sys_ClockTicks < clk_cnt + 20)
*/		;

	connect_USB();
}


void Isr_BusReset(void)
{
//	cprintf("\r\nMode register value = %x", ISP1581_GetMode());
	bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
	bISP1581flags.bits.Vendor_CMD = BULKIN_Idle;
	bISP1581flags.bits.dma_state = DMA_IDLE;
	ioRequest.bAddressH = 0;
	ioRequest.uAddressL = 0;
	ioRequest.uSize = 0;
	globe_variable.ioINSize = 0;
	globe_variable.ioINCount = 0;
	globe_variable.ioOUTSize = 0;
	globe_variable.ioOUTCount = 0;

	ISP1581_Initiate();
}

void suspend_change(void)
{
//	ISP1581_GoSuspend();
	return;
}

void ML_ClearBufferEP0(void)
{
}

void ML_Reserved(void)
{
	ISP1581_ClearBuffer(EPINDEX4CONTROL_OUT);
}

void Sample_INT(void)
{
	Hal4Sys_ControlISP1581Interrupt(TRUE);
	Hal4Sys_ControlISP1581Interrupt(FALSE);
}
void Device_Initiate(void)
{
	disconnect_USB();
	Hal4Sys_ControlISP1581Interrupt(FALSE);
	bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
	bISP1581flags.bits.dbg =0;
	bISP1581flags.bits.verbose =0;
	bISP1581flags.bits.ConnectSpeed = FullSpeed;
	bISP1581flags.bits.Vendor_CMD = BULKIN_Idle;
	bISP1581flags.bits.testmode = 0;
	bISP1581flags.bits.testmodeen = 0;
	bISP1581flags.bits.dma_state = DMA_IDLE;
	bISP1581flags.bits.FREE_DMA_CHANNEL	= 0;
	bISP1581flags.bits.CONTROL_HANDLE_DONE = 0;
	bISP1581flags.bits.ISO_CONFIG = 0;
//	ISP1581_SetDMAInt(0xffff);//c);
	ISP1581_IntClearl(0xffff);
	ISP1581_IntClearh(0xffff);
	ioRequest.bAddressH = 0;
	ioRequest.uAddressL = 0;
	ioRequest.uSize = 0;
	globe_variable.ioINSize = 0;
	globe_variable.ioINCount = 0;
	globe_variable.ioOUTSize = 0;
	globe_variable.ioOUTCount = 0;
	globe_variable.isoINSize = 0;
	globe_variable.isoINCount = 0;
	globe_variable.isoOUTSize = 0;
	globe_variable.isoOUTCount = 0;
	Initialize();

	cprintf("\r\nISP1581 Evaluation Kit Firmware REV 1.00 \r\n");
	ISP1581_ReadChipID();
	cprintf("Philips Electronics Singapore PTE LTD - APIC");
	cprintf("\r\nhttp://www.semiconductors.philips.com/buses/usb/\r\nEmail: wired.support@philips.com");
	cprintf("\r\n");

	/* Power on reset, lightup LEDs for 1 sec,
	   disconnect and reconnect Soft-Connect */
	cprintf("Re-connect ISP1581 demo board.\r\n");

/*	Hal4Sys_ControlISP1581Interrupt(FALSE);
	cprintf("\r\nTest Mode Packet\r\n");
	ISP1581_SetTestMode(testmode_prbs|testmode_forcehs);
	key2go();
*/
	outportb(0x20,0x20);
	connect_USB();
	return;
}

void Reconnect(void)
{
	Hal4Sys_ControlISP1581Interrupt(FALSE);
	bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
	bISP1581flags.bits.dbg =0;
	bISP1581flags.bits.verbose =0;
	bISP1581flags.bits.ConnectSpeed = FullSpeed;
	bISP1581flags.bits.Vendor_CMD = BULKIN_Idle;
	bISP1581flags.bits.testmode = 0;
	bISP1581flags.bits.testmodeen = 0;
	bISP1581flags.bits.dma_state = DMA_IDLE;
	bISP1581flags.bits.CONTROL_HANDLE_DONE = 0;
	bISP1581flags.bits.FREE_DMA_CHANNEL	= 0;
	bISP1581flags.bits.ISO_CONFIG = 0;
//	ISP1581_SetDMAInt(0xffff);//c);
	ISP1581_IntClearl(0xffff);
	ISP1581_IntClearh(0xffff);
	ioRequest.bAddressH = 0;
	ioRequest.uAddressL = 0;
	ioRequest.uSize = 0;
	globe_variable.ioINSize = 0;
	globe_variable.ioINCount = 0;
	globe_variable.ioOUTSize = 0;
	globe_variable.ioOUTCount = 0;
	globe_variable.isoINSize = 0;
	globe_variable.isoINCount = 0;
	globe_variable.isoOUTSize = 0;
	globe_variable.isoOUTCount = 0;
	outportb(0x20,0x20);
	connect_USB();
	return;

}

⌨️ 快捷键说明

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