summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm
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 /c/src/lib/libbsp/arm
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 'c/src/lib/libbsp/arm')
-rw-r--r--c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am2
-rw-r--r--c/src/lib/libbsp/arm/altera-cyclone-v/rtc/rtc.c835
-rw-r--r--c/src/lib/libbsp/arm/atsam/Makefile.am2
-rw-r--r--c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c104
-rw-r--r--c/src/lib/libbsp/arm/lpc176x/Makefile.am2
-rw-r--r--c/src/lib/libbsp/arm/lpc176x/rtc/rtc-config.c125
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/Makefile.am2
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c96
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/Makefile.am2
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c142
10 files changed, 5 insertions, 1307 deletions
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
index 1b9f584a5a..520d7620e2 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
@@ -81,7 +81,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/altera-cyclone-v/i2c/i2cdrv.
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/altera-cyclone-v/i2c/i2cdrv-config.c
# RTC
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/rtc/rtc-support.c
-librtemsbsp_a_SOURCES += rtc/rtc.c
+librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/altera-cyclone-v/rtc/rtc.c
# Cache
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/cache/cache-l2c-310.c
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/rtc/rtc.c b/c/src/lib/libbsp/arm/altera-cyclone-v/rtc/rtc.c
deleted file mode 100644
index e0e468892b..0000000000
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/rtc/rtc.c
+++ /dev/null
@@ -1,835 +0,0 @@
-/*
- * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
- *
- * embedded brains GmbH
- * Dornierstr. 4
- * 82178 Puchheim
- * Germany
- * <info@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.
- */
-
-/*
- * Driver for the DS1339 RTC (Maxim Semiconductors) -> RTC1
- * and the M41ST87 RTC (ST Microelectronics) -> RTC2
- *
- * Please note the following points:
- * - The day of week is ignored.
- * - The century bit is interpreted the following way:
- * - century not set: TOD_BASE_YEAR .. 1999
- * - century set: 2000 .. 2099
- * - century not set: 2100 .. (TOD_BASE_YEAR + 200)
- */
-
-#include <libchip/rtc.h>
-#include <assert.h>
-#include <rtems/score/todimpl.h>
-#include <sys/filio.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-#include <bsp/i2cdrv.h>
-
-#define ALTERA_CYCLONE_V_RTC_NUMBER 2
-
-
-/* ******************************* DS1339 ********************************** */
-
-
-#define DS1339_I2C_ADDRESS (0xD0 >> 1) /* 7-bit addressing! */
-#define DS1339_I2C_BUS_DEVICE "/dev/i2c0"
-
-#define DS1339_ADDR_TIME 0x00
-
-#define DS1339_ADDR_CTRL 0x0E
-#define DS1339_CTRL_EOSC 0x80
-#define DS1339_CTRL_BBSQI 0x20
-#define DS1339_CTRL_RS2 0x10
-#define DS1339_CTRL_RS1 0x08
-#define DS1339_CTRL_INTCN 0x04
-#define DS1339_CTRL_A2IE 0x02
-#define DS1339_CTRL_A1IE 0x01
-
-#define DS1339_CTRL_DEFAULT (0x00)
-
-#define DS1339_ADDR_STATUS 0x0F
-#define DS1339_STATUS_OSF 0x80
-#define DS1339_STATUS_A2F 0x02
-#define DS1339_STATUS_A1F 0x01
-
-#define DS1339_STATUS_CLEAR (0x00)
-
-#define DS1339_ADDR_TRICKLE_CHARGE 0x10
-
-
-typedef struct
-{
- uint8_t seconds;
- uint8_t minutes;
- uint8_t hours;
-#define DS1339_HOURS_12_24_FLAG 0x40
-#define DS1339_HOURS_AM_PM_FLAG_OR_20_HOURS 0x20
-#define DS1339_HOURS_10_HOURS 0x10
- uint8_t weekday;
- uint8_t date;
- uint8_t month;
-#define DS1339_MONTH_CENTURY 0x80
- uint8_t year;
-}
-ds1339_time_t;
-
-
-/* The longest write transmission is writing the time + one address bit */
-#define DS1339_MAX_WRITE_SIZE (sizeof(ds1339_time_t) + 1)
-
-
-/* Functions for converting the fields */
-static unsigned int ds1339_get_seconds(ds1339_time_t* time)
-{
- uint8_t tens = time->seconds >> 4;
- uint8_t ones = time->seconds & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int ds1339_get_minutes(ds1339_time_t* time)
-{
- uint8_t tens = time->minutes >> 4;
- uint8_t ones = time->minutes & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int ds1339_get_hours(ds1339_time_t* time)
-{
-
- uint8_t value = time->hours & 0x0F;
-
- if (time->hours & DS1339_HOURS_10_HOURS)
- {
- value += 10;
- }
- if (time->hours & DS1339_HOURS_AM_PM_FLAG_OR_20_HOURS)
- {
- if (time->hours & DS1339_HOURS_12_24_FLAG)
- value += 12;
- else
- value += 20;
- }
-
- return value;
-}
-
-
-static unsigned int ds1339_get_day_of_month(ds1339_time_t* time)
-{
-
- uint8_t tens = time->date >> 4;
- uint8_t ones = time->date & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int ds1339_get_month(ds1339_time_t* time)
-{
-
- uint8_t tens = (time->month >> 4) & 0x07;
- uint8_t ones = time->month & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int ds1339_get_year(ds1339_time_t* time)
-{
-
- unsigned int year = 1900;
-
- year += (time->year >> 4) * 10;
- year += time->year & 0x0F;
- if (time->month & DS1339_MONTH_CENTURY)
- year += 100;
- if (year < TOD_BASE_YEAR)
- year += 200;
-
- return year;
-}
-
-
-static void ds1339_set_time(ds1339_time_t* time,
- unsigned int second,
- unsigned int minute,
- unsigned int hour,
- unsigned int day,
- unsigned int month,
- unsigned int year)
-{
-
- unsigned int tens;
- unsigned int ones;
- uint8_t century = 0;
-
- tens = second / 10;
- ones = second % 10;
- time->seconds = tens << 4 | ones;
-
- tens = minute / 10;
- ones = minute % 10;
- time->minutes = tens << 4 | ones;
-
- tens = hour / 10;
- ones = hour % 10;
- time->hours = tens << 4 | ones;
-
- /* Weekday is not used. Therefore it can be set to an arbitrary valid value */
- time->weekday = 1;
-
- tens = day / 10;
- ones = day % 10;
- time->date = tens << 4 | ones;
-
- tens = month / 10;
- ones = month % 10;
- if ((year >= 2000) && (year < 2100))
- century = DS1339_MONTH_CENTURY;
- time->month = century | tens << 4 | ones;
-
- tens = (year % 100) / 10;
- ones = year % 10;
- time->year = tens << 4 | ones;
-
-}
-
-
-
-static rtems_status_code ds1339_open_file(int* fd)
-{
-
- int rv = 0;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- *fd = open(DS1339_I2C_BUS_DEVICE, O_RDWR);
- if (*fd == -1)
- sc = RTEMS_IO_ERROR;
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = ioctl(*fd, I2C_IOC_SET_SLAVE_ADDRESS, DS1339_I2C_ADDRESS);
- if (rv == -1)
- sc = RTEMS_IO_ERROR;
- }
-
- return sc;
-}
-
-
-/* Read size bytes from ds1339 register address addr to buf. */
-static rtems_status_code ds1339_read(uint8_t addr, void* buf, size_t size)
-{
-
- int fd = -1;
- int rv = 0;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- sc = ds1339_open_file(&fd);
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = write(fd, &addr, sizeof(addr));
- if (rv != sizeof(addr))
- sc = RTEMS_IO_ERROR;
- }
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = read(fd, buf, size);
- if (rv != size)
- sc = RTEMS_IO_ERROR;
- }
-
- rv = close(fd);
- if (rv != 0)
- sc = RTEMS_IO_ERROR;
-
- return sc;
-}
-
-
-/* Write size bytes from buf to ds1339 register address addr. */
-static rtems_status_code ds1339_write(uint8_t addr, void* buf, size_t size)
-{
-
- int fd = -1;
- int rv = 0;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- /* The driver never writes many bytes. Therefore it should be less expensive
- * to reserve the maximum number of bytes that will be written in one go than
- * use a malloc. */
- uint8_t local_buf[DS1339_MAX_WRITE_SIZE];
- int write_size = size + 1;
-
- assert(write_size <= DS1339_MAX_WRITE_SIZE);
-
- local_buf[0] = addr;
- memcpy(&local_buf[1], buf, size);
-
- sc = ds1339_open_file(&fd);
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = write(fd, local_buf, write_size);
- if (rv != write_size)
- sc = RTEMS_IO_ERROR;
- }
-
- rv = close(fd);
- if (rv != 0)
- sc = RTEMS_IO_ERROR;
-
- return RTEMS_SUCCESSFUL;
-}
-
-
-static void altera_cyclone_v_ds1339_initialize(int minor)
-{
-
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- uint8_t status = 0;
-
- /* Check RTC valid */
- sc = ds1339_read(DS1339_ADDR_STATUS, &status, sizeof(status));
- assert(sc == RTEMS_SUCCESSFUL);
-
- if (status & DS1339_STATUS_OSF)
- {
- /* RTC has been stopped. Initialise it. */
- ds1339_time_t time;
-
- uint8_t write = DS1339_CTRL_DEFAULT;
- sc = ds1339_write(DS1339_ADDR_CTRL, &write, sizeof(write));
- assert(sc == RTEMS_SUCCESSFUL);
-
- write = DS1339_STATUS_CLEAR;
- sc = ds1339_write(DS1339_ADDR_STATUS, &write, sizeof(write));
- assert(sc == RTEMS_SUCCESSFUL);
-
- ds1339_set_time(&time, 0, 0, 0, 1, 1, TOD_BASE_YEAR);
- sc = ds1339_write(DS1339_ADDR_TIME, &time, sizeof(time));
- assert(sc == RTEMS_SUCCESSFUL);
- }
-
-}
-
-
-static int altera_cyclone_v_ds1339_get_time(int minor, rtems_time_of_day* tod)
-{
-
- ds1339_time_t time;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_time_of_day temp_tod;
-
- sc = ds1339_read(DS1339_ADDR_TIME, &time, sizeof(time));
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- temp_tod.ticks = 0;
- temp_tod.second = ds1339_get_seconds(&time);
- temp_tod.minute = ds1339_get_minutes(&time);
- temp_tod.hour = ds1339_get_hours(&time);
- temp_tod.day = ds1339_get_day_of_month(&time);
- temp_tod.month = ds1339_get_month(&time);
- temp_tod.year = ds1339_get_year(&time);
-
- if (_TOD_Validate(&temp_tod))
- memcpy(tod, &temp_tod, sizeof(temp_tod));
- else
- sc = RTEMS_INVALID_CLOCK;
- }
-
- return -sc;
-}
-
-
-static int altera_cyclone_v_ds1339_set_time(int minor, const rtems_time_of_day* tod)
-{
-
- ds1339_time_t time;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- ds1339_set_time(&time,
- tod->second,
- tod->minute,
- tod->hour,
- tod->day,
- tod->month,
- tod->year
- );
-
- sc = ds1339_write(DS1339_ADDR_TIME, &time, sizeof(time));
-
- return -sc;
-}
-
-
-static bool altera_cyclone_v_ds1339_probe(int minor)
-{
-
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- uint8_t buf;
-
- /* try to read from register address 0x00 */
- sc = ds1339_read(0x00, &buf, 1);
- if (sc != RTEMS_SUCCESSFUL)
- /* no RTC implemented */
- return false;
- /* try to read from register address 0x20 (not implemented in DS1339) */
- sc = ds1339_read(0x20, &buf, 1);
- if (sc == RTEMS_SUCCESSFUL)
- /* RTC is not DS1339 */
- return false;
-
- return true;
-
-}
-
-
-/* ******************************* M41ST87 ********************************** */
-
-
-#define M41ST87_I2C_ADDRESS (0xD0 >> 1) /* 7-bit addressing! */
-#define M41ST87_I2C_BUS_DEVICE "/dev/i2c0"
-
-#define M41ST87_ADDR_TIME 0x00
-
-#define M41ST87_ADDR_CTRL 0x08
-#define M41ST87_CTRL_OUT 0x80
-#define M41ST87_CTRL_FT 0x40
-#define M41ST87_CTRL_S 0x20
-#define M41ST87_CTRL_CAL 0x1F
-
-#define M41ST87_ADDR_ALARM_HOUR 0x0C
-#define M41ST87_BIT_HT 0x40
-
-#define M41ST87_ADDR_FLAGS 0x0F
-#define M41ST87_FLAG_WDF 0x80
-#define M41ST87_FLAG_AF 0x40
-#define M41ST87_FLAG_BL 0x10
-#define M41ST87_FLAG_OF 0x04
-#define M41ST87_FLAG_TB1 0x02
-#define M41ST87_FLAG_TB2 0x01
-
-#define M41ST87_ADDR_USER_RAM 0x20
-
-
-typedef struct
-{
- uint8_t sec100;
- uint8_t seconds;
-#define M41ST87_BIT_ST 0x80
- uint8_t minutes;
-#define M41ST87_BIT_OFIE 0x80
- uint8_t hours;
-#define M41ST87_BIT_CB1 0x80
-#define M41ST87_BIT_CB0 0x40
- uint8_t weekday;
-#define M41ST87_BIT_TR 0x80
-#define M41ST87_BIT_THS 0x40
-#define M41ST87_BIT_CLRPW1 0x20
-#define M41ST87_BIT_CLRPW0 0x10
-#define M41ST87_BIT_32KE 0x08
- uint8_t day;
-#define M41ST87_BIT_PFOD 0x80
- uint8_t month;
- uint8_t year;
-}
-m41st87_time_t;
-
-
-/* The longest write transmission is writing the time + one address bit */
-#define M41ST87_MAX_WRITE_SIZE (sizeof(m41st87_time_t) + 1)
-
-
-/* Functions for converting the fields */
-
-/*
-static unsigned int m41st87_get_sec100(m41st87_time_t* time)
-{
-
- uint8_t tens = time->sec100 >> 4;
- uint8_t ones = time->sec100 & 0x0F;
-
- return tens * 10 + ones;
-}
-*/
-
-
-static unsigned int m41st87_get_seconds(m41st87_time_t* time)
-{
-
- uint8_t tens = (time->seconds >> 4) & 0x07;
- uint8_t ones = time->seconds & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int m41st87_get_minutes(m41st87_time_t* time)
-{
-
- uint8_t tens = (time->minutes >> 4) & 0x07;
- uint8_t ones = time->minutes & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int m41st87_get_hours(m41st87_time_t* time)
-{
-
- uint8_t tens = (time->hours >> 4) & 0x03;
- uint8_t ones = time->hours & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-/*
-static unsigned int m41st87_get_day_of_week(m41st87_time_t* time)
-{
-
- return time->weekday & 0x07;
-}
-*/
-
-
-static unsigned int m41st87_get_day_of_month(m41st87_time_t* time)
-{
-
- uint8_t tens = (time->day >> 4) & 0x03;
- uint8_t ones = time->day & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int m41st87_get_month(m41st87_time_t* time)
-{
-
- uint8_t tens = (time->month >> 4) & 0x01;
- uint8_t ones = time->month & 0x0F;
-
- return tens * 10 + ones;
-}
-
-
-static unsigned int m41st87_get_year(m41st87_time_t* time)
-{
-
- uint8_t century = time->hours >> 6;
- uint8_t tens = time->year >> 4;
- uint8_t ones = time->year & 0x0F;
-
- return 1900 + century * 100 + tens * 10 + ones;
-}
-
-
-static void m41st87_set_time(m41st87_time_t* time,
- unsigned int second,
- unsigned int minute,
- unsigned int hour,
- unsigned int day,
- unsigned int month,
- unsigned int year)
-{
-
- unsigned int century;
- unsigned int tens;
- unsigned int ones;
-
- if (year < 1900)
- year = 1900;
- if (year > 2399)
- year = 2399;
- century = (year - 1900) / 100;
-
- /* Hundreds of seconds is not used, set to 0 */
- time->sec100 = 0;
-
- tens = second / 10;
- ones = second % 10;
- time->seconds = (time->seconds & 0x80) | (tens << 4) | ones;
-
- tens = minute / 10;
- ones = minute % 10;
- time->minutes = (time->minutes & 0x80) | (tens << 4) | ones;
-
- tens = hour / 10;
- ones = hour % 10;
- time->hours = (century << 6) | (tens << 4) | ones;
-
- /* Weekday is not used. Therefore it can be set to an arbitrary valid value */
- time->weekday = (time->weekday & 0xF8) | 1;
-
- tens = day / 10;
- ones = day % 10;
- time->day = (time->day & 0x80) | (tens << 4) | ones;
-
- tens = month / 10;
- ones = month % 10;
- time->month = (tens << 4) | ones;
-
- tens = (year % 100) / 10;
- ones = year % 10;
- time->year = (tens << 4) | ones;
-
-}
-
-
-
-static rtems_status_code m41st87_open_file(int* fd)
-{
-
- int rv = 0;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- *fd = open(M41ST87_I2C_BUS_DEVICE, O_RDWR);
- if (*fd == -1)
- sc = RTEMS_IO_ERROR;
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = ioctl(*fd, I2C_IOC_SET_SLAVE_ADDRESS, M41ST87_I2C_ADDRESS);
- if (rv == -1)
- sc = RTEMS_IO_ERROR;
- }
-
- return sc;
-}
-
-
-/* Read size bytes from m41st87 register address addr to buf. */
-static rtems_status_code m41st87_read(uint8_t addr, void* buf, size_t size)
-{
-
- int fd = -1;
- int rv = 0;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- sc = m41st87_open_file(&fd);
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = write(fd, &addr, sizeof(addr));
- if (rv != sizeof(addr))
- sc = RTEMS_IO_ERROR;
- }
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = read(fd, buf, size);
- if (rv != size)
- sc = RTEMS_IO_ERROR;
- }
-
- rv = close(fd);
- if (rv != 0)
- sc = RTEMS_IO_ERROR;
-
- return sc;
-}
-
-
-/* Write size bytes from buf to m41st87 register address addr. */
-static rtems_status_code m41st87_write(uint8_t addr, void* buf, size_t size)
-{
-
- int fd = -1;
- int rv = 0;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- /* The driver never writes many bytes. Therefore it should be less expensive
- * to reserve the maximum number of bytes that will be written in one go than
- * use a malloc. */
- uint8_t local_buf[M41ST87_MAX_WRITE_SIZE];
- int write_size = size + 1;
-
- assert(write_size <= M41ST87_MAX_WRITE_SIZE);
-
- local_buf[0] = addr;
- memcpy(&local_buf[1], buf, size);
-
- sc = m41st87_open_file(&fd);
-
- if (sc == RTEMS_SUCCESSFUL)
- {
- rv = write(fd, local_buf, write_size);
- if (rv != write_size)
- sc = RTEMS_IO_ERROR;
- }
-
- rv = close(fd);
- if (rv != 0)
- sc = RTEMS_IO_ERROR;
-
- return RTEMS_SUCCESSFUL;
-}
-
-
-static void altera_cyclone_v_m41st87_initialize(int minor)
-{
-
- m41st87_time_t time;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- uint8_t value;
-
- /* Check RTC valid */
- sc = m41st87_read(M41ST87_ADDR_TIME, &time, sizeof(time));
- assert(sc == RTEMS_SUCCESSFUL);
-
- if (time.seconds & M41ST87_BIT_ST)
- {
- /* RTC has been stopped. Reset stop flag. */
- time.seconds = 0;
- /* Initialise RTC. */
- m41st87_set_time(&time, 0, 0, 0, 1, 1, TOD_BASE_YEAR);
- sc = m41st87_write(M41ST87_ADDR_TIME, &time, sizeof(time));
- assert(sc == RTEMS_SUCCESSFUL);
- }
-
- /* Reset HT bit */
- sc = m41st87_read(M41ST87_ADDR_ALARM_HOUR, &value, 1);
- assert(sc == RTEMS_SUCCESSFUL);
- value &= ~M41ST87_BIT_HT;
- sc = m41st87_write(M41ST87_ADDR_ALARM_HOUR, &value, 1);
- assert(sc == RTEMS_SUCCESSFUL);
-
-}
-
-
-static int altera_cyclone_v_m41st87_get_time(int minor, rtems_time_of_day* tod)
-{
-
- m41st87_time_t time;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_time_of_day temp_tod;
-
- sc = m41st87_read(M41ST87_ADDR_TIME, &time, sizeof(time));
- if (sc != RTEMS_SUCCESSFUL)
- return -sc;
-
- temp_tod.ticks = 0;
- temp_tod.second = m41st87_get_seconds(&time);
- temp_tod.minute = m41st87_get_minutes(&time);
- temp_tod.hour = m41st87_get_hours(&time);
- temp_tod.day = m41st87_get_day_of_month(&time);
- temp_tod.month = m41st87_get_month(&time);
- temp_tod.year = m41st87_get_year(&time);
-
- if (_TOD_Validate(&temp_tod))
- memcpy(tod, &temp_tod, sizeof(temp_tod));
- else
- sc = RTEMS_INVALID_CLOCK;
-
- return -sc;
-}
-
-
-static int altera_cyclone_v_m41st87_set_time(int minor, const rtems_time_of_day* tod)
-{
-
- m41st87_time_t time;
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- /* first read to preserve the additional flags */
- sc = m41st87_read(M41ST87_ADDR_TIME, &time, sizeof(time));
- if (sc != RTEMS_SUCCESSFUL)
- return -sc;
-
- m41st87_set_time(&time,
- tod->second,
- tod->minute,
- tod->hour,
- tod->day,
- tod->month,
- tod->year
- );
-
- sc = m41st87_write(M41ST87_ADDR_TIME, &time, sizeof(time));
-
- return -sc;
-}
-
-
-static bool altera_cyclone_v_m41st87_probe(int minor)
-{
-
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- uint8_t buf;
-
- /* try to read from register address 0x00 */
- sc = m41st87_read(0x00, &buf, 1);
- if (sc != RTEMS_SUCCESSFUL)
- /* no RTC implemented */
- return false;
- /* try to read from register address 0x20 (implemented in M41ST87) */
- sc = m41st87_read(0x20, &buf, 1);
- if (sc != RTEMS_SUCCESSFUL)
- /* RTC is not M41ST87 */
- return false;
-
- return true;
-
-}
-
-
-/* **************************************** General ********************************** */
-
-
-const rtc_fns altera_cyclone_v_ds1339_ops =
-{
- .deviceInitialize = altera_cyclone_v_ds1339_initialize,
- .deviceGetTime = altera_cyclone_v_ds1339_get_time,
- .deviceSetTime = altera_cyclone_v_ds1339_set_time
-};
-
-
-const rtc_fns altera_cyclone_v_m41st87_ops =
-{
- .deviceInitialize = altera_cyclone_v_m41st87_initialize,
- .deviceGetTime = altera_cyclone_v_m41st87_get_time,
- .deviceSetTime = altera_cyclone_v_m41st87_set_time
-};
-
-
-size_t RTC_Count = ALTERA_CYCLONE_V_RTC_NUMBER;
-
-rtc_tbl RTC_Table[ALTERA_CYCLONE_V_RTC_NUMBER] =
-{
- {
- .sDeviceName = "/dev/rtc",
- .deviceType = RTC_CUSTOM,
- .pDeviceFns = &altera_cyclone_v_ds1339_ops,
- .deviceProbe = altera_cyclone_v_ds1339_probe,
- .pDeviceParams = NULL,
- .ulCtrlPort1 = 0,
- .ulDataPort = 0,
- .getRegister = NULL,
- .setRegister = NULL
- },
- {
- .sDeviceName = "/dev/rtc",
- .deviceType = RTC_CUSTOM,
- .pDeviceFns = &altera_cyclone_v_m41st87_ops,
- .deviceProbe = altera_cyclone_v_m41st87_probe,
- .pDeviceParams = NULL,
- .ulCtrlPort1 = 0,
- .ulDataPort = 0,
- .getRegister = NULL,
- .setRegister = NULL
- }
-};
diff --git a/c/src/lib/libbsp/arm/atsam/Makefile.am b/c/src/lib/libbsp/arm/atsam/Makefile.am
index 3a303085af..dd147951f9 100644
--- a/c/src/lib/libbsp/arm/atsam/Makefile.am
+++ b/c/src/lib/libbsp/arm/atsam/Makefile.am
@@ -141,7 +141,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/atsam/spi/sc16is752.c
# RTC
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/rtc/rtc-support.c
-librtemsbsp_a_SOURCES += rtc/rtc-config.c
+librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/atsam/rtc/rtc-config.c
# Helper functions
librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/atsam/start/iocopy.c
diff --git a/c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c b/c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c
deleted file mode 100644
index dca33668ad..0000000000
--- a/c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2016 embedded brains GmbH
- *
- * embedded brains GmbH
- * Dornierstr. 4
- * 82178 Puchheim
- * Germany
- * <info@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.
- */
-
-#include <libchip/chip.h>
-#include <libchip/rtc.h>
-
-#include <bsp.h>
-
-#define ARBITRARY_DAY_OF_WEEK 1
-
-void atsam_rtc_get_time(rtems_time_of_day *tod)
-{
- Rtc *rtc = RTC;
- uint8_t hour;
- uint8_t minute;
- uint8_t second;
- uint16_t year;
- uint8_t month;
- uint8_t day;
- uint8_t week;
-
- RTC_GetDate(rtc, &year, &month, &day, &week);
- RTC_GetTime(rtc, &hour, &minute, &second);
-
- tod->ticks = 0;
- tod->second = second;
- tod->minute = minute;
- tod->hour = hour;
- tod->day = day;
- tod->month = month;
- tod->year = year;
-}
-
-static void atsam_rtc_device_initialize(int minor)
-{
- Rtc *rtc = RTC;
-
- RTC_DisableIt(rtc, 0x1F);
-}
-
-static int atsam_rtc_device_get_time(int minor, rtems_time_of_day *tod)
-{
- atsam_rtc_get_time(tod);
-
- return 0;
-}
-
-static int atsam_rtc_device_set_time(int minor, const rtems_time_of_day *tod)
-{
- Rtc *rtc = RTC;
- uint8_t hour;
- uint8_t minute;
- uint8_t second;
- uint16_t year;
- uint8_t month;
- uint8_t day;
- uint8_t week;
-
- second = (uint8_t) tod->second;
- minute = (uint8_t) tod->minute;
- hour = (uint8_t) tod->hour;
- day = (uint8_t) tod->day;
- month = (uint8_t) tod->month;
- week = ARBITRARY_DAY_OF_WEEK;
- year = (uint16_t) tod->year;
-
- RTC_SetDate(rtc, year, month, day, week);
- RTC_SetTime(rtc, hour, minute, second);
-
- return 0;
-}
-
-static bool atsam_rtc_device_probe(int minor)
-{
- return true;
-}
-
-const rtc_fns atsam_rtc_device_ops = {
- .deviceInitialize = atsam_rtc_device_initialize,
- .deviceGetTime = atsam_rtc_device_get_time,
- .deviceSetTime = atsam_rtc_device_set_time
-};
-
-rtc_tbl RTC_Table[] = {
- {
- .sDeviceName = "/dev/rtc",
- .deviceType = RTC_CUSTOM,
- .pDeviceFns = &atsam_rtc_device_ops,
- .deviceProbe = atsam_rtc_device_probe
- }
-};
-
-size_t RTC_Count = RTEMS_ARRAY_SIZE(RTC_Table);
diff --git a/c/src/lib/libbsp/arm/lpc176x/Makefile.am b/c/src/lib/libbsp/arm/lpc176x/Makefile.am
index 383bbfd51d..98ba911e49 100644
--- a/c/src/lib/libbsp/arm/lpc176x/Makefile.am
+++ b/c/src/lib/libbsp/arm/lpc176x/Makefile.am
@@ -69,7 +69,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-armv7m.c
# RTC
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/rtc/rtc-support.c
-librtemsbsp_a_SOURCES += rtc/rtc-config.c
+librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc176x/rtc/rtc-config.c
# GPIO
librtemsbsp_a_SOURCES += gpio/lpc-gpio.c
diff --git a/c/src/lib/libbsp/arm/lpc176x/rtc/rtc-config.c b/c/src/lib/libbsp/arm/lpc176x/rtc/rtc-config.c
deleted file mode 100644
index 7d1512c01a..0000000000
--- a/c/src/lib/libbsp/arm/lpc176x/rtc/rtc-config.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * @file
- *
- * @ingroup lpc176x
- *
- * @brief RTC configuration.
- */
-
-/*
- * Copyright (c) 2008
- * 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.
- */
-
-#include <libchip/rtc.h>
-#include <bsp/io.h>
-
-#define LPC176X_RTC_NUMBER 1U
-
-void bsp_rtc_initialize( void );
-int bsp_rtc_get_time( rtems_time_of_day *tod );
-int bsp_rtc_set_time( const rtems_time_of_day *tod );
-bool bsp_rtc_probe( void );
-
-/**
- * @brief Initialize the rtc device.
- */
-void bsp_rtc_initialize( void )
-{
- /* Enable module power */
- lpc176x_module_enable( LPC176X_MODULE_RTC, LPC176X_MODULE_PCLK_DEFAULT );
-
- /* Enable the RTC and use external clock */
- RTC_CCR = RTC_CCR_CLKEN | RTC_CCR_CLKSRC;
-
- /* Disable interrupts */
- RTC_CIIR = 0U;
- RTC_CISS = 0U;
- RTC_AMR = 0xFFU;
-
- /* Clear interrupts */
- RTC_ILR = RTC_ILR_RTCCIF | RTC_ILR_RTCALF | RTC_ILR_RTSSF;
-}
-
-/**
- * @brief Gets the information according to the current time.
- *
- * @param tod Value to be modified.
- * @return 0
- */
-int bsp_rtc_get_time( rtems_time_of_day *tod )
-{
- tod->ticks = 0;
- tod->second = RTC_SEC;
- tod->minute = RTC_MIN;
- tod->hour = RTC_HOUR;
- tod->day = RTC_DOM;
- tod->month = RTC_MONTH;
- tod->year = RTC_YEAR;
-
- return 0;
-}
-
-/**
- * @brief Sets the information according to the current time.
- *
- * @param tod Value to get the new information.
- * @return 0
- */
-int bsp_rtc_set_time( const rtems_time_of_day *tod )
-{
- RTC_SEC = tod->second;
- RTC_MIN = tod->minute;
- RTC_HOUR = tod->hour;
- RTC_DOM = tod->day;
- RTC_MONTH = tod->month;
- RTC_YEAR = tod->year;
-
- return 0;
-}
-
-/**
- * @brief Used to probe. At the moment is not used.
- *
- * @return true.
- */
-bool bsp_rtc_probe( void )
-{
- return true;
-}
-
-/**
- * @brief Represents the real time clock options.
- */
-const rtc_fns lpc176x_rtc_ops = {
- .deviceInitialize = (void *) bsp_rtc_initialize,
- .deviceGetTime = (void *) bsp_rtc_get_time,
- .deviceSetTime = (void *) bsp_rtc_set_time
-};
-
-size_t RTC_Count = LPC176X_RTC_NUMBER;
-
-/**
- * @brief Table to describes the rtc device.
- */
-rtc_tbl RTC_Table[ LPC176X_RTC_NUMBER ] = {
- {
- .sDeviceName = "/dev/rtc",
- .deviceType = RTC_CUSTOM,
- .pDeviceFns = &lpc176x_rtc_ops,
- .deviceProbe = (void *) bsp_rtc_probe,
- .pDeviceParams = NULL,
- .ulCtrlPort1 = 0,
- .ulDataPort = 0,
- .getRegister = NULL,
- .setRegister = NULL
- }
-};
diff --git a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
index 3610584006..e6d78e88ce 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
+++ b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
@@ -84,7 +84,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-armv7m.c
# RTC
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/rtc/rtc-support.c
-librtemsbsp_a_SOURCES += rtc/rtc-config.c
+librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc24xx/rtc/rtc-config.c
# Misc
librtemsbsp_a_SOURCES += misc/system-clocks.c
diff --git a/c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c b/c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c
deleted file mode 100644
index c154a98196..0000000000
--- a/c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * @file
- *
- * @ingroup lpc24xx
- *
- * @brief RTC configuration.
- */
-
-/*
- * Copyright (c) 2008
- * 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.
- */
-
-#include <libchip/rtc.h>
-
-#include <bsp/lpc24xx.h>
-#include <bsp/io.h>
-
-#define LPC24XX_RTC_NUMBER 1
-
-static void lpc24xx_rtc_initialize(int minor)
-{
- /* Enable module power */
- lpc24xx_module_enable(LPC24XX_MODULE_RTC, LPC24XX_MODULE_PCLK_DEFAULT);
-
- /* Enable the RTC and use external clock */
- RTC_CCR = RTC_CCR_CLKEN | RTC_CCR_CLKSRC;
-
- /* Disable interrupts */
- RTC_CIIR = 0;
- RTC_CISS = 0;
- RTC_AMR = 0xff;
-
- /* Clear interrupts */
- RTC_ILR = RTC_ILR_RTCCIF | RTC_ILR_RTCALF | RTC_ILR_RTSSF;
-}
-
-static int lpc24xx_rtc_get_time(int minor, rtems_time_of_day *tod)
-{
- tod->ticks = 0;
- tod->second = RTC_SEC;
- tod->minute = RTC_MIN;
- tod->hour = RTC_HOUR;
- tod->day = RTC_DOM;
- tod->month = RTC_MONTH;
- tod->year = RTC_YEAR;
-
- return 0;
-}
-
-static int lpc24xx_rtc_set_time(int minor, const rtems_time_of_day *tod)
-{
- RTC_SEC = tod->second;
- RTC_MIN = tod->minute;
- RTC_HOUR = tod->hour;
- RTC_DOM = tod->day;
- RTC_MONTH = tod->month;
- RTC_YEAR = tod->year;
-
- return 0;
-}
-
-static bool lpc24xx_rtc_probe(int minor)
-{
- return true;
-}
-
-const rtc_fns lpc24xx_rtc_ops = {
- .deviceInitialize = lpc24xx_rtc_initialize,
- .deviceGetTime = lpc24xx_rtc_get_time,
- .deviceSetTime = lpc24xx_rtc_set_time
-};
-
-size_t RTC_Count = LPC24XX_RTC_NUMBER;
-
-rtc_tbl RTC_Table [LPC24XX_RTC_NUMBER] = {
- {
- .sDeviceName = "/dev/rtc",
- .deviceType = RTC_CUSTOM,
- .pDeviceFns = &lpc24xx_rtc_ops,
- .deviceProbe = lpc24xx_rtc_probe,
- .pDeviceParams = NULL,
- .ulCtrlPort1 = 0,
- .ulDataPort = 0,
- .getRegister = NULL,
- .setRegister = NULL
- }
-};
diff --git a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
index 9353f67da9..4a370756ff 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
+++ b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
@@ -69,7 +69,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-nxp-lpc.c
# RTC
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/rtc/rtc-support.c
-librtemsbsp_a_SOURCES += rtc/rtc-config.c
+librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc32xx/rtc/rtc-config.c
# Misc
librtemsbsp_a_SOURCES += misc/boot.c
diff --git a/c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c b/c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c
deleted file mode 100644
index bd225248b3..0000000000
--- a/c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * @file
- *
- * @ingroup arm_lpc32xx
- *
- * @brief RTC configuration.
- */
-
-/*
- * Copyright (c) 2009-2011 embedded brains GmbH. All rights reserved.
- *
- * embedded brains GmbH
- * Obere Lagerstr. 30
- * 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.
- */
-
-#include <libchip/rtc.h>
-
-#include <bsp.h>
-#include <bsp/lpc32xx.h>
-
-#define LPC32XX_RTC_COUNT 1U
-
-#define LPC32XX_RTC_COUNTER_DELTA 0xfffffffeU
-
-#define LPC32XX_RTC_KEY 0xb5c13f27U
-
-#define LPC32XX_RTC_CTRL_FORCE_ONSW (1U << 7)
-#define LPC32XX_RTC_CTRL_STOP (1U << 6)
-#define LPC32XX_RTC_CTRL_RESET (1U << 4)
-#define LPC32XX_RTC_CTRL_MATCH_1_ONSW (1U << 3)
-#define LPC32XX_RTC_CTRL_MATCH_0_ONSW (1U << 2)
-#define LPC32XX_RTC_CTRL_MATCH_1_INTR (1U << 1)
-#define LPC32XX_RTC_CTRL_MATCH_0_INTR (1U << 0)
-
-static void lpc32xx_rtc_set(uint32_t val)
-{
- unsigned i = lpc32xx_arm_clk() / LPC32XX_OSCILLATOR_RTC;
-
- lpc32xx.rtc.ctrl |= LPC32XX_RTC_CTRL_STOP;
- lpc32xx.rtc.ucount = val;
- lpc32xx.rtc.dcount = LPC32XX_RTC_COUNTER_DELTA - val;
- lpc32xx.rtc.ctrl &= ~LPC32XX_RTC_CTRL_STOP;
-
- /* It needs some time before we can read the values back */
- while (i != 0) {
- __asm__ volatile ("nop");
- --i;
- }
-}
-
-static void lpc32xx_rtc_reset(void)
-{
- lpc32xx.rtc.ctrl = LPC32XX_RTC_CTRL_RESET;
- lpc32xx.rtc.ctrl = 0;
- lpc32xx.rtc.key = LPC32XX_RTC_KEY;
- lpc32xx_rtc_set(0);
-}
-
-static void lpc32xx_rtc_initialize(int minor)
-{
- uint32_t up_first = 0;
- uint32_t up_second = 0;
- uint32_t down_first = 0;
- uint32_t down_second = 0;
-
- if (lpc32xx.rtc.key != LPC32XX_RTC_KEY) {
- lpc32xx_rtc_reset();
- }
-
- do {
- up_first = lpc32xx.rtc.ucount;
- down_first = lpc32xx.rtc.dcount;
- up_second = lpc32xx.rtc.ucount;
- down_second = lpc32xx.rtc.dcount;
- } while (up_first != up_second || down_first != down_second);
-
- if (up_first + down_first != LPC32XX_RTC_COUNTER_DELTA) {
- lpc32xx_rtc_reset();
- }
-}
-
-static int lpc32xx_rtc_get_time(int minor, rtems_time_of_day *tod)
-{
- struct timeval now = {
- .tv_sec = lpc32xx.rtc.ucount,
- .tv_usec = 0
- };
- struct tm time;
-
- gmtime_r(&now.tv_sec, &time);
-
- tod->year = time.tm_year + 1900;
- tod->month = time.tm_mon + 1;
- tod->day = time.tm_mday;
- tod->hour = time.tm_hour;
- tod->minute = time.tm_min;
- tod->second = time.tm_sec;
- tod->ticks = 0;
-
- return RTEMS_SUCCESSFUL;
-}
-
-static int lpc32xx_rtc_set_time(int minor, const rtems_time_of_day *tod)
-{
- lpc32xx_rtc_set(_TOD_To_seconds(tod));
-
- return 0;
-}
-
-static bool lpc32xx_rtc_probe(int minor)
-{
- return true;
-}
-
-const rtc_fns lpc32xx_rtc_ops = {
- .deviceInitialize = lpc32xx_rtc_initialize,
- .deviceGetTime = lpc32xx_rtc_get_time,
- .deviceSetTime = lpc32xx_rtc_set_time
-};
-
-size_t RTC_Count = LPC32XX_RTC_COUNT;
-
-rtc_tbl RTC_Table [LPC32XX_RTC_COUNT] = {
- {
- .sDeviceName = "/dev/rtc",
- .deviceType = RTC_CUSTOM,
- .pDeviceFns = &lpc32xx_rtc_ops,
- .deviceProbe = lpc32xx_rtc_probe,
- .pDeviceParams = NULL,
- .ulCtrlPort1 = 0,
- .ulDataPort = 0,
- .getRegister = NULL,
- .setRegister = NULL
- }
-};