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

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

?? ac97c.c

?? at91sam9260-ek library file
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include "ac97c.h"
#include <board.h>
#include <aic/aic.h>
#include <utility/assert.h>
#include <utility/trace.h>
#include <utility/math.h>

//------------------------------------------------------------------------------
//         Local constants
//------------------------------------------------------------------------------

/// Maximum size of one PDC buffer (in bytes).
#define MAX_PDC_COUNTER	65535

//------------------------------------------------------------------------------
//         Local types
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// AC97 transfer descriptor. Tracks the status and parameters of a transfer
/// on the AC97 bus.
//------------------------------------------------------------------------------
typedef struct _Ac97Transfer {

	/// Buffer containing the slots to send.
	unsigned char *pBuffer;
	/// Total number of samples to send.
	volatile unsigned int numSamples;
	/// Optional callback function.
	Ac97Callback callback;
	/// Optional argument to the callback function.
	void *pArg;

} Ac97Transfer;

//------------------------------------------------------------------------------
/// AC97 controller driver structure. Monitors the status of transfers on all
/// AC97 channels.
//------------------------------------------------------------------------------
typedef struct _Ac97c {

    /// List of transfers occuring on each channel.
	Ac97Transfer transfers[5];
} Ac97c;

//------------------------------------------------------------------------------
//         Local variables
//------------------------------------------------------------------------------

/// Global AC97 controller instance.
static Ac97c ac97c;

//------------------------------------------------------------------------------
//         Local functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Returns the size of one sample (in bytes) on the given channel.
/// \param channel  Channel number.
//------------------------------------------------------------------------------
static unsigned char GetSampleSize(unsigned char channel)
{
    unsigned int size = 0;

    SANITY_CHECK((channel == AC97C_CHANNEL_A)
                 || (channel == AC97C_CHANNEL_B)
                 || (channel == AC97C_CHANNEL_CODEC));

    // Check selected channel
    switch (channel) {
        case AC97C_CHANNEL_CODEC: return 2;
        case AC97C_CHANNEL_A: size = (AT91C_BASE_AC97C->AC97C_CAMR & AT91C_AC97C_SIZE) >> 16; break;
        case AC97C_CHANNEL_B: size = (AT91C_BASE_AC97C->AC97C_CBMR & AT91C_AC97C_SIZE) >> 16; break;
    }

    // Compute size in bytes given SIZE field
    if ((size & 2) != 0) {

        return 2;
    }
    else {

        return 4;
    }
}

//------------------------------------------------------------------------------
/// Interrupt service routine for Codec, is invoked by AC97C_Handler.
//------------------------------------------------------------------------------
static void CodecHandler(void)
{
    unsigned int status;
    unsigned int data;
    Ac97Transfer *pTransfer = &(ac97c.transfers[AC97C_CODEC_TRANSFER]);

    // Read CODEC status register
    status = AT91C_BASE_AC97C->AC97C_COSR;
    status &= AT91C_BASE_AC97C->AC97C_COMR;

    // A sample has been transmitted
    if (status & AT91C_AC97C_TXRDY) {

        pTransfer->numSamples--;

        // If there are remaining samples, transmit one
        if (pTransfer->numSamples > 0) {

            data = *((unsigned int *) pTransfer->pBuffer);
            AT91C_BASE_AC97C->AC97C_COMR &= ~(AT91C_AC97C_TXRDY);
            AT91C_BASE_AC97C->AC97C_COTHR = data;

            // Check if transfer is read or write
            if ((data & AT91C_AC97C_READ) != 0) {
    
                AT91C_BASE_AC97C->AC97C_COMR |= AT91C_AC97C_RXRDY;
            }
            else {
            
                pTransfer->pBuffer += sizeof(unsigned int);
                AT91C_BASE_AC97C->AC97C_COMR |= AT91C_AC97C_TXRDY;
            }
        }
        // Transfer finished
        else {

            AT91C_BASE_AC97C->AC97C_IDR = AT91C_AC97C_COEVT;
            AT91C_BASE_AC97C->AC97C_COMR &= ~(AT91C_AC97C_TXRDY);
            if (pTransfer->callback) {

                pTransfer->callback(pTransfer->pArg, 0, 0);
            }
        }   
    }

    // A sample has been received
    if (status & AT91C_AC97C_RXRDY) {

        // Store sample
        data = AT91C_BASE_AC97C->AC97C_CORHR;
        *((unsigned int *) pTransfer->pBuffer) = data;

        pTransfer->pBuffer += sizeof(unsigned int);
        pTransfer->numSamples--;

        // Transfer finished
        if (pTransfer->numSamples > 0) {

            data = *((unsigned int *) pTransfer->pBuffer);
            AT91C_BASE_AC97C->AC97C_COMR &= ~(AT91C_AC97C_RXRDY);
            AT91C_BASE_AC97C->AC97C_COTHR = data;

            // Check if transfer is read or write
            if ((data & AT91C_AC97C_READ) != 0) {
    
                AT91C_BASE_AC97C->AC97C_COMR |= AT91C_AC97C_RXRDY;
            }
            else {
            
                pTransfer->pBuffer += sizeof(unsigned int);
                AT91C_BASE_AC97C->AC97C_COMR |= AT91C_AC97C_TXRDY;
            }
        }
        else {

            AT91C_BASE_AC97C->AC97C_IDR = AT91C_AC97C_COEVT;
            AT91C_BASE_AC97C->AC97C_COMR &= ~(AT91C_AC97C_RXRDY);
            if (pTransfer->callback) {

                pTransfer->callback(pTransfer->pArg, 0, 0);
            }
        }
    }
}

