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

📄 stccmd.c

📁 Windows CE 5.0 下的SmartCard驱动。
💻 C
📖 第 1 页 / 共 2 页
字号:
        if( NTStatus == STATUS_SUCCESS )
        {
            SCCtrl=0xD1;    //     vcc, clk, io
            NTStatus = IFWriteSTCRegister( ReaderExtension, ADR_SC_CONTROL, 1, &SCCtrl );
        }
    }
    return( NTStatus );
}


NTSTATUS
STCSetRST(
    PREADER_EXTENSION    ReaderExtension,
    BOOLEAN                On)
/*++
Description:

Arguments:
    ReaderExtension        context of call

Return Value:
    STATUS_SUCCESS
    error values from IFRead / IFWrite

--*/
{
    NTSTATUS    NTStatus = STATUS_SUCCESS;
    UCHAR        SCCtrl;

    NTStatus = IFReadSTCRegister( ReaderExtension, ADR_SC_CONTROL, 1,&SCCtrl );
    if( NTStatus == STATUS_SUCCESS )
    {
        if( On )
        {
            SCCtrl |= 0x20;
        }
        else
        {
            SCCtrl &= ~0x20;
        }

        NTStatus = IFWriteSTCRegister( ReaderExtension, ADR_SC_CONTROL, 1,&SCCtrl );
    }
    return(NTStatus);
}


NTSTATUS
STCConfigureSTC(     
    PREADER_EXTENSION    ReaderExtension,
    PSTC_REGISTER        pConfiguration
    )
{
    NTSTATUS            NTStatus = STATUS_SUCCESS;
    UCHAR                Value;

    do
    {

        if( pConfiguration->Register == ADR_INT_CONTROL )
        {
            // Read interrupt status register to acknoledge wrong states
            NTStatus = IFReadSTCRegister( ReaderExtension,ADR_INT_STATUS,1,&Value );
        }

        Value = (UCHAR)pConfiguration->Value;
        NTStatus = IFWriteSTCRegister(
            ReaderExtension,
            pConfiguration->Register,
            pConfiguration->Size,
            (PUCHAR)&pConfiguration->Value
            );

        // delay to stabilize the oscilator clock:
        if( pConfiguration->Register == ADR_CLOCK_CONTROL )
        {
            SysDelay( 100 );
        }
        pConfiguration++;

    } while(( NTStatus == STATUS_SUCCESS ) && ( pConfiguration->Size ));

    return (NTStatus);    
}


NTSTATUS
STCSetETU(
    PREADER_EXTENSION    ReaderExtension,
    ULONG                NewETU)
/*++
Description:

Arguments:
    ReaderExtension        context of call

Return Value:
    STATUS_SUCCESS
    error values from IFRead / IFWrite

--*/
{
    NTSTATUS    NTStatus = STATUS_DATA_ERROR;
    UCHAR        ETU[2];

    SmartcardDebug( 
        DEBUG_TRACE, 
        (TEXT("%s!STCSetETU   %d\n"),
        DRIVER_NAME,
        NewETU));

    if( NewETU < 0x0FFF )
    {
        NTStatus = IFReadSTCRegister(
            ReaderExtension,
            ADR_ETULENGTH15,
            2,
            ETU);

        if( NTStatus == STATUS_SUCCESS )
        {
            //
            //    save all RFU bits
            //
            ETU[1]    = (UCHAR) NewETU;
            ETU[0]    = (UCHAR)(( ETU[0] & 0xF0 ) | ( NewETU >> 8 ));

            NTStatus = IFWriteSTCRegister(
                ReaderExtension,
                ADR_ETULENGTH15,
                2,
                ETU);
        }
    }
    return(NTStatus);
}

NTSTATUS
STCSetCGT(
    PREADER_EXTENSION    ReaderExtension,
    ULONG                NewCGT)
/*++
Description:

Arguments:
    ReaderExtension        context of call

Return Value:
    STATUS_SUCCESS
    error values from IFRead / IFWrite

--*/

{
    NTSTATUS    NTStatus = STATUS_DATA_ERROR;
    UCHAR        CGT[2];

    SmartcardDebug( 
        DEBUG_TRACE, 
        (TEXT("%s!STCSetCGT   %d\n"),
        DRIVER_NAME,
        NewCGT));
    
    if( NewCGT < 0x01FF )
    {
        NTStatus = IFReadSTCRegister(
            ReaderExtension,
            ADR_CGT8,
            2,
            CGT);

        if( NTStatus == STATUS_SUCCESS )
        {
            //
            //    save all RFU bits
            //
            CGT[1] = ( UCHAR )NewCGT;
            CGT[0] = (UCHAR)(( CGT[0] & 0xFE ) | ( NewCGT >> 8 ));
                
            NTStatus = IFWriteSTCRegister(
                ReaderExtension,
                ADR_CGT8,
                2,
                CGT);
        }
    }
    return(NTStatus);
}

