亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? xsac97ctrl.c

?? 嵌入式系統(tǒng)關(guān)于串口傳輸、觸摸屏、定時(shí)器、控制器、中斷處理、音頻控制等實(shí)驗(yàn)代碼
?? C
?? 第 1 頁 / 共 4 頁
字號(hào):
*  4.  Perform the first (dummy) read from the processor memory location that is
*      mapped to the target Codec's target register.  Discard the resulting data
*  5.  Continuously check the AC '97 Controller's Global Status Register until
*      the SDONE bit is set.  Use software timeout logic.
*  6.  If the Read Completion Status bit is set or the software timeout has 
*      occurred, there is a timeout.
*      a)  Declare an error status 
*      b)  Skip to step 8 in this procedure.
*  7.  If there was no timeout, the read operation was successful.
*      a)  Read the CAR until it is verified that no codec I/O accesses are
*          currently in progress.  This also claims the next codec I/O
*          transaction for this operation.  It leaves an indication for the 
*          next SW read or write I/O operation.  This will prevent ambiguity.
*          (We shouldn't actually have to loop here because the SDONE bit 
*           indicator ought to be set at the same time as the CAR indicator
*           clears.  But we loop anyway, just in case.)
*      b)  Perform the second read to obtain the register contents reported by
*          the codec.
*      c)  Report the data obtained from the codec.
*  8.  Restore previous interrupt state. 
*  9.  Report success or error status.
*  
*  Note that this operation does not wait for the second read operation to
*   complete.  Any remaining wait is done in the beginning of the next access.
* 
*  Note also that there is a possible optimization in this processor for reads 
*   of a modem's GPIO bits that are reported to the controller in time slot 12.
*   It would be to skip the timeout logic and the second read cycle because the
*   local values are constantly updated from the values reported in TS 12.
*  
*  Once the link is acquired, perform the double read under interrupt 
*   protection.  This is necessary to make it an atomic operation.  Even
*   if link acquisition continued for @@@
*  
*******************************************************************************
*/

