1 /* 2 * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha (at) intel.com> 3 * Copyright (c) 2014 Intel Corporation. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be 14 * included in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 #pragma once 25 26 #include <string> 27 #include <mraa/i2c.hpp> 28 29 #define ADDR 0x68 // device address 30 31 // timekeeping registers 32 #define TIME_CAL_ADDR 0x00 33 #define ALARM1_ADDR 0x07 34 #define ALARM2_ADDR 0x0B 35 #define CONTROL_ADDR 0x0E 36 #define STATUS_ADDR 0x0F 37 #define AGING_OFFSET_ADDR 0x10 38 #define TEMPERATURE_ADDR 0x11 39 40 // control register bits 41 #define A1IE 0x1 42 #define A2IE 0x2 43 #define INTCN 0x4 44 45 // status register bits 46 #define A1F 0x1 47 #define A2F 0x2 48 #define OSF 0x80 49 50 #define HIGH 1 51 #define LOW 0 52 53 namespace upm { 54 55 struct Time3231 { 56 uint8_t second; 57 uint8_t minute; 58 uint8_t hour; 59 uint8_t day; 60 uint8_t month; 61 int16_t year; 62 uint8_t weekDay; 63 }; 64 65 /** 66 * @brief MAXDS3231M Proximity Sensor library 67 * @defgroup maxds3231m libupm-maxds3231m 68 * @ingroup maxim i2c light 69 */ 70 /** 71 * @library maxds3231m 72 * @sensor maxds3231m 73 * @comname MAXDS3231M Real-Time Clock 74 * @type light 75 * @man maxim 76 * @con i2c 77 * 78 * @brief API for the MAXDS3231M I2C Real-Time Clock 79 * 80 * This module defines the API for MAXDS3231M 81 * 82 * @snippet maxds3231m.cxx Interesting 83 */ 84 class MAXDS3231M { 85 public: 86 /** 87 * Instantiates an MAXDS3231M object 88 * 89 * @param bus Number of the used bus 90 * @param devAddr Address of the used I2C device 91 */ 92 MAXDS3231M (int bus=0, int devAddr=0x68); 93 94 /** 95 * Sets the date and time on the chip. 96 * 97 * @param time Time structure 98 */ 99 void setDate (Time3231 &time); 100 101 /** 102 * Gets the date and time from the chip. 103 * 104 * @param time Time structure 105 */ 106 bool getDate (Time3231 &time); 107 108 /** 109 * Gets the on-board temperature. 110 */ 111 uint16_t getTemperature (); 112 113 /** 114 * Returns the name of the component 115 */ 116 std::string name() 117 { 118 return m_name; 119 } 120 private: 121 std::string m_name; 122 123 int m_i2cAddr; 124 int m_bus; 125 mraa::I2c m_i2Ctx; 126 127 uint16_t i2cReadReg_N (int reg, unsigned int len, uint8_t * buffer); 128 mraa::Result i2cWriteReg_N (uint8_t reg, unsigned int len, uint8_t * buffer); 129 uint8_t DECtoBSD (uint8_t data); 130 uint8_t BCDtoDEC (uint8_t data); 131 }; 132 133 } 134