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

📄 isp1581.c

📁 飞利浦公司usb2.0芯片isp1581的通用驱动代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
	return i;
}

void ISP1581_SetDMACounterLow(USHORT wDMACounter)
{
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_dmacount);
	outport(dport, wDMACounter);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
}

void ISP1581_SetDMACounterHigh(USHORT wDMACounter)
{
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_dmacount + 0x2);
	outport(dport, wDMACounter);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
}

USHORT ISP1581_GetDMACounterLow(void)
{
	USHORT i;
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_dmacount);
	i = inport(dport);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
	return i;
}

USHORT ISP1581_GetDMACounterHigh(void)
{
	USHORT i;
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_dmacount + 0x2);
	i = inport(dport);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
	return i;
}

USHORT ISP1581_GetDataFromChipRam(void)
{
	USHORT i;
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_scratch);
	i = inport(dport);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
	return i;
}

void ISP1581_SetDataToChipRam(USHORT wData)
{
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_scratch);
	outport(dport, wData);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
}

USHORT ISP1581_ReadCurrentFrameNumber(void)
{
	USHORT i;

	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_framenumber);
	i = inport(dport);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();

	return i;
}

void ISP1581_UnlockDevice(void)
{
	USHORT c;
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_unlock);
	outport(dport, 0xaa37);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
}

unsigned short ISP1581_ReadChipID(void)
{
	unsigned short i,j, k;

	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	outport(aport, rega_chipid);
	i = inport(dport);
	outport(aport, rega_chipid);
	i = inport(dport);
	outport(aport, rega_chipid+2);
	j = inport(dport);
	k = i>>8;
	i &= 0x00ff;
	cprintf("ISP1581 CHIP ID / REV  %x%x / %x\r\n",j,k,i);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();

	return i;
}

UCHAR ISP1581_GetEndpointConfig(UCHAR bEPIndex)
{
	UCHAR   c;
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	ISP1581_SetEPIndex(bEPIndex);

	outport(aport, rega_eptype);
	c = (unsigned char)inport(dport);

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();

	return c;
}

void ISP1581_SetEndpointConfig(UCHAR bEPIndex, UCHAR bEPConfig)
{
	if(bISP1581flags.bits.At_IRQL1 == 0)
		RaiseIRQL();

	ISP1581_SetEPIndex(bEPIndex);

	outport(aport, rega_eptype);
	outport(dport, ((unsigned short)bEPConfig | 0xff00));

	if(bISP1581flags.bits.At_IRQL1 == 0)
		LowerIRQL();
}

/*
//*************************************************************************
// Subroutines -- 3
//*************************************************************************
*/
void ISP1581_UnconfigDevice(void)
{
}

void ISP1581_ConfigDevice(void)
{
}

void ISP1581_RegAccess(void)
{
	USHORT   c;
	USHORT  i,j;

//      ISP1581_ResetDevice();

	cprintf("Reseting\r\n");

//	i = ISP1581_ReadChipID();
//	cprintf("1581 ChipId = %lx \r\n ", i);
	i = ISP1581_GetDataFromChipRam();
	cprintf("1581 Chip RAM = %hx\r\n",i);

	if(i == 0)
		cprintf("Verify Scratch register, write =%hx, ", (i=0xaa55));
	else
		cprintf("Verify Scratch register, write =%hx, ", (i=~i));
	ISP1581_SetDataToChipRam(i);
	i = ISP1581_GetDataFromChipRam();
	cprintf("Read =%hx\r\n",i);

	i = (USHORT)ISP1581_GetIntConfig();
	cprintf("ISP1581_GetIntConfig = %lx\r\n",i);

	i = ISP1581_GetIntEnableLow();
	j = ISP1581_GetIntEnableHigh();
	cprintf("ISP1581_GetIntEnable = %2x%2x\r\n",j,i);

	i = ISP1581_ReadInterruptRegisterLow();
	j = ISP1581_ReadInterruptRegisterHigh();
	cprintf("ISP1581_ReadInterruptRegister = %2x%2x\r\n",j,i);

	i = ISP1581_GetDMAConfig();
	cprintf("ISP1581_GetDMAConfig = %hx\r\n",i);

	i = ISP1581_GetDMACounterLow();
	j = ISP1581_GetDMACounterHigh();
	cprintf("ISP1581_GetDMACounter = %hx%hx\r\n",j,i);

	i = ISP1581_ReadCurrentFrameNumber();
	cprintf("ISP1581_ReadCurrentFrameNumber = %hx\r\n",i);

	c = ISP1581_GetMode();
	cprintf("ISP1581_GetMode = %x\r\n",c);

	c = ISP1581_GetAddress();
	cprintf("ISP1581_GetAddress = %x\r\n",c);
}

