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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hwctxt.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
        // No done bits set- must not be my interrupt
        return 0;
    case DMA_DONEA|DMA_DONEB|DMA_BIU:
        // Load B, then A
        BytesTransferred = FillOutputBuffer(OUTPUT_DMA_BUFFER1);
        // fall through
    case DMA_DONEA: // This should never happen!
    case DMA_DONEA|DMA_BIU:
        BytesTransferred += FillOutputBuffer(OUTPUT_DMA_BUFFER0);        // charlie, A => B
        break;
    case DMA_DONEA|DMA_DONEB:
        // Load A, then B
        BytesTransferred = FillOutputBuffer(OUTPUT_DMA_BUFFER0);
        BytesTransferred += FillOutputBuffer(OUTPUT_DMA_BUFFER1);
        break;
    case DMA_DONEB|DMA_BIU: // This should never happen!
    case DMA_DONEB:
        // Load B
        BytesTransferred += FillOutputBuffer(OUTPUT_DMA_BUFFER1);        // charlie, B => A
        break;
    }

    // If it was our interrupt, but we weren't able to transfer any bytes
    // (e.g. no full buffers ready to be emptied)
    // and all the output DMA buffers are now empty, then stop the output DMA
    BytesTotal = m_nOutByte[OUTPUT_DMA_BUFFER0]+m_nOutByte[OUTPUT_DMA_BUFFER1];

    if (BytesTotal == 0)
    {
        StopOutputDMA();
    }
    else
    {
        StartOutputDMA();        // for DMA resume when wake up
    }

    return BytesTransferred;
}


ULONG
HardwareContext::FillOutputBuffer(int nBufferNumber)
{
    ULONG BytesTransferred = 0;
    PBYTE pBufferStart = m_OutputDMABufferVirPage[nBufferNumber];
    PBYTE pBufferEnd = pBufferStart + AUDIO_DMA_PAGE_SIZE;
    PBYTE pBufferLast;

    WAV_MSG((_T("[WAV] FillOutputBuffer(%d)\n\r"), nBufferNumber));

    __try
    {
        pBufferLast = m_OutputDeviceContext.TransferBuffer(pBufferStart, pBufferEnd, NULL);

        BytesTransferred = pBufferLast-pBufferStart;
        m_nOutByte[nBufferNumber] = BytesTransferred;

        // Enable if you need to clear the rest of the DMA buffer
        StreamContext::ClearBuffer(pBufferLast, pBufferEnd);

        if(nBufferNumber == OUTPUT_DMA_BUFFER0)            // Output Buffer A
        {
            m_OutputDMAStatus &= ~DMA_DONEA;
            m_OutputDMAStatus |= DMA_STRTA;
        }
        else                                // Output Buffer B
        {
            m_OutputDMAStatus &= ~DMA_DONEB;
            m_OutputDMAStatus |= DMA_STRTB;
        }
    }
    __except(GetExceptionCode()==STATUS_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        WAV_ERR((_T("[WAV:ERR] FillOutputBuffer() : Exception ccurs [%d]\n\r"), GetExceptionCode()));
    }

    return BytesTransferred;
}


ULONG
HardwareContext::TransferInputBuffers(DWORD dwStatus)
{
    ULONG BytesTransferred=0;

    dwStatus &= (DMA_DONEA|DMA_DONEB|DMA_BIU);

    WAV_MSG((_T("[WAV] TransferInputBuffers(0x%08x)\n\r"), dwStatus));

    switch (dwStatus)
    {
    case 0:
    case DMA_BIU:
        // No done bits set- must not be my interrupt
        return 0;
    case DMA_DONEA|DMA_DONEB|DMA_BIU:
        // Load B, then A
        BytesTransferred = FillInputBuffer(INPUT_DMA_BUFFER1);
        // fall through
    case DMA_DONEA: // This should never happen!
    case DMA_DONEA|DMA_BIU:
        // Load A
        BytesTransferred += FillInputBuffer(INPUT_DMA_BUFFER0);
        break;
    case DMA_DONEA|DMA_DONEB:
        // Load A, then B
        BytesTransferred = FillInputBuffer(INPUT_DMA_BUFFER0);
        BytesTransferred += FillInputBuffer(INPUT_DMA_BUFFER1);
        break;
    case DMA_DONEB|DMA_BIU: // This should never happen!
    case DMA_DONEB:
        // Load B
        BytesTransferred += FillInputBuffer(INPUT_DMA_BUFFER1);
        break;
    }

    // If it was our interrupt, but we weren't able to transfer any bytes
    // (e.g. no empty buffers ready to be filled)
    // Then stop the input DMA
    if (BytesTransferred==0)
    {
        StopInputDMA();
    }
    else
    {
        StartInputDMA();        // for DMA resume when wake up
    }

    return BytesTransferred;
}


