drivers/can: add CTU CAN FD driver (qemu only)
Add CTU CAN FD driver for qemu only: https://www.qemu.org/docs/master/system/devices/can.html#ctu-can-fd-support-examples Signed-off-by: p-szafonimateusz <p-szafonimateusz@xiaomi.com>
This commit is contained in:
parent
033f203e2a
commit
7b8f01f2da
7 changed files with 2328 additions and 0 deletions
|
@ -34,4 +34,8 @@ if(CONFIG_CAN_KVASER)
|
|||
list(APPEND SRCS kvaser_pci.c)
|
||||
endif()
|
||||
|
||||
if(CONFIG_CAN_CTUCANFD)
|
||||
list(APPEND SRCS ctucanfd_pci.c)
|
||||
endif()
|
||||
|
||||
target_sources(drivers PRIVATE ${SRCS})
|
||||
|
|
|
@ -299,4 +299,34 @@ endchoice # "Kvaser PCI CAN device type"
|
|||
|
||||
endif # CAN_KVASER
|
||||
|
||||
config CAN_CTUCANFD
|
||||
bool "CTUCANFD PCI CAN card"
|
||||
default n
|
||||
depends on PCI
|
||||
---help---
|
||||
Enable driver support for CTU CAN FD PCI card.
|
||||
NOTE: for now works only with QEMU
|
||||
|
||||
if CAN_CTUCANFD
|
||||
|
||||
choice
|
||||
prompt "CTU CAN FD PCI CAN device type"
|
||||
default CAN_CTUCANFD_CHARDEV if CAN
|
||||
default CAN_CTUCANFD_SOCKET if NET_CAN
|
||||
|
||||
config CAN_CTUCANFD_CHARDEV
|
||||
bool "CTU CAN FD PCI can device as chardev"
|
||||
depends on CAN
|
||||
select ARCH_HAVE_CAN_ERRORS
|
||||
|
||||
config CAN_CTUCANFD_SOCKET
|
||||
bool "CTU CAN FD PCI can device as socketCAN"
|
||||
depends on NET_CAN
|
||||
select NET_CAN_HAVE_ERRORS
|
||||
select NET_CAN_HAVE_CANFD
|
||||
|
||||
endchoice # "CTU CAN FD PCI CAN device type"
|
||||
|
||||
endif # CAN_CTUCANFD
|
||||
|
||||
endmenu # CAN Driver Support
|
||||
|
|
|
@ -38,6 +38,10 @@ ifeq ($(CONFIG_CAN_KVASER),y)
|
|||
CSRCS += kvaser_pci.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_CAN_CTUCANFD),y)
|
||||
CSRCS += ctucanfd_pci.c
|
||||
endif
|
||||
|
||||
# Include CAN device driver build support
|
||||
|
||||
DEPPATH += --dep-path can
|
||||
|
|
264
drivers/can/ctucanfd.h
Normal file
264
drivers/can/ctucanfd.h
Normal file
|
@ -0,0 +1,264 @@
|
|||
/****************************************************************************
|
||||
* drivers/can/ctucanfd.h
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* 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 __DRIVERS_CAN_CTUCANFD_H
|
||||
#define __DRIVERS_CAN_CTUCANFD_H
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* CAN FD Core memory map */
|
||||
|
||||
#define CTUCANFD_CTRL (0x000)
|
||||
#define CTUCANFD_TXT1 (0x100)
|
||||
#define CTUCANFD_TXT2 (0x200)
|
||||
#define CTUCANFD_TXT3 (0x300)
|
||||
#define CTUCANFD_TXT4 (0x400)
|
||||
#define CTUCANFD_TXT5 (0x500)
|
||||
#define CTUCANFD_TXT6 (0x600)
|
||||
#define CTUCANFD_TXT7 (0x700)
|
||||
#define CTUCANFD_TXT8 (0x800)
|
||||
#define CTUCANFD_TXT_SIZE (0x100)
|
||||
|
||||
/* Control registers */
|
||||
|
||||
#define CTUCANFD_VERID (0x00)
|
||||
#define CTUCANFD_SET_MODE (0x04)
|
||||
#define CTUCANFD_STATUS (0x08)
|
||||
#define CTUCANFD_CMD (0x0c)
|
||||
#define CTUCANFD_INTSTAT (0x10)
|
||||
#define CTUCANFD_INTENSET (0x14)
|
||||
#define CTUCANFD_INTENCLR (0x18)
|
||||
#define CTUCANFD_INTMASKSET (0x1c)
|
||||
#define CTUCANFD_INTMASKCLR (0x20)
|
||||
#define CTUCANFD_BTR (0x24)
|
||||
#define CTUCANFD_BTRFD (0x28)
|
||||
#define CTUCANFD_FAULT (0x2c)
|
||||
#define CTUCANFD_ERRCNT (0x30)
|
||||
#define CTUCANFD_ERR (0x34)
|
||||
#define CTUCANFD_CTRPRES (0x38)
|
||||
#define CTUCANFD_FLTR_A_MSK (0x3c)
|
||||
#define CTUCANFD_FLTR_A_VAL (0x40)
|
||||
#define CTUCANFD_FLTR_B_MSK (0x44)
|
||||
#define CTUCANFD_FLTR_B_VAL (0x48)
|
||||
#define CTUCANFD_FLTR_C_MSK (0x4c)
|
||||
#define CTUCANFD_FLTR_C_VAL (0x50)
|
||||
#define CTUCANFD_FLTR_RAN_L (0x54)
|
||||
#define CTUCANFD_FLTR_RAN_H (0x58)
|
||||
#define CTUCANFD_FLTR (0x5c)
|
||||
#define CTUCANFD_RXMEMINFO (0x60)
|
||||
#define CTUCANFD_RXPOINTERS (0x64)
|
||||
#define CTUCANFD_RXSETSTAT (0x68)
|
||||
#define CTUCANFD_RXDATA (0x6c)
|
||||
#define CTUCANFD_TXSTAT (0x70)
|
||||
#define CTUCANFD_TXINFOCMD (0x74)
|
||||
#define CTUCANFD_TXPRIO (0x78)
|
||||
#define CTUCANFD_MISC (0x7c)
|
||||
#define CTUCANFD_SSP (0x80)
|
||||
#define CTUCANFD_RXFRCTR (0x84)
|
||||
#define CTUCANFD_TXFRCTR (0x88)
|
||||
#define CTUCANFD_DEBUG (0x8c)
|
||||
#define CTUCANFD_YOLO (0x90)
|
||||
#define CTUCANFD_TS_L (0x94)
|
||||
#define CTUCANFD_TS_H (0x98)
|
||||
|
||||
/* Mode */
|
||||
|
||||
#define CTUCANFD_MODE_RST (1 << 0) /* Soft reset */
|
||||
#define CTUCANFD_MODE_BMM (1 << 1) /* Bus monitoring mode */
|
||||
#define CTUCANFD_MODE_STM (1 << 2) /* Self test mode */
|
||||
#define CTUCANFD_MODE_AFM (1 << 3) /* Acceptance filters mode */
|
||||
#define CTUCANFD_MODE_FDE (1 << 4) /* Flexible data rate mode */
|
||||
#define CTUCANFD_MODE_TTTM (1 << 5) /* Time triggered transmission mode */
|
||||
#define CTUCANFD_MODE_ROM (1 << 6) /* Restricted operation mode */
|
||||
#define CTUCANFD_MODE_ACF (1 << 7) /* Acknowledge forbidden mode */
|
||||
#define CTUCANFD_MODE_TSTM (1 << 8) /* Test mode */
|
||||
#define CTUCANFD_MODE_RXBAM (1 << 9) /* TX buffer automatic mode */
|
||||
#define CTUCANFD_MODE_TXBBM (1 << 10) /* TXT buffer backup mode */
|
||||
#define CTUCANFD_MODE_SAM (1 << 11) /* Self-acknowledge mode */
|
||||
#define CTUCANFD_MODE_ERFM (1 << 12) /* Error frame receive mode */
|
||||
|
||||
/* Settings */
|
||||
|
||||
#define CTUCANFD_SET_SHFIT (16) /* Shift in 32-bit access mode */
|
||||
|
||||
#define CTUCANFD_SET_RTRLE (1 << 0) /* Retransmit limit enable */
|
||||
#define CTUCANFD_SET_RTRTH_SHIFT (1) /* Retransmit limit threshold shift */
|
||||
#define CTUCANFD_SET_ILBP (1 << 5) /* Internal loop back mode */
|
||||
#define CTUCANFD_SET_ENA (1 << 6) /* Main enable bif of CTU CAN FD */
|
||||
#define CTUCANFD_SET_NISOFD (1 << 7) /* Non ISO FD */
|
||||
#define CTUCANFD_SET_PEX (1 << 8) /* Protocol exception handling */
|
||||
#define CTUCANFD_SET_TBFBO (1 << 9) /* TX failed for all buffers when bus-off */
|
||||
#define CTUCANFD_SET_FDRF (1 << 10) /* Frame filter drop remote frames */
|
||||
#define CTUCANFD_SET_PCHKE (1 << 11) /* Enable parity checks in TXT and RX buffers */
|
||||
|
||||
/* Command */
|
||||
|
||||
#define CTUCANFD_CMD_RXRPMV (1 << 1) /* RX buffer read pointer move */
|
||||
#define CTUCANFD_CMD_RRB (1 << 2) /* Release RX buffer */
|
||||
#define CTUCANFD_CMD_CDO (1 << 3) /* Clear data overrun flag in RX buffer */
|
||||
#define CTUCANFD_CMD_ERCRST (1 << 4) /* Error counters reset */
|
||||
#define CTUCANFD_CMD_RXFCRST (1 << 5) /* Clear RX bus traffic counter */
|
||||
#define CTUCANFD_CMD_TXFCRST (1 << 6) /* Clear TX bus traffic counter */
|
||||
#define CTUCANFD_CMD_CPEXS (1 << 7) /* Clear protocol exception status */
|
||||
#define CTUCANFD_CMD_CRXPE (1 << 8) /* Clear STATUS[RXPE] flag */
|
||||
#define CTUCANFD_CMD_CTXPE (1 << 9) /* Clear STATUS[TXPE] flag */
|
||||
#define CTUCANFD_CMD_CTXDPE (1 << 10) /* Clear STATUS[TXDPE] flag */
|
||||
|
||||
/* Interrupts */
|
||||
|
||||
#define CTUCANFD_INT_RXI (1 << 0) /* Frame received interrupt */
|
||||
#define CTUCANFD_INT_TXI (1 << 1) /* Frame transmitted interrupt */
|
||||
#define CTUCANFD_INT_EWLI (1 << 2) /* Error warning limit interrupt */
|
||||
#define CTUCANFD_INT_DOI (1 << 3) /* Data overrun interrupt */
|
||||
#define CTUCANFD_INT_FCSI (1 << 4) /* Fault confinement state changed interrupt */
|
||||
#define CTUCANFD_INT_ALI (1 << 5) /* Arbitration lost interrupt */
|
||||
#define CTUCANFD_INT_BEI (1 << 6) /* Bus error interrupt */
|
||||
#define CTUCANFD_INT_OFI (1 << 7) /* Overload frame interrupt */
|
||||
#define CTUCANFD_INT_RXFI (1 << 8) /* RX buffer full interrupt */
|
||||
#define CTUCANFD_INT_BSI (1 << 9) /* Bit rate shifted interrupt */
|
||||
#define CTUCANFD_INT_RBNEI (1 << 10) /* RX buffer not empty interrupt */
|
||||
#define CTUCANFD_INT_TXBHCI (1 << 11) /* TXT buffer HW command interrupt */
|
||||
|
||||
/* RX_STATUS and RX_SETTINGS */
|
||||
|
||||
#define CTUCANFD_RXSTAT_RXE (1 << 0) /* RX buffer is empty */
|
||||
#define CTUCANFD_RXSTAT_RXF (1 << 1) /* RX buffer is full */
|
||||
#define CTUCANFD_RXSTAT_RXMOF (1 << 2) /* RX buffer middle of frame */
|
||||
#define CTUCANFD_RXSTAT_RXFRC_SHIFT (4) /* RX buffer frame count */
|
||||
#define CTUCANFD_RXSTAT_RXFRC_MASK (0x7ff << CTUCANFD_RXSTAT_RXFRC_SHIFT)
|
||||
|
||||
/* TX_STATUS */
|
||||
|
||||
#define CTUCANFD_TXSTAT_SHIFT (4) /* TXyS shift */
|
||||
#define CTUCANFD_TXSTAT_MASK (0xf) /* TXyS mask */
|
||||
#define CTUCANFD_TXSTAT_GET(val, i) (((val) >> (CTUCANFD_TXSTAT_SHIFT * (i))) & \
|
||||
CTUCANFD_TXSTAT_MASK)
|
||||
#define CTUCANFD_TXSTAT_NOTEXIST (0) /* TXT buffer doesn't exist */
|
||||
#define CTUCANFD_TXSTAT_RDY (1) /* "Ready" state */
|
||||
#define CTUCANFD_TXSTAT_TRAN (2) /* "TX in porgress" state */
|
||||
#define CTUCANFD_TXSTAT_ABTP (3) /* "Abort in progress" state */
|
||||
#define CTUCANFD_TXSTAT_TOK (4) /* "TX OK" state */
|
||||
#define CTUCANFD_TXSTAT_ERR (6) /* "Failed" state */
|
||||
#define CTUCANFD_TXSTAT_ABT (7) /* "Aborted" state */
|
||||
#define CTUCANFD_TXSTAT_ETY (8) /* "Empty" state */
|
||||
#define CTUCANFD_TXSTAT_PER (9) /* "Parity error" state */
|
||||
|
||||
/* TX_COMMAND and TXTB_INFO */
|
||||
|
||||
#define CTUCANFD_TXCMD_TXCE (1 << 0) /* "set empty" */
|
||||
#define CTUCANFD_TXCMD_TXCR (1 << 1) /* "set ready" */
|
||||
#define CTUCANFD_TXCMD_TXCA (1 << 2) /* "set abort" */
|
||||
#define CTUCANFD_TXCMD_TXB_SHIFT (8)
|
||||
#define CTUCANFD_TXCMD_TXB1 (1 << 8) /* TXT buffer 1 */
|
||||
#define CTUCANFD_TXCMD_TXB2 (1 << 9) /* TXT buffer 2 */
|
||||
#define CTUCANFD_TXCMD_TXB3 (1 << 10) /* TXT buffer 3 */
|
||||
#define CTUCANFD_TXCMD_TXB4 (1 << 11) /* TXT buffer 4 */
|
||||
#define CTUCANFD_TXCMD_TXB5 (1 << 12) /* TXT buffer 5 */
|
||||
#define CTUCANFD_TXCMD_TXB6 (1 << 13) /* TXT buffer 6 */
|
||||
#define CTUCANFD_TXCMD_TXB7 (1 << 14) /* TXT buffer 7 */
|
||||
#define CTUCANFD_TXCMD_TXB8 (1 << 15) /* TXT buffer 8 */
|
||||
|
||||
/* TX_PRIORITY */
|
||||
|
||||
#define CTUCANFD_TXPRIO_SHIFT (4)
|
||||
|
||||
/* TX buffer */
|
||||
|
||||
#define CTUCANFD_TXBUF_FMT (0x00)
|
||||
#define CTUCANFD_TXBUF_ID (0x04)
|
||||
#define CTUCANFD_TXBUF_TSL (0x08)
|
||||
#define CTUCANFD_TXBUF_TSU (0x0c)
|
||||
#define CTUCANFD_TXBUF_DATA (0x10)
|
||||
#define CTUCANFD_TXBUF_TEST (0x05)
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
/* CAN FD frame format */
|
||||
|
||||
begin_packed_struct struct ctucanfd_frame_fmt_s
|
||||
{
|
||||
uint32_t dlc:4; /* DLC */
|
||||
uint32_t erf:1; /* Error frame flag */
|
||||
uint32_t rtr:1; /* Remote frame flag */
|
||||
uint32_t ide:1; /* Extended identifier type */
|
||||
uint32_t fdf:1; /* Flexible data-rate format */
|
||||
uint32_t lbpf:1; /* Loop-back frame */
|
||||
uint32_t brs:1; /* Bit rate shift */
|
||||
uint32_t esi_rsv:1; /* Error state indicator */
|
||||
uint32_t rwcnt:4; /* Size without FRAME_FORMAT WORD */
|
||||
uint32_t erf_pos:4; /* Error frame position */
|
||||
uint32_t erf_erp:1; /* Error pasive state */
|
||||
uint32_t erf_type:3; /* Error frame type */
|
||||
uint32_t ivld:1; /* Valid identifier */
|
||||
uint32_t lbtbi:3; /* Loop-back TXT index */
|
||||
uint32_t _reserved:4; /* Reserved */
|
||||
} end_packed_struct;
|
||||
|
||||
union ctucanfd_frame_fmt_u
|
||||
{
|
||||
struct ctucanfd_frame_fmt_s s;
|
||||
uint32_t u32;
|
||||
};
|
||||
|
||||
/* CAN FD frame ID */
|
||||
|
||||
begin_packed_struct struct ctucanfd_frame_id_s
|
||||
{
|
||||
uint32_t id_ext:18; /* Extended identifier */
|
||||
uint32_t id:11; /* Base identifier */
|
||||
uint32_t _res:3; /* Reserved */
|
||||
} end_packed_struct;
|
||||
|
||||
union ctucanfd_frame_id_u
|
||||
{
|
||||
struct ctucanfd_frame_id_s s;
|
||||
uint32_t u32;
|
||||
};
|
||||
|
||||
/* CAN FD frame test */
|
||||
|
||||
begin_packed_struct struct ctucanfd_frame_tst_s
|
||||
{
|
||||
uint32_t fstc:1; /* Flip stuff count field bit */
|
||||
uint32_t fcrc:1; /* Flip CRC field bit */
|
||||
uint32_t sdlc:1; /* Swap DLC in TX */
|
||||
uint32_t _res1:4; /* Reserved */
|
||||
uint32_t tprm:4; /* Test parameter */
|
||||
uint32_t _res2:3; /* Reserved */
|
||||
} end_packed_struct;
|
||||
|
||||
/* CAN FD frame format */
|
||||
|
||||
begin_packed_struct struct ctucanfd_frame_s
|
||||
{
|
||||
struct ctucanfd_frame_fmt_s fmt; /* Frame format */
|
||||
struct ctucanfd_frame_id_s id; /* Frame ID */
|
||||
uint64_t timestamp; /* Frame timestamp */
|
||||
uint8_t data[64]; /* Frame data */
|
||||
uint32_t test; /* Frame test */
|
||||
} end_packed_struct;
|
||||
|
||||
#endif /* __DRIVERS_CAN_CTUCANFD_H */
|
1956
drivers/can/ctucanfd_pci.c
Normal file
1956
drivers/can/ctucanfd_pci.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -33,6 +33,7 @@
|
|||
#include <nuttx/net/e1000.h>
|
||||
#include <nuttx/net/igc.h>
|
||||
#include <nuttx/can/kvaser_pci.h>
|
||||
#include <nuttx/can/ctucanfd_pci.h>
|
||||
|
||||
#include "pci_drivers.h"
|
||||
|
||||
|
@ -171,6 +172,16 @@ int pci_register_drivers(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Initialzie CTU CAN FD pci driver */
|
||||
|
||||
#ifdef CONFIG_CAN_CTUCANFD
|
||||
ret = pci_ctucanfd_init();
|
||||
if (ret < 0)
|
||||
{
|
||||
pcierr("pci_ctucanfd_init failed, ret=%d\n", ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = pci_dev_register();
|
||||
if (ret < 0)
|
||||
{
|
||||
|
|
59
include/nuttx/can/ctucanfd_pci.h
Normal file
59
include/nuttx/can/ctucanfd_pci.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/****************************************************************************
|
||||
* include/nuttx/can/ctucanfd_pci.h
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* 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_CTUCANFD_H
|
||||
#define __INCLUDE_NUTTX_CAN_CTUCANFD_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define EXTERN extern "C"
|
||||
extern "C"
|
||||
{
|
||||
#else
|
||||
#define EXTERN extern
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: pci_ctucanfd_init
|
||||
*
|
||||
* Description:
|
||||
* Register a pci driver
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int pci_ctucanfd_init(void);
|
||||
|
||||
#undef EXTERN
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __INCLUDE_NUTTX_CAN_CTUCANFD_H */
|
Loading…
Reference in a new issue