void ISP1581_StallEP0InControlWrite(void)
{
	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_IN, epctlfc_stall);
	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_OUT, epctlfc_stall);
}

void ISP1581_StallEP0InControlRead(void)
{
	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_OUT, epctlfc_stall);
	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_IN, epctlfc_stall);
}

void ISP1581_SetEPMAXSize(unsigned char bEPIndex, unsigned short epmaxsize)
{
	ISP1581_SetEPIndex(bEPIndex);
	outport(aport, rega_epmaxsize);
	outport(dport, epmaxsize);
}

unsigned short ISP1581_GetEPMAXSize(unsigned char bEPIndex)
{
	ISP1581_SetEPIndex(bEPIndex);
	outport(aport, rega_epmaxsize);
	return inport(dport);
}

void ISP1581_SetDCount(unsigned short dcount)
{
	outport(aport, rega_dcount);
	outport(dport, dcount);
}

unsigned short ISP1581_GetDCount(void)
{
	outport(aport, rega_dcount);
	return inport(dport);
}

USHORT ISP1581_GetDMAStrobeTiming(void)
{
	outport(aport, rega_dmast);
	return inport(dport);
}

USHORT ISP1581_GetDMAInt(void)
{
	outport(aport, rega_dmaint);
	return inport(dport);
}

void ISP1581_SetDMAInt(USHORT dma_int)
{
	outport(aport, rega_dmaint);
	outport(dport, dma_int);
}

void ISP1581_SetDMAIntMask(unsigned short dmaintmask)
{
	outport(aport, rega_dmaintmask);
	outport(dport, dmaintmask);
}

unsigned short ISP1581_GetDMAIntMask(void)
{
	outport(aport, rega_dmaintmask);
	return inport(dport);
}

void ISP1581_SetDMAEP(unsigned char dmaep)
{
	outport(aport, rega_dmaep);
	outport(dport, ((unsigned short)dmaep | 0xff00));
}

unsigned char ISP1581_GetDMAEP(void)
{
	outport(aport, rega_dmaep);
	return (unsigned char)inport(dport);
}

void ISP1581_SetTestMode(unsigned char testmode)
{
	outport(aport, rega_testmode);
	outport(dport, ((unsigned short)testmode | 0xff00));
}

unsigned char ISP1581_GetTestMode(void)
{
	outport(aport, rega_testmode);
	return (unsigned char)inport(dport);
}

void ISP1581_ControlWriteHandshake(void)
{
//	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_IN, epctlfc_status);
// stall control endpoint when there is more data out, 16/03/01 khoo kah sing
	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_OUT, epctlfc_status|epctlfc_stall);
}

void ISP1581_ControlReadHandshake(void)
{
//	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_OUT, epctlfc_status);
// stall control endpoint when there is more data out, 16/03/01 khoo kah sing
	ISP1581_SetEndpointStatus(EPINDEX4CONTROL_IN, epctlfc_status|epctlfc_stall);
}

void ISP1581_SetDMACMD(unsigned bCMD)
{
	outport(aport, rega_dmacmd);
	outport(dport, bCMD);
}

USHORT ISP1581_GetDMAState(void)
{
	outport(aport, rega_dmastate);
	return inport(dport);
}

