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

📄 ac97.c

📁 pxa270触摸屏驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
        // Assume that the value written to the codec will be accepted without
        //  change.  Record as actual value in mixer register.
        // Divide by two for index because only even registers are used, 
        //  and structures assume that.
        ctxP->mixerRegsCurrVals[targetReg/2] = newValue;
    }
    return (status);

} // Ac97GetAnyMixerRegister ()

*/

// 0x02: LINE_OUT master volume
//       If only 5 bits of attenuation are supported, the codec is required 
//       to truncate any 6-bit attenuation command to its maximum attenuation.
UINT32 Ac97GetMasterVolLeft (Ac97ContextT* ctxP, PUINT8 attenuationP)
{
    UINT32 status ;
    UINT16 masterVolTmp;

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_MASTER_VOLUME, 
                                       &masterVolTmp);
    if (!status)
    {
        *attenuationP  = (masterVolTmp >> AC97_MR_MSTR_VOL_L_SHFT)
                                            & AC97_MR_MSTR_VOL_MSK;
    }
    // Subroutine records enough error info.  Just pass status back.
    return (status);

} // Ac97GetMasterVolLeft ()

UINT32 Ac97GetMasterVolRight (Ac97ContextT* ctxP, PUINT8 attenuationP)
{
    UINT32 status ;
    UINT16 masterVolTmp;

    status = Ac97GetAnyMixerRegister (ctxP, 
                                      AC97_MR_MASTER_VOLUME, 
                                      &masterVolTmp);
    if (!status)
    {
        *attenuationP = (masterVolTmp >> AC97_MR_MSTR_VOL_R_SHFT)
                                            & AC97_MR_MSTR_VOL_MSK;
    }
    // Subroutine records enough error info.  Just pass status back.
    return (status);

} // Ac97GetMasterVolRight ()

UINT32 Ac97GetMasterVolMute (Ac97ContextT* ctxP, BOOL* muteEnableP)
{
  return 0;//zzm mask  return (Ac97GetUsualMute  (ctxP, AC97_MR_MASTER_VOLUME, muteEnableP));

} // Ac97GetMasterVolMute ()

/*  //masked zzm
UINT32 Ac97SetMasterVolLeft (Ac97ContextT* ctxP, UINT8 attenuation)
{
    UINT32 status ;
    UINT16 masterVolTmp ;
    
    // Don't bother range-checking the requested volume levels
    // Get existing setting and change target field

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_MASTER_VOLUME, 
                                       &masterVolTmp);
    if (!status)
    {
        // clear target field and insert new value
        masterVolTmp =   (masterVolTmp & ~ (AC97_MR_MSTR_VOL_MSK
                                                 << AC97_MR_MSTR_VOL_L_SHFT))
                       | ((attenuation  & AC97_MR_MSTR_VOL_MSK)
                                                 << AC97_MR_MSTR_VOL_L_SHFT);
        status = Ac97SetAnyMixerRegister  (ctxP, 
                                           AC97_MR_MASTER_VOLUME, 
                                           masterVolTmp);
    }
    // Subroutine records enough error info.  Just pass status back.
    return (status);

} // Ac97SetMasterVolLeft ()
*/ //masked zzm
/*  masked zzm
UINT32 Ac97SetMasterVolRight (Ac97ContextT* ctxP, UINT8 attenuation)
{
    UINT32 status ;
    UINT16 masterVolTmp ;
    
    // Don't bother range-checking the requested levels
    // Get existing setting and change target field

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_MASTER_VOLUME, 
                                       &masterVolTmp);
    if (!status)
    {
        // clear target field and insert new value
        masterVolTmp =   (masterVolTmp & ~ (AC97_MR_MSTR_VOL_MSK
                                                 << AC97_MR_MSTR_VOL_R_SHFT))
                       | ((attenuation  & AC97_MR_MSTR_VOL_MSK)
                                                 << AC97_MR_MSTR_VOL_R_SHFT);
        status = Ac97SetAnyMixerRegister  (ctxP, 
                                           AC97_MR_MASTER_VOLUME, 
                                           masterVolTmp);
    }
    // Subroutine records enough error info.  Just pass status back.
    return (status);

} // Ac97SetMasterVolRight ()
*/
UINT32 Ac97SetMasterVolMute (Ac97ContextT* ctxP, BOOL muteEnable)
{
    // Subroutine records enough error info.  Just pass status back.
   return 0;//mask zzm return (Ac97SetUsualMute  (ctxP, AC97_MR_MASTER_VOLUME, muteEnable));

} // Ac97SetMasterVolMute ()