ULONG
HardwareContext::FillInputBuffer(int nBufferNumber)
{
    ULONG BytesTransferred = 0;

    PBYTE pBufferStart = m_InputDMABufferVirPage[nBufferNumber];
    PBYTE pBufferEnd = pBufferStart + AUDIO_DMA_PAGE_SIZE;
    PBYTE pBufferLast;

    WAV_MSG((_T("[WAV] FillInputBuffer(%d)\n\r"), nBufferNumber));

    __try
    {
        pBufferLast = m_InputDeviceContext.TransferBuffer(pBufferStart, pBufferEnd, NULL);
        BytesTransferred = m_nInByte[nBufferNumber] = pBufferLast-pBufferStart;

        if(nBufferNumber == INPUT_DMA_BUFFER0)            // Input Buffer A
        {
            m_InputDMAStatus &= ~DMA_DONEA;
            m_InputDMAStatus |= DMA_STRTA;
        }
        else                                                // Input Buffer B
        {
            m_InputDMAStatus &= ~DMA_DONEB;
            m_InputDMAStatus |= DMA_STRTB;
        }

    }
    __except(GetExceptionCode()==STATUS_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        WAV_ERR((_T("[WAV:ERR] FillInputBuffer() : Exception ccurs [%d]\n\r"), GetExceptionCode()));
    }

    return BytesTransferred;
}


void
HardwareContext::WriteCodecRegister(UCHAR Reg, USHORT Val)
{
    // WM8580
    // SFR[B15..B9], DATA[B8..B0]
    // +------------------------+
    // | B15...B9 B8.........B0 |
    // +------------------------+
    //
    UCHAR command0, command1;

    m_WM8580_SFR_Table[Reg] = Val;

    WAV_MSG((_T("[WAV] WriteCodecRegister(0x%02x, 0x%x)\n\r"), Reg, Val));

    command0 = (UCHAR)(Reg<<1)|(UCHAR)((Val>>8)&1);
    command1 = (UCHAR)(Val&0xFF);

    HW_WriteRegisters((PUCHAR)&command1, command0, 1);
}


DWORD
HardwareContext::WriteCodecRegister2(UCHAR Reg, USHORT Val)
{
    DWORD nReturned=0, bytes=0;
    BOOL  bRet = FALSE;

    UCHAR buff[2];
    IIC_IO_DESC IIC_Data;

    // WM8580
    // SFR[B15..B9], DATA[B8..B0]
    // +------------------------+
    // | B15...B9 B8.........B0 |
    // +------------------------+
    //
    UCHAR command0, command1;

    m_WM8580_SFR_Table[Reg] = Val;

    WAV_MSG((_T("[WAV] WriteCodecRegister2(0x%02x, 0x%x)\n\r"), Reg, Val));

    buff[0] = command0 = (UCHAR)(Reg<<1)|(UCHAR)((Val>>8)&1);
    buff[1] = command1 = (UCHAR)(Val&0xFF);

    IIC_Data.SlaveAddress = CHIP_ID;
    IIC_Data.Data = buff;
    IIC_Data.Count = 2;

    bRet = DeviceIoControl(m_hI2C,
                        IOCTL_IIC_WRITE,
                        &IIC_Data, sizeof(IIC_IO_DESC),
                        NULL, 0,
                        &bytes, NULL);

    if (bRet == 0)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("[HWCTXT] ERROR: Device I/O Control Request FAIL, 0x%08X\r\n"), GetLastError()));
        nReturned = -1;
    }

    WAV_MSG((_T("[WAV] WriteCodecRegister2()-\n\r")));

    return nReturned;
}


USHORT
HardwareContext::ReadCodecRegister(UCHAR Reg)
{
    USHORT RegValue = 0;

    //-----------------------------------------------------------------------------------------------------
    // !!!!! Caution !!!!!
    // WM8580 support write operation only.
    // I write sfr data value onto internal table(m_WM8580_SFR_Table), on every write operation for backup.
    // And To support read operation, I just return some value from internal table(m_WM8580_SFR_Table).
    //-----------------------------------------------------------------------------------------------------

    RegValue = m_WM8580_SFR_Table[(int)Reg];

    WAV_MSG((_T("[WAV] ReadCodecRegister(0x%02x) = 0x%03x\n\r"), Reg, RegValue));

    return (USHORT)RegValue;
}


