Index: c/src/lib/libbsp/arm/lpc176x/include/can.h
===================================================================
--- c/src/lib/libbsp/arm/lpc176x/include/can.h	(revision 7b35a36fb16491dbdb98106ab39d35b8d19598e5)
+++ c/src/lib/libbsp/arm/lpc176x/include/can.h	(revision 7b35a36fb16491dbdb98106ab39d35b8d19598e5)
@@ -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.com/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 */