// 0x1A Select the input source for the PCM stream to the controller.
UINT32 Ac97GetRecordSelectLeft (Ac97ContextT* ctxP, PUINT8 inputSourceP)
{
    UINT32 status ;
    UINT16 recordSelectTmp;

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_RECORD_SELECT, 
                                       &recordSelectTmp);
    if (!status)
    {
        *inputSourceP  = (recordSelectTmp >> AC97_MR_REC_SEL_L_SHFT) 
                                                    & AC97_MR_REC_SEL_MSK;
    }
    // Subroutine records enough error info.  Just pass status back.
    return (status);
    
} // Ac97GetRecordSelectLeft()


UINT32 Ac97GetRecordSelectRight (Ac97ContextT* ctxP, PUINT8 inputSourceP)
{
    UINT32 status ;
    UINT16 recordSelectTmp;

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_RECORD_SELECT, 
                                       &recordSelectTmp);
    if (!status)
    {
        *inputSourceP = (recordSelectTmp >> AC97_MR_REC_SEL_R_SHFT) 
                                                    & AC97_MR_REC_SEL_MSK;
    }
    // Subroutine records enough error info.  Just pass status back.
    return (status);
    
} // Ac97GetRecordSelectRight()

/*
UINT32 Ac97SetRecordSelectLeft (Ac97ContextT* ctxP, UINT8 inputSource)
{
    UINT32 status ;
    UINT16 recordSelectTmp;
    UINT   srcCheckMask;

    srcCheckMask = (1u << inputSource);

    if (~(ctxP->mixerRegsSpecialMasksP->mr0x1aRecSelSupport) & srcCheckMask)
    {
        status = ERR_T_NOT_AVAIL; // Source not available in target codec

        // Only record our error info.  For comms problem, subroutine records.
        LOGERROR (ctxP->loggedError, ERR_L_AC97, 
                       ERR_S_AC97_SET_REC_SEL, status, srcCheckMask, 0, 0)
    }
    else
    {
        status = Ac97GetAnyMixerRegister  (ctxP, 
                                           AC97_MR_RECORD_SELECT, 
                                           &recordSelectTmp);
        if (!status)
        {
            // clear target field and insert new value
            recordSelectTmp =   ((recordSelectTmp & ~ (AC97_MR_REC_SEL_MSK
                                                     << AC97_MR_REC_SEL_L_SHFT))
                              | (inputSource  <<  AC97_MR_REC_SEL_L_SHFT));

            status = Ac97SetAnyMixerRegister  (ctxP, 
                                               AC97_MR_RECORD_SELECT, 
                                               recordSelectTmp);
        }
    }
    // Subroutines record enough error info.  Just pass status back.
    return (status);

} // Ac97SetRecordSelectLeft()

UINT32 Ac97SetRecordSelectRight (Ac97ContextT* ctxP, UINT8 inputSource)
{
    UINT32 status ;
    UINT16 recordSelectTmp;
    UINT   srcCheckMask;

    srcCheckMask = (1u << inputSource);

    if (~(ctxP->mixerRegsSpecialMasksP->mr0x1aRecSelSupport) & srcCheckMask)
    {
        status = ERR_T_NOT_AVAIL; // Source not available in target codec

        // Only record our error info.  For comms problem, subroutine records.
        LOGERROR (ctxP->loggedError, ERR_L_AC97, 
                       ERR_S_AC97_SET_REC_SEL, status, srcCheckMask, 0, 0)
    }
    else
    {
        status = Ac97GetAnyMixerRegister  (ctxP, 
                                           AC97_MR_RECORD_SELECT, 
                                           &recordSelectTmp);
        if (!status)
        {
            // clear target field and insert new value
            recordSelectTmp =   ((recordSelectTmp & ~ (AC97_MR_REC_SEL_MSK
                                                     << AC97_MR_REC_SEL_R_SHFT))
                              | (inputSource  <<  AC97_MR_REC_SEL_R_SHFT));

            status = Ac97SetAnyMixerRegister  (ctxP, 
                                               AC97_MR_RECORD_SELECT, 
                                               recordSelectTmp);
        }
    }
    // Subroutines record enough error info.  Just pass status back.
    return (status);

} // Ac97SetRecordSelectRight()


UINT32 Ac97GetHWLoopAdcToDac (Ac97ContextT* ctxP, BOOL* enableLoopP)
{
    UINT32 status;
    UINT16 gprTmp;

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_GENERAL_PURPOSE, 
                                       &gprTmp);
    if (!status)
    {
        if (gprTmp & AC97_MR_GPR_LPBK_ENAB)
        {
            *enableLoopP = TRUE;
        }
        else
        {
            *enableLoopP = FALSE;
        }
    }
    // Subroutines record enough error info.  Just pass status back.
    return (status);
    
} // Ac97SetHWLoopAdcToDac ()


UINT32 Ac97SetHWLoopAdcToDac (Ac97ContextT* ctxP, BOOL enableLoop)
{
    UINT32 status ;
    UINT16 gprTmp;

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_GENERAL_PURPOSE, 
                                       &gprTmp);
    if (!status)
    {
        gprTmp &= ~AC97_MR_GPR_LPBK_ENAB;
        if (enableLoop)
        {
            gprTmp |= AC97_MR_GPR_LPBK_ENAB;
        }
        status = Ac97SetAnyMixerRegister  (ctxP, 
                                           AC97_MR_GENERAL_PURPOSE, 
                                           gprTmp);
    }
    // Subroutines record enough error info.  Just pass status back.
    return (status);
    
} // Ac97SetHWLoopAdcToDac ()


UINT32 Ac97GetPcmVariableRateEnable (Ac97ContextT* ctxP, BOOL* enabledP)
{
    
    UINT32 status ;
    UINT16 reg2aTmp;

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_E_AUDIO_CTRL_STAT, 
                                       &reg2aTmp);
    if (!status)
    {
        if (reg2aTmp & AC97_MR_EA_STAT_CTRL_VRA_ENAB)
        {
            *enabledP = TRUE ;
        }
        else
        {
            *enabledP = FALSE ;
        }
    }

    // Subroutine records enough error info.  Just pass status back.
    return (status);

} // Ac97GetPcmVariableRateEnable ()


// 0x2A: Extended Audio Status and Control Register
UINT32 Ac97SetPcmVariableRateEnable (Ac97ContextT* ctxP, BOOL enable)
{
    UINT32 status ;
    UINT16 reg2aTmp;

    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_E_AUDIO_CTRL_STAT, 
                                       &reg2aTmp);
    if (!status)
    {
        reg2aTmp &= ~AC97_MR_EA_STAT_CTRL_VRA_ENAB;
        if (enable)
        {
            reg2aTmp |= AC97_MR_EA_STAT_CTRL_VRA_ENAB;
        }
        status = Ac97SetAnyMixerRegister  (ctxP, 
                                           AC97_MR_E_AUDIO_CTRL_STAT, 
                                           reg2aTmp);
    }
    // Subroutines record enough error info.  Just pass status back.
    return (status);

} // Ac97SetPcmVariableRateEnable ()



// 0x2C: Controls variable rate for SDAT_OUT slots 3, 4 & 6
//       Rate = value Hertz
UINT32 Ac97GetSampleRatePcmOut (Ac97ContextT* ctxP, PUINT16 currentRateP)
{
    UINT32 status ;
    
    status = Ac97GetAnyMixerRegister  (ctxP, 
                                       AC97_MR_E_ASR_PCM_FRNT_DAC_RT, 
                                       currentRateP);

    // Subroutine records enough error info.  Just pass status back.
    return (status);
    
} // Ac97GetSampleRatePcmOut ()

UINT32 Ac97SetSampleRatePcmOut (Ac97ContextT* ctxP, UINT16 desiredRate)
{
    UINT32 status ;
    
    status = Ac97SetAnyMixerRegister  (ctxP, 
                                      

⌨️ 快捷键说明

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