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----------------------------------------------