FreeCalypso > hg > fc-tourmaline
view src/nucleus/gcc/tmt.S @ 267:10b3a6876273
fc-target.h preprocessor symbols: introduce CONFIG_TARGET_LEO_RFFE
Out of our currently existing supported targets, Leonardo and Tango
use TI's classic Leonardo RFFE wiring. However, we would like to
use the same quadband RFFE with the same classic wiring on our
FreeCalypso Libre Dumbphone handset, and also on the planned
development board that will serve as a stepping stone toward that
goal. Therefore, we introduce the new CONFIG_TARGET_LEO_RFFE
preprocessor symbol, and conditionalize on this symbol in tpudrv12.h,
instead of a growing || of different targets.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 09 Jun 2021 07:26:51 +0000 |
parents | 4e78acac3d88 |
children |
line wrap: on
line source
/* ************************************************************************ * * Copyright Mentor Graphics Corporation 2002 * All Rights Reserved. * * THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS * THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS * SUBJECT TO LICENSE TERMS. * ************************************************************************ ************************************************************************ * * FILE NAME VERSION * * tmt.s Nucleus PLUS\ARM925\Code Composer 1.14.1 * * COMPONENT * * TM - Timer Management * * DESCRIPTION * * This file contains the target dependent routines of the timer * management component. * * FUNCTIONS * * TMT_Set_Clock Set system clock * TMT_Retrieve_Clock Retrieve system clock * TMT_Read_Timer Read count-down timer * TMT_Enable_Timer Enable count-down timer * TMT_Adjust_Timer Adjust count-down timer * TMT_Disable_Timer Disable count-down timer * TMT_Retrieve_TS_Task Retrieve time-sliced task ptr * TMT_Timer_Interrupt Process timer interrupt * * DEPENDENCIES * * tc_extr.h Thread Control functions * tm_extr.h Timer functions * * HISTORY * * NAME DATE REMARKS * * B. Ronquillo 08-28-2002 Released version 1.14.1 * * ************************************************************************ */ #define NU_SOURCE_FILE /* ****************************** * INCLUDE ASSEMBLY CONSTANTS * ****************************** * Define constants used in low-level initialization. */ #include "asm_defs.h" .code 32 .text /* ********************************** * LOCAL VARIABLE DECLARATIONS * ********************************** * Define various data structure pointers so their addresses * can be obtained in a PC-relative manner. */ System_Clock: .word TMD_System_Clock Timer: .word TMD_Timer Timer_State: .word TMD_Timer_State Slice_State: .word TMD_Time_Slice_State Time_Slice: .word TMD_Time_Slice Current_Thread: .word TCD_Current_Thread Slice_Task: .word TMD_Time_Slice_Task HISR: .word TMD_HISR Int_Level: .word TCD_Interrupt_Level /* ************************************************************************ * * FUNCTION * * TMT_Set_Clock * * DESCRIPTION * * This function sets the system clock to the specified value. * * CALLED BY * * Application * * CALLS * * None * * INPUTS * * new_value New value for the clock * * OUTPUTS * * None * * HISTORY * * NAME DATE REMARKS * * W. Lamie 02-15-1994 Created initial version 1.0 * D. Lamie 02-15-1994 Verified version 1.0 * ************************************************************************ */ @VOID TMT_Set_Clock(UNSIGNED new_value) @{ .globl TMT_Set_Clock TMT_Set_Clock: @ Set the system clock to the specified value. @ TMD_System_Clock = new_value; LDR r1,System_Clock @ Build address of system clock STR r0,[r1,#0] @ Store new system clock value BX r14 @ Return to caller @} /* ************************************************************************ * * FUNCTION * * TMT_Retrieve_Clock * * DESCRIPTION * * This function returns the current value of the system clock. * * CALLED BY * * Application * * CALLS * * None * * INPUTS * * None * * OUTPUTS * * TMD_System_Clock Value of system clock * * HISTORY * * NAME DATE REMARKS * * W. Lamie 02-15-1994 Created initial version 1.0 * D. Lamie 02-15-1994 Verified version 1.0 * ************************************************************************ */ @UNSIGNED TMT_Retrieve_Clock(void) @{ .globl TMT_Retrieve_Clock TMT_Retrieve_Clock: @ Return the current value of the system clock. @ return(TMD_System_Clock); LDR r0,System_Clock @ Build address to system clock LDR r0,[r0,#0] @ Pickup system clock contents BX r14 @ Return to caller @} /* ************************************************************************ * * FUNCTION * * TMT_Read_Timer * * DESCRIPTION * * This function returns the current value of the count-down timer. * * CALLED BY * * TMC_Start_Timer Start timer function * * CALLS * * None * * INPUTS * * None * * OUTPUTS * * TMD_Timer Value of count-down timer * * HISTORY * * NAME DATE REMARKS * * W. Lamie 02-15-1994 Created initial version 1.0 * D. Lamie 02-15-1994 Verified version 1.0 * ************************************************************************ */ @UNSIGNED TMT_Read_Timer(void) @{ .globl TMT_Read_Timer TMT_Read_Timer: @ Return the current value of the count-down timer. @ return(TMD_Timer); LDR r0,Timer @ Build address to timer LDR r0,[r0,#0] @ Pickup timer contents BX r14 @ Return to caller @} /* ************************************************************************ * * FUNCTION * * TMT_Enable_Timer * * DESCRIPTION * * This function enables the count-down timer with the specified * value. * * CALLED BY * * TMC_Start_Timer Start timer function * TMC_Timer_Task Timer expiration task * * CALLS * * None * * INPUTS * * time New count-down time * * OUTPUTS * * None * * HISTORY * * NAME DATE REMARKS * * W. Lamie 02-15-1994 Created initial version 1.0 * D. Lamie 02-15-1994 Verified version 1.0 * ************************************************************************ */ @VOID TMT_Enable_Timer(UNSIGNED time) @{ .globl TMT_Enable_Timer TMT_Enable_Timer: @ Place the new time value into the count-down timer. @ TMD_Timer = time; LDR r1,Timer @ Build address of timer STR r0,[r1,#0] @ Store new timer value @ Indicate that the timer is active. @ TMD_Timer_State = TM_ACTIVE; MOV r0,#0 @ Build TM_ACTIVE value LDR r1,Timer_State @ Build address of timer state var STR r0,[r1,#0] @ Change the state to active BX r14 @ Return to caller @} /* ************************************************************************ * * FUNCTION * * TMT_Adjust_Timer * * DESCRIPTION * * This function adjusts the count-down timer with the specified * value, if the new value is less than the current. * * CALLED BY * * None * * CALLS * * None * * INPUTS * * time New count-down time. * * OUTPUTS * * None * * HISTORY * * NAME DATE REMARKS * * C. Meredith 03-01-1994 Created initial version 1.1 * D. Lamie 03-18-1994 Verified version 1.1 * C. Meredith 08-27-1994 Corrected bug in new timer * adjust routine, resulting in * version 1.1a * W. Lamie 08-27-1994 Verified version 1.1a * ************************************************************************ */ @VOID TMT_Adjust_Timer(UNSIGNED time) @{ .globl TMT_Adjust_Timer TMT_Adjust_Timer: @ Lockout all interrupts @ TMD_Timer_State = TM_NOT_ACTIVE; MRS r3,CPSR @ Pickup current CPSR ORR r2,r3,#LOCKOUT @ Build lockout CPSR MSR CPSR,r2 @ Setup new CPSR interrupt bits @ Check for the new value is less than the current time value @ if (time < TMD_Timer) LDR r1,Timer @ Build address to timer var LDR r2,[r1,#0] @ read value of the timer CMP r2,r0 @ Do Timer - time > 0, means BLT TMT_No_Adjust @ time < Timer. @ Adjust the time @ TMD_Timer = time; STR r0,[r1,#0] @ load passed in timer value @ Return to caller after restoring interrupts TMT_No_Adjust: MSR CPSR,r3 @ Setup new CPSR enable bits BX r14 @ Return to caller @} /* ************************************************************************ * * FUNCTION * * TMT_Disable_Timer * * DESCRIPTION * * This function disables the count-down timer. * * CALLED BY * * TMC_Start_Timer Start timer function * TMC_Timer_Task Timer expiration task * * CALLS * * None * * INPUTS * * None * * OUTPUTS * * None * * HISTORY * * NAME DATE REMARKS * * W. Lamie 02-15-1994 Created initial version 1.0 * D. Lamie 02-15-1994 Verified version 1.0 * ************************************************************************ */ @VOID TMT_Disable_Timer(void) @{ .globl TMT_Disable_Timer TMT_Disable_Timer: @ Disable the count-down timer. @ TMD_Timer_State = TM_NOT_ACTIVE; MOV r1,#1 @ Build TM_NOT_ACTIVE value LDR r0,Timer_State @ Build address to timer state var STR r1,[r0,#0] @ Change timer state to not active BX r14 @ Return to caller @} /* ************************************************************************ * * FUNCTION * * TMT_Retreive_TS_Timer * * DESCRIPTION * * This function returns the time-sliced task pointer. * * CALLED BY * * TMC_Timer_HISR Timer HISR * * CALLS * * None * * INPUTS * * None * * OUTPUTS * * TMD_Time_Slice_Task Time sliced task pointer * * HISTORY * * NAME DATE REMARKS * * C. Meredith 03-01-1994 Created initial version 1.1 * D. Lamie 03-18-1994 Verified version 1.1 * ************************************************************************ */ @NU_TASK TMT_Retrieve_TS_Task (VOID) @{ .globl TMT_Retrieve_TS_Task TMT_Retrieve_TS_Task: @ Read the current TMD_Time_Slice_Task variable and load for @ return to caller. LDR r1,Slice_Task @ Build address to timer slice var LDR r0,[r1,#0] @ Get task pointer to be returned @ Return to caller time slice value back to caller BX r14 @ Return to caller @} /* ************************************************************************ * * FUNCTION * * TMT_Timer_Interrupt * * DESCRIPTION * * This function processes the actual hardware interrupt. * Processing includes updating the system clock and the count- * down timer and the time-slice timer. If one or both of the * timers expire, the timer HISR is activated. * * CALLED BY * * Interrupt Vector * * CALLS * * TCT_Activate_HISR Activate timer HISR * TCT_Interrupt_Context_Save Save interrupted context * TCT_Interrupt_Context_Restore Restore interrupted context * * INPUTS * * None * * OUTPUTS * * None * * HISTORY * * NAME DATE REMARKS * * W. Lamie 02-15-1994 Created initial version 1.0 * D. Lamie 02-15-1994 Verified version 1.0 * ************************************************************************ */ @VOID TMT_Timer_Interrupt(void) @{ .globl TMT_Timer_Interrupt TMT_Timer_Interrupt: MRS r1,CPSR @ Pickup current CPSR ORR r1,r1,#LOCKOUT @ Set the interrupt lockout bits MSR CPSR,r1 @ Lockout interrupts @ Increment the system clock. @ TMD_System_Clock++; LDR r0,System_Clock @ Pickup system clock address LDR r1,[r0,#0] @ Pickup system clock contents ADD r1,r1,#1 @ Increment system clock STR r1,[r0,#0] @ Store new system clock value @ Determine if the count-down timer is active. @ if (TMD_Timer_State == TM_ACTIVE) @ { LDR r1,Timer_State @ Build address to timer state flag LDR r0,[r1,#0] @ Pickup timer state MOV r3,#2 @ Build expired value CMP r0,#0 @ Is there a timer active? BNE TMT_No_Timer_Active @ No, skip timer processing @ Decrement the count-down timer. @ TMD_Timer--; LDR r0,Timer @ Build timer address LDR r2,[r0,#0] @ Pickup the current timer value @ Test if the Timer is at 0 and if so skip the decrement cmp r2,#1 beq EXPIRED SUBS r2,r2,#1 @ Decrement the timer value STR r2,[r0,#0] @ Store the new timer value bne TMT_No_Timer_Active @ Skip over the Set Timer State @ Determine if the timer has expired. If so, modify the state @ to indicate that it has expired. @ if (TMD_Timer == 0) @ TMD_Timer_State = TM_EXPIRED; EXPIRED: STREQ r3,[r1,#0] @ Change the timer state to @ expired @ } TMT_No_Timer_Active: @ Determine if the time-slice timer is active. Note that the parameters @ for the time-slice are controlled by the Thread Control (TC) @ component. @ if (TMD_Time_Slice_State == TM_ACTIVE) @ { LDR r0,Slice_State @ Build time slice state address LDR r2,[r0,#0] @ Pickup time slice state CMP r2,#0 @ Is there a time slice active? BNE TMT_No_Time_Slice_Active @ No, skip time slice processing @ Decrement the time slice counter. @ TMD_Time_Slice--; LDR r2,Time_Slice @ Build time slice address LDR r3,[r2,#0] @ Pickup the time slice value SUBS r3,r3,#1 @ Decrement the time slice STR r3,[r2,#0] @ Store the new time slice value @ Determine if the time-slice timer has expired. If so, modify the @ time-slice state to indicate that it has. @ if (TMD_Time_Slice == 0) @ { BNE TMT_No_Time_Slice_Active @ Has time slice expired? @ TMD_Time_Slice_State = TM_EXPIRED; MOV r3,#2 @ Build TM_EXPIRED value STR r3,[r0,#0] @ Indicate time slice is expired @ Copy the current thread into the time-slice task pointer. @ TMD_Time_Slice_Task = TCD_Current_Thread; LDR r2,Current_Thread @ Pickup current thread pointer adr LDR r2,[r2,#0] @ Pickup current thread pointer LDR r3,Slice_Task @ Pickup time slice task pointer ad STR r2,[r3,#0] @ Store current thread pointer @ ((TC_TCB *) TCD_Current_Thread) -> tc_cur_time_slice = 1; MOV r3,#1 @ For safety, place a minimal time- STR a4,[a3,#0x20]! @ slice into the task's control @ block @ } @ } TMT_No_Time_Slice_Active: @ Determine if either of the basic timers have expired. If so, @ activate the timer HISR. @ if ((TMD_Timer_State == TM_EXPIRED) || @ (TMD_Time_Slice_State == TM_EXPIRED)) @ { LDR r1,[r1,#0] @ Pickup timer state CMP r1,#2 @ Does it indicate expiration? LDRNE r0,[r0,#0] @ Pickup time slice state CMPNE r0,#2 @ Does it indicate expiration? BXNE r14 @ Return if no expiration @ Activate the HISR timer function. @ TCT_Activate_HISR(&TMD_HISR); STR r14,[r13, #-4]! @ Save r14 on the stack LDR r0,HISR @ Build address of timer HISR BL TCT_Activate_HISR @ Activate timer HISR LDR r14,[r13], #4 @ Recover return address @ } BX r14 @ Return to caller @}