UINT32 XsAc97CtrlReadCodecReg (XsAc97CtrlCodecModemIdT  ac97DeviceId, 
                               AC97MixerRegisterIdT     targetRegister, 
                               UINT32*                  mixerRegValueP)
{
    UINT32    status ;
    INT       badParamNum  = 0; // Which param had error.  Assume no errors.
    INT       timeoutLoc   = 0; // What point had a timeout.  Assume no errors.
    BOOL      gotLink;
    VUINT32   readFinishedStatus;
    UINT32    irqIntState;
    UINT32    rcsErrTmp;
    INT       minorIterations;
    INT       retries   =   0;  
    XsAc97CtrlStatsT* codeStatsP;
    VUINT32*  mixerRegsAccessP;

    status = Ac97CheckRegId (targetRegister);

    if (status)
    {
        badParamNum = 2;
    }
    else    // register ID OK, set register access pointer to codec access base
    {
        switch (ac97DeviceId)
        {
            case XS_AC97CTRL_CM_ID_PRI_CODEC:
                mixerRegsAccessP  = &XsAc97CtrlRegsP->
                                            XsAC97CtrlMixerRegsPrimaryAud[0];
                codeStatsP = &XsAc97CtrlContext.statistics[ac97DeviceId];
                break;
            default:
                status      = ERR_T_ILLPARAM;
                badParamNum = 1;
                break;
        }
        // Point to specified register within area mapped to target codec regs
        mixerRegsAccessP += (targetRegister / XS_AC97CTRL_MIXER_REGS_PER_WORD);

    } // else (register ID OK)

    if (!status)
    {
        // Some statistics.  Only valid invocations are interesting.
        irqIntState = XsIcDisableInterruptsIrq();
        codeStatsP->readCodecNumInvocations++;     
        XsIcRestoreInterruptsIrq (irqIntState);

        do
        {
            status = ERR_NONE;      // Clear for possible retry
            // Protect entire operation for simplicity.  Very small extra
            //  execution time penalty.
            irqIntState = XsIcDisableInterruptsIrq();

            // Lock the ACLINK
            minorIterations = 0; 
            do
            {
                gotLink = XsAc97CtrlLockAcLink();
                if (!gotLink)    // 1 usec is a long time.  Skip delay if possible.
                {
                    DM_WaitUs(1);
                }
            }
            // Wait while time remaining and ACLINK not available
            while (   (minorIterations++ < XS_AC97CTRL_CAIP_TIMEOUT_1USECS) 
                    && !gotLink );


            if (!gotLink)                           // Didn't get the ACLINK
            {
                status = ERR_T_NOT_AVAIL;      
            }
            else  // We got the link.  Perform the read operations.
            {
                // First, clear old read status indications.
                (void) XsAc97CtrlClearStatus (XS_AC97CTRL_STAT_SDONE); 
                (void) XsAc97CtrlClearStatus (XS_AC97CTRL_STAT_RCS_ERR); 

                *mixerRegValueP = *mixerRegsAccessP; // This is THE DUMMY READ.

                // Wait for read I/O with codec to complete before doing real read.
                minorIterations = 0;
                do
                {
                    DM_WaitUs(1);
                    readFinishedStatus = 
                        XsAc97CtrlGetStatus (XS_AC97CTRL_STAT_SDONE);
                }
                // Wait while time remaining and read I/O still incomplete
                // SDONE bit is high when done.
                while (   (minorIterations++ < XS_AC97CTRL_READ_TIMEOUT_1USECS)
                        && !readFinishedStatus);

                // Another way to detect a timeout is to check the Read 
                //  Completion Status bit in the GSR.  It is set for a timeout.
                rcsErrTmp = XsAc97CtrlGetStatus (XS_AC97CTRL_STAT_RCS_ERR);
                if ( rcsErrTmp || 
                    !readFinishedStatus)
                {
                    // Timed out on read
                    status      = ERR_T_TIMEOUT;
                    timeoutLoc  = 1;                // First timeout opportunity
                }
                else  // OK to do real read
                {
                    if (!gotLink)                   // Didn't get the ACLINK
                    {
                        status = ERR_T_TIMEOUT;
                        timeoutLoc  = 2;            // Second timeout opportunity
                    }
                    else  // No problems.  Perform the read operation.
                    {
                        *mixerRegValueP = *mixerRegsAccessP;     // THE REAL READ.
                    }

                }  // else  (OK to do real read)

            } // else  (We got the link.  Perform the read operations.)

            XsIcRestoreInterruptsIrq (irqIntState);     // End atomic zone.

        } // do: try communication until retries run out or success.
        while (retries++ < XS_AC97CTRL_CODEC_READ_RETRIES && (status)); 

        // Some statistics
        irqIntState = XsIcDisableInterruptsIrq();
        codeStatsP->readCodecTotalRetries += retries -1; // Adjust for post-increment

        if (status)
        {
            codeStatsP->readCodecNumFailures++; 
        }
        else
        {
            // Clean up after real read.  Why must we do it here instead 
            //  of speculatively at the beginning of the read process?
            //  Need to investigate proper procedure.
            minorIterations = 0;
            do
            {
                DM_WaitUs(1);
                readFinishedStatus = 
                    XsAc97CtrlGetStatus (XS_AC97CTRL_STAT_SDONE);
            }
            // Wait while time remaining and read I/O still incomplete
            // SDONE bit is high when done.
            while (   (minorIterations++ < XS_AC97CTRL_READ_TIMEOUT_1USECS)
                    && !readFinishedStatus);
            
        }

        XsIcRestoreInterruptsIrq (irqIntState);

    } // if (!status): got past initial parameter checks


    if (status)
    {

//        LOGERROR (XsAc97CtrlContext.loggedError,
  //          ERR_L_XSAC97CTRL, 
    //        ERR_S_XSAC97CTRL_CODEC_READ, 
      //      status,
        //    badParamNum, 
          //  timeoutLoc, 
            //targetRegister)
    }

    return (status);

} // XsAc97CtrlCodecRead ()


/*
*******************************************************************************
    Non-standard, test-oriented API of main processor on-board 
        AC'97 controller driver.  Lower level access provided.
*******************************************************************************
*/

/*
*******************************************************************************
*
* FUNCTION:         XsAc97CtrlColdReset
*
* DESCRIPTION:      Perform a cold reset of the processor's AC'97 Controller,
*                   the AC Link and all AC'97 codecs and modems attached to 
*                   the controller's AC'97 cold reset pin.
*
* INPUT PARAMETERS: None
*
* RETURNS:
*       Success:    0 (ERR_NONE); All codecs reported ready within time limit.
*       Failure:    ERR_T_TIMEOUT:   A timeout occurred on one of the codecs.
*                        In systems with multiple codecs, the calling function 
*                        could determine which device(s) is/are not ready by 
*                        performing XsAc97CtrlGetStatus() on 
*                        XS_AC97CTRL_STAT_PCRDY and XS_AC97CTRL_STAT_SCRDY.
*
* GLOBAL EFFECTS:   All codecs initialized to default settings.  Controller
*                   set to default state and is operational.
*
* ASSUMPTIONS:      Not used in an interrupt service routine.
*
* CALLS:            
*
* CALLED BY:        
*
* PROTOTYPE:        UINT32  XsAc97CtrlColdReset (void);
*
*******************************************************************************
*/