void ISP1581_SetTaskFile(USHORT taskfile, UCHAR taskfile_value)
{
	unsigned char i;
	unsigned short j;
	if(taskfile == 0x1f0)
	{
		outport(aport, rega_task1f0);
		outport(dport, ((unsigned short)taskfile_value |  0xff00));
	}
	if(taskfile == 0x1f1)
	{
		j = ISP1581_GetTaskFile(0x1f2) & 0xff00;
		outport(aport, rega_task1f1);
		outport(dport, ((unsigned short)taskfile_value |  j));
	}
	if(taskfile == 0x1f2)
	{
		j = ISP1581_GetTaskFile(0x1f2) & 0x00ff;
		outport(aport, rega_task1f1);
		outport(dport, (((unsigned short)taskfile_value << 8) |  j));
	}
	if(taskfile == 0x1f3)
	{
		j = ISP1581_GetTaskFile(0x1f3) & 0xff00;
		outport(aport, rega_task1f3);
		outport(dport, ((unsigned short)taskfile_value |  j));
	}
	if(taskfile == 0x1f4)
	{
		j = ISP1581_GetTaskFile(0x1f4) & 0x00ff;
		outport(aport, rega_task1f4);
		outport(dport, (((unsigned short)taskfile_value << 8) |  j));
	}
	if(taskfile == 0x1f5)
	{
		j = ISP1581_GetTaskFile(0x1f5) & 0xff00;
		outport(aport, rega_task1f5);
		outport(dport, ((unsigned short)taskfile_value |  j));
	}
	if(taskfile == 0x1f6)
	{
		j = ISP1581_GetTaskFile(0x1f6) & 0x00ff;
		outport(aport, rega_task1f6);
		outport(dport, (((unsigned short)taskfile_value << 8) |  j));
	}
	if(taskfile == 0x1f7)
	{
		outport(aport, rega_task1f3);
		outport(dport, ((unsigned short)taskfile_value |  0xff00));
	}
	if(taskfile == 0x3f6)
	{
		j = ISP1581_GetTaskFile(0x3f6) & 0xff00;
		outport(aport, rega_task3f6);
		outport(dport, ((unsigned short)taskfile_value |  j));
	}
	if(taskfile == 0x3f7)
	{
		j = ISP1581_GetTaskFile(0x3f7) & 0x00ff;
		outport(aport, rega_task3f7);
		outport(dport, (((unsigned short)taskfile_value << 8) |  j));
	}
	else
	{
		cprintf("WRONG TASKFILE REGISTER");
	}
	return;
}

UCHAR ISP1581_GetTaskFile(USHORT taskfile)
{
	if(taskfile == 0x1f0)
	{
		outport(aport, rega_task1f0);
		return (UCHAR)inport(dport);
	}
	if(taskfile == 0x1f1)
	{
		outport(aport, rega_task1f1);
		return (UCHAR)inport(dport);
	}
	if(taskfile == 0x1f2)
	{
		outport(aport, rega_task1f2);
		return (UCHAR)(inport(dport)>>8);
	}
	if(taskfile == 0x1f3)
	{
		outport(aport, rega_task1f3);
		return (UCHAR)inport(dport);
	}
	if(taskfile == 0x1f4)
	{
		outport(aport, rega_task1f4);
		return (UCHAR)(inport(dport)>>8);
	}
	if(taskfile == 0x1f5)
	{
		outport(aport, rega_task1f5);
		return (UCHAR)inport(dport);
	}
	if(taskfile == 0x1f6)
	{
		outport(aport, rega_task1f6);
		return (UCHAR)(inport(dport)>>8);
	}
	if(taskfile == 0x1f7)
	{
		outport(aport, rega_task1f7);
		return (UCHAR)inport(dport);
	}
	if(taskfile == 0x3f6)
	{
		outport(aport, rega_task3f6);
		return (UCHAR)inport(dport);
	}
	if(taskfile == 0x3f7)
	{
		outport(aport, rega_task3f7);
		return (UCHAR)(inport(dport)>>8);
	}
	else
	{
		cprintf("WRONG TASKFILE REGISTER");
		return 0;
	}
}

void HARDWARE_RESET(void)
{
	unsigned char i=0,j,k;
	cprintf("HARDWARE RESET ISP1581, !@@#%$#@!!@@#$!_^");
	outport(ctlport, 0x0);
	for(i = 0; i <17; i++)
	{
		for(j = 0; j < 255; j++)
		{
			for(k = 0; k < 255; k++)
			{}
		}
		cprintf(".");

		if(i == 14)
			outport(ctlport, ctlportb_hdreset);
	}
	cprintf("RESET OK!\r\n");
}

void interrupt_enable(void)
{
	outport(ctlport, ctlportb_hdreset);
}

⌨️ 快捷键说明

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