view src/nucleus/tms470/tmt.s @ 51:04aaa5622fa7

disable deep sleep when Iota LEDB is on TI's Iota chip docs say that CLK13M must be running in order for LEDB to work, and practical experience on Mot C139 which uses Iota LEDB for its keypad backlight concurs: if Calypso enters deep sleep while the keypad backlight is turned on, the light flickers visibly as the chipset goes into and out of deep sleep. TI's original L1 sleep manager code had logic to disable deep sleep when LT_Status() returns nonzero, but that function only works for B-Sample and C-Sample LT, always returns 0 on BOARD 41 - no check of Iota LEDB status anywhere. Change this code for our current hardware: disable deep sleep when Iota LEDB has been turned on through LLS.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 19 Oct 2020 05:11:29 +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.
LOCKOUT                     .equ    00C0h   ; Interrupt lockout value

	.state32

;**********************************
;* EXTERNAL VARIABLE DECLARATIONS *
;**********************************
; Define external inner-component global data references.
;extern VOID           *TCD_Current_Thread;
;extern UNSIGNED        TMD_System_Clock;
;extern UNSIGNED        TMD_Timer;
;extern INT             TMD_Timer_State;
;extern UNSIGNED        TMD_Time_Slice;
;extern TC_TCB         *TMD_Time_Slice_Task;
;extern INT             TMD_Time_Slice_State;
;extern TC_HCB          TMD_HISR;

        .ref  _TCD_Current_Thread
        .ref  _TMD_System_Clock
        .ref  _TMD_Timer
        .ref  _TMD_Timer_State
        .ref  _TMD_Time_Slice
        .ref  _TMD_Time_Slice_Task
        .ref  _TMD_Time_Slice_State
        .ref  _TMD_HISR
        .ref  _TCD_Interrupt_Level

; Define activate HISR function.
;STATUS  TCT_Activate_HISR(TC_HCB *hisr);

        .ref  _TCT_Activate_HISR

    .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)
;{
    .def    $TMT_Set_Clock
$TMT_Set_Clock                              ; Dual-state interworking veneer
    .state16
    BX  r15
    NOP
    .state32
    B   _TMT_Set_Clock

        .def    _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)
;{
    .def    $TMT_Retrieve_Clock
$TMT_Retrieve_Clock                         ; Dual-state interworking veneer   
    .state16
    BX  r15
    NOP
    .state32
    B   _TMT_Retrieve_Clock

        .def    _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)
;{
    .def    $TMT_Read_Timer
$TMT_Read_Timer                             ; Dual-state interworking veneer
    .state16
    BX  r15
    NOP
    .state32
    B   _TMT_Read_Timer

        .def    _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)
;{
    .def    $TMT_Enable_Timer
$TMT_Enable_Timer                           ; Dual-state interworking veneer
    .state16
    BX  r15
    NOP
    .state32
    B   _TMT_Enable_Timer

        .def    _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)
;{
    .def    $TMT_Adjust_Timer
$TMT_Adjust_Timer                           ; Dual-state interworking veneer
    .state16
    BX  r15
    NOP
    .state32
    B   _TMT_Adjust_Timer

        .def    _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)
;{
    .def    $TMT_Disable_Timer
$TMT_Disable_Timer                          ; Dual-state interworking veneer
    .state16
    BX  r15
    NOP
    .state32
    B   _TMT_Disable_Timer

        .def    _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)
;{
    .def    $TMT_Retrieve_TS_Task
$TMT_Retrieve_TS_Task                        ; Dual-state interworking veneer
    .state16
    BX  r15
    NOP
    .state32
    B   _TMT_Retrieve_TS_Task

        .def    _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)
;{
        .def  _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,#20h]!                   ; 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

;}
        .end