Exemplo n.º 1
0
int32_t DrvRTC_Open (S_DRVRTC_TIME_DATA_T *sPt)
{
    uint32_t u32Reg;
	
	volatile int32_t i32delay=1000;
    
	RTC_TLR_T tlr = {0};
	RTC_CLR_T clr = {0};
    
    /*-----------------------------------------------------------------------------------------------------*/
    /* DO BASIC JUDGEMENT TO Check RTC time data value is reasonable or not.                               */
    /*-----------------------------------------------------------------------------------------------------*/
    if ( ((sPt->u32Year - DRVRTC_YEAR2000) > 99)|
         ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12))|
         ((sPt->u32cDay   == 0) || (sPt->u32cDay   > 31)))
    {
        return E_DRVRTC_ERR_CALENDAR_VALUE;
    }

    if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)
    {
        if ( (sPt->u32cHour == 0) || (sPt->u32cHour > 12) )
        {
            return E_DRVRTC_ERR_TIMESACLE_VALUE ;
        }
    }
    else if (sPt->u8cClockDisplay == DRVRTC_CLOCK_24)
    {
        if (sPt->u32cHour > 23)
        {
            return E_DRVRTC_ERR_TIMESACLE_VALUE ;
        }
    }
    else
    {
        return E_DRVRTC_ERR_TIMESACLE_VALUE ;
    }

    if ((sPt->u32cMinute > 59) |
        (sPt->u32cSecond > 59) |
        (sPt->u32cSecond > 59))
    {
        return E_DRVRTC_ERR_TIME_VALUE ;
    }
    if (sPt->u32cDayOfWeek > 6)
    {
        return E_DRVRTC_ERR_DWR_VALUE ;
    }

    /*-----------------------------------------------------------------------------------------------------*/
    /* Important, call RTC_WriteEnable() before write data into any register.                              */
    /* User should be write data as soon as possible.Access enable wiil clear after 200ms                  */
	/*-----------------------------------------------------------------------------------------------------*/
    g_u32Reg = DrvRTC_WriteEnable();
    if (g_u32Reg != 0)
    {
        return E_DRVRTC_ERR_FAILED;
    }
    
    /*-----------------------------------------------------------------------------------------------------*/
    /* Second, set RTC 24/12 hour setting                                                                  */
    /*-----------------------------------------------------------------------------------------------------*/
    if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)
    {
        DrvRTC_WriteEnable();
 		RTC->TSSR.HR24 = DRVRTC_CLOCK_12;

        /*-------------------------------------------------------------------------------------------------*/
        /* important, range of 12-hour PM mode is 21 upto 32                                               */
        /*-------------------------------------------------------------------------------------------------*/
        if (sPt->u8cAmPm == DRVRTC_PM)
            sPt->u32cHour += 20;
    }
    else                                                                               /* RTC_CLOCK_24 */
    {

        DrvRTC_WriteEnable();
 		RTC->TSSR.HR24 = DRVRTC_CLOCK_24;
        RTCDEBUG ("RTC: 24-hour\n");
    }

    /*-----------------------------------------------------------------------------------------------------*/
    /* Set RTC Calender Loading                                                                            */
    /*-----------------------------------------------------------------------------------------------------*/
    u32Reg    = ((sPt->u32Year - DRVRTC_YEAR2000) / 10) << 20;
    u32Reg    |= (((sPt->u32Year - DRVRTC_YEAR2000) % 10) << 16);
    u32Reg    |= ((sPt->u32cMonth  / 10) << 12);
    u32Reg    |= ((sPt->u32cMonth  % 10) << 8);
    u32Reg    |= ((sPt->u32cDay    / 10) << 4);
    u32Reg    |= (sPt->u32cDay     % 10);
    g_u32Reg = u32Reg;
	
	DrvRTC_WriteEnable();
 	RTC->TSSR.HR24 = DRVRTC_CLOCK_24;
    outpw(&RTC->CLR, (uint32_t)g_u32Reg);

	/*-----------------------------------------------------------------------------------------------------*/
    /* Set RTC Time Loading                                                                                */
    /*-----------------------------------------------------------------------------------------------------*/
    u32Reg     = ((sPt->u32cHour / 10) << 20);
    u32Reg    |= ((sPt->u32cHour % 10) << 16);
    u32Reg    |= ((sPt->u32cMinute / 10) << 12);
    u32Reg    |= ((sPt->u32cMinute % 10) << 8);
    u32Reg    |= ((sPt->u32cSecond / 10) << 4);
    u32Reg    |= (sPt->u32cSecond % 10);
    g_u32Reg = u32Reg;

 	DrvRTC_WriteEnable();
    outpw(&RTC->TLR, (uint32_t)g_u32Reg);

	outpw(&RTC->DWR, sPt->u32cDayOfWeek);

	RTC->TTR.TWKE = sPt->u8IsEnableWakeUp;

	/* Waiting for RTC settings stable */
  	while(i32delay--);

    return E_SUCCESS;
}
Exemplo n.º 2
0
/*               Update current date/time or alarm date/time from RTC                                      */
//*--------------------------------------------------------------------------------------------------------*/
int32_t DrvRTC_Write(E_DRVRTC_TIME_SELECT eTime, S_DRVRTC_TIME_DATA_T *sPt)
{
    uint32_t u32Reg;

    /*-----------------------------------------------------------------------------------------------------*/
    /* Check RTC time data value is reasonable or not.                                                     */
    /*-----------------------------------------------------------------------------------------------------*/
    if ( ((sPt->u32Year - DRVRTC_YEAR2000) > 99)|
         ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12))|
         ((sPt->u32cDay   == 0) || (sPt->u32cDay   > 31)))
    {
        RTCDEBUG ("\nRTC: Year value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if ((sPt->u32Year - DRVRTC_YEAR2000) > 99)
    {
        RTCDEBUG ("\nRTC: Year value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12))
    {
        RTCDEBUG ("\nRTC: Month value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if ((sPt->u32cDay == 0) || (sPt->u32cDay > 31))
    {
        RTCDEBUG ("\nRTC: Day value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)
    {
        if ((sPt->u32cHour == 0) || (sPt->u32cHour > 12))
        {
            RTCDEBUG ("\nRTC: Hour value is incorrect\n");
            return E_DRVRTC_ERR_FAILED;
        }
    }
    else if (sPt->u8cClockDisplay == DRVRTC_CLOCK_24)
    {
        if (sPt->u32cHour > 23)
        {
            RTCDEBUG ("\nRTC: Hour value is incorrect\n");
            return E_DRVRTC_ERR_FAILED;
        }
    }
    else
    {
        RTCDEBUG ("\nRTC: Clock mode is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u32cMinute > 59)
    {
        RTCDEBUG ("\nRTC: Minute value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u32cSecond > 59)
    {
        RTCDEBUG ("\nRTC: Second value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u32cDayOfWeek > 6)
    {
        RTCDEBUG ("\nRTC: Day of week value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    /*-----------------------------------------------------------------------------------------------------*/
    /* Important, call RTC_Open() before write data into any register.                                     */
    /*-----------------------------------------------------------------------------------------------------*/
    g_u32Reg = DrvRTC_WriteEnable();
    if (g_u32Reg != 0)
    {
        return E_DRVRTC_ERR_FAILED;
    }

    switch (eTime)
    {

        case DRVRTC_CURRENT_TIME:
            /*---------------------------------------------------------------------------------------------*/
            /* Second, set RTC time data.                                                                  */
            /*---------------------------------------------------------------------------------------------*/
            if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)
            {
                g_chHourMode = DRVRTC_CLOCK_12;
				RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_12;
                RTCDEBUG ("RTC: 12-hour\n");
                /*-----------------------------------------------------------------------------------------*/
                /* important, range of 12-hour PM mode is 21 upto 32                                       */
                /*-----------------------------------------------------------------------------------------*/
                if (sPt->u8cAmPm == DRVRTC_PM)
                    sPt->u32cHour += 20;
            }
            else                                                                  
            {
                /* RTC_CLOCK_24 */
                g_chHourMode = DRVRTC_CLOCK_24;
    			RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_24;
                RTCDEBUG ("RTC: 24-hour\n");
            }

  			RTC->DWR.DWR = sPt->u32cDayOfWeek;
		    
			/*---------------------------------------------------------------------------------------------*/
            /* Second, set RTC time data.                                                                  */
            /*---------------------------------------------------------------------------------------------*/
			u32Reg     = ((sPt->u32Year - DRVRTC_YEAR2000) / 10) << 20;
		    u32Reg    |= (((sPt->u32Year - DRVRTC_YEAR2000) % 10) << 16);
		    u32Reg    |= ((sPt->u32cMonth  / 10) << 12);
		    u32Reg    |= ((sPt->u32cMonth  % 10) << 8);
		    u32Reg    |= ((sPt->u32cDay    / 10) << 4);
		    u32Reg    |= (sPt->u32cDay     % 10);
            g_u32Reg = u32Reg;
			DrvRTC_WriteEnable();
          
			outpw(&RTC->CLR, (uint32_t)g_u32Reg);
			RTCDEBUG ("RTC: REG_RTC_CLR[0x%08x]\n", inpw(&RTC->CLR));  
            
		    u32Reg     = ((sPt->u32cHour / 10) << 20);
		    u32Reg    |= ((sPt->u32cHour % 10) << 16);
		    u32Reg    |= ((sPt->u32cMinute / 10) << 12);
		    u32Reg    |= ((sPt->u32cMinute % 10) << 8);
		    u32Reg    |= ((sPt->u32cSecond / 10) << 4);
		    u32Reg    |= (sPt->u32cSecond % 10);
			g_u32Reg = u32Reg;
		
			DrvRTC_WriteEnable();
           	outpw(&RTC->TLR, (uint32_t)g_u32Reg);
			RTCDEBUG ("RTC: REG_RTC_TLR[0x%08x]\n", inpw(&RTC->TLR));   
			
            return E_SUCCESS;

         case DRVRTC_ALARM_TIME:

            g_pfnRTCCallBack_Alarm = NULL;                                /* Initial call back function.*/
            
			/*---------------------------------------------------------------------------------------------*/
            /* Set Calender alarm time data.                                                               */
            /*---------------------------------------------------------------------------------------------*/
		    u32Reg     = ((sPt->u32Year - DRVRTC_YEAR2000) / 10) << 20;
		    u32Reg    |= (((sPt->u32Year - DRVRTC_YEAR2000) % 10) << 16);
		    u32Reg    |= ((sPt->u32cMonth  / 10) << 12);
		    u32Reg    |= ((sPt->u32cMonth  % 10) << 8);
		    u32Reg    |= ((sPt->u32cDay    / 10) << 4);
		    u32Reg    |= (sPt->u32cDay     % 10);
            g_u32Reg = u32Reg;
			DrvRTC_WriteEnable();
			
			outpw(&RTC->CAR, (uint32_t)g_u32Reg);
			RTCDEBUG ("RTC: REG_RTC_CAR[0x%08x]\n", inpw(&RTC->CAR));  
			
						 
            if (g_chHourMode == DRVRTC_CLOCK_12)
            {
                if (sPt->u8cAmPm == DRVRTC_PM)       /* important, range of 12-hour PM mode is 21 upto 32 */
                    sPt->u32cHour += 20;
            }

			/*---------------------------------------------------------------------------------------------*/
            /* Set Time alarm time data.                                                                   */
            /*---------------------------------------------------------------------------------------------*/
		    u32Reg     = ((sPt->u32cHour / 10) << 20);
		    u32Reg    |= ((sPt->u32cHour % 10) << 16);
		    u32Reg    |= ((sPt->u32cMinute / 10) << 12);
		    u32Reg    |= ((sPt->u32cMinute % 10) << 8);
		    u32Reg    |= ((sPt->u32cSecond / 10) << 4);
		    u32Reg    |= (sPt->u32cSecond % 10);

			g_u32Reg = u32Reg;
            DrvRTC_WriteEnable();
           	outpw(&RTC->TAR, (uint32_t)g_u32Reg);
			RTCDEBUG ("RTC: REG_RTC_TAR[0x%08x]\n", inpw(&RTC->TAR));   

			/*---------------------------------------------------------------------------------------------*/
            /* Finally, enable alarm interrupt.                                                            */
            /*---------------------------------------------------------------------------------------------*/
			DrvRTC_EnableInt(DRVRTC_ALARM_INT,NULL);
            
			RTC->TTR.TWKE = sPt->u8IsEnableWakeUp;
			return E_SUCCESS;


	        default:
	        {
	            return E_DRVRTC_ERR_ENOTTY;
	        }
    }
}