www.pudn.com > OS.rar > SACM_HAL_Driver.asm, change:2006-12-11,size:15851b
//=======================================================================
// Progarm: sacm.asm , Standard function definition for SACM library
// Writen by: Sam Sung/Arthur Shieh
//
// Lastest modified date:
// 2000/02/26: first version
//
// Note:
// 1. This file includes hardware dependent functions for kernel to connect to hardware.
// 2. Design can add harware dependent function here if necessary.
//
//SACM.asm: This file includes APIs for SA to hook on different Plateform
// Proposed by: Arthur
//=======================================================================
.include GPL162001.inc
.include unOS.inc
.include Snd_ArithmConfig.inc
//=======================================================================
.public F_SACM_RampUpDAC1
.public F_SACM_RampDnDAC1
.public F_SACM_RampUpDAC2
.public F_SACM_RampDnDAC2
.public F_SACM_EnableDAC1
.public F_SACM_EnableDAC2
.public F_SACM_EnableDAC2_Only
.public F_SACM_DisableDAC1
.public F_SACM_DisableDAC2
.public F_SACM_DisableAudioTimer
//==============For TFSK Demo 2006/07/06==============================
.public _Demo_DAC12Open
.public F_Demo_DAC12Open
//============================2006/07/06 xiaolei======================
//************************************************************************
// added by Anson 2004/1/29
.PUBLIC F_SACM_CHA_PlayInterrupt_Enable
.PUBLIC F_SACM_CHB_PlayInterrupt_Enable
.PUBLIC F_SACM_CHA_PlayInterrupt_Disable
.PUBLIC F_SACM_CHB_PlayInterrupt_Disable
.PUBLIC F_SACM_CHA_WaitFIFOEmpty
.PUBLIC F_SACM_CHB_WaitFIFOEmpty
//************************************************************************
//added by guili 2005/08/05 for ETTS
.ifdef C_SND_ETTS_SUPPORT
.public _SACM_TIMERINT_ENABLE
.public _SACM_TIMERINT_DISABLE
.endif
//************************************************************************
.define C_SACM_RAMP_DELAY 50 //for RampUp, RampDn
.external _SysTimeDly
//=======================================================================
.CODE
////////////////////////////////////////////////////////
// Function: F_SACM_RampUpDAC1
// Description: Ramp Up before using DAC to avoid "bow" sound from speaker
// for SPL162001,only set P_CHA_Ctrl.bit12, Ramp up done by hardware
// but need delay
// Syntax: F_SACM_RampUpDAC1()
// Destory: R1
////////////////////////////////////////////////////////
F_SACM_RampUpDAC1: .PROC
push r1,r2 to [sp]
.ifdef C_DAC_CONTROL_INSIDE
//-------------------------------------------
.ifdef C_SYSTEM_SPL162001
r1 = [P_CHA_Ctrl]
r1 |= 0x1000
[P_CHA_Ctrl] = r1
.else //For 2002 Platform only
.ifdef C_SYSTEM_SPL162002
r1=100
loop?:
call F_SACM_Delay;
r1-=1
jnz loop?
.endif
.endif //--- for 162001 end
.ifdef C_DACRAMPUP_DELAY
push r1, r5 to [sp]
r1 = C_SACM_RAMP_DELAY
push r1 to [sp]
call _SysTimeDly
pop r1 from [sp]
pop r1, r5 from [sp]
.endif //end C_DACRAMPUP_DELAY
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf;
.ENDP
////////////////////////////////////////////////////////
// Function: F_SACM_RampUpDAC2
// Description: Ramp Up before using DAC to avoid "bow" sound
// from speaker
// Syntax: F_SACM_RampUpDAC2()
// Destory: R1
////////////////////////////////////////////////////////
F_SACM_RampUpDAC2: .PROC
push r1,r2 to [sp]
.ifdef C_DAC_CONTROL_INSIDE
//-------------------------------------------
.ifdef C_SYSTEM_SPL162001
r1 = [P_CHA_Ctrl]
r1 |= 0x1000
[P_CHA_Ctrl] = r1
.else //For 2002 Platform
.ifdef C_SYSTEM_SPL162002
r1=0x100
?_Loop_0:
call F_SACM_Delay;
R1 -= 1
jnz ?_Loop_0;
.endif
.endif //--- for 162001 definition end
.ifdef C_DACRAMPUP_DELAY
push r1, r5 to [sp]
r1 = C_SACM_RAMP_DELAY
push r1 to [sp]
call _SysTimeDly
pop r1 from [sp]
pop r1, r5 from [sp]
.endif //end C_DACRAMPUP_DELAY
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf;
.ENDP
F_SACM_Delay: .proc
push R1 to [SP];
R1 = C_SACM_RAMP_DELAY; // Ramp Up/Dn delay per step
?_Loop_0:
R1 -= 0x0001;
jnz ?_Loop_0;
pop R1 from [SP];
retf;
.endp
////////////////////////////////////////////////////////
// Function: F_SACM_RampDnDAC1
// Description: Ramp down after using DAC to avoid "bow" sound
// from speaker
// Syntax: F_SACM_RampDnDAC1
// Destory: R1
////////////////////////////////////////////////////////
F_SACM_RampDnDAC1: .PROC
push r1,r2 to [sp]
.ifdef C_DAC_CONTROL_INSIDE
//-------------------------------------------
.ifdef C_DACRAMPUP_DELAY
push r1, r5 to [sp]
r1 = C_SACM_RAMP_DELAY
push r1 to [sp]
call _SysTimeDly
pop r1 from [sp]
pop r1, r5 from [sp]
.endif //end C_DACRAMPUP_DELAY
.ifdef C_SYSTEM_SPL162001
r1 = [P_CHA_Ctrl]
r1 &= ~0x1000
[P_CHA_Ctrl] = r1
.else
r1=0x100
?_Loop_0:
call F_SACM_Delay;
R1 -= 1
jnz ?_Loop_0;
.endif
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf;
.ENDP
////////////////////////////////////////////////////////
// Function: F_SACM_RampDnDAC2
// Description: Ramp down after using DAC to avoid "bow" sound
// from speaker
// Syntax: F_SACM_RampDnDAC2
// Destory: R1
////////////////////////////////////////////////////////
F_SACM_RampDnDAC2: .PROC
push r1,r2 to [sp]
.ifdef C_DAC_CONTROL_INSIDE
.ifdef C_DACRAMPUP_DELAY
push r1, r5 to [sp]
r1 = C_SACM_RAMP_DELAY
push r1 to [sp]
call _SysTimeDly
pop r1 from [sp]
pop r1, r5 from [sp]
.endif //end C_DACRAMPUP_DELAY
//-------------------------------------------
.ifdef C_SYSTEM_SPL162001
r1 = [P_CHA_Ctrl]
r1 &= ~0x1000
[P_CHA_Ctrl] = r1
.else
.ifdef C_SYSTEM_SPL162002
r1=0x100
?_Loop_0:
call F_SACM_Delay;
R1 -= 1
jnz ?_Loop_0;
.endif
.endif
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf;
.ENDP
////////////////////////////////////////////////////////
// Function: F_SACM_EnableDAC
// Description: enable dac
// Syntax: F_SACM_EnableDAC()
// Destory: R1,r2
////////////////////////////////////////////////////////
.if 0 //2005/06/21 for CHA + CHB
F_SACM_EnableDAC: .PROC
push r1,r2 to [sp]
//-------------------------------------------
.ifdef C_SYSTEM_SPL162001
r1 = 0x8120
[P_CHA_FIFO] = r1
[P_CHB_FIFO] = r1
r2 = 0
r1 = [P_CHA_Ctrl]
r1 |= 0xa000
[P_CHA_Ctrl] = r1
//[P_CHA_Data] = r2 //2005/06/029
r1 = [P_CHB_Ctrl]
r1 |= 0x8000
[P_CHB_Ctrl] = r1
//[P_CHB_Data] = r2
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf
.endp
.endif
////////////////////////////////////////////////////////
// Function: F_SACM_EnableDAC1
// Description: enable dac
// Syntax: F_SACM_EnableDAC1()
// Destory: R1,r2
////////////////////////////////////////////////////////
F_SACM_EnableDAC1: .PROC
push r1,r2 to [sp]
.ifdef C_DAC_CONTROL_INSIDE
//-------------------------------------------
.ifdef C_SYSTEM_SPL162001
r1 = 0x8120
[P_CHA_FIFO] = r1
r2 = 0
r1 = [P_CHA_Ctrl]
r1 |= 0xa000 //enable cha
[P_CHA_Ctrl] = r1
//[P_CHA_Data] = r2 //2005/06/029
.else //For 162002 PlatForm
//F_SACM_CHA_ControlLogic_Enable:
r1 = [P_CHA_FIFO]
r1&=~0x00f0 //clear fifo level set
r1 = r1 | 0x0170
//r1 = r1 | 0x0180
[P_CHA_FIFO] = r1
r1=[P_HPAMP_Ctrl]
r1&=~0x02
[P_HPAMP_Ctrl]=r1
//F_SACM_CHA_ControlLogic_Enable_FIFO:
.comment @ //For S200 test play 2006/08/15
r1 = [P_CHA_FIFO]
r1&=~0x0f0
r1 = r1 | 0x0170 // Reset FIFO
[P_CHA_FIFO] = r1
@
.endif
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf
.endp
////////////////////////////////////////////////////////
// Function: F_SACM_EnableDAC2
// Description: enable dac
// Syntax: F_SACM_EnableDAC2()
// Destory: R1,r2
////////////////////////////////////////////////////////
F_SACM_EnableDAC2: .PROC
push r1,r2 to [sp]
.ifdef C_DAC_CONTROL_INSIDE
//-------------------------------------------
.ifdef C_SYSTEM_SPL162001
r1 = 0x8020 //2005/06/21
[P_CHB_FIFO] = r1 //2005/06/21
r2 = 0
r1 = [P_CHB_Ctrl]
r1 |= 0xb000 //2005/06/21chb the same cha
[P_CHB_Ctrl] = r1
//[P_CHB_Data] = r2 //2005/06/029
.else
//F_SACM_CHA_ControlLogic_Enable:
r1 = [P_CHB_Ctrl]
r1&=~0x0400
r1 = r1 | 0x9800 //add by zgq on 20051215
[P_CHB_Ctrl] = r1
r1 = [P_CHB_FIFO]
r1&=~0x0f0
r1 = r1 | 0x0120
[P_CHB_FIFO] = r1
r1=[P_HPAMP_Ctrl]
r1&=~0x01
[P_HPAMP_Ctrl]=r1
//F_SACM_CHA_ControlLogic_Enable_FIFO:
.comment @ //For S200 Play test 2006/08/15
r1 = [P_CHB_FIFO]
r1&=~0x0f0
r1 = r1 | 0x0170 // Reset FIFO
[P_CHB_FIFO] = r1
@
.endif
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf
.endp
F_SACM_EnableDAC2_Only: .PROC
push r1,r2 to [sp]
.ifdef C_DAC_CONTROL_INSIDE
//-------------------------------------------
.ifdef C_SYSTEM_SPL162001
r1 = 0x8020 //2005/06/21
[P_CHB_FIFO] = r1 //2005/06/21
r2 = 0
r1 = [P_CHB_Ctrl]
r1 |= 0xa000 //2005/06/21chb the diff cha
[P_CHB_Ctrl] = r1
//[P_CHB_Data] = r2 //2005/06/029
.else
r1 = [P_CHB_Ctrl]
r1&=~0x0400
r1 = r1 | 0x9800 //add by zgq on 20051215
[P_CHB_Ctrl] = r1
r1 = [P_CHB_FIFO]
r1&=~0x0f0
r1 = r1 | 0x0180
[P_CHB_FIFO] = r1
r1=[P_HPAMP_Ctrl]
r1&=~0x01
[P_HPAMP_Ctrl]=r1
.endif
.endif
//-------------------------------------------
pop r1,r2 from [sp]
retf
.endp
////////////////////////////////////////////////////////
// Function: F_SACM_DisableDAC
// Description: disable dac
// Syntax: F_SACM_DisableDAC()
// Destory: R1
////////////////////////////////////////////////////////
.if 0
F_SACM_DisableDAC: .PROC
.ifdef C_SYSTEM_SPL162001
r1 = 0x8000
[P_CHA_Ctrl]=r1
[P_CHB_Ctrl]=r1
.endif
retf
.endp
.endif
////////////////////////////////////////////////////////
// Function: F_SACM_DisableDAC1
// Description: disable dac
// Syntax: F_SACM_DisableDAC1()
// Destory: R1
////////////////////////////////////////////////////////
F_SACM_DisableDAC1: .PROC
.ifdef C_DAC_CONTROL_INSIDE
.ifdef C_SYSTEM_SPL162001
r1 = 0x8000
[P_CHA_Ctrl]=r1
.else
r1=[P_HPAMP_Ctrl]
r1&=~0x0c //switch to DAC channel
r1|=0x02 //disable left channel
[P_HPAMP_Ctrl]=r1
r1 = [P_CHA_Ctrl]
r1 = r1 & (~0x2000)
r1|=0x0200 //reset SRC module
[P_CHA_Ctrl] = r1
.endif
.endif
retf
.endp
////////////////////////////////////////////////////////
// Function: F_SACM_DisableDAC2
// Description: disable dac
// Syntax: F_SACM_DisableDAC2()
// Destory: R1
////////////////////////////////////////////////////////
F_SACM_DisableDAC2: .PROC
.ifdef C_DAC_CONTROL_INSIDE
.ifdef C_SYSTEM_SPL162001
r1 = 0x8000
[P_CHB_Ctrl]=r1
.else
r1=[P_HPAMP_Ctrl]
r1|=0x01 //disable left channel
[P_HPAMP_Ctrl]=r1
r1 = [P_CHB_Ctrl]
r1 = r1 & (~0x2000)
[P_CHB_Ctrl] = r1
.endif
.endif
retf
.endp
////////////////////////////////////////////////////////
// Function: F_SACM_DisableAudioTimer
// Description: disable audio timer
// Destory: R1
////////////////////////////////////////////////////////
F_SACM_DisableAudioTimer: .PROC
.ifdef C_SYSTEM_SPL162001
r1 = 0
[P_TimerE_Preload] = R1;
r1 = 0x8000
[P_TimerE_Ctrl] = R1;
r1 = 0
[P_TimerF_Preload] = R1;
r1 = 0x8000
[P_TimerF_Ctrl] = R1;
.else
.ifdef C_SYSTEM_SPL162002
nop
.endif
.endif
retf
.endp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// added by Anson 2004/1/29
F_SACM_CHA_PlayInterrupt_Enable: .PROC
unOSIrqOff //2005/03/11
.if 0
r1 = [P_CHA_Ctrl]
r1 = r1 | (0x4000)
[P_CHA_Ctrl] = r1
.else
r1 = [P_CHA_Ctrl]
r1 = r1 | (0x6000)
[P_CHA_Ctrl] = r1
.endif
unOSIrqOn //2005/03/11
retf
.endp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
F_SACM_CHB_PlayInterrupt_Enable: .PROC
unOSIrqOff //2005/03/11
.if 0
r1 = [P_CHB_Ctrl]
r1 = r1 | (0x4000)
[P_CHB_Ctrl] = r1
.else
r1 = [P_CHB_Ctrl]
r1 = r1 | (0x6000)
[P_CHB_Ctrl] = r1
.endif
unOSIrqOn //2005/03/11
retf
.endp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
F_SACM_CHA_PlayInterrupt_Disable: .PROC
unOSIrqOff //2005/03/11
.if 0
r1 = [P_CHA_Ctrl]
r1 = r1 & (~0x4000)
[P_CHA_Ctrl] = r1
.else
r1 = [P_CHA_Ctrl]
r1 = r1 & (~0x4000)
[P_CHA_Ctrl] = r1
.endif
unOSIrqOn //2005/03/11
retf
.endp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
F_SACM_CHB_PlayInterrupt_Disable: .PROC
unOSIrqOff //2005/03/11
.if 0
r1 = [P_CHB_Ctrl]
r1 = r1 & (~0x4000)
[P_CHB_Ctrl] = r1
.else
r1 = [P_CHB_Ctrl]
r1 = r1 & (~0x4000)
[P_CHB_Ctrl] = r1
.endif
unOSIrqOn //2005/03/11
retf
.endp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
F_SACM_CHA_WaitFIFOEmpty: .PROC
r1 = 0xA005
[P_WatchDog_Clear] = r1
r1 = [P_CHA_FIFO]
r1 = r1 & 0x000F
cmp r1,1
ja F_SACM_CHA_WaitFIFOEmpty
retf
.endp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
F_SACM_CHB_WaitFIFOEmpty: .PROC
r1 = 0xA005
[P_WatchDog_Clear] = r1
r1 = [P_CHB_FIFO]
r1 = r1 & 0x000F
cmp r1,1
ja F_SACM_CHB_WaitFIFOEmpty
retf
.endp
//--------------------------------------------------------------------
//added by guili 2005/08/05 for ETTS
//--------------------------------------------------------------------
.ifdef C_SND_ETTS_SUPPORT
_SACM_TIMERINT_ENABLE: .proc
F_SACM_TIMERINT_ENABLE:
retf;
.endp
//--------------------------------------------------------------------
//added by guili 2005/08/05 for ETTS
//--------------------------------------------------------------------
_SACM_TIMERINT_DISABLE: .proc
F_SACM_TIMERINT_DISABLE:
retf
.endp
.endif
//xiaolei add for TFSK Demo for double DAC use====================
_Demo_DAC12Open: .proc
F_Demo_DAC12Open:
//RAMPON:
.if 0 //For 162001 Platform only
r1 = [P_CHA_Ctrl]
r1 |= 0x1000
[P_CHA_Ctrl] = r1
.endif
.ifdef C_DACRAMPUP_DELAY
push r1, r5 to [sp]
r1 = C_SACM_RAMP_DELAY
push r1 to [sp]
call _SysTimeDly
pop r1 from [sp]
pop r1, r5 from [sp]
.endif
push r1,r2 to [sp]
.if 0 //For 162001 Platform only
//DAC1 Enable:
r1 = 0x8120
[P_CHA_FIFO] = r1
r2 = 0
r1 = [P_CHA_Ctrl]
r1 |= 0xa000 //enable cha
[P_CHA_Ctrl] = r1
//DAC2 Enable:
r1 = 0x8020 //2005/06/21
[P_CHB_FIFO] = r1 //2005/06/21
r2 = 0
r1 = [P_CHB_Ctrl]
r1 |= 0xb000 //2005/06/21chb the same cha
[P_CHB_Ctrl] = r1
.else //For 2002 Platform
//DAC1 Enable:
r1 = [P_CHA_FIFO]
r1&=~0x00f0 //clear fifo level set
//r1 = r1 | 0x0120 // Reset FIFO
r1 = r1 | 0x0180
[P_CHA_FIFO] = r1
r1=[P_HPAMP_Ctrl]
r1&=~0x02
[P_HPAMP_Ctrl]=r1
//DAC2 Enable:
r1 = [P_CHB_Ctrl]
r1&=~0x0400
r1 = r1 | 0x9800 //add by zgq on 20051215
[P_CHB_Ctrl] = r1
r1 = [P_CHB_FIFO]
r1&=~0x0f0
//r1 = r1 | 0x0120 // Reset FIFO
r1 = r1 | 0x0180
[P_CHB_FIFO] = r1
r1=[P_HPAMP_Ctrl]
r1&=~0x01
[P_HPAMP_Ctrl]=r1
.endif
pop r1,r2 from [sp]
retf
.endp
//xiaolei add end 2006/07/06===================================
//------ sacm_HAL.asm end----------------------------------------------