📄 7-3.c
字号:
#include <windows.h>
#include <types.h>
#include <xsc1.h>
#include "tchpdd.h"
#include "aclinkcontrol.h"
#include "drv_glob.h"
extern void usWait(unsigned usVal);
extern void msWait(unsigned msVal);
extern PVOID VirtualAllocCopy(unsigned size,char *str,PVOID pVirtualAddress);
PDRIVER_GLOBALS v_pDriverGlobals = NULL;
volatile AC97_REGS *v_pAc97regs = NULL;
volatile LPVOID v_pCodecAddr = NULL;
static BOOL Initialised = FALSE;
#ifdef SHADOWREGISTERS
static USHORT registerAddList[] = {
0x00, 0x02, 0x04, 0x06, 0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18, 0x1A,
0x1C,0x20,0x22, 0x28, 0x2C,0x32,0x3A,0x72,0x74, 0x78, 0x7C,0x7E
};
static USHORT registerAddDefault[] = {
0x6150,0x8000,0x8000,0x8000,0x8000, 0x8808,0x8808,0x8808,0x8808,0x8808, 0x8808,0x8808, 0x0000,
0x8000,0x0000,0x0000,0x0605,0x8880,0x8880,0x2000,0x0808,0x0000,0x0000,0x574D,0x4C05
};
#define NUMBEROFAC97REGISTERS 0x3F
typedef struct
{
unsigned short DefaultRegValue;
volatile unsigned short RegValue;
BOOL Shadow;
} AC97REG;
typedef AC97REG AC97REGS[NUMBEROFAC97REGISTERS];
static AC97REGS Ac97ShadowRegisters;
#endif
BOOL CheckPCM_InFifoError( void );
void ClearPCM_InFifoError( void );
BOOL CheckPCM_OutFifoError( void );
void ClearPCM_OutFifoError( void );
BOOL CheckMic_InFifoError( void );
void ClearMic_InFifoError( void );
BOOL CheckModem_InFifoError( void );
void ClearModem_InFifoError( void );
BOOL CheckModem_OutFifoError( void );
void ClearModem_OutFifoError( void );
#ifdef SHADOWREGISTERS
BOOL ResetShadowRegisters();
BOOL RestoreShadowRegisters();
BOOL SaveShadowRegisters();
#endif SHADOWREGISTERS
short int ReadAC97(BYTE , unsigned short int * , BYTE );
short int WriteAC97(BYTE , unsigned short int, BYTE );
short int InitAcLink(volatile GPIO_REGS *,BOOL, BYTE );
short int DeInitAcLink(volatile GPIO_REGS *, BOOL, BYTE);
short int WaitTillCodecReady();
short int IsCommandDone( void );
short int IsStatusDone( void );
short int DeAllocAcLink(BYTE DevId);
short int Ac97Lock();
short int Ac97Unlock();
short int Ac97ColdReset();
short int AllocAcLink(BYTE);
short int AC97GpioUnConfigure(volatile GPIO_REGS *, BOOL, BYTE );
short int AC97GpioConfigure(volatile GPIO_REGS *, BOOL, BYTE );
BOOL StartClock(unsigned int,BOOL);
BOOL StopClock(unsigned int,BOOL);
extern void DriverSleep(DWORD, BOOL);
short int WaitTillCodecReady()
{
while( TEST( v_pAc97regs->car,AC97CAR_CAIP ) == BUSY );
return( (short int)TEST( v_pAc97regs->car, AC97CAR_CAIP ) );
}
short int IsCommandDone( void )
{
while( TEST( v_pAc97regs->gsr,AC97GSR_CDONE ) == CLEAR_BIT );
return( (short int)TEST(v_pAc97regs->gsr,AC97GSR_CDONE) );
}
short int IsStatusDone( void )
{
while( TEST( v_pAc97regs->gsr,AC97GSR_SDONE ) == CLEAR_BIT );
return ( (short int)TEST( v_pAc97regs->gsr,AC97GSR_SDONE ) );
}
short int RawAC97Read(BYTE Offset, unsigned short int * Data)
{
unsigned long *DerivedAddr;
v_pAc97regs->gsr |= AC97GSR_SDONE ;
v_pAc97regs->gsr &= ~AC97GSR_READ_COMPLETION_STATUS; // lock the channel
WaitTillCodecReady();
DerivedAddr = (unsigned long *) ((unsigned char *) v_pAc97regs->v_pCodecBaseAddr + (Offset << 1)) ;
// 转换16位地址到32位地址
*Data = (volatile unsigned short int) *DerivedAddr ;
IsStatusDone();
v_pAc97regs->gsr |= AC97GSR_SDONE ;
*Data = (volatile unsigned short int) *DerivedAddr ; // 读数据
IsStatusDone();
if(TEST(v_pAc97regs->gsr,AC97GSR_READ_COMPLETION_STATUS))
{ CLEAR(v_pAc97regs->gsr,AC97GSR_READ_COMPLETION_STATUS);
return( ERR_DATA_TIMED_OUT);
}
else
{
return(SUCCESS);
}
}
short int ReadAC97(BYTE Offset, unsigned short int * Data, BYTE DevId)
{
short int retval;
#ifdef SHADOWREGISTERS
if( Ac97ShadowRegisters[Offset].Shadow == TRUE )
{
*Data = Ac97ShadowRegisters[Offset].RegValue;
retval = SUCCESS;
}
else
#endif
{
Ac97Lock();
retval = RawAC97Read( Offset, Data );
Ac97Unlock();
}
return retval;
}
short int RawAC97Write(BYTE Offset, unsigned short int Data)
{
volatile unsigned long *DerivedAddr;
WaitTillCodecReady();
DerivedAddr = (unsigned long *) ((unsigned char *)v_pAc97regs->v_pCodecBaseAddr + (Offset << 1)) ;
v_pAc97regs->gsr |= AC97GSR_CDONE;
(volatile unsigned short int) *DerivedAddr = Data; // 写数据
IsCommandDone();
v_pAc97regs->gsr |= AC97GSR_CDONE;
return(SUCCESS);
}
short int WriteAC97(BYTE Offset, unsigned short int Data, BYTE DevId)
{
short int retval;
#ifdef SHADOWREGISTERS
if( Ac97ShadowRegisters[Offset].Shadow == TRUE )
{
Ac97ShadowRegisters[Offset].RegValue = Data;
}
#endif // SHADOWREGISTERS
Ac97Lock();
retval=RawAC97Write(Offset,Data);
Ac97Unlock();
return(retval);
}
short int AllocAcLink(BYTE DevId)
{
if (v_pAc97regs == NULL)
{
v_pAc97regs = (volatile AC97_REGS *) VirtualAllocCopy(sizeof(AC97_REGS),…
… (char *)TEXT("ACLink alloc codec registers"),
(PVOID) AC97_BASE_U_VIRTUAL);
}
if(v_pDriverGlobals == NULL)
{
v_pDriverGlobals = (PDRIVER_GLOBALS)
VirtualAllocCopy(DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE, …
…(char*)TEXT("TouchPanelEnable: DRIVER_GLOBALS"),…
… (PVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START);
}
hAcLinkControlMutex = CreateMutex(NULL,FALSE, ACLINK_MUTEX_NAME);
if(v_pAc97regs!=NULL)
{
return(SUCCESS);
}
else
{
DeAllocAcLink(DevId);
return(FALSE);
}
}
short int DeAllocAcLink(BYTE DevId)
{
if (v_pAc97regs)
{
VirtualFree((void *)v_pAc97regs,sizeof(unsigned int),MEM_RELEASE);
v_pAc97regs = NULL;
}
if (v_pDriverGlobals)
{
VirtualFree((void *)v_pAc97regs,sizeof(unsigned int),MEM_RELEASE);
v_pAc97regs = NULL;
}
return(SUCCESS);
}
short int Ac97Lock()
{
DWORD retval;
retval=WaitForSingleObject(hAcLinkControlMutex, 3000);
if(retval==WAIT_OBJECT_0)
return(SUCCESS);
else
{ DEBUGCHK(1);
return(FALSE);
}
}
short int Ac97Unlock()
{
v_pAc97regs->car &= ~AC97CAR_CAIP;
ReleaseMutex(hAcLinkControlMutex);
return(SUCCESS);
}
short int AC97GpioConfigure(volatile GPIO_REGS *v_pGPIOReg, BOOL inPowerHandler, BYTE DevId)
{
int i;
if(v_pDriverGlobals != NULL)
{
if(0 != v_pDriverGlobals->ac97.GpioIsConfigured)
{
v_pDriverGlobals->ac97.GpioIsConfigured |= 1u << DevId;
return(SUCCESS);
}
}
else
{
return(FALSE);
}
v_pDriverGlobals->ac97.GpioIsConfigured |= 1u << DevId;
if(v_pGPIOReg)
{
if (StartClock(CLK_AC97,inPowerHandler)!=SUCCESS)
return(FALSE);
v_pGPIOReg->GPDR_x |= GPIO_30 | GPIO_31;
v_pGPIOReg->GPDR_x &= ~(GPIO_28 | GPIO_29);
v_pGPIOReg->GAFR1_x |= GPIO_28_AF1_BITCLK | GPIO_29_AF1_SDATA_IN0 | GPIO_30_AF2_SDATA_OUT |GPIO_31_AF2_SYNC;
v_pAc97regs->gcr |= AC97GCR_GIE; // 使能 nACRESET 信号
v_pAc97regs->gcr |= AC97GCR_ColdReset; // 复位信号
for(i=0;i<10000;i++);
DriverSleep(2000, TRUE);
if(v_pAc97regs->gsr & AC97GSR_CODEC_READY_BIT)
{
return(SUCCESS);
}
else
{
RETAILMSG(0,(TEXT("***********UCB1400 not ready\r\n"))); // 设备信息
return(FALSE);
}
}
else
{
RETAILMSG(0,(TEXT("Gpio regs are NULL\r\n")));
return(FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -