📄 isp1581.c
字号:
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 + -