//------------------------------------------------------------------------------
/// Interrupt service routine for channel A, is invoked by AC97C_Handler.
//------------------------------------------------------------------------------
static void ChannelAHandler(void)
{
    unsigned int status;
    Ac97Transfer *pTransmit = &(ac97c.transfers[AC97C_CHANNEL_A_TRANSMIT]);
    Ac97Transfer *pReceive = &(ac97c.transfers[AC97C_CHANNEL_A_RECEIVE]);

    // Read channel A status register
    status = AT91C_BASE_AC97C->AC97C_CASR;

    // A buffer has been transmitted
    if ((status & AT91C_AC97C_ENDTX) != 0) {

        // Update transfer information
        if (pTransmit->numSamples > MAX_PDC_COUNTER) {

            pTransmit->numSamples -= MAX_PDC_COUNTER;
        }
        else {

            pTransmit->numSamples = 0;
        }

        // Transmit new buffers if necessary
        if (pTransmit->numSamples > MAX_PDC_COUNTER) {

            // Fill next PDC
            AT91C_BASE_AC97C->AC97C_TNPR = (unsigned int) pTransmit->pBuffer;
            if (pTransmit->numSamples > 2 * MAX_PDC_COUNTER) {

                AT91C_BASE_AC97C->AC97C_TNCR = MAX_PDC_COUNTER;
                pTransmit->pBuffer += MAX_PDC_COUNTER * GetSampleSize(AC97C_CHANNEL_A);
            }
            else {

                AT91C_BASE_AC97C->AC97C_TNCR = pTransmit->numSamples - MAX_PDC_COUNTER;
            }
        }
        // Only one buffer remaining
        else {

            AT91C_BASE_AC97C->AC97C_CAMR &= ~AT91C_AC97C_ENDTX;
            AT91C_BASE_AC97C->AC97C_CAMR |= AT91C_AC97C_TXBUFE;
        }
    }

    // Transmit completed
    if ((status & AT91C_AC97C_TXBUFE) != 0) {

        pTransmit->numSamples = 0;
        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_TXTDIS;
        AT91C_BASE_AC97C->AC97C_CAMR &= ~AT91C_AC97C_TXBUFE;
        if (pTransmit->callback) {

            pTransmit->callback(pTransmit->pArg, 0, 0);
        }
    }

    // A buffer has been received
    if (status & AT91C_AC97C_ENDRX) {

        if (pReceive->numSamples > MAX_PDC_COUNTER) {
        
            pReceive->numSamples -= MAX_PDC_COUNTER;
        }
        else {

            pReceive->numSamples = 0;
        }

        // Transfer remaining samples
        if (pReceive->numSamples > MAX_PDC_COUNTER) {

            AT91C_BASE_AC97C->AC97C_RNPR = (unsigned int) pReceive->pBuffer;
            if (pReceive->numSamples > 2 * MAX_PDC_COUNTER) {
            
                AT91C_BASE_AC97C->AC97C_RNCR = MAX_PDC_COUNTER;
                pReceive->pBuffer += MAX_PDC_COUNTER * GetSampleSize(AC97C_CHANNEL_A);
            }
            else {

                AT91C_BASE_AC97C->AC97C_RNCR = pReceive->numSamples - MAX_PDC_COUNTER;
            }
        }
        // Only one buffer remaining
        else {

            AT91C_BASE_AC97C->AC97C_CAMR &= ~(AT91C_AC97C_ENDRX);
            AT91C_BASE_AC97C->AC97C_CAMR |= AT91C_AC97C_RXBUFF;
        }
    }

    // Receive complete
    if ((status & AT91C_AC97C_RXBUFF) != 0) {

        pReceive->numSamples = 0;
        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_RXTDIS;
        AT91C_BASE_AC97C->AC97C_CAMR &= ~AT91C_AC97C_RXBUFF;
        if (pReceive->callback) {

            pReceive->callback(pReceive->pArg, 0, 0);
        }
    }
}

