summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/tms570/clock/clock.c
diff options
context:
space:
mode:
authorPremysl Houdek <kom541000@gmail.com>2014-08-20 17:24:23 +0200
committerGedare Bloom <gedare@rtems.org>2014-08-20 13:44:23 -0400
commit4407ee675cb22e8bb870a76eafc590eb6e754315 (patch)
treeaf8b73c912e1011cd99d5c8966756c06a08bacfd /c/src/lib/libbsp/arm/tms570/clock/clock.c
parentlpc24xx/lpc17xx: lpc24xx_pin_set_function() keep LPC4088 W type pin in digita... (diff)
downloadrtems-4407ee675cb22e8bb870a76eafc590eb6e754315.tar.bz2
BSP for TMS570LS31x Hercules Development Kit from TI (TMS570LS3137)
Included variants: tms570ls3137_hdk_intram - place code and data into internal SRAM tms570ls3137_hdk_sdram - place code into external SDRAM and data to SRAM tms570ls3137_hdk - variant prepared for stand-alone RTEMS aplication stored and running directly from flash. Not working yet. Chip initialization code not included in BSP. External startup generated by TI's HalCoGen was used for testing and debugging. More information about TMS570 BSP can be found at http://www.rtems.org/wiki/index.php/Tms570 Patch version 2 - most of the formatting suggestion applied. - BSP converted to use clock shell - console driver "set attributes" tested. Baudrate change working Patch version 3 - more formatting changes. - removed leftover defines and test functions Todo: refactor header files (name register fields)
Diffstat (limited to 'c/src/lib/libbsp/arm/tms570/clock/clock.c')
-rw-r--r--c/src/lib/libbsp/arm/tms570/clock/clock.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/tms570/clock/clock.c b/c/src/lib/libbsp/arm/tms570/clock/clock.c
new file mode 100644
index 0000000000..2a8bb5f4a6
--- /dev/null
+++ b/c/src/lib/libbsp/arm/tms570/clock/clock.c
@@ -0,0 +1,159 @@
+/**
+ * @file clock.c
+ *
+ * @ingroup tms570
+ *
+ * @brief clock functions definitions.
+ */
+
+/*
+ * Copyright (c) 2014 Premysl Houdek <kom541000@gmail.com>
+ *
+ * Google Summer of Code 2014 at
+ * Czech Technical University in Prague
+ * Zikova 1903/4
+ * 166 36 Praha 6
+ * Czech Republic
+ *
+ * Based on LPC24xx and LPC1768 BSP
+ * by embedded brains GmbH and others
+ *
+ * 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 <stdlib.h>
+
+#include <rtems.h>
+#include <bsp.h>
+#include <bsp/irq.h>
+#include <bsp/tms570-rti.h>
+
+/**
+ * holds HW counter value since last interrupt event
+ * sets in tms570_clock_driver_support_at_tick
+ * used in tms570_clock_driver_nanoseconds_since_last_tick
+ */
+static uint32_t tms570_rti_last_tick_fcr0;
+
+/**
+ * @brief Initialize the HW peripheral for clock driver
+ *
+ * Clock driver is implemented by RTI module
+ *
+ * @retval Void
+ */
+static void tms570_clock_driver_support_initialize_hardware( void )
+{
+
+ uint32_t microsec_per_tick = rtems_configuration_get_microseconds_per_tick();
+
+ /* Hardware specific initialize */
+ TMS570_RTI.RTIGCTRL = 0;
+ TMS570_RTI.RTICPUC0 = BSP_PLL_OUT_CLOCK /1000000 / 2; /* prescaler */
+ TMS570_RTI.RTITBCTRL = 2;
+ TMS570_RTI.RTICAPCTRL = 0;
+ TMS570_RTI.RTICOMPCTRL = 0;
+ /* set counter to zero */
+ TMS570_RTI.RTIUC0 = 0;
+ TMS570_RTI.RTIFRC0 = 0;
+ /* clear interrupts*/
+ TMS570_RTI.RTICLEARINTENA = 0x00070f0f;
+ TMS570_RTI.RTIINTFLAG = 0x0007000f;
+ /* set timer */
+ TMS570_RTI.RTICOMP0 = TMS570_RTI.RTIFRC0 + microsec_per_tick;
+ TMS570_RTI.RTICOMP0CLR = TMS570_RTI.RTICOMP0 + microsec_per_tick / 2;
+ TMS570_RTI.RTIUDCP0 = microsec_per_tick;
+ /* enable interupt */
+ TMS570_RTI.RTISETINTENA = 0x1;
+ /* enable timer */
+ TMS570_RTI.RTIGCTRL = 1;
+}
+
+/**
+ * @brief Clears interrupt source
+ *
+ * @retval Void
+ */
+static void tms570_clock_driver_support_at_tick( void )
+{
+ TMS570_RTI.RTIINTFLAG = 0x00000001;
+ tms570_rti_last_tick_fcr0 = TMS570_RTI.RTICOMP0 - TMS570_RTI.RTIUDCP0;
+ /* TMS570_RTI.RTICOMP0 += 1000; */
+}
+
+/**
+ * @brief registers RTI interrupt handler
+ *
+ * @param[in] Clock_isr new ISR handler
+ * @param[in] Old_ticker old ISR handler (unused and type broken)
+ *
+ * @retval Void
+ */
+static void tms570_clock_driver_support_install_isr(
+ rtems_isr_entry Clock_isr
+)
+{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+
+ sc = rtems_interrupt_handler_install(
+ TMS570_IRQ_TIMER_0,
+ "Clock",
+ RTEMS_INTERRUPT_UNIQUE,
+ (rtems_interrupt_handler) Clock_isr,
+ NULL
+ );
+ if ( sc != RTEMS_SUCCESSFUL ) {
+ rtems_fatal_error_occurred(0xdeadbeef);
+ }
+}
+
+/**
+ * @brief disables RTI interrupt
+ *
+ * Called when closing clock driver
+ *
+ * @retval Void
+ */
+static void tms570_clock_driver_support_shutdown_hardware( void )
+{
+ /* turn off the timer interrupts */
+ TMS570_RTI.RTICLEARINTENA = 0x20000;
+}
+
+/**
+ * @brief returns the nanoseconds since last tick
+ *
+ * Return the nanoseconds since last tick
+ *
+ * @retval x nanoseconds
+ *
+ */
+static uint32_t tms570_clock_driver_nanoseconds_since_last_tick( void )
+{
+ uint32_t actual_fcr0 = TMS570_RTI.RTIFRC0;
+ uint32_t usec_since_tick;
+
+ usec_since_tick = actual_fcr0 - tms570_rti_last_tick_fcr0;
+
+ return usec_since_tick * 1000;
+}
+
+#define Clock_driver_support_initialize_hardware \
+ tms570_clock_driver_support_initialize_hardware
+#define Clock_driver_support_at_tick \
+ tms570_clock_driver_support_at_tick
+#define Clock_driver_support_initialize_hardware \
+ tms570_clock_driver_support_initialize_hardware
+#define Clock_driver_support_shutdown_hardware \
+ tms570_clock_driver_support_shutdown_hardware
+#define Clock_driver_nanoseconds_since_last_tick \
+ tms570_clock_driver_nanoseconds_since_last_tick
+
+#define Clock_driver_support_install_isr(Clock_isr, Old_ticker ) \
+ tms570_clock_driver_support_install_isr( Clock_isr )
+
+void Clock_isr(void *arg); /* to supress warning */
+
+#include "../../../shared/clockdrv_shell.h"