i2cM41T81Clock.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.  * $Id: i2cM41T81Clock.c,v 1.3 Broadcom SDK $
  3.  * $Copyright: Copyright 2008 Broadcom Corporation.
  4.  * This program is the proprietary software of Broadcom Corporation
  5.  * and/or its licensors, and may only be used, duplicated, modified
  6.  * or distributed pursuant to the terms and conditions of a separate,
  7.  * written license agreement executed between you and Broadcom
  8.  * (an "Authorized License").  Except as set forth in an Authorized
  9.  * License, Broadcom grants no license (express or implied), right
  10.  * to use, or waiver of any kind with respect to the Software, and
  11.  * Broadcom expressly reserves all rights in and to the Software
  12.  * and all intellectual property rights therein.  IF YOU HAVE
  13.  * NO AUTHORIZED LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS SOFTWARE
  14.  * IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE
  15.  * ALL USE OF THE SOFTWARE.  
  16.  *  
  17.  * Except as expressly set forth in the Authorized License,
  18.  *  
  19.  * 1.     This program, including its structure, sequence and organization,
  20.  * constitutes the valuable trade secrets of Broadcom, and you shall use
  21.  * all reasonable efforts to protect the confidentiality thereof,
  22.  * and to use this information only in connection with your use of
  23.  * Broadcom integrated circuit products.
  24.  *  
  25.  * 2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS
  26.  * PROVIDED "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES,
  27.  * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY,
  28.  * OR OTHERWISE, WITH RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY
  29.  * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY,
  30.  * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES,
  31.  * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
  32.  * CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING
  33.  * OUT OF USE OR PERFORMANCE OF THE SOFTWARE.
  34.  * 
  35.  * 3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL
  36.  * BROADCOM OR ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL,
  37.  * INCIDENTAL, SPECIAL, INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER
  38.  * ARISING OUT OF OR IN ANY WAY RELATING TO YOUR USE OF OR INABILITY
  39.  * TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF THE
  40.  * POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF
  41.  * THE AMOUNT ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1,
  42.  * WHICHEVER IS GREATER. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING
  43.  * ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.$
  44.  */
  45. #include "vxWorks.h"
  46. #include "taskLib.h"
  47. #include "stdlib.h"
  48. #include "stdio.h"
  49. #include "string.h"
  50. #include "ctype.h"
  51. #include "config.h"
  52. #include "sysMotI2c.h"
  53. #include "i2cM41T81Clock.h"
  54. /*
  55.  * Get RTC ready
  56.  */
  57. STATUS
  58. m41t81_tod_init(void)
  59. {
  60.     char byte;
  61.     int polls;
  62.     int status;
  63.     /*
  64.      * Reset HT bit to "0" to update registers with current time.
  65.      */
  66.     status = i2cRead(M41T81_SMBUS_CHAN,
  67.                      M41T81_CCR_ADDRESS,
  68.                      I2C_DEVICE_TYPE_RTC_M41T48,
  69.                      M41T81REG_AHR,
  70.                      1, 
  71.                      &byte);
  72.     byte &= ~M41T81REG_AHR_HT;
  73.     status = i2cWrite(M41T81_SMBUS_CHAN,
  74.                      M41T81_CCR_ADDRESS,
  75.                      I2C_DEVICE_TYPE_RTC_M41T48,
  76.                      M41T81REG_AHR,
  77.                      1, 
  78.                      &byte);
  79.     /*
  80.      * Try to read from the device.  If it does not
  81.      * respond, fail.  We may need to do this for up to 300ms.
  82.      */
  83.     for (polls = 0; polls < 300; polls++) {
  84.         taskDelay(1);
  85.         status = i2cRead(M41T81_SMBUS_CHAN,
  86.                      M41T81_CCR_ADDRESS,
  87.                      I2C_DEVICE_TYPE_RTC_M41T48,
  88.                      0,
  89.                      1, 
  90.                      &byte);
  91.         if (status == OK) break;              /* read is ok */
  92.     }
  93.     return 0;
  94. }
  95. int
  96. m41t81_tod_get_second(void)
  97. {
  98.     int second;
  99.     char  byte;
  100.     second = 0;
  101.     if (i2cRead(M41T81_SMBUS_CHAN,
  102.                      M41T81_CCR_ADDRESS,
  103.                      I2C_DEVICE_TYPE_RTC_M41T48,
  104.                      M41T81REG_SC,
  105.                      1,
  106.                      &byte) == 0) {
  107.         byte &= ~(M41T81REG_SC_ST);
  108.         second = (UINT8) FROM_BCD(byte);
  109.     }
  110.     return second;
  111. }
  112. STATUS
  113. m41t81_tod_get(int *year,        /* 1980-2079 */
  114.                int *month,       /* 01-12 */
  115.                int *date,        /* 01-31 */
  116.                int *hour,        /* 00-23 */
  117.                int *minute,      /* 00-59 */
  118.                int *second)      /* 00-59 */
  119. {
  120.     int   status;
  121.     char  byte;
  122.     int   y2k;
  123.     status = i2cRead(M41T81_SMBUS_CHAN,
  124.                      M41T81_CCR_ADDRESS,
  125.                      I2C_DEVICE_TYPE_RTC_M41T48,
  126.                      M41T81REG_HR,
  127.                      1, 
  128.                      &byte);
  129.     y2k = ((byte & M41T81REG_HR_CB) == M41T81REG_HR_CB);
  130.     byte &= ~(M41T81REG_HR_CB | M41T81REG_HR_CEB);
  131.     *hour = (UINT8) FROM_BCD(byte);
  132.     status = i2cRead(M41T81_SMBUS_CHAN,
  133.                      M41T81_CCR_ADDRESS,
  134.                      I2C_DEVICE_TYPE_RTC_M41T48,
  135.                      M41T81REG_MN,
  136.                      1,
  137.                      &byte);
  138.     *minute = (UINT8) FROM_BCD(byte);
  139.     status = i2cRead(M41T81_SMBUS_CHAN,
  140.                      M41T81_CCR_ADDRESS,
  141.                      I2C_DEVICE_TYPE_RTC_M41T48,
  142.                      M41T81REG_SC,
  143.                      1,
  144.                      &byte);
  145.     byte &= ~(M41T81REG_SC_ST);
  146.     *second = (UINT8) FROM_BCD(byte);
  147.     status = i2cRead(M41T81_SMBUS_CHAN,
  148.                      M41T81_CCR_ADDRESS,
  149.                      I2C_DEVICE_TYPE_RTC_M41T48,
  150.                      M41T81REG_MO,
  151.                      1,
  152.                      &byte);
  153.     *month = (UINT8) byte;
  154.     status = i2cRead(M41T81_SMBUS_CHAN,
  155.                      M41T81_CCR_ADDRESS,
  156.                      I2C_DEVICE_TYPE_RTC_M41T48,
  157.                      M41T81REG_DT,
  158.                      1,
  159.                      &byte);
  160.     *date = (UINT8) FROM_BCD(byte);
  161. #if 0
  162.     status = i2cRead(M41T81_SMBUS_CHAN,
  163.                      M41T81_CCR_ADDRESS,
  164.                      I2C_DEVICE_TYPE_RTC_M41T48,
  165.                      M41T81REG_DY,
  166.                      1,
  167.                      &byte);
  168.     *day = (UINT8) byte;
  169. #endif
  170.     status = i2cRead(M41T81_SMBUS_CHAN,
  171.                      M41T81_CCR_ADDRESS,
  172.                      I2C_DEVICE_TYPE_RTC_M41T48,
  173.                      M41T81REG_YR,
  174.                      1,
  175.                      &byte);
  176.     *year = (UINT8) byte;
  177.     if (y2k) {
  178.         *year += 2000;                   /*Year 20xx*/
  179.     } else {
  180.         *year += 1900;                   /*Year 19xx*/
  181.     }
  182.     return 0;
  183. }
  184. /*
  185.  * Note: the TOD should store the current GMT
  186.  */
  187. STATUS
  188. m41t81_tod_set(int year,            /* 1980-2079 */
  189.                int month,           /* 01-12 */
  190.                int day,             /* 01-31 */
  191.                int hour,            /* 00-23 */
  192.                int minute,          /* 00-59 */
  193.                int second)          /* 00-59 */
  194. {
  195.     UINT8 y2k;
  196.     int   status;
  197.     char  buffer;
  198.     /* write time */
  199.     /*
  200.      * M41T81 does not have a century byte, so we don't need to write y2k
  201.      * But we should flip the century bit (CB) to "1" for year 20xx and to "0"
  202.      * for year 19xx.
  203.      */
  204.     y2k = (year >= 2000) ? 0x20 : 0x19;
  205.     buffer = 0;
  206.     if (y2k == 0x20) {
  207.         buffer = M41T81REG_HR_CB;
  208.     }
  209.     buffer |= (char) (TO_BCD(hour) & 0xff);
  210.     status = i2cWrite(M41T81_SMBUS_CHAN,
  211.                    M41T81_CCR_ADDRESS,
  212.                    I2C_DEVICE_TYPE_RTC_M41T48,
  213.                    M41T81REG_HR, 
  214.                    1,
  215.                    &buffer);
  216.     buffer = (char) (TO_BCD(minute) & 0xff);
  217.     status = i2cWrite(M41T81_SMBUS_CHAN,
  218.                    M41T81_CCR_ADDRESS,
  219.                    I2C_DEVICE_TYPE_RTC_M41T48,
  220.                    M41T81REG_MN, 
  221.                    1,
  222.                    &buffer);
  223.     buffer  = (char) (TO_BCD(second) & 0xff);
  224.     buffer &= ~M41T81REG_SC_ST;
  225.     status = i2cWrite(M41T81_SMBUS_CHAN,
  226.                    M41T81_CCR_ADDRESS,
  227.                    I2C_DEVICE_TYPE_RTC_M41T48,
  228.                    M41T81REG_SC,
  229.                    1,
  230.                    &buffer);
  231.     /* write date */
  232.     buffer = (char) (TO_BCD(month) & 0xff);
  233.     status = i2cWrite(M41T81_SMBUS_CHAN,
  234.                    M41T81_CCR_ADDRESS,
  235.                    I2C_DEVICE_TYPE_RTC_M41T48,
  236.                    M41T81REG_MO,
  237.                    1,
  238.                    &buffer);
  239.     buffer = (char) (TO_BCD(day) & 0xff);
  240.     status = i2cWrite(M41T81_SMBUS_CHAN,
  241.                    M41T81_CCR_ADDRESS,
  242.                    I2C_DEVICE_TYPE_RTC_M41T48,
  243.                    M41T81REG_DT,
  244.                    1,
  245.                    &buffer);
  246.     year %= 100;
  247.     buffer = (char) (TO_BCD(year) & 0xff);
  248.     status = i2cWrite(M41T81_SMBUS_CHAN,
  249.                    M41T81_CCR_ADDRESS,
  250.                    I2C_DEVICE_TYPE_RTC_M41T48,
  251.                    M41T81REG_YR,
  252.                    1,
  253.                    &buffer);                  
  254.     return 0;
  255. }
  256. #ifdef INCLUDE_I2C_DEBUG
  257. void
  258. m41t81_tod_show() {
  259.     int    year, month, date, hour, minute, second;
  260.     m41t81_tod_init();
  261.     if (m41t81_tod_get(&year, &month, &date, &hour, &minute, &second) == 0) {
  262.         printf("%d/%d/%d %d:%d:%dn", 
  263.                year, month, date, hour, minute, second);
  264.     } else {
  265.         printf("m41t81_tod_get() failedn");
  266.     }
  267. }
  268. #endif /* INCLUDE_I2C_DEBUG */