UINT32  XsAc97CtrlColdReset (void)
{ 
    UINT32   status            = ERR_NONE; 
    INT      numCodecsReady;
    BOOL     primaryCodecReady; 
    INT      timeRemaining; 
    UINT32   irqIntState;

    // Activate cold reset line under interrupt protection
    irqIntState = XsIcDisableInterruptsIrq();   // Begin atomic zone.

    XsAc97CtrlRegsP = (XsAc97CtrlRegsT *) XS_AC97CTRL_REGISTER_BASE;

    XsAc97CtrlRegsP->GCR &= ~(XS_AC97CTRL_GCR_COLD_RESET_MSK); // Activate

    XsIcRestoreInterruptsIrq (irqIntState);     // End atomic zone.

    // Hold reset active for a minimum time
    for (timeRemaining = 0 ; 
        timeRemaining < XS_AC97CTRL_COLD_HOLD_50USECS; 
        timeRemaining++ )
    {
        DM_WaitUs(50);
    }

    // Deactivate cold reset line
    irqIntState = XsIcDisableInterruptsIrq();   // Begin atomic zone.

    XsAc97CtrlRegsP->GCR |= XS_AC97CTRL_GCR_COLD_RESET_MSK; // Deactivate

    XsIcRestoreInterruptsIrq (irqIntState);     // End atomic zone.

    // And wait with timeout for all codecs to respond.

    numCodecsReady    = 0;         // Codecs plus modems. 
    primaryCodecReady = FALSE; 
    timeRemaining = XS_AC97CTRL_COLD_TIMEOUT_50USECS;

    do
    {
        DM_WaitUs(50);

        if ((!primaryCodecReady) && (XsAc97CtrlRegsP->GSR & XS_AC97CTRL_GSR_PCRDY_MSK))
        {
            // Note: Don't bother trying to clear the interrupt trigger for the 
            //   primary codec ready status indicator.  This is not an 
            //   interrupt-based function.
            primaryCodecReady = TRUE;
            numCodecsReady ++;
        }

        // Note: Other codecs or modems would be checked here, if supported by 
        //  the platform.

    } // exit loop if timeout or all devices ready
    while (timeRemaining-- && (numCodecsReady < XS_AC97CTRL_NUM_CODECS));


    // Timeout status if some of the devices weren't ready.
    if (numCodecsReady < XS_AC97CTRL_NUM_CODECS)
    {
        status = ERR_T_TIMEOUT;
//        LOGERROR (XsAc97CtrlContext.loggedError, ERR_L_XSAC97CTRL, 
  //          ERR_S_XSAC97CTRL_COLD_RESET, status, 0, 0, 0);
    }

    return (status);

} // XsAc97CtrlColdReset ()


