forked from Imagelibrary/rtems
180 lines
4.2 KiB
C
180 lines
4.2 KiB
C
/**
|
|
* @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 length 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 */
|