📄 dongle.c
字号:
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
dongle.c
Revision History:
26th May 1999 Released
*/
//#define OUTMSG
#define DPRINT
#include <stdio.h>
#include <stdlib.h>
#ifndef UNDER_CE
#include <time.h>
#include <dos.h>
#endif // !UNDER_CE
#include "newdong.h"
#ifdef NDIS40_MINIPORT
#include "nsc.h"
#else
extern void NSC_WriteBankReg(UINT ComPort, const iBank, int iRegNum, UCHAR iVal);
extern UCHAR NSC_ReadBankReg(UINT ComPort,const iBank, int iRegNum);
#endif
#include "settings.h"
UIR uir;
DongleParam Dingle[2];
//////////////////////////////////////////////////////////////////////////
// //
// Function prototypes //
//////////////////////////////////////////////////////////////////////////
DongleParam *GetDongleCapabilities(UIR Com);
int SetDongleCapabilities(UIR Com);
void delay(unsigned int period); // a delay loop
UINT DoPlugPlayDongle(UINT UirPort);
// Called from SetDongleCapabilities
int SetReqMode(UIR Com);
void SetHpDongle(UINT UirPort,int Mode);
void SetTemicDongle(UINT UirPort,int Mode);
void SetSharpDongle(UINT UirPort,int Mode);
void SetDellDongle(UINT UirPort,int Mode);
void SetHpMuxDongle(UINT UirPort, int Mode);
// Pauses for a specified number of microseconds.
#ifndef UNDER_CE
void Sleep( clock_t wait );
#endif // !UNDER_CE
void PrintDongleParam(DongleParam *Dongle);
//////////////////////////////////////////////////////////////////////////
// //
// Function: GetDongleCapabilities //
// //
// Description: //
// //
// This routine fill up the DongleParam structure interpreting the //
// dongle oem's code and returns a pointer the structure. //
// //
// Input : UIR structure with XcvrNumber ,Com Port and IR mode //
// offset //
// OutPut : DongleParam Structure //
// //
//////////////////////////////////////////////////////////////////////////
DongleParam *GetDongleCapabilities(UIR Com)
{
UINT Signature;
DEBUGMSG(ZONE_FIRMODE, (TEXT("GetDongleCapabilities -->\r\n")));
// Check for validity of the Com port address
if (Com.ComPort == 0) return (NULL);
// Com.XcvrNum only has either 0 or 1 co
// Check for validity of the Port Number address
if (Com.XcvrNum > 1) return (NULL);
// Check for first time
if (Dingle[Com.XcvrNum].WORD0.bits.DSVFLAG)
return (&Dingle[Com.XcvrNum]);
// Signature is a word long ID information
// bit 15 = 1 -- Plug and Play
// bit 0, 1, 2, 3 -- ID number for different Manufactures
Signature = Com.Signature;
Dingle[Com.XcvrNum].PlugPlay = 0;
Dingle[Com.XcvrNum].WORD0.bits.GCERR = TRUE;
if (GetBit(Com.Signature,15)) {
// Make the Pins IRSL1-2 as Inputs
// bit 3 (ID/IRSL(2-1) pin) = 0 means Pins direction is Input
NSC_WriteBankReg(Com.ComPort,BANK7,7,0x00);
// Check whether Disconnect
// ID/IRSL(2-1) as Input upon READ bit 0-3 return the logic
// level of the pins(allowing external devices to identify
// themselves.)
if ((NSC_ReadBankReg(Com.ComPort,BANK7,4) & 0xf) == 0xf) {
Dingle[Com.XcvrNum].WORD0.bits.GCERR = XCVR_DISCONNECT;
Dingle[Com.XcvrNum].WORD0.bits.DSVFLAG = 1;
return (&Dingle[Com.XcvrNum]);
}
#ifdef DPRINT
printf(" Plug and Play Dongle\n");
#endif
Signature = DoPlugPlayDongle(Com.ComPort);
Dingle[Com.XcvrNum].PlugPlay = 1;
#ifdef DPRINT
printf(" Sig %x\n",Signature);
#endif
Dingle[Com.XcvrNum].WORD0.bits.GCERR = TRUE;
}
// Identify the dongle OEM
switch (Signature & 0xf) {
case 0:
#ifdef DPRINT
printf(" Reserved ");
#endif
return (NULL);
break;
case 1:
#ifdef DPRINT
printf(" Rohm");
#endif
return (NULL);
break;
case 2:
case 3:
case 10:
case 11:
#ifdef DPRINT
printf(" Intelligent Adapter");
#endif
Dingle[Com.XcvrNum].WORD0.bits.IADP = 1;
return (NULL);
break;
case 4:
#ifdef DPRINT
printf(" Sharp , Linear Technology Module");
#endif
Dingle[Com.XcvrNum].WORD0.bits.GCERR = TRUE;
Dingle[Com.XcvrNum].WORD0.bits.DSVFLAG = 1;
Dingle[Com.XcvrNum].WORD0.bits.TrcvrCode = SHARP;
Dingle[Com.XcvrNum].WORD4.Data = TemicRecovery;
Dingle[Com.XcvrNum].WORD6.Data = TemicBofs;
Dingle[Com.XcvrNum].WORD7.bits.FIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.MIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.SIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.Sharp_IR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrHiSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrMedSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrLowSpeed = TRUE;
break;
case 5:
#ifdef DPRINT
printf(" Irvine Sensors ");
#endif
return (NULL);
break;
case 6:
#ifdef DPRINT
printf(" Reserved ");
#endif
return (NULL);
break;
case 7:
#ifdef DPRINT
printf(" CIR Only");
#endif
return (NULL);
break;
case 0x8:
// HP HSDL-2300
Dingle[Com.XcvrNum].WORD0.bits.DSVFLAG = 1;
Dingle[Com.XcvrNum].WORD0.bits.TrcvrCode = HPMUX;
Dingle[Com.XcvrNum].WORD6.Data = HpBofs;
Dingle[Com.XcvrNum].WORD4.Data = HpRecovery;
Dingle[Com.XcvrNum].WORD7.bits.FIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.MIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.SIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.Sharp_IR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrHiSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrMedSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrLowSpeed = TRUE;
break;
case 0x9:
// IBM 31T1100 or TEMIC TFDS-6000
#ifdef DPRINT
printf(" TEMIC");
#endif
Dingle[Com.XcvrNum].WORD0.bits.GCERR = TRUE;
Dingle[Com.XcvrNum].WORD0.bits.DSVFLAG = 1;
Dingle[Com.XcvrNum].WORD0.bits.TrcvrCode = TEMIC;
Dingle[Com.XcvrNum].WORD4.Data = TemicRecovery;
Dingle[Com.XcvrNum].WORD6.Data = TemicBofs;
Dingle[Com.XcvrNum].WORD7.bits.FIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.MIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.SIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.Sharp_IR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrHiSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrMedSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrLowSpeed = TRUE;
break;
case 0xc:
case 0xd:
#ifdef DPRINT
printf(" HP ");
#endif
Dingle[Com.XcvrNum].WORD0.bits.DSVFLAG = 1;
Dingle[Com.XcvrNum].WORD0.bits.TrcvrCode = HP;
Dingle[Com.XcvrNum].WORD6.Data = HpBofs;
Dingle[Com.XcvrNum].WORD4.Data = HpRecovery;
Dingle[Com.XcvrNum].WORD7.bits.FIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.MIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.SIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.Sharp_IR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrHiSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrMedSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrLowSpeed = TRUE;
break;
case 0xe:
#ifdef DPRINT
printf(" SIR Only");
#endif
Dingle[Com.XcvrNum].WORD0.bits.GCERR = TRUE;
Dingle[Com.XcvrNum].WORD0.bits.DSVFLAG = 1;
Dingle[Com.XcvrNum].WORD0.bits.TrcvrCode = DELL;
Dingle[Com.XcvrNum].WORD4.Data = TemicRecovery;
Dingle[Com.XcvrNum].WORD6.Data = TemicBofs;
Dingle[Com.XcvrNum].WORD7.bits.FIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.MIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.SIR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.Sharp_IR = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrHiSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrMedSpeed = TRUE;
Dingle[Com.XcvrNum].WORD7.bits.CirOvrLowSpeed = TRUE;
break;
case 0xf:
break;
default:
#ifdef DPRINT
printf(" Default 0");
#endif
break;
}
// Look for CIR support
//
if (GetBit(Signature,5))
Dingle[Com.XcvrNum].WORD8.bits.Cir36k = 1;
if (GetBit(Signature,6))
Dingle[Com.XcvrNum].WORD8.bits.Cir40k = 1;
if (GetBit(Signature,7)) {
Dingle[Com.XcvrNum].WORD8.bits.Cir38k = 1;
#ifdef DPRINT
printf(" 38K \n");
#endif
}
if (GetBit(Signature,9))
Dingle[Com.XcvrNum].WORD9.bits.Cir57k = 1;
Dingle[Com.XcvrNum].WORD0.bits.GCERR = TRUE;
DEBUGMSG(ZONE_FIRMODE, (TEXT("GetDongleCapabilities <--\r\n")));
// Everything O.K return the structure
return (&Dingle[Com.XcvrNum]);
}
//////////////////////////////////////////////////////////////////////////
// //
// Function: SetDongleCapabilities //
// //
// Description: //
// //
// Input : UIR structure with XcvrNumber ,Com Port and IR mode offset //
// Result : If successfull will set the dongle to the appropriate mode. //
// Returns TRUE for success and error codes defined in dongle.h//
// UNSUPPORTED 2 //
// ERROR_GETCAPAB 7 //
// //
//////////////////////////////////////////////////////////////////////////
int SetDongleCapabilities(UIR Com)
{
DongleParam *Dongle;
DEBUGMSG(ZONE_FIRMODE, (TEXT("SetDongleCapabilities <--\r\n")));
Dongle = GetDongleCapabilities(Com);
// Check whether Dongle is NULL
if (Dongle == NULL) {
#ifdef DPRINT
printf(" Returning ERROR");
#endif
return (ERROR_GETCAPAB);
}
if (Dingle[Com.XcvrNum].WORD0.bits.GCERR != TRUE)
return (ERROR_GETCAPAB);
DEBUGMSG(ZONE_FIRMODE, (TEXT("SetDongleCapabilities <--\r\n")));
return (SetReqMode(Com));
}
//////////////////////////////////////////////////////////////////////////
// //
// Function: SetRegMode //
// //
// Description: //
// //
// Input : Structure Com with ComPort, ModeReq and XcvrNum set. //
// OutPut : True if successfull //
// UNIMPLEMENTED if so //
// //
// //
//////////////////////////////////////////////////////////////////////////
int SetReqMode(UIR Com)
{
DEBUGMSG(ZONE_FIRMODE, (TEXT("SetRegMode -->\r\n")));
#ifdef DPRINT
printf("ModeReq %d ",Com.ModeReq);
#endif
if (Dingle[Com.XcvrNum].WORD0.bits.IADP)
return (UNSUPPORTED);
/*
if (Dingle[Com.XcvrNum].WORD0.bits.TrcvrCode == HP)
// Make the Pins IRSL1-2 as output
NSC_WriteBankReg(Com.ComPort,BANK7,7,0x08);
else
// Make the Pins IRSL0-2 as output
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -