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

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

?? hwctxt.cpp

?? 基于WINCE 的音頻驅動源碼
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

   
Module Name:	HWCTXT.CPP

Abstract:		Platform dependent code for the mixing audio driver.

Notes:			The following file contains all the hardware specific code
				for the mixing audio driver.  This code's primary responsibilities
				are:

					* Initialize audio hardware (including codec chip)
					* Schedule DMA operations (move data from/to buffers)
					* Handle audio interrupts

				All other tasks (mixing, volume control, etc.) are handled by the "upper"
				layers of this driver.

				****** IMPORTANT ******
				For the SC2440 CPU, DMA channel 2 can be used for both input and output.  In this,
				configuration, however, only one type operation (input or output) can execute.  In 
				order to implement simultaneous playback and recording, two things must be done:
 
					1) Input DMA should be moved to DMA Channel 1; Output DMA still uses DMA Channel 2.
					2) Step #3 in InterruptThread() needs to be implemented so that the DMA interrupt
					   source (input DMA or output DMA?) can be determined.  The interrupt source needs
					   to be determined so that the appropriate buffers can be copied (Steps #4,#5...etc.).

				Lastly, the m_OutputDMAStatus and m_InputDMAStatus variables shouldn't need to be modified.  
				The logic surrounding these drivers is simply used to determine which buffer (A or B) needs
				processing.

-*/

#include "wavemain.h"
#include <s3c2440a.h>
#include "s3c2440a_dmatransfer.h"
#include "I2S.h"
#include "hwctxt.h"
#include <ceddk.h>

#define DMA_CH_MIC 2
#define DMA_CH_OUT 1

#define L3M (0x04)	// TOUT2
#define L3C (0x10)	// TCLK0
#define L3D (0x08)	// TOUT3

// UDA1341 Register definitions
// The codec has three "addressing modes", which could also be thought of as registers
#define UDA1341_ADDR_DATA0  0x14    // 00010100 | 00  (ID | data0)
#define UDA1341_ADDR_DATA1  0x15    // 00010100 | 01  (ID | data1)
#define UDA1341_ADDR_STATUS	0x16    // 00010100 | 10  (ID | status)

// Status register bits
// Think of the status register as two separate 7-bit register (StatusA and StatusB)
// with bit 7 selecting between the two.

#define UDA1341_STATUS_A            0x00
#define UDA1341_STATUS_B            0x80
#define UDA1341_STATUS_DCFILTER     0x01 // bit 0: DC Filter on
#define UDA1341_STATUS_FMTIIS       0x00 // bit 1-3: format status
#define UDA1341_STATUS_FMT_LSB16    0x02
#define UDA1341_STATUS_FMT_LSB18    0x04
#define UDA1341_STATUS_FMT_LSB20    0x06
#define UDA1341_STATUS_FMT_MSB      0x08
#define UDA1341_STATUS_FMT_MSB16    0x0A
#define UDA1341_STATUS_FMT_MSB18    0x0C
#define UDA1341_STATUS_FMT_MSB20    0x0E
#define UDA1341_STATUS_CLK512       0x00 // bits 4,5: system clock
#define UDA1341_STATUS_CLK384       0x10 // 
#define UDA1341_STATUS_CLK256       0x20 // 
#define UDA1341_STATUS_RESET        0x40 // bit 6: reset

#define UDA1341_STATUS_PWR_DAC      0x01 // bit 0: DAC power on
#define UDA1341_STATUS_PWR_ADC      0x02 // bit 1: ADC power on
#define UDA1341_STATUS_IGS          0x20 // bit 5: IGS - ADC 6dB Boost
#define UDA1341_STATUS_OGS          0x40 // bit 6: OGS - DAC 6dB Boost


int rec_mode=0;
//-------------------------------- Global Variables --------------------------------------
volatile S3C2440A_IISBUS_REG *g_pIISregs		= NULL;		// I2S control registers
volatile S3C2440A_IOPORT_REG *g_pIOPregs		= NULL;		// GPIO registers (needed to enable I2S and SPI)
volatile S3C2440A_SPI_REG    *g_pSPIregs        = NULL;		// SPI control registers

volatile S3C2440A_DMA_REG    *g_pDMAregs		= NULL;		// DMA registers (needed for I/O on I2S bus)
volatile S3C2440A_CLKPWR_REG *g_pCLKPWRreg	= NULL;		// Clock power registers (needed to enable I2S and SPI clocks)
volatile S3C2440A_INTR_REG *s2440INT 		= NULL;
				
HardwareContext *g_pHWContext		= NULL;

PHYSICAL_ADDRESS g_PhysDMABufferAddr;

//----------------------------------------------------------------------------------------

#ifdef DEBUG
DBGPARAM dpCurSettings = {
    TEXT("WaveDriver"), {
		 TEXT("Test")           //  0   ZONE_TEST
		,TEXT("Params")         //  1   ZONE_PARAMS     
		,TEXT("Verbose")        //  2   ZONE_VERBOSE    
		,TEXT("Interrupt")      //  3   ZONE_INTERRUPT  
		,TEXT("WODM")           //  4   ZONE_WODM       
		,TEXT("WIDM")           //  5   ZONE_WIDM       
		,TEXT("PDD")            //  6   ZONE_PDD        
		,TEXT("MDD")            //  7   ZONE_MDD        
		,TEXT("Regs")           //  8   ZONE_REGS       
		,TEXT("Misc")           //  9   ZONE_MISC       
		,TEXT("Init")           // 10   ZONE_INIT       
		,TEXT("IOcontrol")      // 11   ZONE_IOCTL      
		,TEXT("Alloc")          // 12   ZONE_ALLOC      
		,TEXT("Function")       // 13   ZONE_FUNCTION   
		,TEXT("Warning")        // 14   ZONE_WARN       
		,TEXT("Error")          // 15   ZONE_ERROR      
	},
        (1 << 15)   // Errors
    |   (1 << 14)   // Warnings
}; 
#endif

void WriteL3Addr(unsigned char data)
{	
    int i,j;

    g_pIOPregs->GPBDAT &= ~(L3D|L3M|L3C);		//L3D=L/L3M=L(in address mode)/L3C=L
    g_pIOPregs->GPBDAT |= L3C;	                //L3C=H

    for(j=0;j<10;j++);		                    //tsu(L3) > 190ns
    
    //PD[8:6]=L3D:L3C:L3M
    for(i=0;i<8;i++)	                        //LSB first
    {
	if(data&0x1)	                            //if data's LSB is 'H'
	{
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
	    g_pIOPregs->GPBDAT |= L3D;	            //L3D=H		    
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	    g_pIOPregs->GPBDAT |= L3C;	            //L3C=H
	    g_pIOPregs->GPBDAT |= L3D;	            //L3D=H
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	}
	else		                                //if data's LSB is 'L'
	{
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	    g_pIOPregs->GPBDAT |= L3C;	            //L3C=H
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
	    for(j=0;j<10;j++);	                    //tcy(L3) > 500ns
	}
	data >>=1;
    }
    g_pIOPregs->GPBDAT|=L3C|L3M;	            //L3M=H,L3C=H
}


void WriteL3Data(unsigned char data,int halt)
{
    int i,j;

    if(halt)
    {
        g_pIOPregs->GPBDAT|=L3C;	            //L3C=H(while tstp, L3 interface halt condition)
        for(j=0;j<10;j++);                       //tstp(L3) > 190ns
    }

    g_pIOPregs->GPBDAT|=L3C|L3M;	            //L3M=H(in data transfer mode)	
    for(j=0;j<10;j++);	                        //tsu(L3)D > 190ns

    //PD[8:6]=L3D:L3C:L3M
    for(i=0;i<8;i++)
    {
        if(data&0x1)	                        //if data's LSB is 'H'
        {
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
            g_pIOPregs->GPBDAT |= L3D;	        //L3D=H
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
            g_pIOPregs->GPBDAT |= (L3C|L3D);    //L3C=H,L3D=H
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
        }
        else		//if data's LSB is 'L'
        {
	    g_pIOPregs->GPBDAT &= ~L3C;	            //L3C=L
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
            g_pIOPregs->GPBDAT |= L3C;	        //L3C=H
	    g_pIOPregs->GPBDAT &= ~L3D;	            //L3D=L
            for(j=0;j<10;j++);	                //tcy(L3) > 500ns
        }
        data>>=1;	//for check next bit
    }
    
    g_pIOPregs->GPBDAT|=L3C|L3M;	            //L3M=H,L3C=H
}

BOOL HardwareContext::CreateHWContext(DWORD Index)
{
    if (g_pHWContext)
    {
        return(TRUE);
    }

    g_pHWContext = new HardwareContext;
    if (!g_pHWContext)
    {
        return(FALSE);
    }

    return(g_pHWContext->Init(Index));
}

HardwareContext::HardwareContext()
: m_InputDeviceContext(), m_OutputDeviceContext()
{
    InitializeCriticalSection(&m_Lock);
    m_Initialized=FALSE;
}

HardwareContext::~HardwareContext()
{
    DeleteCriticalSection(&m_Lock);
}

BOOL HardwareContext::Init(DWORD Index)
{
    UINT32 Irq;

	m_dwInputGain = 0xFFFF;
	m_dwOutputGain = 0xFFFF;
    m_fInputMute = FALSE;
    m_fOutputMute = FALSE;


    if (m_Initialized)
    {
        return(FALSE);
    }

    // Call the OAL to translate the audio IRQ into a SYSINTR value.
    //
    Irq = IRQ_DMA2;  // audio output DMA interrupt.
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &m_dwSysintrOutput, sizeof(UINT32), NULL))
    {
        RETAILMSG(TRUE, (TEXT("ERROR: HardwareContext::Init: Failed to obtain sysintr value for output interrupt.\r\n")));
        return FALSE;
    }

    Irq = IRQ_DMA1;  // audio input DMA interrupt.
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &m_dwSysintrInput, sizeof(UINT32), NULL))
    {
        RETAILMSG(TRUE, (TEXT("ERROR: HardwareContext::Init: Failed to obtain sysintr value for input interrupt.\r\n")));
        return FALSE;
    }

	//----- 1. Initialize the state/status variables -----
    m_DriverIndex		= Index;
    m_InPowerHandler    = FALSE;
    m_InputDMARunning   = FALSE;
    m_OutputDMARunning  = FALSE;
	m_InputDMAStatus	= DMA_CLEAR;				
	m_OutputDMAStatus	= DMA_CLEAR;				

    //----- 2. Map the necessary descriptory channel and control registers into the driver's virtual address space -----
	if(!MapRegisters())
	{
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVEDEV.DLL:HardwareContext::Init() - Failed to map config registers.\r\n")));
        goto Exit;
	}

    //----- 3. Map the DMA buffers into driver's virtual address space -----
    if(!MapDMABuffers())
    {
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVEDEV.DLL:HardwareContext::Init() - Failed to map DMA buffers.\r\n")));
        goto Exit;
    }

    //----- 4. Configure the Codec -----
    InitCodec();
    
	//----- 5. Initialize the interrupt thread -----
    if (!InitInterruptThread())
    {
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVEDEV.DLL:HardwareContext::Init() - Failed to initialize interrupt thread.\r\n")));
        goto Exit;
    }
    m_Initialized=TRUE;