BOOL
HardwareContext::CodecPowerControl()
{

    if( m_bInputDMARunning & m_bOutputDMARunning )
    {
        WAV_MSG((_T("[WAV] CodecPowerControl() : CodecPowerControl() ADC & DAC On\n\r")));
        WriteCodecRegister(WM8580_PWRDN1, WM8580_ALL_POWER_ON);                    // ADC, DAC power up
    }
    else if( m_bInputDMARunning )
    {
        WAV_MSG((_T("[WAV] CodecPowerControl() : CodecPowerControl() ADC On\n\r")));
        WriteCodecRegister(WM8580_PWRDN1, WM8580_PWRDN1_ADCPD_ENABLE|WM8580_PWRDN1_DACPD_ALL_DISABLE);        // ADC power up, DAC power down
    }
    else if( m_bOutputDMARunning )
    {
        WAV_MSG((_T("[WAV] CodecPowerControl() : CodecPowerControl() DAC On\n\r")));
        WriteCodecRegister(WM8580_PWRDN1, WM8580_PWRDN1_DACPD_ALL_ENABLE|WM8580_PWRDN1_ADCPD_DISABLE);   // DAC power up, ADC power down    
    }
    else
    {
        WAV_MSG((_T("[WAV] CodecPowerControl() : CodecPowerControl() ADC & DAC Off\n\r")));
        WriteCodecRegister(WM8580_PWRDN1, WM8580_PWRDN1_ADCPD_DISABLE|WM8580_PWRDN1_DACPD_ALL_DISABLE ); // ADC/DAC power down
    }

    return(TRUE);
}


BOOL
HardwareContext::CodecMuteControl(DWORD channel, BOOL bMute)
{

    if(channel & DMA_CH_OUT)
    {
        if(bMute)
        {
            WriteCodecRegister(WM8580_DAC_CONTROL5, 0x010);
        }
        else
        {
            WriteCodecRegister(WM8580_DAC_CONTROL5, 0x000);
        }
    }
    if(channel & DMA_CH_IN) 
    {
        if(bMute)
        {
            WriteCodecRegister(WM8580_ADC_CONTROL1, 0x044);
        }
        else
        {
            WriteCodecRegister(WM8580_ADC_CONTROL1, 0x040);
        }
    }

    return(TRUE);
}


void HardwareContext::SetSpeakerEnable(BOOL bEnable)
{
    // Code to turn speaker on/off here
    return;
}


void CallInterruptThreadOutputDMA(HardwareContext *pHWContext)
{
    pHWContext->InterruptThreadOutputDMA();
}


void CallInterruptThreadInputDMA(HardwareContext *pHWContext)
{
    pHWContext->InterruptThreadInputDMA();
}


// Write WM8580 IIS Codec registers directly from our cache
DWORD HardwareContext::HW_WriteRegisters(
    PUCHAR pBuff,       // Optional buffer
    UCHAR StartReg,     // start register
    DWORD nRegs         // number of registers
    )
{
    DWORD dwErr=0,bytes;
    UCHAR buff[2];
    IIC_IO_DESC IIC_Data;


    buff[0] = StartReg;
    buff[1] = pBuff[0];

    IIC_Data.SlaveAddress = WM8580_WRITE;
    
    IIC_Data.Data = buff;
    IIC_Data.Count = 2;

    WAV_MSG((_T("[WAV] HW_WriteRegisters()\r\n")));

    // use iocontrol to write
    if ( !DeviceIoControl(m_hI2C,
                        IOCTL_IIC_WRITE,
                        &IIC_Data, sizeof(IIC_IO_DESC),
                        NULL, 0,
                        &bytes, NULL) )
    {
        dwErr = GetLastError();
    }

    if ( dwErr )
    {
        WAV_ERR((_T("[WAV::ERR]I2CWrite ERROR: %u \r\n"), dwErr));
    }

    return dwErr;
}


