hw/net/can: Introduce Xilinx ZynqMP CAN controller
The Xilinx ZynqMP CAN controller is developed based on SocketCAN, QEMU CAN bus
implementation. Bus connection and socketCAN connection for each CAN module
can be set through command lines.
Example for using single CAN:
-object can-bus,id=canbus0 \
-machine xlnx-zcu102.canbus0=canbus0 \
-object can-host-socketcan,id=socketcan0,if=vcan0,canbus=canbus0
Example for connecting both CAN to same virtual CAN on host machine:
-object can-bus,id=canbus0 -object can-bus,id=canbus1 \
-machine xlnx-zcu102.canbus0=canbus0 \
-machine xlnx-zcu102.canbus1=canbus1 \
-object can-host-socketcan,id=socketcan0,if=vcan0,canbus=canbus0 \
-object can-host-socketcan,id=socketcan1,if=vcan0,canbus=canbus1
To create virtual CAN on the host machine, please check the QEMU CAN docs:
https://github.com/qemu/qemu/blob/master/docs/can.txt
Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com>
Message-id: 1605728926-352690-2-git-send-email-fnu.vikram@xilinx.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2020-11-18 22:48:43 +03:00
|
|
|
/*
|
|
|
|
* QEMU model of the Xilinx ZynqMP CAN controller.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2020 Xilinx Inc.
|
|
|
|
*
|
|
|
|
* Written-by: Vikram Garhwal<fnu.vikram@xilinx.com>
|
|
|
|
*
|
|
|
|
* Based on QEMU CAN Device emulation implemented by Jin Yang, Deniz Eren and
|
|
|
|
* Pavel Pisa.
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
|
|
* in the Software without restriction, including without limitation the rights
|
|
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
* THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef XLNX_ZYNQMP_CAN_H
|
|
|
|
#define XLNX_ZYNQMP_CAN_H
|
|
|
|
|
2022-12-22 15:08:11 +03:00
|
|
|
#include "hw/sysbus.h"
|
hw/net/can: Introduce Xilinx ZynqMP CAN controller
The Xilinx ZynqMP CAN controller is developed based on SocketCAN, QEMU CAN bus
implementation. Bus connection and socketCAN connection for each CAN module
can be set through command lines.
Example for using single CAN:
-object can-bus,id=canbus0 \
-machine xlnx-zcu102.canbus0=canbus0 \
-object can-host-socketcan,id=socketcan0,if=vcan0,canbus=canbus0
Example for connecting both CAN to same virtual CAN on host machine:
-object can-bus,id=canbus0 -object can-bus,id=canbus1 \
-machine xlnx-zcu102.canbus0=canbus0 \
-machine xlnx-zcu102.canbus1=canbus1 \
-object can-host-socketcan,id=socketcan0,if=vcan0,canbus=canbus0 \
-object can-host-socketcan,id=socketcan1,if=vcan0,canbus=canbus1
To create virtual CAN on the host machine, please check the QEMU CAN docs:
https://github.com/qemu/qemu/blob/master/docs/can.txt
Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com>
Message-id: 1605728926-352690-2-git-send-email-fnu.vikram@xilinx.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2020-11-18 22:48:43 +03:00
|
|
|
#include "hw/register.h"
|
|
|
|
#include "net/can_emu.h"
|
|
|
|
#include "net/can_host.h"
|
|
|
|
#include "qemu/fifo32.h"
|
|
|
|
#include "hw/ptimer.h"
|
|
|
|
#include "hw/qdev-clock.h"
|
|
|
|
|
|
|
|
#define TYPE_XLNX_ZYNQMP_CAN "xlnx.zynqmp-can"
|
|
|
|
|
|
|
|
#define XLNX_ZYNQMP_CAN(obj) \
|
|
|
|
OBJECT_CHECK(XlnxZynqMPCANState, (obj), TYPE_XLNX_ZYNQMP_CAN)
|
|
|
|
|
|
|
|
#define MAX_CAN_CTRLS 2
|
|
|
|
#define XLNX_ZYNQMP_CAN_R_MAX (0x84 / 4)
|
|
|
|
#define MAILBOX_CAPACITY 64
|
|
|
|
#define CAN_TIMER_MAX 0XFFFFUL
|
|
|
|
#define CAN_DEFAULT_CLOCK (24 * 1000 * 1000)
|
|
|
|
|
|
|
|
/* Each CAN_FRAME will have 4 * 32bit size. */
|
|
|
|
#define CAN_FRAME_SIZE 4
|
|
|
|
#define RXFIFO_SIZE (MAILBOX_CAPACITY * CAN_FRAME_SIZE)
|
|
|
|
|
|
|
|
typedef struct XlnxZynqMPCANState {
|
|
|
|
SysBusDevice parent_obj;
|
|
|
|
MemoryRegion iomem;
|
|
|
|
|
|
|
|
qemu_irq irq;
|
|
|
|
|
|
|
|
CanBusClientState bus_client;
|
|
|
|
CanBusState *canbus;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
uint32_t ext_clk_freq;
|
|
|
|
} cfg;
|
|
|
|
|
|
|
|
RegisterInfo reg_info[XLNX_ZYNQMP_CAN_R_MAX];
|
|
|
|
uint32_t regs[XLNX_ZYNQMP_CAN_R_MAX];
|
|
|
|
|
|
|
|
Fifo32 rx_fifo;
|
|
|
|
Fifo32 tx_fifo;
|
|
|
|
Fifo32 txhpb_fifo;
|
|
|
|
|
|
|
|
ptimer_state *can_timer;
|
|
|
|
} XlnxZynqMPCANState;
|
|
|
|
|
|
|
|
#endif
|