view src/nucleus/gcc/tmt.S @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +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

@}