summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/gen5200
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-23 09:55:15 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-23 15:18:44 +0200
commit4fb1b79a804ca8de866be0ef718e54e1f62fa3ec (patch)
tree11b85c98244db22c927e7f1323ed222c43a589b0 /bsps/powerpc/gen5200
parentbsps: Move legacy network drivers to bsps (diff)
downloadrtems-4fb1b79a804ca8de866be0ef718e54e1f62fa3ec.tar.bz2
bsps: Move RTC drivers to bsps
This patch is a part of the BSP source reorganization. Update #3285.
Diffstat (limited to 'bsps/powerpc/gen5200')
-rw-r--r--bsps/powerpc/gen5200/rtc/pcf8563.c228
-rw-r--r--bsps/powerpc/gen5200/rtc/pcf8563.h99
-rw-r--r--bsps/powerpc/gen5200/rtc/todcfg.c102
3 files changed, 429 insertions, 0 deletions
diff --git a/bsps/powerpc/gen5200/rtc/pcf8563.c b/bsps/powerpc/gen5200/rtc/pcf8563.c
new file mode 100644
index 0000000000..e41e3b48d2
--- /dev/null
+++ b/bsps/powerpc/gen5200/rtc/pcf8563.c
@@ -0,0 +1,228 @@
+/*===============================================================*\
+| Project: RTEMS generic MPC5200 BSP |
++-----------------------------------------------------------------+
+| Partially based on the code references which are named below. |
+| Adaptions, modifications, enhancements and any recent parts of |
+| the code are: |
+| Copyright (c) 2005 |
+| Embedded Brains GmbH |
+| Obere Lagerstr. 30 |
+| D-82178 Puchheim |
+| Germany |
+| rtems@embedded-brains.de |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be |
+| found in the file LICENSE in this distribution or at |
+| |
+| http://www.rtems.org/license/LICENSE. |
+| |
++-----------------------------------------------------------------+
+| this file contains the tod driver for a Philips pcf8563 I2C RTC |
+\*===============================================================*/
+/*
+ * This file interfaces with the real-time clock found in a
+ * Philips PCF8563 serial real-time clock chip.
+ * This RTC have I2C bus interface. BSP have to provide I2C bus primitives
+ * to make this driver working. getRegister and setRegister primitives is
+ * not used here to avoid multiple transactions over I2C bus (each transaction
+ * require significant time and error when date/time information red may
+ * occurs). ulControlPort contains I2C bus number; ulDataPort contains
+ * RTC I2C device address.
+ *
+ * Based on a ds1307 driver from:
+ *
+ * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia
+ * Author: Victor V. Vengerov <vvv@oktet.ru>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems.h>
+#include <bsp/fatal.h>
+#include <bsp/i2c.h>
+#include <libchip/rtc.h>
+#include <string.h>
+#include "pcf8563.h"
+
+/* Convert from/to Binary-Coded Decimal representation */
+#define From_BCD( _x ) ((((_x) >> 4) * 10) + ((_x) & 0x0F))
+#define To_BCD( _x ) ((((_x) / 10) << 4) + ((_x) % 10))
+
+/* pcf8563_initialize --
+ * Initialize PCF8563 real-time clock chip. If RTC is halted, this
+ * function resume counting.
+ *
+ * PARAMETERS:
+ * minor -- minor RTC device number
+ */
+static void
+pcf8563_initialize(int minor)
+{
+ i2c_message_status status;
+ int try;
+ uint8_t ctrl1;
+ i2c_bus_number bus;
+ i2c_address addr;
+
+ bus = RTC_Table[minor].ulCtrlPort1;
+ addr = RTC_Table[minor].ulDataPort;
+
+ /* Read SECONDS register */
+ try = 0;
+ do {
+ status = i2c_wbrd(bus, addr, PCF8563_CONTROL1_ADR,
+ &ctrl1, sizeof(ctrl1));
+ try++;
+ } while ((status != I2C_SUCCESSFUL) && (try < 15));
+
+ /* If clock is halted, reset and start the clock */
+ if ((ctrl1 & PCF8563_CONTROL1_STOP) != 0)
+ {
+ uint8_t start[8];
+ memset(start, 0, sizeof(start));
+ start[0] = PCF8563_CONTROL1_ADR;
+ try = 0;
+ do {
+ status = i2c_write(bus, addr, start, 2);
+ } while ((status != I2C_SUCCESSFUL) && (try < 15));
+ }
+}
+
+/* pcf8563_get_time --
+ * read current time from PCF8563 real-time clock chip and convert it
+ * to the rtems_time_of_day structure.
+ *
+ * PARAMETERS:
+ * minor -- minor RTC device number
+ * time -- place to put return value (date and time)
+ *
+ * RETURNS:
+ * 0, if time obtained successfully
+ * -1, if error occured
+ */
+static int
+pcf8563_get_time(int minor, rtems_time_of_day *time)
+{
+ i2c_bus_number bus;
+ i2c_address addr;
+ uint8_t info[10];
+ uint32_t v1, v2;
+ i2c_message_status status;
+ int try;
+
+ if (time == NULL)
+ return -1;
+
+ bus = RTC_Table[minor].ulCtrlPort1;
+ addr = RTC_Table[minor].ulDataPort;
+
+ memset(time, 0, sizeof(rtems_time_of_day));
+ try = 0;
+ do {
+ status = i2c_wbrd(bus, addr, PCF8563_SECOND_ADR, info, sizeof(info));
+ try++;
+ } while ((status != I2C_SUCCESSFUL) && (try < 10));
+
+ if (status != I2C_SUCCESSFUL)
+ {
+ return -1;
+ }
+
+ v1 = info[PCF8563_YEAR_ADR-PCF8563_SECOND_ADR];
+ v2 = From_BCD(v1);
+ if ((info[PCF8563_MONTH_ADR-PCF8563_SECOND_ADR]
+ & PCF8563_MONTH_CENTURY) == 0) {
+ time->year = 1900 + v2;
+ }
+ else {
+ time->year = 2000 + v2;
+ }
+
+ v1 = info[PCF8563_MONTH_ADR-PCF8563_SECOND_ADR] & PCF8563_MONTH_MASK;
+ time->month = From_BCD(v1);
+
+ v1 = info[PCF8563_DAY_ADR-PCF8563_SECOND_ADR] & PCF8563_DAY_MASK;
+ time->day = From_BCD(v1);
+
+ v1 = info[PCF8563_HOUR_ADR-PCF8563_SECOND_ADR] & PCF8563_HOUR_MASK;
+ time->hour = From_BCD(v1);
+
+ v1 = info[PCF8563_MINUTE_ADR-PCF8563_SECOND_ADR] & PCF8563_MINUTE_MASK;
+ time->minute = From_BCD(v1);
+
+ v1 = info[PCF8563_SECOND_ADR-PCF8563_SECOND_ADR] & PCF8563_SECOND_MASK;
+ time->second = From_BCD(v1);
+
+ return 0;
+}
+
+/* pcf8563_set_time --
+ * set time to the PCF8563 real-time clock chip
+ *
+ * PARAMETERS:
+ * minor -- minor RTC device number
+ * time -- new date and time to be written to PCF8563
+ *
+ * RETURNS:
+ * 0, if time obtained successfully
+ * -1, if error occured
+ */
+static int
+pcf8563_set_time(int minor, const rtems_time_of_day *time)
+{
+ i2c_bus_number bus;
+ i2c_address addr;
+ uint8_t info[8];
+ i2c_message_status status;
+ int try;
+
+ if (time == NULL)
+ return -1;
+
+ bus = RTC_Table[minor].ulCtrlPort1;
+ addr = RTC_Table[minor].ulDataPort;
+
+ if ((time->year >= 2100) || (time->year < 1900)) {
+ bsp_fatal(MPC5200_FATAL_PCF8563_INVALID_YEAR);
+ }
+ info[0] = PCF8563_SECOND_ADR;
+ info[1 + PCF8563_YEAR_ADR -PCF8563_SECOND_ADR] = To_BCD(time->year % 100);
+ info[1 + PCF8563_MONTH_ADR -PCF8563_SECOND_ADR] = To_BCD(time->month);
+ info[1 + PCF8563_DAY_ADR -PCF8563_SECOND_ADR] = To_BCD(time->day);
+ info[1 + PCF8563_HOUR_ADR -PCF8563_SECOND_ADR] = To_BCD(time->hour);
+ info[1 + PCF8563_MINUTE_ADR-PCF8563_SECOND_ADR] = To_BCD(time->minute);
+ info[1 + PCF8563_SECOND_ADR-PCF8563_SECOND_ADR] = To_BCD(time->second);
+ /* Do not set day of week */
+ info[1 + PCF8563_DAY_OF_WEEK_ADR-PCF8563_SECOND_ADR] = 1;
+
+ /*
+ * add century info
+ */
+ if (time->year >= 2000) {
+ info[1 + PCF8563_MONTH_ADR -PCF8563_SECOND_ADR] |= PCF8563_MONTH_CENTURY;
+ }
+ /*
+ * send to device
+ */
+ try = 0;
+ do {
+ status = i2c_write(bus, addr, info,sizeof(info));
+ try++;
+ } while ((status != I2C_SUCCESSFUL) && (try < 10));
+
+ if (status != I2C_SUCCESSFUL)
+ return -1;
+ else
+ return 0;
+}
+
+/* Driver function table */
+
+rtc_fns pcf8563_fns = {
+ pcf8563_initialize,
+ pcf8563_get_time,
+ pcf8563_set_time
+};
diff --git a/bsps/powerpc/gen5200/rtc/pcf8563.h b/bsps/powerpc/gen5200/rtc/pcf8563.h
new file mode 100644
index 0000000000..f46b03e531
--- /dev/null
+++ b/bsps/powerpc/gen5200/rtc/pcf8563.h
@@ -0,0 +1,99 @@
+/*===============================================================*\
+| Project: RTEMS generic MPC5200 BSP |
++-----------------------------------------------------------------+
+| Partially based on the code references which are named below. |
+| Adaptions, modifications, enhancements and any recent parts of |
+| the code are: |
+| Copyright (c) 2005 |
+| Embedded Brains GmbH |
+| Obere Lagerstr. 30 |
+| D-82178 Puchheim |
+| Germany |
+| rtems@embedded-brains.de |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be |
+| found in the file LICENSE in this distribution or at |
+| |
+| http://www.rtems.org/license/LICENSE. |
+| |
++-----------------------------------------------------------------+
+| this file contains declarations for the pcf8563 RTC driver |
+\*===============================================================*/
+/*
+ * This file contains the definitions for Dallas Semiconductor
+ * DS1307/DS1308 serial real-time clock/NVRAM.
+ *
+ * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia
+ * Author: Victor V. Vengerov <vvv@oktet.ru>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef __RTC_PCF8563__
+#define __RTC_PCF8563__
+
+#define PCF8563_I2C_ADDRESS (0xA2) /* I2C bus address assigned to PCF8563 */
+
+#define PCF8563_CONTROL1_ADR (0x00)
+#define PCF8563_CONTROL1_TEST1 (0x80) /* EXT_CLK test mode */
+#define PCF8563_CONTROL1_STOP (0x20) /* stop RTC source clock, clear divider*/
+#define PCF8563_CONTROL1_TESTC (0x08) /* enable power-on reset override */
+ /***********/
+#define PCF8563_CONTROL2_ADR (0x01)
+#define PCF8563_CONTROL2_TITP (0x10) /* 0: int output is level */
+#define PCF8563_CONTROL2_AF (0x08) /* alarm flag */
+#define PCF8563_CONTROL2_TF (0x04) /* timer flag */
+#define PCF8563_CONTROL2_AIE (0x02) /* alarm interrupt enable */
+#define PCF8563_CONTROL2_TIE (0x01) /* timer interrupt enable */
+ /***********/
+
+#define PCF8563_SECOND_ADR (0x02)
+#define PCF8563_SECOND_VL (0x80) /* clock integrity no longer guaranteed */
+#define PCF8563_SECOND_MASK (0x7f)
+ /***********/
+
+#define PCF8563_MINUTE_ADR (0x03)
+#define PCF8563_MINUTE_MASK (0x7f)
+ /***********/
+
+#define PCF8563_HOUR_ADR (0x04)
+#define PCF8563_HOUR_MASK (0x3f)
+ /***********/
+
+#define PCF8563_DAY_ADR (0x05)
+#define PCF8563_DAY_MASK (0x3f)
+
+#define PCF8563_DAY_OF_WEEK_ADR (0x06)
+#define PCF8563_DAY_OF_WEEK_MASK (0x07)
+
+#define PCF8563_MONTH_ADR (0x07)
+#define PCF8563_MONTH_MASK (0x1f)
+#define PCF8563_MONTH_CENTURY (0x80)
+ /***********/
+
+#define PCF8563_YEAR_ADR (0x08)
+#define PCF8563_YEAR_MASK (0xff)
+
+#define PCF8563_MINUTE_ALARM_ADR (0x09)
+#define PCF8563_HOUR_ALARM_ADR (0x0A)
+#define PCF8563_DAY_ALARM_ADR (0x0B)
+#define PCF8563_DAY_OF_WEEK_ALARM_ADR (0x0C)
+#define PCF8563_XXX_ALARM_AE (0x80)
+ /***********/
+
+#define PCF8563_CLKOUTCTL_ADR (0x0D)
+#define PCF8563_CLKOUTCTL_FE (0x80) /* */
+#define PCF8563_CLKOUTCTL_FD (0x03) /* */
+ /***********/
+
+#define PCF8563_TIMERCTL_ADR (0x0E)
+#define PCF8563_TIMERCTL_FE (0x80) /* */
+#define PCF8563_TIMERCTL_FD (0x03) /* */
+ /***********/
+
+#define PCF8563_TIMER_ADR (0x0F)
+
+#endif /* __RTC_PCF8563__ */
diff --git a/bsps/powerpc/gen5200/rtc/todcfg.c b/bsps/powerpc/gen5200/rtc/todcfg.c
new file mode 100644
index 0000000000..076de70b28
--- /dev/null
+++ b/bsps/powerpc/gen5200/rtc/todcfg.c
@@ -0,0 +1,102 @@
+/*===============================================================*\
+| Project: RTEMS generic MPC5200 BSP |
++-----------------------------------------------------------------+
+| Partially based on the code references which are named below. |
+| Adaptions, modifications, enhancements and any recent parts of |
+| the code are: |
+| Copyright (c) 2005 |
+| Embedded Brains GmbH |
+| Obere Lagerstr. 30 |
+| D-82178 Puchheim |
+| Germany |
+| rtems@embedded-brains.de |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be |
+| found in the file LICENSE in this distribution or at |
+| |
+| http://www.rtems.org/license/LICENSE. |
+| |
++-----------------------------------------------------------------+
+| this file configures the pcf8563 RTC for a PM520 board |
+\*===============================================================*/
+/*
+ * This file contains the RTC driver table for Motorola MCF5206eLITE
+ * ColdFire evaluation board.
+ *
+ * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia
+ * Author: Victor V. Vengerov <vvv@oktet.ru>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp.h>
+#include <bsp/i2c.h>
+#include <libchip/rtc.h>
+#include "pcf8563.h"
+
+/* Forward function declaration */
+bool mpc5200_pcf8563_probe(int minor);
+
+extern rtc_fns pcf8563_fns;
+
+/* The following table configures the RTC drivers used in this BSP */
+rtc_tbl RTC_Table[] = {
+ {
+ "/dev/rtc", /* sDeviceName */
+ RTC_CUSTOM, /* deviceType */
+ &pcf8563_fns, /* pDeviceFns */
+ mpc5200_pcf8563_probe, /* deviceProbe */
+ NULL, /* pDeviceParams */
+ 0x01, /* ulCtrlPort1, for PCF8563-I2C bus number */
+ PCF8563_I2C_ADDRESS, /* ulDataPort, for PCF8563-I2C device addr */
+ NULL, /* getRegister - not applicable to PCF8563 */
+ NULL /* setRegister - not applicable to PCF8563 */
+ }
+};
+
+/* Some information used by the RTC driver */
+
+#define NUM_RTCS (sizeof(RTC_Table)/sizeof(rtc_tbl))
+
+size_t RTC_Count = NUM_RTCS;
+
+/* mpc5200_pcf8563_probe --
+ * RTC presence probe function. Return TRUE, if device is present.
+ * Device presence checked by probe access to RTC device over I2C bus.
+ *
+ * PARAMETERS:
+ * minor - minor RTC device number
+ *
+ * RETURNS:
+ * TRUE, if RTC device is present
+ */
+bool
+mpc5200_pcf8563_probe(int minor)
+{
+ int try = 0;
+ i2c_message_status status;
+ rtc_tbl *rtc;
+ i2c_bus_number bus;
+ i2c_address addr;
+
+ if (minor >= NUM_RTCS)
+ return false;
+
+ rtc = RTC_Table + minor;
+
+ bus = rtc->ulCtrlPort1;
+ addr = rtc->ulDataPort;
+ do {
+ status = i2c_wrbyte(bus, addr, 0);
+ if (status == I2C_NO_DEVICE)
+ return false;
+ try++;
+ } while ((try < 15) && (status != I2C_SUCCESSFUL));
+ if (status == I2C_SUCCESSFUL)
+ return true;
+ else
+ return false;
+}