Exit:
    return(m_Initialized);
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		MapRegisters()

Description:	Maps the config registers used by both the SPI and
				I2S controllers.

Notes:			The SPI and I2S controllers both use the GPIO config
				registers, so these MUST be initialized FIRST.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
BOOL HardwareContext::MapRegisters()
{

	// IIS registers.
	//
    g_pIISregs = (volatile S3C2440A_IISBUS_REG*)VirtualAlloc(0, sizeof(S3C2440A_IISBUS_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!g_pIISregs)
	{
		DEBUGMSG(1, (TEXT("IISreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)g_pIISregs, (PVOID)(S3C2440A_BASE_REG_PA_IISBUS >> 8), sizeof(S3C2440A_IISBUS_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("IISreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}

	// SPI registers.
	//
    g_pSPIregs = (volatile S3C2440A_SPI_REG*)VirtualAlloc(0, sizeof(S3C2440A_SPI_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (!g_pSPIregs)
	{
		DEBUGMSG(1, (TEXT("SPIreg: VirtualAlloc failed!\r\n")));
		return(FALSE);
	}
	if (!VirtualCopy((PVOID)g_pSPIregs, (PVOID)(S3C2440A_BASE_REG_PA_SPI >> 8), sizeof(S3C2440A_SPI_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
	{
		DEBUGMSG(1, (TEXT("SPIreg: VirtualCopy failed!\r\n")));
		return(FALSE);
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本色道亚洲精品aⅴ| 欧美日韩免费不卡视频一区二区三区| 亚洲精品中文字幕在线观看| 日韩一二三区视频| 欧美亚洲高清一区| 91麻豆成人久久精品二区三区| 黄色精品一二区| 午夜伊人狠狠久久| 一区二区三区产品免费精品久久75| 国产精品二三区| 国产日本欧美一区二区| 久久久无码精品亚洲日韩按摩| 精品久久久久久久久久久久久久久| 欧美日韩国产另类一区| 国产精品丝袜在线| **欧美大码日韩| 一区二区三区欧美日韩| 国产精品一区二区久激情瑜伽| 国产精一品亚洲二区在线视频| 欧美亚洲一区三区| 亚洲天堂精品在线观看| 亚洲成av人影院| 色天使色偷偷av一区二区| 国产亚洲短视频| 亚洲三级电影全部在线观看高清| 国产综合色在线| 欧美精品丝袜中出| 26uuu色噜噜精品一区二区| 久久精品水蜜桃av综合天堂| 久久se这里有精品| 成人免费视频视频在线观看免费| 99久免费精品视频在线观看| 欧美三级乱人伦电影| 日韩小视频在线观看专区| 三级欧美在线一区| 福利视频网站一区二区三区| 欧美丝袜丝交足nylons| 亚洲免费观看高清在线观看| 美女在线视频一区| 成人综合婷婷国产精品久久免费| 精品免费国产一区二区三区四区| 奇米影视7777精品一区二区| 成人免费av在线| 国产日韩精品一区二区三区在线| 国产精品综合在线视频| 久久久久久久电影| www.欧美精品一二区| 中文字幕中文在线不卡住| 91性感美女视频| 一区二区成人在线| 欧美日韩高清一区二区| 免费精品视频在线| 久久婷婷国产综合精品青草| 成人午夜在线播放| 亚洲激情五月婷婷| 7777精品伊人久久久大香线蕉完整版| 国产欧美一区二区精品婷婷| 97se狠狠狠综合亚洲狠狠| 日韩女优av电影| 午夜精品久久久久久久| 色婷婷综合激情| 亚洲成人av福利| 欧美精品一区二区不卡| 粉嫩aⅴ一区二区三区四区五区| 亚洲欧洲精品一区二区三区| 欧美午夜在线观看| 乱中年女人伦av一区二区| 国产欧美一区二区精品秋霞影院| 99re8在线精品视频免费播放| 午夜视频一区二区| 久久亚洲精华国产精华液 | 国产日韩欧美不卡在线| 9i在线看片成人免费| 丝袜亚洲另类欧美| 欧美激情一区二区三区四区| 精久久久久久久久久久| 精品女同一区二区| 色综合久久综合| 理论片日本一区| 亚洲日本va在线观看| 欧美一区二区人人喊爽| 麻豆一区二区在线| 亚洲免费资源在线播放| 欧美一区二区三区的| 色婷婷激情一区二区三区| 美女mm1313爽爽久久久蜜臀| 一区二区三区免费看视频| 欧美精品一区二区三区久久久| 麻豆久久久久久| 亚洲精品福利视频网站| 久久久久久久久伊人| 欧美日韩免费在线视频| 成人激情图片网| 国产精品进线69影院| 欧美一区二区三区色| 91无套直看片红桃| 国产盗摄视频一区二区三区| 欧美极品另类videosde| 欧美一区二区三区婷婷月色| 色综合久久久久综合99| 国产麻豆91精品| 成人免费一区二区三区视频| 欧美精品一区二区三区高清aⅴ| 欧美日韩高清一区| 欧美在线不卡一区| 蜜臀久久99精品久久久久久9| 亚洲精品综合在线| 亚洲欧美精品午睡沙发| 国产精品毛片无遮挡高清| xfplay精品久久| 91精品欧美福利在线观看 | 丰满白嫩尤物一区二区| 国产在线日韩欧美| 黑人巨大精品欧美黑白配亚洲| 五月天婷婷综合| 午夜精品久久久久久久久久| 亚洲激情自拍偷拍| 亚洲综合激情小说| 久久综合资源网| 欧美r级在线观看| 精品国一区二区三区| 精品国一区二区三区| 久久免费视频一区| 国产精品美女视频| 成人免费在线播放视频| 亚洲精选视频在线| 天天av天天翘天天综合网 | 91国偷自产一区二区开放时间| 日本不卡视频在线| 老司机免费视频一区二区三区| 男女男精品网站| 国产一区二区三区四区五区入口| 国产一区二区三区观看| 国产精品白丝av| 成人久久视频在线观看| 播五月开心婷婷综合| 色欧美88888久久久久久影院| 欧美色图一区二区三区| 欧美日韩视频在线观看一区二区三区 | www.欧美亚洲| 欧美中文字幕不卡| 91精品国产综合久久婷婷香蕉| 日韩欧美亚洲国产精品字幕久久久 | 色中色一区二区| 欧美日韩一级片网站| 日韩欧美国产三级电影视频| 久久久久久久综合| 一区二区三区四区五区视频在线观看| 亚洲电影在线播放| 中文字幕亚洲精品在线观看| 亚洲免费观看高清| 免费看精品久久片| 成人动漫视频在线| 欧美日韩一区二区不卡| 精品国产sm最大网站| 亚洲免费在线播放| 精品一区二区三区免费观看| 99re66热这里只有精品3直播| 欧美日韩一区二区三区高清| 久久―日本道色综合久久| 亚洲国产视频在线| 国产精品一区在线观看你懂的| 欧美综合天天夜夜久久| 久久久三级国产网站| 亚洲成av人片一区二区梦乃 | 99精品一区二区三区| 91精品视频网| 亚洲激情图片qvod| 国产传媒一区在线| 91精品在线观看入口| ㊣最新国产の精品bt伙计久久| 久久综合综合久久综合| 色av成人天堂桃色av| 久久精品欧美一区二区三区麻豆 | 日韩一区中文字幕| 国精产品一区一区三区mba桃花 | 韩国视频一区二区| 欧美日韩一区在线观看| 国产精品剧情在线亚洲| 美女性感视频久久| 欧美日韩一级大片网址| 国产精品久久久久影院亚瑟| 人人爽香蕉精品| 欧美日韩精品专区| 亚洲精品视频在线| 国产成人啪免费观看软件| 精品国产一区二区三区久久影院 | 日韩视频一区二区在线观看| 一区二区成人在线| www..com久久爱| 国产日韩一级二级三级| 精品一区二区三区在线播放视频| 在线成人午夜影院| 香港成人在线视频| 欧美日韩中文精品| 亚洲高清不卡在线观看| 欧洲视频一区二区| 亚洲一区中文日韩| 欧美日韩精品一二三区| 婷婷国产v国产偷v亚洲高清|