/**************************************************************************** * include/nuttx/can.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ #ifndef __INCLUDE_NUTTX_CAN_CAN_H #define __INCLUDE_NUTTX_CAN_CAN_H /**************************************************************************** * Included Files ****************************************************************************/ #ifdef CONFIG_CAN_TXREADY # include #endif #include #ifdef CONFIG_NET_CAN /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /* Ioctl Commands ***********************************************************/ /* Ioctl commands supported by the upper half CAN driver. * * CANIOC_RTR: * Description: Send the remote transmission request and wait for the * response. * Argument: A reference to struct canioc_rtr_s * * Ioctl commands that may or may not be supported by the lower half CAN * driver. * * CANIOC_ADD_STDFILTER: * Description: Add an address filter for a standard 11 bit address. * Argument: A reference to struct canioc_stdfilter_s * Returned Value: A non-negative filter ID is returned on success. * Otherwise -1 (ERROR) is returned with the errno * variable set to indicate the nature of the error. * Dependencies: None * * CANIOC_ADD_EXTFILTER: * Description: Add an address filter for a extended 29 bit address. * Argument: A reference to struct canioc_extfilter_s * Returned Value: A non-negative filter ID is returned on success. * Otherwise -1 (ERROR) is returned with the errno * variable set to indicate the nature of the error. * Dependencies: Requires CONFIG_CAN_EXTID=y * * CANIOC_DEL_STDFILTER: * Description: Remove an address filter for a standard 11 bit address. * Argument: The filter index previously returned by the * CANIOC_ADD_STDFILTER command * Returned Value: Zero (OK) is returned on success. Otherwise -1 (ERROR) * is returned with the errno variable set to indicate the * nature of the error. * Dependencies: None * * CANIOC_DEL_EXTFILTER: * Description: Remove an address filter for a standard 29 bit address. * Argument: The filter index previously returned by the * CANIOC_ADD_EXTFILTER command * Returned Value: Zero (OK) is returned on success. Otherwise -1 (ERROR) * is returned with the errno variable set to indicate the * nature of the error. * Dependencies: Requires CONFIG_CAN_EXTID=y * * CANIOC_GET_BITTIMING: * Description: Return the current bit timing settings * Argument: A pointer to a write-able instance of struct * canioc_bittiming_s in which current bit timing values * will be returned. * Returned Value: Zero (OK) is returned on success. Otherwise -1 (ERROR) * is returned with the errno variable set to indicate the * nature of the error. * Dependencies: None * * CANIOC_SET_BITTIMING: * Description: Set new current bit timing values * Argument: A pointer to a read-able instance of struct * canioc_bittiming_s in which the new bit timing values * are provided. * Returned Value: Zero (OK) is returned on success. Otherwise -1 (ERROR) * is returned with the errno variable set to indicate the * nature of the error. * Dependencies: None * * CANIOC_GET_CONNMODES: * Description: Get the current bus connection modes * Argument: A pointer to a write-able instance of struct * canioc_connmodes_s in which the new bus modes will be * returned. * Returned Value: Zero (OK) is returned on success. Otherwise -1 (ERROR) * is returned with the errno variable set to indicate the * nature of the error. * Dependencies: None * * CANIOC_SET_CONNMODES: * Description: Set new bus connection modes values * Argument: A pointer to a read-able instance of struct * canioc_connmodes_s in which the new bus modes are * provided. * Returned Value: Zero (OK) is returned on success. Otherwise -1 (ERROR) * is returned with the errno variable set to indicate the * nature of the error. * Dependencies: None * * CANIOC_BUSOFF_RECOVERY: * Description: Initiates the BUS-OFF recovery sequence * Argument: None * Returned Value: Zero (OK) is returned on success. Otherwise -1 (ERROR) * is returned with the errno variable set to indicate the * nature of the error. * Dependencies: None */ #define CANIOC_RTR _CANIOC(1) #define CANIOC_GET_BITTIMING _CANIOC(2) #define CANIOC_SET_BITTIMING _CANIOC(3) #define CANIOC_ADD_STDFILTER _CANIOC(4) #define CANIOC_ADD_EXTFILTER _CANIOC(5) #define CANIOC_DEL_STDFILTER _CANIOC(6) #define CANIOC_DEL_EXTFILTER _CANIOC(7) #define CANIOC_GET_CONNMODES _CANIOC(8) #define CANIOC_SET_CONNMODES _CANIOC(9) #define CANIOC_BUSOFF_RECOVERY _CANIOC(10) #define CAN_FIRST 0x0001 /* First common command */ #define CAN_NCMDS 10 /* Ten common commands */ /* User defined ioctl commands are also supported. These will be forwarded * by the upper-half CAN driver to the lower-half CAN driver via the * co_ioctl() method fo the CAN lower-half interface. * However, the lower-half driver must reserve a block of commands as follows * in order prevent IOCTL command numbers from overlapping. * * This is generally done as follows. The first reservation for CAN driver A * would look like: * * CAN_A_FIRST (CAN_FIRST + CAN_NCMDS) <- First command * CAN_A_NCMDS 42 <- Number of commands * * IOCTL commands for CAN driver A would then be defined in a CAN A header * file like: * * CANIOC_A_CMD1 _CANIOC(CAN_A_FIRST+0) * CANIOC_A_CMD2 _CANIOC(CAN_A_FIRST+1) * CANIOC_A_CMD3 _CANIOC(CAN_A_FIRST+2) * ... * CANIOC_A_CMD42 _CANIOC(CAN_A_FIRST+41) * * The next reservation would look like: * * CAN_B_FIRST (CAN_A_FIRST + CAN_A_NCMDS) <- Next command * CAN_B_NCMDS 77 <- Number of commands */ /* CAN payload length and DLC definitions according to ISO 11898-1 */ #define CAN_MAX_DLC 8 #define CAN_MAX_DLEN 8 /* CAN FD payload length and DLC definitions according to ISO 11898-7 */ #define CANFD_MAX_DLC 15 #define CANFD_MAX_DLEN 64 /* Defined bits for canfd_frame.flags * * The use of struct canfd_frame implies the Extended Data Length (EDL) bit * to be set in the CAN frame bitstream on the wire. The EDL bit switch turns * the CAN controllers bitstream processor into the CAN FD mode which creates * two new options within the CAN FD frame specification: * * Bit Rate Switch - to indicate a second bitrate is/was used for the payload * Error State Indicator - represents the error state of the transmitting * node * * As the CANFD_ESI bit is internally generated by the transmitting CAN * controller only the CANFD_BRS bit is relevant for real CAN controllers * when building a CAN FD frame for transmission. Setting the CANFD_ESI bit * can make sense for virtual CAN interfaces to test applications with echoed * frames. */ #define CANFD_BRS 0x01 /* bit rate switch (second bitrate for payload data) */ #define CANFD_ESI 0x02 /* error state indicator of the transmitting node */ #define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */ /**************************************************************************** * Public Types ****************************************************************************/ typedef FAR void *CAN_HANDLE; struct can_response_s { sq_entry_t flink; /* Message-specific data may follow */ }; /* FIXME remove */ typedef uint32_t canid_t; /* Controller Area Network Error Message Frame Mask structure * * bit 0-28 : error class mask (see include/uapi/linux/can/error.h) * bit 29-31 : set to zero */ typedef uint32_t can_err_mask_t; /* struct can_frame - basic CAN frame structure * can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition * can_dlc: frame payload length in byte (0 .. 8) aka data length code * N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1 * mapping of the 'data length code' to the real payload length * __pad: padding * __res0: reserved / padding * __res1: reserved / padding * data: CAN frame payload (up to 8 byte) */ struct can_frame { canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ uint8_t can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ uint8_t __pad; /* padding */ uint8_t __res0; /* reserved / padding */ uint8_t __res1; /* reserved / padding */ uint8_t data[CAN_MAX_DLEN] aligned_data(8); }; /* struct canfd_frame - CAN flexible data rate frame structure * can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition * len: frame payload length in byte (0 .. CANFD_MAX_DLEN) * flags: additional flags for CAN FD * __res0: reserved / padding * __res1: reserved / padding * data: CAN FD frame payload (up to CANFD_MAX_DLEN byte) */ struct canfd_frame { canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ uint8_t len; /* frame payload length in byte */ uint8_t flags; /* additional flags for CAN FD */ uint8_t __res0; /* reserved / padding */ uint8_t __res1; /* reserved / padding */ uint8_t data[CANFD_MAX_DLEN] aligned_data(8); }; /* struct can_filter - CAN ID based filter in can_register(). * can_id: relevant bits of CAN ID which are not masked out. * can_mask: CAN mask (see description) * * Description: * A filter matches, when * * & mask == can_id & mask * * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can * filter for error message frames (CAN_ERR_FLAG bit set in mask). */ struct can_filter { canid_t can_id; canid_t can_mask; }; /**************************************************************************** * Public Function Prototypes ****************************************************************************/ #undef EXTERN #if defined(__cplusplus) #define EXTERN extern "C" extern "C" { #else #define EXTERN extern #endif #undef EXTERN #if defined(__cplusplus) } #endif #endif /* CONFIG_CAN */ #endif /* __INCLUDE_NUTTX_CAN_CAN_H */