diff gsm-fw/bsp/rtc/rtc_functions.c @ 159:3c42e6e5fc04

gsm-fw/bsp/rtc: initial import from Leonardo TCS211 semi-src
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 17 Nov 2013 22:10:10 +0000
parents
children dbfc9ff4e8d2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/bsp/rtc/rtc_functions.c	Sun Nov 17 22:10:10 2013 +0000
@@ -0,0 +1,813 @@
+/************************************************************************************/
+/* rtc_functions.c :            contains low level function for the rtc             */
+/*                                                                                  */
+/*                                                                                  */
+/*   Author: Laurent Sollier                                                        */
+/*                                                                                  */
+/*   version: 1.0                                                                   */
+/*                                                                                  */
+/*   Date: 03/20/01                                                                 */
+/*   (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved      */   
+/************************************************************************************/
+
+#ifndef _WINDOWS
+   #include "l1sw.cfg" 
+   #include "chipset.cfg" 
+#endif
+
+#include <string.h> /* needed for memset */
+#include "nucleus.h" 
+
+#include "rtc/rtc_messages_i.h"
+#include "rtc/rtc_api.h"
+#include "rtc/rtc_i.h"
+#include "rtc/board/rtc_config.h" 
+
+#include "rvm/rvm_use_id_list.h"
+
+#include "memif/mem.h"
+#include "inth/iq.h"
+#include "ulpd/ulpd.h"
+
+#if (CHIPSET == 12)
+  #include "inth/sys_inth.h"
+#else
+  #include "inth/inth.h"
+#endif
+
+/* ----- Macro ----- */
+/*-------------------------------------------------------------*/
+/* RTC_STOP                                                    */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Stop the RTC (STOP_RTC is cleared)          */
+/*-------------------------------------------------------------*/
+#define RTC_STOP  (* (volatile UINT8 *) RTC_CTRL_REG &= ~RTC_START_RTC)
+
+/*-------------------------------------------------------------*/
+/* RTC_START                                                   */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Start the RTC                               */
+/*-------------------------------------------------------------*/
+#define RTC_START (* (volatile UINT8 *) RTC_CTRL_REG |= RTC_START_RTC) 
+
+/*-------------------------------------------------------------*/
+/* RTC_SET_32_CNT                                              */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Set the SET_32_COUNTER bit                  */
+/*-------------------------------------------------------------*/
+#define RTC_SET_32_CNT (* (volatile UINT8 *) RTC_CTRL_REG |= RTC_SET_32_COUNTER)
+
+/*-------------------------------------------------------------*/
+/* RTC_RESET_32_CNT                                            */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Reset the SET_32_COUNTER bit                */
+/*-------------------------------------------------------------*/
+#define RTC_RESET_32_CNT  (* (volatile UINT8 *) RTC_CTRL_REG &= ~RTC_SET_32_COUNTER)
+
+/*-------------------------------------------------------------*/
+/* RTC_SET_TEST_MODE                                           */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Set the TEST_MODE bit                       */
+/*-------------------------------------------------------------*/
+#define RTC_SET_TEST_MODE (* (volatile UINT8 *) RTC_CTRL_REG |= RTC_TEST_MODE)
+
+/*-------------------------------------------------------------*/
+/* RTC_ENABLE_IT_ALARM                                         */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Enable the IT_ALARM                         */
+/*-------------------------------------------------------------*/
+#define RTC_ENABLE_IT_ALARM (* (volatile UINT8 *) RTC_INTERRUPTS_REG |= RTC_IT_ALARM)
+
+/*-------------------------------------------------------------*/
+/* RTC_DISABLE_IT_ALARM                                        */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Disable the IT_ALARM                        */
+/*-------------------------------------------------------------*/
+#define RTC_DISABLE_IT_ALARM (* (volatile UINT8 *) RTC_INTERRUPTS_REG &= ~RTC_IT_ALARM)
+
+/*-------------------------------------------------------------*/
+/* RTC_ENABLE_IT_TIMER                                         */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Enable the IT_TIMER                         */
+/*-------------------------------------------------------------*/
+#define RTC_ENABLE_IT_TIMER (* (volatile UINT8 *) RTC_INTERRUPTS_REG |= RTC_IT_TIMER)
+
+/*-------------------------------------------------------------*/
+/* RTC_DISABLE_IT_TIMER                                        */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Disable the IT_TIMER                        */
+/*-------------------------------------------------------------*/
+#define RTC_DISABLE_IT_TIMER (* (volatile UINT8 *) RTC_INTERRUPTS_REG &= ~RTC_IT_TIMER)
+
+/*-------------------------------------------------------------*/
+/* RTC_SET_EVENT_TIMER                                         */
+/*-------------------------------------------------------------*/
+/* Parameters :   event to enable or disable                   */
+/* Return :   none                                             */
+/* Functionality : Set the event for the IT_TIMER              */
+/*         Enable or disable IT                                */
+/*-------------------------------------------------------------*/
+#define RTC_SET_EVENT_TIMER(x) (* (volatile UINT8 *) RTC_INTERRUPTS_REG = (* (volatile UINT8 *) RTC_INTERRUPTS_REG & 0xfffc) | (x))
+
+/*-------------------------------------------------------------*/
+/* RTC_TEST_BUSY                                               */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Return the RTC state busy signal            */
+/*-------------------------------------------------------------*/
+#define RTC_TEST_BUSY ((* (volatile UINT8 *) RTC_STATUS_REG) & RTC_BUSY) 
+
+/*-------------------------------------------------------------*/
+/* RTC_RUN_STATE                                               */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Return the RTC run state                    */
+/*-------------------------------------------------------------*/
+#define RTC_RUN_STATE ((* (volatile UINT8 *) RTC_STATUS_REG) & RTC_RUN) 
+
+/*-------------------------------------------------------------*/
+/* RTC_FREE_AL_ITLINE                                          */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : free it AL line                             */
+/*-------------------------------------------------------------*/
+
+#define RTC_FREE_AL_ITLINE ((* (volatile UINT8 *) RTC_STATUS_REG) |= RTC_ALARM) 
+
+/*-------------------------------------------------------------*/
+/* RTC_FREE_POWER_UP                                           */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : clear reset event                           */
+/*-------------------------------------------------------------*/
+
+#define RTC_FREE_POWER_UP ((* (volatile UINT8 *) RTC_STATUS_REG) |= RTC_POWER_UP) 
+
+
+/*-------------------------------------------------------------*/
+/* RTC_GET_EVENT_TIMER                                         */
+/*-------------------------------------------------------------*/
+/* Parameters :   none                                         */
+/* Return :   none                                             */
+/* Functionality : Get the event status for the IT_TIMER       */
+/*-------------------------------------------------------------*/
+#define RTC_GET_EVENT_TIMER ((* (volatile UINT8 *) RTC_STATUS_REG & 0x3c))
+
+
+
+
+/* ----- Global variables ----- */
+static T_RTC_DATE_TIME rtc_date_time_alarm = {0};
+
+static T_RV_RETURN rtc_return_path = {RVF_INVALID_ADDR_ID, NULL};
+static T_RTC_ALARM* rtc_msg_alarm_event = NULL;
+
+extern T_RTC_ENV_CTRL_BLK* rtc_env_ctrl_blk;
+
+/* Number of 32 Khz clock */
+static UINT32 rtc_nb_32khz = 0;
+
+/* Number of high frequency clock */
+static UINT32 rtc_nb_hf = 0;
+
+static NU_HISR hisr;
+char hisrStack[512];
+
+// UINT16 toto = 0; tmp
+
+void HisrEntryFunc(void)
+{
+   if (rtc_msg_alarm_event)
+      rvf_send_msg(rtc_env_ctrl_blk->addr_id, rtc_msg_alarm_event);
+   //char comp[15];
+/*   sprintf(comp,"%d",toto);
+   LCDG_WriteString( 4, 0, "              ");
+   LCDG_WriteString( 3, 0, (char*) comp); //tmp */
+}
+
+
+/*---------------------------------------------------------------*/
+/* conv_bin   DCB => B                                           */
+/*---------------------------------------------------------------*/
+/* Parameters : value to be convert                              */
+/* Return :   none                                               */
+/* Functionality : BCD et binary conversion function             */
+/*---------------------------------------------------------------*/
+
+static UINT8 conv_bin(UINT8 value)
+{
+   return (10*(value>>4) + ( value & 0x0f));
+}
+
+/*---------------------------------------------------------------*/
+/* conv_bcd    B => DCB                                          */
+/*---------------------------------------------------------------*/
+/* Parameters : value to be convert                              */
+/* Return :   none                                               */
+/* Functionality : Binary to BCD conversion function             */
+/*---------------------------------------------------------------*/
+
+static UINT8 conv_bcd(UINT8 value)
+{
+   return ((value%10) | ( (value/10) <<4));
+}
+
+
+
+/*---------------------------------------------------------------*/
+/* format_date_available                                         */
+/*---------------------------------------------------------------*/
+/* Parameters : T_RTC_DATE_TIME structure                        */
+/* Return :     TRUE if format is available                      */
+/*              FALSE else                                       */
+/* Functionality : test if date and time format is available     */
+/*---------------------------------------------------------------*/
+
+BOOL format_date_available(T_RTC_DATE_TIME date_time)
+{
+   UINT8 m;
+
+   if (date_time.second < 0 || date_time.second > 59)
+      return FALSE;
+   if (date_time.minute < 0 || date_time.minute > 59)
+      return FALSE;
+   if (date_time.mode_12_hour == FALSE)
+   {
+      if (date_time.hour < 0 || date_time.hour > 23)
+         return FALSE;
+   }
+   else
+      if (date_time.hour < 1 || date_time.hour > 12)
+         return FALSE;
+
+   if (date_time.month < 1 || date_time.month > 12)
+      return FALSE;
+   if (date_time.year < 0 || date_time.year > 99)
+      return FALSE;
+   if (date_time.wday < 0 || date_time.wday > 6)
+      return FALSE;
+   m = date_time.month;
+   if (m == 1||m == 3||m == 5||m == 7||m == 8||m == 10||m == 12)
+   {
+      if (date_time.day < 1 || date_time.day > 31)
+         return FALSE;
+   }
+   else
+   {
+      if (m == 4||m == 6||m == 9||m == 11)
+      {
+         if (date_time.day < 1 || date_time.day > 30)
+            return FALSE;
+      }
+      else
+      {
+         if (date_time.year%4)
+         {
+            if (date_time.day < 1 || date_time.day > 28)
+               return FALSE;
+         }
+         else
+         {
+            if (date_time.day < 1 || date_time.day > 29)
+               return FALSE;
+         }
+      }
+   }
+   return TRUE;
+}
+
+
+
+/*******************************************************************************
+ *
+ *                               RTC_Initialize
+ *
+ ******************************************************************************/
+
+
+
+T_RVF_RET RTC_Initialize(void)
+{
+   T_RVF_MB_STATUS   mb_status;
+
+   /* Reserve memory for alarm event */
+   mb_status = rvf_get_buf (rtc_env_ctrl_blk->prim_id, sizeof (T_RTC_ALARM ), (void **) &rtc_msg_alarm_event);   
+
+   if ((mb_status == RVF_GREEN) || (mb_status == RVF_YELLOW)) /* Memory allocation success */
+   {      
+      rtc_msg_alarm_event->os_hdr.msg_id = RTC_ALARM_EVT;
+   }
+   else
+   {
+      rtc_msg_alarm_event = NULL;
+      return RVF_MEMORY_ERR;
+   }
+
+   rtc_env_ctrl_blk->msg_alarm_event = rtc_msg_alarm_event;
+
+
+   /* Start RTC module */
+   if (RTC_RUN_STATE == 0)
+      RTC_START;
+
+   /* Enable auto compensation */
+    //*(volatile UINT8*) RTC_CTRL_REG |= RTC_AUTO_COMP;
+   /* Disable auto compensation */
+    *(volatile UINT8*) RTC_CTRL_REG &= ~RTC_AUTO_COMP;
+
+    /* For CHIPSET = 7, 9, 10 or 11, set analog baseband type */
+#if (((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11)) && (ANLG_FAM == 1))
+   *(volatile UINT8*) RTC_CTRL_REG |= RTC_nDELTA_OMEGA;
+#endif
+
+   /* Activate periodic interrupt every minute*/
+   /* Disable all IT before accessing register */
+   rvf_disable(25);
+
+   /* Enable IRQ9 and IRQ10 */
+   #if (CHIPSET == 12)
+     F_INTH_ENABLE_ONE_IT(C_INTH_RTC_TIMER_IT);
+     F_INTH_ENABLE_ONE_IT(C_INTH_RTC_ALARM_IT);
+   #else
+     IQ_Unmask(IQ_RTC_TIMER);
+     IQ_Unmask(IQ_RTC_ALARM);
+   #endif
+
+   while (RTC_TEST_BUSY);
+   RTC_SET_EVENT_TIMER(RTC_EVERY_MIN); /* Set timer every minute */
+   RTC_ENABLE_IT_TIMER;
+   RTC_DISABLE_IT_ALARM;
+
+   rvf_enable();
+
+   /* The stack is entirely filled with the pattern 0xFE. */
+   memset (hisrStack, 0xFE, sizeof(hisrStack));
+
+   /* Temporary modification: create HISR to diplay compensation value */
+   NU_Create_HISR(&hisr, "RTC_HISR", HisrEntryFunc, 2, hisrStack, sizeof(hisrStack)); // lowest prty
+   /* end temporary modification */
+
+   return RVF_OK;
+}
+/*******************************************************************************
+ *
+ *                               RTC_RtcReset
+ *
+ ******************************************************************************/
+
+BOOL RTC_RtcReset(void)
+{
+
+   /* Read POWER UP bit to inform MMI of a possible RTC reset */
+   if ( ((* (volatile UINT8*) RTC_STATUS_REG) & RTC_POWER_UP) )
+   {
+      RTC_FREE_POWER_UP;
+      return TRUE;
+   }
+   else
+      return FALSE;
+
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_GetDateTime
+ *
+ ******************************************************************************/
+
+T_RVF_RET RTC_GetDateTime(T_RTC_DATE_TIME* date_time)
+{
+   UINT8 sec;
+   UINT8 min;
+   UINT8 hour;
+   UINT8 day;
+   UINT8 month;
+   UINT8 year;
+   UINT8 wday;
+   UINT8 hr_reg;
+
+   /* Disable all IT before reading register */
+   rvf_disable(25);
+
+   if (RTC_TEST_BUSY)
+   {   
+      rvf_enable();
+      return RVF_NOT_READY;
+   }
+   else
+   {
+      day  = * (volatile UINT8 *) RTC_DAYS_REG;
+      month  = * (volatile UINT8 *) RTC_MONTHS_REG;
+      year = * (volatile UINT8 *) RTC_YEARS_REG;
+      wday = * (volatile UINT8 *) RTC_WEEK_REG;   
+      sec  = * (volatile UINT8 *) RTC_SECONDS_REG;
+      min  = * (volatile UINT8 *) RTC_MINUTES_REG;
+      hr_reg = * (volatile UINT8 *) RTC_HOURS_REG;
+      rvf_enable();
+   }
+
+   hour = (0x7f & hr_reg);
+
+   date_time->second = conv_bin(sec);
+   date_time->minute = conv_bin(min);
+   date_time->hour = conv_bin(hour);
+
+   if ( (* (volatile UINT8 *)RTC_CTRL_REG & RTC_MODE_12_24 ) == 0)
+   {
+      /* 24 hour mode */
+      date_time->mode_12_hour = FALSE;
+      date_time->PM_flag = FALSE;
+   }
+   else
+   {
+      /* 12 hour mode */
+      date_time->mode_12_hour = TRUE;
+      if ((hr_reg & 0x80) == 0)
+         date_time->PM_flag = FALSE;
+      else
+         date_time->PM_flag = TRUE;
+   }
+
+   date_time->day = conv_bin(day);
+   date_time->month = conv_bin(month);
+   date_time->year = conv_bin(year);
+   date_time->wday = conv_bin(wday);
+
+   return RVF_OK;
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_SetDateTime
+ *
+ ******************************************************************************/
+
+T_RVF_RET RTC_SetDateTime(T_RTC_DATE_TIME date_time)
+{
+   UINT8 sec;
+   UINT8 min;
+   UINT8 hour;
+   UINT8 day;
+   UINT8 month;
+   UINT8 year;
+   UINT8 wday;
+
+   /* testing parameter range validity */
+   if (!format_date_available(date_time))
+      return RVF_INVALID_PARAMETER;
+
+
+   sec = conv_bcd(date_time.second);
+   min = conv_bcd(date_time.minute);
+   if (date_time.mode_12_hour == FALSE)
+   {
+      * (volatile UINT8 *)RTC_CTRL_REG &= ~RTC_MODE_12_24;
+      hour = conv_bcd(date_time.hour);
+   }
+   else
+   {
+      * (volatile UINT8 *)RTC_CTRL_REG |= RTC_MODE_12_24;
+      hour = conv_bcd(date_time.hour);
+      if (date_time.PM_flag != FALSE)
+         hour |= (0x80);
+   }
+
+   day = conv_bcd(date_time.day);
+   month = conv_bcd(date_time.month);
+   year = conv_bcd(date_time.year);
+   wday = conv_bcd(date_time.wday);
+
+   /* Disable all IT before reading register */
+   rvf_disable(25);
+
+   if (RTC_TEST_BUSY)
+   {   
+      rvf_enable();
+      return RVF_NOT_READY;
+   }
+   else
+   {
+      * (volatile UINT8 *) RTC_DAYS_REG = day;
+      * (volatile UINT8 *) RTC_MONTHS_REG = month;
+      * (volatile UINT8 *) RTC_YEARS_REG = year;
+      * (volatile UINT8 *) RTC_WEEK_REG = wday;   
+      * (volatile UINT8 *) RTC_SECONDS_REG = sec;
+      * (volatile UINT8 *) RTC_MINUTES_REG = min;
+      * (volatile UINT8 *) RTC_HOURS_REG = hour;
+
+      rvf_enable();
+   }
+
+   return RVF_OK;
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_GetAlarm
+ *
+ ******************************************************************************/
+
+T_RVF_RET RTC_GetAlarm(T_RTC_DATE_TIME* date_time)
+{
+   date_time->second = rtc_date_time_alarm.second;
+   date_time->minute = rtc_date_time_alarm.minute;
+   date_time->hour = rtc_date_time_alarm.hour;
+   date_time->day = rtc_date_time_alarm.day;
+   date_time->month = rtc_date_time_alarm.month;
+   date_time->year = rtc_date_time_alarm.year;
+   date_time->wday = rtc_date_time_alarm.wday;
+   date_time->mode_12_hour = rtc_date_time_alarm.mode_12_hour;
+   date_time->PM_flag = rtc_date_time_alarm.PM_flag;
+   return RVF_OK;
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_SetAlarm
+ *
+ ******************************************************************************/
+
+T_RVF_RET RTC_SetAlarm(T_RTC_DATE_TIME date_time, T_RV_RETURN return_path)
+{
+   UINT8 sec;
+   UINT8 min;
+   UINT8 hour;
+   UINT8 day;
+   UINT8 month;
+   UINT8 year;
+   UINT8 wday;
+
+
+   /* testing parameter range validity */
+   if (!format_date_available(date_time))
+      return RVF_INVALID_PARAMETER;
+
+   sec = conv_bcd(date_time.second);
+   min = conv_bcd(date_time.minute);
+
+   if (date_time.mode_12_hour == FALSE)
+      hour = conv_bcd(date_time.hour);
+   else
+      hour = conv_bcd(date_time.hour) | (date_time.PM_flag << 7);
+
+   day = conv_bcd(date_time.day);
+   month = conv_bcd(date_time.month);
+   year = conv_bcd(date_time.year);
+   wday = conv_bcd(date_time.wday);
+
+
+   /* Disable all IT before reading register */
+   rvf_disable(25);
+
+   if (RTC_TEST_BUSY)
+   {   
+      rvf_enable();
+      return RVF_NOT_READY;
+   }
+   else
+   {
+      *(volatile UINT8*) RTC_ALARM_DAYS_REG = day;
+      *(volatile UINT8*) RTC_ALARM_MONTHS_REG = month;
+      *(volatile UINT8*) RTC_ALARM_YEARS_REG = year;   
+      *(volatile UINT8*) RTC_ALARM_SECONDS_REG = sec;
+      *(volatile UINT8*) RTC_ALARM_MINUTES_REG = min;
+      *(volatile UINT8*) RTC_ALARM_HOURS_REG = hour;
+
+      /* Enable alarm*/
+      RTC_ENABLE_IT_ALARM;
+      rvf_enable();
+
+      /* Save callback */
+      rtc_return_path.callback_func = return_path.callback_func;
+      rtc_return_path.addr_id        = return_path.addr_id;
+   }
+   return RVF_OK;
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_UnsetAlarm
+ *
+ ******************************************************************************/
+
+T_RVF_RET RTC_UnsetAlarm(void)
+{
+   /* Disable all IT before reading register */
+   rvf_disable(25);
+
+   if (RTC_TEST_BUSY)
+   {   
+      rvf_enable();
+      return RVF_NOT_READY;
+   }
+   else
+   {
+      /* Disable alarm*/
+      RTC_DISABLE_IT_ALARM;
+      rvf_enable();
+   }
+   return RVF_OK;
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_Rounding30s
+ *
+ ******************************************************************************/
+
+void RTC_Rounding30s(void)
+{
+   *(UINT8*) RTC_CTRL_REG |= RTC_ROUND_30S;
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_Set12HourMode
+ *
+ ******************************************************************************/
+
+void RTC_Set12HourMode(BOOL Mode12Hour)
+{
+  if ( Mode12Hour == FALSE)
+   * (volatile UINT8*) RTC_CTRL_REG &= 0xf7;
+  else
+   * (volatile UINT8*) RTC_CTRL_REG |= 0x08;
+
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_Is12HourMode
+ *
+ ******************************************************************************/
+
+BOOL RTC_Is12HourMode(void)
+{
+   if ( (*(volatile UINT8*) RTC_CTRL_REG & RTC_MODE_12_24) )
+      return TRUE;
+   else
+      return FALSE;
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_ItTimerHandle
+ *
+ ******************************************************************************/
+
+void RTC_ItTimerHandle(void)
+{
+   static double compensation = 0;
+   static UINT8 nb_sample = 0;
+   double delta;
+   UINT16 value = 0;
+   INT16 tmp_value = 0;
+   UINT8 cmp[15];
+
+   /* Evaluate average on one hour max */
+   if ( nb_sample < 60)
+      nb_sample++;
+
+   /* perform calculation of auto compensation each minute and evaluate an
+      average on one hour */
+   /* Number of 32 kHz clock lost in one second */
+   /* Accurate operation is : delta = CLK_32 - rtc_nb_32khz*CLK_PLL/g_nb_hf */
+   /* with CLK_32 = 32768 Hz and CLK_PLL depend on chipset */
+   delta = RTC_CLOCK_32K - rtc_nb_32khz*RTC_CLOCK_HF/rtc_nb_hf;
+
+   /* Number of 32 kHz clock lost in one hour */
+   delta *= 3600.0;
+
+   /* Average of the compensation to load */
+   compensation = (compensation*(nb_sample-1) + delta)/nb_sample;
+
+   if (compensation >= 0x7FFF)
+      tmp_value = 0x7FFE;
+   else if (compensation <= -0x7FFF)
+      tmp_value = -0x7FFE;
+   else
+      tmp_value = (INT16) compensation;
+
+   if (tmp_value > 0) /* if 32 Khz clock is slow */
+      value = tmp_value;
+   if (tmp_value < 0) /* if 32 Khz clock is fast */
+      value = 0xFFFF + tmp_value + 1;
+
+   /* Set value in compensation register */
+   if (!RTC_TEST_BUSY)
+   {
+      *(volatile UINT8*) RTC_COMP_MSB_REG = (UINT8) (value >> 8);
+      *(volatile UINT8*) RTC_COMP_LSB_REG = (UINT8) (value & 0xFF);
+   }
+/*toto = value; tmp*/
+/*NU_Activate_HISR(&hisr); tmp*/
+
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_ItAlarmHandle
+ *
+ ******************************************************************************/
+
+void RTC_ItAlarmHandle(void)
+{
+   /* Sending alarm event */
+   /* Post alarm event in RTC mailbox */
+   NU_Activate_HISR(&hisr);
+
+   /*if (rtc_msg_alarm_event)
+      rvf_send_msg(rtc_env_ctrl_blk->task_id, rtc_env_ctrl_blk->mbox_id, rtc_msg_alarm_event);*/
+
+   /* Free alarm IT line */
+   RTC_FREE_AL_ITLINE;
+}
+
+/*******************************************************************************
+ *
+ *                               RTC_GaugingHandler
+ *
+ ******************************************************************************/
+void RTC_GaugingHandler(void)
+{
+   /* Number of 32 Khz clock at the end of the gauging */
+   rtc_nb_32khz =  ((*(volatile UINT16 *)ULDP_COUNTER_32_MSB_REG) * 0x10000) +
+             (*(volatile UINT16 *)ULDP_COUNTER_32_LSB_REG);     
+
+   /* Number of high frequency clock at the end of the gauging */
+   /* To convert in nbr of 13 Mhz clocks (5*13=65Mhz) */
+   rtc_nb_hf =   ( ((*(volatile UINT16 *)ULDP_COUNTER_HI_FREQ_MSB_REG) * 0x10000) +
+            (*(volatile UINT16 *)ULDP_COUNTER_HI_FREQ_LSB_REG) );
+}
+
+
+/*******************************************************************************
+ *
+ *                               RTC_ProcessAlarmEvent
+ *
+ ******************************************************************************/
+
+void RTC_ProcessAlarmEvent(void)
+{
+   T_RVF_MB_STATUS mb_status;
+   T_RTC_ALARM* msg_alarm;
+
+   /* Call MMI */
+   if (rtc_return_path.callback_func != NULL)
+   {
+      rtc_return_path.callback_func(NULL);
+   }
+   else
+   {
+      /* Reserve memory for alarm event */
+      mb_status = rvf_get_buf (rtc_env_ctrl_blk->prim_id, sizeof (T_RTC_ALARM ), (void **) &msg_alarm);   
+
+      if ((mb_status == RVF_GREEN) || (mb_status == RVF_YELLOW)) /* Memory allocation success */
+      {      
+         msg_alarm->os_hdr.msg_id = RTC_ALARM_EVT;
+         /* Send event in the mailbox */
+         rvf_send_msg(rtc_return_path.addr_id, msg_alarm);
+      }
+      else
+      {
+         rvf_send_trace("Memory allocation error",23, NULL_PARAM, RV_TRACE_LEVEL_ERROR, RTC_USE_ID );
+      }
+   }
+}
+
+
+
+/*---------------------------------------------------------------------------------------*/
+