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

📄 verify.c

📁 飞利浦公司usb2.0芯片isp1581的通用驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		{
			ISP1581_WriteBulkEndpoint(bulkinendpointindex, fp, globe_variable.ioINSize);
			globe_variable.ioINCount += globe_variable.ioINSize;
		}
*/
	bISP1581flags.bits.Vendor_CMD = BULKIN_Set;
	}
	else
	{
		cprintf("bulk out ");
		globe_variable.ioOUTSize = ioRequest.uSize;
		globe_variable.ioOUTCount = 0;
		seg = (ioBuffer + globe_variable.ioOUTCount)>>4;
//		off = (ioBuffer + globe_variable.ioOUTCount)&0xf;
//		fp = MK_FP(seg, off);
	}
	cprintf("%5u Bytes", ioRequest.uSize);
}

void Config_DMA(void)
{
	unsigned int c;
	unsigned short dmacfg_width = 0, dmacfg_counter = 0; // 16 bit when assign dmacfg_width16 to it, else 8 bit;
	unsigned short isa_dma_more = 0; // when this is not 0, EXT EOT does not come;
#ifdef debug
	debug_out(debug_code_configdma);
#endif
	RaiseIRQL();
	bISP1581flags.bits.dma_state = DMA_RUNNING;
#ifdef debug1
	cprintf("dma_state DMA %x ",bISP1581flags.bits.dma_state);
#endif
	LowerIRQL();
	dmacfg_width = dmacfg_width16;
//	dmacfg_width = dmacfg_width8;
//	dmacfg_dmacounter = dmacfg_disablecounter;
	ISP1581_SetDMACMD(dmacmd_reset);

	isa_dma_more = 10;
	globe_variable.xfer_dir = (unsigned short)(ioRequest.bCommand & 0x1);
	globe_variable.scantransfer_length_odd = ioRequest.uSize & 0x1; // record dma_counter preset value;
	if(globe_variable.xfer_dir){// IN
		globe_variable.isp1581_dma_counterset_lowbyte = ioRequest.uSize; //exact number, else, clear ep feature;
//		dmacfg_counter = dmacfg_disablecounter;
		dmacfg_counter &= ~dmacfg_disablecounter;
	}
	else{
		globe_variable.isp1581_dma_counterset_lowbyte = ioRequest.uSize ; // adjust value, stop by short packet;
//		dmacfg_counter = dmacfg_disablecounter;
		dmacfg_counter &= ~dmacfg_disablecounter;
	}

	if(globe_variable.xfer_dir && globe_variable.scantransfer_length_odd && dmacfg_width){
		//IN and bus width = 16
		//and transfer length is odd, EXT_EOT at last strobe add 1 more byte, increase isa counter to avoid;
			isa_dma_more++;
	}

	if (dmacfg_width) // 16 bit;
		globe_variable.isa_dma_counterset = ((ioRequest.uSize - 1)>>1) + isa_dma_more;//DMA control, 0 = 1 Xfer
	else	// 8 bit;
		globe_variable.isa_dma_counterset = (ioRequest.uSize -1) + isa_dma_more;

		ISP1581_SetDMACounterLow(globe_variable.isp1581_dma_counterset_lowbyte);
		ISP1581_SetDMACounterHigh(0x00);		// no longer than 64k bytes each transfer;

		dma_start(&ioRequest);  // dma control configuration;
		ISP1581_SetDMAHDCfg(dmahd_dreqpolh/*|dmahd_dackpolh*/|dmahd_eotpolh/*|dmahd_readpolh|dmahd_writepolh|dmahd_endianbig*/);
#ifdef dma_on_local
#ifdef debug
//			cprintf(" dma_on_local verify reset");
#endif
		Local_dma_cfg(dma_ctl_rst);
#endif

		if(globe_variable.xfer_dir){
#ifdef debug
			textattr(0x05);
			cprintf("\n\rDMA IN  ");
#else
			cprintf("DMA IN   ");
#endif
		}
		else{
#ifdef debug
			textattr(0x06);
			cprintf("\n\rDMA OUT ");
#else
			cprintf("DMA OUT  ");
#endif
			Test_all_burst_mode();
		}
#ifdef debug
			textattr(0x07);	cprintf("CMD %4u ISA %4u, 1581 %4u ", ioRequest.uSize, globe_variable.isa_dma_counterset, globe_variable.isp1581_dma_counterset_lowbyte);//token, DMA start at %lx of %u bytes.\r\n", buf_phy_addr, pio->uSize);
			textattr(0x07); cprintf("DMA BURST"); textattr(0x03); cprintf(" %x, ", (globe_variable.burst_mode >> 4)); textattr(0x07);
#else
			cprintf("%5u Bytes ", ioRequest.uSize);
#endif

		// stop dma on isa board for dma reset testing;
// For CPLD DMA config

#ifdef dma_on_local
#ifdef debug
//			cprintf(" dma_on_local ");
#endif
/*		if(globe_variable.xfer_dir)	{
			Local_dma_cfg(dma_ctl_in);
		}
		globe_variable.burst_mode = dmacfg_burst0;
*/
#endif;

		ISP1581_SetDMACounterLow(globe_variable.isp1581_dma_counterset_lowbyte);
		ISP1581_SetDMACounterHigh(0x00);		// no longer than 64k bytes each transfer;

		ISP1581_SetDMAConfig(0x00
							|globe_variable.burst_mode//dmacfg_burst2
							|dmacfg_modediorw
//							|dmacfg_modedack
//							|dmacfg_modediorack
							|dmacfg_width//dmacfg_width16
							|dmacfg_counter
							);
		ISP1581_SetDMAIntMask(dmaint_oddint|dmaint_extereot|dmaint_intereot|dmaint_xferok);

		if(globe_variable.xfer_dir)
		{//IN
//			ISP1581_SetDMACounterLow(dma_counter);
//			ISP1581_SetDMACounterHigh(0x00);		// no longer than 64k bytes each transfer;
// clear buffer for dma reset testing;
//			ISP1581_SetDMACMD(dmacmd_clearbuffer);
//			ISP1581_SetDMACMD(dmacmd_clearbuffer);
			ISP1581_SetDMAEP(bulkinendpointindex);
			bISP1581flags.bits.dma_endpoint = bulkinendpointindex;
			c = ISP1581_GetIntEnableLow();
			ISP1581_SetIntEnableLow(c&(~bulkinendpointinterrupt));
#ifdef dma_on_local
#ifdef debug
//			cprintf(" dma_on_local enable dma in");
#endif
			Local_dma_cfg(dma_ctl_in|dma_ctl_en|dma_ctl_start);
#endif
			ISP1581_SetDMACMD(dmacmd_gdmaread);
		}
		else
		{// out
			ISP1581_SetDMAEP(bulkoutendpointindex);
			bISP1581flags.bits.dma_endpoint = bulkoutendpointindex;
			c = ISP1581_GetIntEnableLow();
			ISP1581_SetIntEnableLow(c&(~bulkoutendpointinterrupt));
#ifdef dma_on_local
#ifdef debug
//			cprintf(" dma_on_local enable dma out");
#endif
			Local_dma_cfg(dma_ctl_en|dma_ctl_start);
#endif
			ISP1581_SetDMACMD(dmacmd_gdmawrite);
		}
		
//		ioRequest.uSize += 64;
//		dma_start(&ioRequest);  // dma control configuration;

#ifdef debug
//		cprintf("setup_dma: ISP1581_GetIntEnableLow =%lx\r\n", ISP1581_GetIntEnableLow());
#endif
}