//------------------------------------------------------------------------------
//         Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// This handler function must be called by the AC97C interrupt service routine.
/// Identifies which event was activated and calls the associated function.
//------------------------------------------------------------------------------ 
void AC97C_Handler(void)
{
    unsigned int status;

    // Get the real interrupt source
    status = AT91C_BASE_AC97C->AC97C_SR;
    status &= AT91C_BASE_AC97C->AC97C_IMR;
    
    // Check if an event on the codec channel is active
    if ((status & AT91C_AC97C_COEVT) != 0) {

        CodecHandler();    
    }
    // Check if an event on channel A is active
    if ((status & AT91C_AC97C_CAEVT) != 0) {

        ChannelAHandler();  
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区影视| 自拍偷拍亚洲激情| 日欧美一区二区| 6080国产精品一区二区| 日韩福利视频网| 91精品国产手机| 麻豆精品久久精品色综合| 91精品免费观看| 精品中文av资源站在线观看| 精品国产伦一区二区三区观看体验| 日韩av电影天堂| 久久午夜国产精品| 成人国产精品视频| 亚洲视频你懂的| 在线不卡免费av| 国产乱淫av一区二区三区| 中文字幕第一页久久| 欧美日韩国产综合一区二区三区| 亚洲精品成人精品456| 欧美日韩一二三区| 激情综合色综合久久综合| 国产丝袜欧美中文另类| 91啪在线观看| 日韩福利视频网| 国产精品午夜久久| 欧美日韩国产高清一区二区 | 欧美日精品一区视频| 日韩高清欧美激情| 国产欧美日韩精品一区| 91成人免费电影| 久久久一区二区三区捆绑**| 99久久99久久精品国产片果冻| 亚洲成人动漫一区| 欧美国产精品劲爆| 欧美人狂配大交3d怪物一区| 国产99久久久国产精品潘金| 亚洲精品成人在线| 国产日产精品1区| 欧美高清视频在线高清观看mv色露露十八| 欧美日韩免费电影| 国产大片一区二区| 午夜电影网亚洲视频| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲成人av一区二区| 日韩欧美一级二级三级| 成人av电影在线播放| 蜜臀va亚洲va欧美va天堂| 亚洲欧洲日韩在线| 久久久精品国产免大香伊| 欧美日韩aaaaa| 99久久综合国产精品| 欧美一个色资源| 在线观看网站黄不卡| 国产成人午夜精品影院观看视频| 在线视频亚洲一区| 国产乱对白刺激视频不卡| 亚洲卡通欧美制服中文| 肉色丝袜一区二区| 亚洲精品免费在线播放| 国产亚洲视频系列| 亚洲精品一区二区三区影院| 欧美日韩一区二区三区视频| 亚洲欧洲日产国码二区| 国产欧美日韩中文久久| 欧美日韩黄色一区二区| 色偷偷久久一区二区三区| 国产精品亚洲一区二区三区妖精| 日韩国产欧美一区二区三区| 亚洲日本va午夜在线电影| 国产精品人成在线观看免费| 精品国产乱码91久久久久久网站| 91精品国产综合久久香蕉麻豆| 色爱区综合激月婷婷| 91丨porny丨首页| av一区二区久久| 国产高清无密码一区二区三区| 精品一区二区三区视频| 2014亚洲片线观看视频免费| 欧美一级久久久久久久大片| 欧美性xxxxx极品少妇| 日本国产一区二区| 色老汉av一区二区三区| 欧洲精品一区二区| 欧美日韩亚洲不卡| 在线精品视频一区二区| 色综合久久久久综合体| 在线这里只有精品| 日韩有码一区二区三区| 蜜臀91精品一区二区三区| 久久成人久久鬼色| 激情另类小说区图片区视频区| 国产一区欧美二区| 成人黄色国产精品网站大全在线免费观看| 国产高清成人在线| 91免费看视频| 欧美日韩精品免费| 日韩女优制服丝袜电影| 国产米奇在线777精品观看| 高清免费成人av| 成人激情文学综合网| 色噜噜狠狠色综合中国| 91麻豆精品久久久久蜜臀| 欧美成人三级在线| 国产精品毛片大码女人| 亚洲老妇xxxxxx| 日韩激情在线观看| 国产成人在线电影| 日本高清不卡一区| 精品国产伦一区二区三区观看方式| 成人毛片老司机大片| 91国产免费观看| 欧美一区二区国产| 国产女主播在线一区二区| 国产午夜精品福利| 一区二区三区欧美在线观看| 蜜桃视频第一区免费观看| 国产成人av在线影院| 欧美网站大全在线观看| 久久久噜噜噜久久人人看| 亚洲综合色噜噜狠狠| 激情欧美一区二区三区在线观看| 91小视频在线观看| 日韩欧美激情在线| 亚洲欧美国产77777| 免费看精品久久片| 99久久99久久精品免费看蜜桃| 欧美一区二区三区四区高清| 综合久久国产九一剧情麻豆| 麻豆国产一区二区| 色婷婷综合久久久中文字幕| 日韩欧美一区在线观看| 1024国产精品| 精品无人码麻豆乱码1区2区 | 亚洲精品国产精品乱码不99| 一级中文字幕一区二区| 久久成人av少妇免费| 一区二区三区四区不卡在线| 精品在线一区二区| 欧美日韩在线免费视频| 国产精品三级在线观看| 国产在线一区观看| 91精品国产91久久久久久最新毛片| 国产精品理论片在线观看| 激情深爱一区二区| 在线不卡a资源高清| 一区二区三区欧美视频| av欧美精品.com| 久久老女人爱爱| 日韩西西人体444www| 亚洲国产美国国产综合一区二区| 成人综合在线观看| 国产婷婷色一区二区三区| 理论电影国产精品| 91精品国产入口| 欧美日韩精品福利| 亚洲国产精品视频| 91黄色在线观看| 中文字幕一区二区日韩精品绯色| 秋霞电影网一区二区| 欧美色综合天天久久综合精品| 欧美高清在线视频| 韩国av一区二区三区四区| 欧美视频中文一区二区三区在线观看| 国产精品久久久久久久久果冻传媒 | 国精产品一区一区三区mba桃花| 欧美三级电影一区| 一区二区在线免费| 成人av网址在线观看| 国产欧美日韩卡一| 国产福利精品导航| 久久久av毛片精品| 欧美成人性福生活免费看| 蜜臀精品久久久久久蜜臀| 欧美一区二区三区免费大片| 午夜婷婷国产麻豆精品| 5566中文字幕一区二区电影| 午夜电影网亚洲视频| 欧美一区2区视频在线观看| 日日嗨av一区二区三区四区| 欧美日韩你懂的| 青椒成人免费视频| 精品国产乱子伦一区| 丰满岳乱妇一区二区三区| 亚洲欧美自拍偷拍| 欧美性大战久久| 秋霞午夜鲁丝一区二区老狼| 久久综合狠狠综合久久综合88 | 久久久久久久久岛国免费| 国产成人亚洲综合a∨婷婷 | 亚洲靠逼com| 欧美日韩一二三| 六月丁香婷婷色狠狠久久| 国产日本欧洲亚洲| 国产成人在线网站| 夜夜爽夜夜爽精品视频| 日韩写真欧美这视频| 成人黄动漫网站免费app| 亚洲在线一区二区三区| 日韩欧美不卡在线观看视频| 成人天堂资源www在线|