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

📄 dongle.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
📖 第 1 页 / 共 3 页
字号:
/*

  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 + -