void get_twin_configuration(void)
{
	unsigned int len;
	if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_INDEX)
	{
		if(ControlData.DeviceRequest.wLength > TWIN_CURRENT_FILE_INDEX_LENGTH)
			len = TWIN_CURRENT_FILE_INDEX_LENGTH;
		else
			len = ControlData.DeviceRequest.wLength;

		Chap9_SingleTransmitEP0(&twin_config.bFileIndex, len);
	}
	else if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_SIZE)
	{
		if(ControlData.DeviceRequest.wLength > TWIN_CURRENT_FILE_SIZE_LENGTH)
			len = TWIN_CURRENT_FILE_SIZE_LENGTH;
		else
			len = ControlData.DeviceRequest.wLength;

		Chap9_SingleTransmitEP0(&twin_config.bFileSizeLL, len);
	}
	else
	{
			Chap9_StallEP0();
			key2go();
			printf("stall: unknow set twin configuration");
			return;
	}
}

void set_twin_configuration(void)
{
	if(ControlData.DeviceRequest.wValue == TWIN_CLEAR_CURRENT_FILE)
	{
		twin_config.bFileIndex = 0;
		twin_config.bFileSizeLL = 0;
		twin_config.bFileSizeLH = 0;
		twin_config.bFileSizeHL = 0;
		twin_config.bFileSizeHH = 0;
	}
	else if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_INDEX)
	{
		twin_config.bFileIndex = *ControlData.dataBuffer;
	}
	else if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_SIZE)
	{
		twin_config.bFileSizeLL = *ControlData.dataBuffer;
		twin_config.bFileSizeLH = *(ControlData.dataBuffer+1);
		twin_config.bFileSizeHL = *(ControlData.dataBuffer+2);
		twin_config.bFileSizeHH = *(ControlData.dataBuffer+3);
	}
	else
	{
			Chap9_StallEP0();
			key2go();
			printf("stall: unknow set twin configuration");
			return;
	}

	bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLOUTDONE;
#ifdef debug
	cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
	return;
}

void Test_all_burst_mode(void)
{
		if(globe_variable.burst_mode == dmacfg_burst0)
		{
			globe_variable.burst_mode = dmacfg_burst1;
		}
		else if(globe_variable.burst_mode == dmacfg_burst1)
		{
			globe_variable.burst_mode = dmacfg_burst2;
		}
		else if(globe_variable.burst_mode == dmacfg_burst2)
		{
			globe_variable.burst_mode = dmacfg_burst4;
		}
		else if(globe_variable.burst_mode == dmacfg_burst4)
		{
			globe_variable.burst_mode = dmacfg_burst8;
		}
		else if(globe_variable.burst_mode == dmacfg_burst8)
		{
			globe_variable.burst_mode = dmacfg_burst12;
		}
		else if(globe_variable.burst_mode == dmacfg_burst12)
		{
			globe_variable.burst_mode = dmacfg_burst16;
		}
		else if(globe_variable.burst_mode == dmacfg_burst16)
		{
			globe_variable.burst_mode = dmacfg_burst32;
		}
		else if(globe_variable.burst_mode == dmacfg_burst32)
		{
			globe_variable.burst_mode = dmacfg_burst0;
		}
		else
		{
			globe_variable.burst_mode = dmacfg_burst0;
		}

		globe_variable.burst_mode = dmacfg_burst0;
#ifdef debug
		debug_out(( globe_variable.burst_mode >> 4) | 0x1000);
#endif
		return;
}

void Local_dma_cfg(unsigned int dma_ctl_settings)
{
	outport(dmaport, dma_ctl_settings);
	return;
}


void transfer_error_handler(void)
{
	unsigned char type_loop, type_code;

		RaiseIRQL();
		type_code = *(ControlData.dataBuffer+4);
		type_loop = *(ControlData.dataBuffer+5);

		Local_dma_cfg(dma_ctl_rst);
		if (type_code == 0)
		{
			if(type_loop == 2) // stop transfer loop
			{
				Local_dma_cfg(dma_ctl_rst);
				ISP1581_SetDMACMD(dmacmd_reset);
				Local_dma_cfg(dma_ctl_rst);
				ISP1581_SetDMAEP(EPINDEX4EP02OUT);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
				ISP1581_SetDMAEP(EPINDEX4EP02IN);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
#ifdef debug
				cprintf("Bulk loop stop %x %x %x %x %x %x", *(ControlData.dataBuffer), *(ControlData.dataBuffer+1), *(ControlData.dataBuffer+2), *(ControlData.dataBuffer+3), *(ControlData.dataBuffer+4), *(ControlData.dataBuffer+5));
#else
				cprintf(" Stop Bulk Loop");
#endif
			}
			else if(type_loop == 1)
			{
				ISP1581_SetDMAEP(EPINDEX4EP03OUT);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
				ISP1581_SetDMAEP(EPINDEX4EP03IN);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
				ISP1581_SetDMACMD(dmacmd_clearbuffer);
#ifdef debug
				cprintf("ISO loop stop %x %x %x %x %x %x", *(ControlData.dataBuffer), *(ControlData.dataBuffer+1), *(ControlData.dataBuffer+2), *(ControlData.dataBuffer+3), *(ControlData.dataBuffer+4), *(ControlData.dataBuffer+5));
#else
				cprintf(" Stop ISO loop");
#endif
			}
//			else{} // no use;
			bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLOUTDONE;
		}
		else// if(type_code == 1) // error in data transfer
		{
			Chap9_StallEP0();
#ifdef debug
			key2go();
			cprintf("Stall: unsupported vendor command data %x %x %x %x %x %x", *(ControlData.dataBuffer), *(ControlData.dataBuffer+1), *(ControlData.dataBuffer+2), *(ControlData.dataBuffer+3), *(ControlData.dataBuffer+4), *(ControlData.dataBuffer+5));
#endif			
		}
#ifdef debug
		cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
		LowerIRQL();
		return;
}

⌨️ 快捷键说明

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