summaryrefslogtreecommitdiff
path: root/include/bsp/can.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/bsp/can.h')
-rwxr-xr-xinclude/bsp/can.h179
1 files changed, 179 insertions, 0 deletions
diff --git a/include/bsp/can.h b/include/bsp/can.h
new file mode 100755
index 0000000000..c323608da2
--- /dev/null
+++ b/include/bsp/can.h
@@ -0,0 +1,179 @@
+/**
+ * @file can.h
+ *
+ * @ingroup lpc176x
+ *
+ * @brief CAN controller for the mbed lpc1768 board.
+ */
+
+/*
+ * Copyright (c) 2014 Taller Technologies.
+ *
+ * @author Diaz Marcos (marcos.diaz@tallertechnologies.com)
+ * @author Daniel Chicco (daniel.chicco@tallertechnologies.com)
+ *
+ * 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 LPC176X_CAN_H
+#define LPC176X_CAN_H
+
+#include <bsp.h>
+#include <bsp/io.h>
+#include <bsp/lpc176x.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @brief The CAN devices of the board.
+ */
+typedef enum {
+ CAN_0,
+ CAN_1,
+ CAN_DEVICES_NUMBER
+} lpc176x_can_number;
+
+/**
+ * @brief A CAN message represented for the registers of the device.
+ */
+typedef struct {
+ uint32_t info;
+ uint32_t id;
+ uint32_t data_a;
+ uint32_t data_b;
+} registers_can_message;
+
+/**
+ * @brief A CAN message represented with each logical parts
+ */
+typedef struct {
+ unsigned int reserved1 : 16;
+ unsigned int dlc : 4; /* Bits 16..19: DLC - Data Length Counter*/
+ unsigned int reserved0 : 10;
+ unsigned int rtr : 1; /* Bit 30: Set if this is a RTR message*/
+ unsigned int type : 1; /* Bit 31: Set if this is a 29-bit ID message*/
+ unsigned int id; /* CAN Message ID (11-bit or 29-bit)*/
+ unsigned char data[ 8 ]; /* CAN Message Data Bytes 0-7*/
+} low_level_can_message;
+
+/**
+ * @brief A CAN message represented of both forms.
+ */
+typedef union {
+ low_level_can_message low_level;
+ registers_can_message registers;
+} can_message;
+
+/**
+ * @brief The possible interrupt sources for CAN.
+ */
+typedef enum {
+ IRQ_RX = 0,
+ IRQ_TX,
+ IRQ_ERROR,
+ IRQ_OVERRUN,
+ IRQ_WAKEUP,
+ IRQ_PASSIVE,
+ IRQ_ARB,
+ IRQ_BUS,
+ IRQ_READY,
+ CAN_IRQ_NUMBER
+} can_irq_type;
+
+/**
+ * @brief An isr for a CAN interrupt
+ *
+ * @param number The CAN which rised the interrupt.
+ */
+typedef void (*lpc176x_can_isr) ( lpc176x_can_number number );
+
+/**
+ * @brief A CAN frequency value
+ */
+typedef unsigned int can_freq;
+
+/**
+ * @brief Opens CAN device.
+ * @details It enables the module and gives it a clock, sets the pins,
+ * disables the interrupts, sets the frequency and bypasses
+ * the acceptance filter.
+ *
+ * @param minor The device to open.
+ * @param freq The desired frequency.
+ * @return RTEMS_SUCCESFUL on success.
+ */
+rtems_status_code can_open( lpc176x_can_number minor, can_freq freq );
+
+/**
+ * @brief Closes the passed CAN device and shut it down.
+ *
+ * @param minor The device to close.
+ * @return RTEMS_SUCCESSFUL if ok, RTEMS_INVALID_NUMBER for a bad parameter.
+ */
+rtems_status_code can_close( lpc176x_can_number minor );
+
+/**
+ * @brief Reads the CAN device.
+ *
+ * @param minor The CAN device to read.
+ * @param message The read message.
+ * @return RTEMS_SUCCESSFUL if read ok, RTEMS_IO_ERROR otherwise.
+ */
+rtems_status_code can_read(
+ const lpc176x_can_number minor,
+ can_message *message
+);
+
+/**
+ * @brief Writes the passed CAN message into the selected CAN device.
+ *
+ * @param minor The device to write.
+ * @param message The message to write.
+ * @return RTEMS_SUCCESFUL if write ok. RTEMS_IO_ERROR otherwise.
+ */
+rtems_status_code can_write(
+ const lpc176x_can_number minor,
+ const can_message *const message
+);
+
+/**
+ * @brief Registers an isr in the driver vector, and enables the interrupt
+* in the device.
+ *
+ * @param number The CAN device to set
+ * @param type The interrupt type.
+ * @param isr The isr to register.
+ * @return RTEMS_SUCCESSFUL if ok RTEMS_INVALID_NUMBER otherwise.
+ */
+rtems_status_code can_register_isr(
+ const lpc176x_can_number number,
+ const can_irq_type type,
+ const lpc176x_can_isr isr
+);
+
+/**
+ * @brief Creates a CAN message.
+ * @details [long description]
+ *
+ * @param msg The created message.
+ * @param _id The can id for the message.
+ * @param _data The data of the message.
+ * @param _len The lenght of the message.
+ * @return RTEMS_SUCCESFUL if created, RTEMS_INVALID_NUMBER otherwise.
+ */
+rtems_status_code create_can_message(
+ can_message *const msg,
+ const int _id,
+ const char *const _data,
+ const char _len
+);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* ifndef LPC176X_CAN_H */