/*
*******************************************************************************
*

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩黄色免费网站| 欧美私模裸体表演在线观看| 久久国产精品一区二区| 亚洲 欧美综合在线网络| 一区二区三区精品在线观看| 亚洲视频一二区| 一区二区三区日韩欧美| 一区二区国产视频| 亚洲午夜在线视频| 免费av网站大全久久| 美女视频黄 久久| 激情小说亚洲一区| 成人成人成人在线视频| 99视频在线精品| 欧美影片第一页| 8x8x8国产精品| 日韩视频在线观看一区二区| www激情久久| 国产精品理伦片| 亚洲欧洲中文日韩久久av乱码| 亚洲一区免费视频| 三级久久三级久久久| 美女在线一区二区| 国产乱淫av一区二区三区| 丰满亚洲少妇av| 欧美主播一区二区三区美女| 91精品国产一区二区| 亚洲精品一区二区三区蜜桃下载| 久久精品日韩一区二区三区| 亚洲欧美在线观看| 午夜精品在线看| 国产高清无密码一区二区三区| av亚洲产国偷v产偷v自拍| 欧美怡红院视频| 精品va天堂亚洲国产| 国产精品美女久久久久久久久久久 | 有码一区二区三区| 男女男精品网站| 成人激情午夜影院| 欧美男同性恋视频网站| 久久蜜桃av一区二区天堂 | 亚洲成在人线在线播放| 裸体健美xxxx欧美裸体表演| 国产成人午夜电影网| 日本精品一级二级| 精品久久人人做人人爰| 亚洲视频狠狠干| 毛片不卡一区二区| 精品福利av导航| 中文字幕在线播放不卡一区| 午夜伊人狠狠久久| 国产精华液一区二区三区| 欧美手机在线视频| 久久久国产午夜精品| 午夜视频久久久久久| 成人激情黄色小说| 欧美不卡一区二区| 亚洲狠狠丁香婷婷综合久久久| 国内精品伊人久久久久av一坑| 色悠久久久久综合欧美99| 欧美成人女星排行榜| 亚洲一区二区欧美日韩| 成人动漫一区二区在线| 精品少妇一区二区三区在线播放 | 欧美精品一区二区三| 亚洲精品国久久99热| 国产一区二区免费看| 欧美日韩国产三级| 亚洲免费伊人电影| 国产超碰在线一区| 欧美成人激情免费网| 亚洲18影院在线观看| 91视频国产观看| 日本一区二区不卡视频| 久久精品国产一区二区| 欧美艳星brazzers| 综合激情网...| 成人白浆超碰人人人人| 26uuu成人网一区二区三区| 天天综合网 天天综合色| 色偷偷一区二区三区| 日本一区二区久久| 国产成人亚洲综合色影视| 欧美成va人片在线观看| 日本sm残虐另类| 7777精品久久久大香线蕉| 亚洲.国产.中文慕字在线| 91精品福利在线| 亚洲美女免费在线| 91美女福利视频| 1000精品久久久久久久久| 成人高清在线视频| 国产精品天美传媒沈樵| 国产成人精品午夜视频免费| 精品美女一区二区三区| 免费成人你懂的| 欧美一区二区三区不卡| 青青草伊人久久| 日韩免费视频线观看| 蜜臀a∨国产成人精品| 日韩一区二区在线播放| 日韩av一区二区在线影视| 欧美精品一二三| 日韩va欧美va亚洲va久久| 欧美一区二区视频观看视频| 日本不卡一二三区黄网| 日韩欧美国产综合在线一区二区三区| 亚洲3atv精品一区二区三区| 宅男噜噜噜66一区二区66| 日韩va亚洲va欧美va久久| 欧美一区二视频| 免费av网站大全久久| 久久综合九色综合欧美亚洲| 国产一区二区三区久久悠悠色av| 久久久久88色偷偷免费| 成人91在线观看| 伊人夜夜躁av伊人久久| 欧美性猛交xxxx黑人交| 无码av中文一区二区三区桃花岛| 日韩一区二区三区视频| 国产主播一区二区三区| 欧美国产日本视频| 色94色欧美sute亚洲线路一久| 亚洲成人动漫在线免费观看| 91精品久久久久久久久99蜜臂| 蜜桃久久av一区| 国产日韩欧美制服另类| 色综合中文字幕国产| 夜夜嗨av一区二区三区中文字幕| 欧美日韩一区二区三区在线看| 人妖欧美一区二区| 国产清纯白嫩初高生在线观看91| 色综合一区二区| 日韩不卡一二三区| 久久精品视频一区二区| 色综合婷婷久久| 日韩电影在线观看一区| 久久久久久久久岛国免费| a4yy欧美一区二区三区| 日韩—二三区免费观看av| 国产亚洲一区二区三区| 91久久精品一区二区三| 久草中文综合在线| 17c精品麻豆一区二区免费| 欧美日韩在线观看一区二区| 经典三级视频一区| 自拍视频在线观看一区二区| 欧美一区国产二区| youjizz国产精品| 婷婷一区二区三区| 国产精品伦理一区二区| 在线播放国产精品二区一二区四区| 国产最新精品精品你懂的| 夜夜嗨av一区二区三区网页| 久久久精品天堂| 欧美日韩国产高清一区二区 | 欧美精品一区二区不卡| 色综合网色综合| 国产一区欧美二区| 午夜精品一区在线观看| 国产精品久久久久aaaa樱花| 91精品国产色综合久久不卡电影 | 国产精品无码永久免费888| 欧美日韩亚州综合| 国产91对白在线观看九色| 偷拍日韩校园综合在线| 国产精品美女久久福利网站| 欧美一级一级性生活免费录像| av在线播放成人| 国产毛片一区二区| 亚洲chinese男男1069| 一区在线中文字幕| 久久这里只有精品视频网| 欧美日韩一卡二卡三卡 | 欧美日韩亚洲综合在线 | 三级久久三级久久| 一区二区三区在线免费视频| 国产亚洲欧美日韩在线一区| 777久久久精品| 91国在线观看| 波多野结衣在线aⅴ中文字幕不卡| 麻豆91免费观看| 日韩精品亚洲专区| 亚洲午夜激情av| 亚洲美女视频在线| 中文字幕视频一区| 国产无遮挡一区二区三区毛片日本| 欧美一区二区三区免费| 欧美老肥妇做.爰bbww视频| 在线观看一区二区视频| 99麻豆久久久国产精品免费优播| 精品午夜一区二区三区在线观看| 日韩影视精彩在线| 亚洲第一激情av| 亚洲小说春色综合另类电影| 悠悠色在线精品| 亚洲精品高清视频在线观看| 亚洲欧美日韩成人高清在线一区| 中文字幕字幕中文在线中不卡视频| 中文字幕高清不卡|