root/sys/dev/ic/m41t8xreg.h
/*      $OpenBSD: m41t8xreg.h,v 1.3 2020/10/23 20:55:15 patrick Exp $   */

/*
 * Copyright (c) 2010 Miodrag Vallat.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * ST M41T8x serial access real time clock registers
 *
 * http://www.st.com/stonline/products/literature/ds/9074/m41t80.pdf
 */

/*
 * Note that register update will stop while accessing registers 0x00 to 0x07
 * (without the clock stopping), so that the reader does not get false data.
 * Registers will be thawed after reading register 0x07, when the
 * autoincrementing read address reaches 0x08.
 *
 * Clock and alarm numerical values are stored in BCD. All other values are
 * stored in binary.
 */

#define M41T8X_HSEC     0x00            /* 1/100th of second */
#define M41T8X_SEC      0x01            /* second */
#define M41T8X_STOP             0x80    /* stop clock, bit 7 of above */
#define M41T8X_MIN      0x02            /* minute */
#define M41T8X_HR       0x03            /* hour */
#define M41T8X_CEB              0x80    /* century bit toggle enable */
#define M41T8X_CB               0x40    /* century bit */
#define M41T8X_DOW      0x04            /* day of week */
#define M41T8X_DOW_MASK         0x07    /* day of week bits */
#define M41T8X_DAY      0x05            /* day of month */
#define M41T8X_MON      0x06            /* month */
#define M41T8X_YEAR     0x07            /* year */

#define M41T8X_TOD_START        0x00
#define M41T8X_TOD_LENGTH       0x08

#define M41T8X_CTRL     0x08            /* control */
#define M41T8X_OUT              0x80    /* output level */
#define M41T8X_32KHZ    0x09            /* 32KHz oscillator control */
#define M41T8X_32KE             0x80    /* 32KHz enable */

#define M41T8X_ALMON    0x0a            /* alarm month */
#define M41T8X_AFE              0x80    /* alarm flag enable */
#define M41T8X_SQWE             0x40    /* square wave enable */
#define M41T8X_ALDAY    0x0b            /* alarm day */
#define M41T8X_RPT4             0x80    /* alarm repeat mode bits */
#define M41T8X_RPT5             0x40
#define M41T8X_ALHOUR   0x0c            /* alarm hour */
#define M41T8X_RPT3             0x80
#define M41T8X_ALMIN    0x0d            /* alarm minute */
#define M41T8X_RPT2             0x80
#define M41T8X_ALSEC    0x0e            /* alarm second */
#define M41T8X_RPT1             0x80

#define M41T8X_FLAGS    0x0f            /* flags */
#define M41T8X_AF               0x40    /* alarm flag */

#define M41T8X_SQW      0x13            /* square wave control */
#define M41T8X_RS3              0x80    /* square wave frequency */
#define M41T8X_RS2              0x40
#define M41T8X_RS1              0x20
#define M41T8X_RS0              0x10

/* alarm repeat settings, RPT5..RPT1 */
#define M41T8X_ALREP_SEC        0x1f    /* once per second */
#define M41T8X_ALREP_MIN        0x1e    /* once per minute */
#define M41T8X_ALREP_HOUR       0x1c    /* once per hour */
#define M41T8X_ALREP_DAY        0x18    /* once per day */
#define M41T8X_ALREP_MON        0x10    /* once per month */
#define M41T8X_ALREP_YEAR       0x00    /* once per year */

/* square wave frequency, RS3..RS0 */
#define M41T8X_SQW_32K          0x01
#define M41T8X_SQW_8K           0x02
#define M41T8X_SQW_4K           0x03
#define M41T8X_SQW_2K           0x04
#define M41T8X_SQW_1K           0x05
#define M41T8X_SQW_512          0x06
#define M41T8X_SQW_256          0x07
#define M41T8X_SQW_128          0x08
#define M41T8X_SQW_64           0x09
#define M41T8X_SQW_32           0x0a
#define M41T8X_SQW_16           0x0b
#define M41T8X_SQW_8            0x0c
#define M41T8X_SQW_4            0x0d
#define M41T8X_SQW_2            0x0e
#define M41T8X_SQW_1            0x0f