NTSTATUS
STCSetCWT(
    PREADER_EXTENSION    ReaderExtension,
    ULONG                NewCWT)
/*++
Description:

Arguments:
    ReaderExtension        context of call

Return Value:
    STATUS_SUCCESS
    error values from IFRead / IFWrite

--*/
{
    NTSTATUS    NTStatus = STATUS_SUCCESS;
    UCHAR        CWT[4];


    SmartcardDebug( 
        DEBUG_TRACE, 
        (TEXT("%s!STCSetCWT   %d\n"),
        DRIVER_NAME,
        NewCWT));
    //    little endians...
    CWT[0] = (( PUCHAR )&NewCWT )[3];
    CWT[1] = (( PUCHAR )&NewCWT )[2];
    CWT[2] = (( PUCHAR )&NewCWT )[1];
    CWT[3] = (( PUCHAR )&NewCWT )[0];
    
    NTStatus = IFWriteSTCRegister( 
        ReaderExtension, 
        ADR_CWT31, 
        4, 
        CWT );
    return(NTStatus);
}

NTSTATUS
STCSetBWT(
    PREADER_EXTENSION    ReaderExtension,
    ULONG                NewBWT)
/*++
Description:

Arguments:
    ReaderExtension        context of call

Return Value:
    STATUS_SUCCESS
    error values from IFRead / IFWrite

--*/
{
    NTSTATUS     NTStatus = STATUS_SUCCESS;
    UCHAR        BWT[4];

    SmartcardDebug( 
        DEBUG_TRACE, 
        (TEXT("%s!STCSetBWT   %d\n"),
        DRIVER_NAME,
        NewBWT));

    //    little endians...
    BWT[0] = (( PUCHAR )&NewBWT )[3];
    BWT[1] = (( PUCHAR )&NewBWT )[2];
    BWT[2] = (( PUCHAR )&NewBWT )[1];
    BWT[3] = (( PUCHAR )&NewBWT )[0];
    
    NTStatus = IFWriteSTCRegister( 
        ReaderExtension, 
        ADR_BWT31, 
        4, 
        BWT );

    return(NTStatus);
}


NTSTATUS
STCSetFDIV(
    PREADER_EXTENSION    ReaderExtension,
    ULONG                Factor)
/*++
Description:

Arguments:
    ReaderExtension        context of call

Return Value:
    STATUS_SUCCESS
    error values from IFRead / IFWrite

--*/
{
    NTSTATUS    NTStatus = STATUS_SUCCESS;
    UCHAR        DIV;
    
    NTStatus = IFReadSTCRegister( 
        ReaderExtension, 
        ADR_ETULENGTH15, 
        1, 
        &DIV );

    if( NTStatus == STATUS_SUCCESS ) 
    {
        switch( Factor )
        {
            case 1:
                DIV &= ~M_DIV0;
                DIV &= ~M_DIV1;
                break;
            
            case 2:
                DIV |= M_DIV0;
                DIV &= ~M_DIV1;
                break;
            
            case 4    :
                DIV &= ~M_DIV0;
                DIV |= M_DIV1;
                break;
            
            case 8    :
                DIV |= M_DIV0;
                DIV |= M_DIV1;
                break;

            default :
                NTStatus = STATUS_DATA_ERROR;
        }
        if( NTStatus == STATUS_SUCCESS ) 
        {
            NTStatus = IFWriteSTCRegister( 
                ReaderExtension, 
                ADR_ETULENGTH15, 
                1, 
                &DIV );
        }
    }
    return(NTStatus);    
}

NTSTATUS 
STCInitUART(
    PREADER_EXTENSION    ReaderExtension,
    BOOLEAN                AutoLearn)
/*++
Description:

Arguments:
    ReaderExtension        context of call

Return Value:
    STATUS_SUCCESS
    error values from IFRead / IFWrite

--*/
{
    NTSTATUS    NTStatus = STATUS_SUCCESS;
    UCHAR        Value;

    Value = AutoLearn ? 0x6F : 0x66;

    NTStatus = IFWriteSTCRegister( 
        ReaderExtension, 
        ADR_UART_CONTROL, 
        1, 
        &Value );

    return( NTStatus );
}

//---------------------------------------- END OF FILE ----------------------------------------

⌨️ 快捷键说明

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