DWORD HardwareContext::HW_ReadRegisters(
    PUCHAR pBuff,       // Optional buffer
    UCHAR StartReg,     // start register
    DWORD nRegs         // number of registers
    )
{
    DWORD dwErr=0;
    DWORD bytes;
    IIC_IO_DESC IIC_AddressData, IIC_Data;

    IIC_AddressData.SlaveAddress = WM8580_READ;
    
    IIC_AddressData.Data = &StartReg;
    IIC_AddressData.Count = 1;

    IIC_Data.SlaveAddress = WM8580_READ;
    
    IIC_Data.Data = pBuff;
    IIC_Data.Count = 1;

    WAV_MSG((_T("[WAV] HW_ReadRegisters()\r\n")));

    // use iocontrol to read
    if ( !DeviceIoControl(m_hI2C,
                        IOCTL_IIC_READ,
                        &IIC_AddressData, sizeof(IIC_IO_DESC),
                        &IIC_Data, sizeof(IIC_IO_DESC),
                        &bytes, NULL) )
    {
        dwErr = GetLastError();
    }

    if ( dwErr )
    {
        WAV_ERR((_T("[WAV::ERR]I2CRead ERROR: %u \r\n"), dwErr));
    }

    return dwErr;
}


void HardwareContext::I2S_Init8580Driver()
{
    int i;

    WAV_MSG((_T("[WAV] +I2S_Init8580Driver()\n\r")));

    // Initialize WM8580_SFR_Table data
    for (i=0; i<WM8580_MAX_REGISTER_COUNT; i++)
    {
        m_WM8580_SFR_Table[i] = 0;
    }

    // Default setting value
    for(i=0; i<(sizeof(WM8580_Codec_Init_Table)/sizeof(unsigned int)/2); i++)
    {
        WriteCodecRegister(WM8580_Codec_Init_Table[i][0], WM8580_Codec_Init_Table[i][1]);
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区视频| 欧美久久久久久久久| 91免费观看视频| 欧美精品在线观看一区二区| 欧美国产一区二区| 伦理电影国产精品| 91成人免费电影| 国产精品国产三级国产普通话99 | 欧美一区二区三区性视频| 国产精品高潮呻吟| 国产一区日韩二区欧美三区| 91精品国产入口| 亚洲午夜精品一区二区三区他趣| 成人一级视频在线观看| 精品国产91亚洲一区二区三区婷婷| 一区二区三区在线视频播放| 成人精品免费网站| 久久久国产一区二区三区四区小说| 亚洲欧洲国产日本综合| 免费观看91视频大全| 99精品久久免费看蜜臀剧情介绍| 欧美一区二区三区在线| 亚洲精品成人天堂一二三| 国产成人精品一区二| 精品国产乱码久久久久久夜甘婷婷 | 国内精品写真在线观看| 日韩一区二区免费高清| 视频一区视频二区在线观看| 在线视频国产一区| 亚洲国产日韩精品| 欧美久久久一区| 午夜亚洲国产au精品一区二区| 91福利视频网站| 亚洲一区二区三区四区的| 在线观看中文字幕不卡| 亚洲国产精品一区二区www| 色欧美乱欧美15图片| 亚洲品质自拍视频| 色综合天天综合给合国产| 成人免费一区二区三区视频 | 国产99精品视频| 国产精品天干天干在观线| 成人免费不卡视频| 亚洲人成网站色在线观看| 在线看不卡av| 日本sm残虐另类| 久久―日本道色综合久久| 国产不卡高清在线观看视频| 中文字幕不卡在线| 色综合天天视频在线观看| 亚洲一二三级电影| 日韩欧美一区电影| 国产精品一区二区视频| 国产精品久久久久久久岛一牛影视| 91片在线免费观看| 亚洲午夜电影网| 91精品国产aⅴ一区二区| 国产又粗又猛又爽又黄91精品| 欧美国产欧美亚州国产日韩mv天天看完整| 丁香婷婷综合激情五月色| 亚洲精品一二三区| 91精品啪在线观看国产60岁| 国产91丝袜在线播放0| 亚洲视频在线观看三级| 欧美精品vⅰdeose4hd| 色婷婷久久99综合精品jk白丝| 亚洲精品一卡二卡| 精品剧情v国产在线观看在线| 国产91高潮流白浆在线麻豆| 夜夜嗨av一区二区三区网页| 日韩欧美国产小视频| 成人精品视频一区二区三区| 日韩成人精品在线| 国产精品色眯眯| 欧美第一区第二区| 欧美午夜精品一区二区三区| 国产成人在线网站| 午夜精品国产更新| 亚洲欧美成aⅴ人在线观看| 日韩精品专区在线影院观看| 色综合天天综合狠狠| 精品中文字幕一区二区| 亚洲一区二三区| 欧美经典一区二区| 精品国产乱码久久久久久老虎| 日本久久精品电影| 极品少妇一区二区| 亚洲一区电影777| 国产精品福利一区| 国产无人区一区二区三区| 4hu四虎永久在线影院成人| 色菇凉天天综合网| 粉嫩高潮美女一区二区三区| 蜜臀91精品一区二区三区| 亚洲免费在线视频| 国产精品久久99| 国产三级一区二区三区| 91麻豆精品国产自产在线观看一区| 色婷婷亚洲综合| 91亚洲精品乱码久久久久久蜜桃| 国产精品一级黄| 精品无人码麻豆乱码1区2区| 人人爽香蕉精品| 日日噜噜夜夜狠狠视频欧美人| 亚洲免费观看视频| 中文字幕一区二区三| 欧美国产禁国产网站cc| 国产三级欧美三级日产三级99| 日韩欧美一区二区不卡| 91精品综合久久久久久| 欧美人与禽zozo性伦| 欧美日韩在线播放三区| 欧美男女性生活在线直播观看 | 97精品久久久午夜一区二区三区| 精品亚洲成av人在线观看| 久久99久久99| 国产精品白丝jk黑袜喷水| 国产精品69毛片高清亚洲| 国产电影精品久久禁18| 国产经典欧美精品| 成人三级在线视频| 99久久免费精品| 色狠狠综合天天综合综合| 欧美最猛性xxxxx直播| 欧美日韩在线播| 91精品国产色综合久久不卡蜜臀 | 欧美狂野另类xxxxoooo| 717成人午夜免费福利电影| 日韩一区二区三区视频在线观看| 91精品国产麻豆国产自产在线| 欧美一区二区日韩一区二区| 精品人伦一区二区色婷婷| 国产午夜亚洲精品理论片色戒| 国产精品国产三级国产aⅴ入口 | 国产成人综合在线播放| 国产成人啪免费观看软件| 99热这里都是精品| 欧美日韩一区二区三区在线看| 91精品国产一区二区三区香蕉| 久久亚洲欧美国产精品乐播| 国产精品不卡在线| 亚洲成人在线免费| 国产一区二区三区在线观看免费视频| 成人综合婷婷国产精品久久蜜臀| 在线国产电影不卡| 精品1区2区在线观看| 最新中文字幕一区二区三区| 亚洲电影你懂得| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 美女视频黄频大全不卡视频在线播放| 国产一区二区不卡| 色欧美日韩亚洲| 久久综合狠狠综合久久综合88| 亚洲欧洲av一区二区三区久久| 五月天久久比比资源色| 丁香天五香天堂综合| 欧美日本一区二区| 欧美国产成人精品| 欧美aa在线视频| zzijzzij亚洲日本少妇熟睡| 91精品国产综合久久精品图片| 国产精品拍天天在线| 午夜婷婷国产麻豆精品| 高清不卡在线观看av| 欧美喷潮久久久xxxxx| 国产精品第13页| 极品尤物av久久免费看| 欧美日韩国产系列| 国产精品国产三级国产aⅴ入口| 蜜臀av一区二区| 欧美在线观看禁18| 国产欧美一区二区精品性色超碰| 日韩精品一级中文字幕精品视频免费观看 | 国产欧美日韩在线| 婷婷中文字幕综合| 99久久婷婷国产综合精品| 久久午夜羞羞影院免费观看| 天天色图综合网| 91在线免费播放| 国产精品久久久久久久久快鸭 | 国产一区 二区| 欧美一区午夜视频在线观看| 亚洲国产一区二区视频| 色综合久久中文字幕| 国产清纯在线一区二区www| 久久se精品一区二区| 欧美日韩国产高清一区二区 | 欧美精品v国产精品v日韩精品 | 亚洲高清在线精品| 91亚洲午夜精品久久久久久| 国产精品久久看| 成人精品国产免费网站| 国产欧美一区二区精品性| 久久国产成人午夜av影院| 日韩一二三四区| 久久爱www久久做| 久久亚洲影视婷婷| 国产成人亚洲综合a∨猫咪| 久久久久久久性| 成人黄色电影在线|