Linux CAN driver
This information corresponds to the CAN driver that is the main branch of the Git tree.
This driver supports both ZYNQ CANPS IP and Soft IP axi_can and axi_canfd.
This driver defines the architecture and features of the Xilinx CAN controller core.
HW/IP Features
- Conforms to the ISO 11898 -1, CAN 2.0A, and CAN2.0B standards
- Supports Industrial (I) and Extended TemperatureRange (Q) grade device support
- Supports both standard (11-bit identifier) andextended (29-bit identifier) frames
- Supports bit rates up to 1 Mbps
- Transmit message FIFO with a user-configurable depth of up to 64 messages
- Transmit prioritization through one High-Priority Transmit buffer
- Automatic re-transmission on errors or arbitration loss
- Receive message FIFO with a user- configurable depth of up to 64 messages
- Acceptance filtering (through a user-configurable number) of up to four acceptance filters
- Sleep Mode with automatic walk-up
- Loop Back Mode for diagnostic applications
- Maskable Error and Status Interrupts
- Readable Error Counters
Features supported in driver
- Conforms to the ISO 11898 -1, CAN 2.0A, and CAN2.0B standards
- Supports Industrial (I) and Extended TemperatureRange (Q) grade device support
- Supports both standard (11-bit identifier) andextended (29-bit identifier) frames
- Supports bit rates up to 1 Mbps
- Transmit message FIFO with a user-configurable depth of up to 64 messages
- Transmit prioritization through one High-Priority Transmit buffer
- Automatic re-transmission on errors or arbitration loss
- Receive message FIFO with a user- configurable depth of up to 64 messages
- Loop Back Mode for diagnostic applications
- Maskable Error and Status Interrupts
- Readable Error Counters
Missing features, Known Issues and Limitations
- Frame work won’t support Acceptance filters
- Frame work won’t support water marking
- Frame work won’t support Multiple RX buffers
Kernel Configuration
Xilinx CAN drivers is not enabled in the current default kernel configuration. The following steps may be used to enable the driver in the kernel configuration.
Device Tree
For More details about the device tree bindings doc please refer to the Documentation/devicetree/bindings/net/can/xilinx_can.txt file
For Zynq CANPS Dts file: zynq_can_0: can@e0008000 < compatible = "xlnx,zynq-can-1.0"; clocks = , ; clock-names = "can_clk", "pclk"; reg = ; interrupts = ; interrupt-parent = ; tx-fifo-depth = ; rx-fifo-depth = ; >; For Axi CAN Dts file: axi_can_0: axi-can@40000000 < compatible = "xlnx,axi-can-1.00.a"; clocks = , ; clock-names = "can_clk","s_axi_aclk" ; reg = ; interrupt-parent = ; interrupts = ; tx-fifo-depth = ; rx-fifo-depth = ; >; For CAN FD 1.0: axi_can_0: axi-can@40000000 < compatible = "xlnx-canfd-1.0"; clocks = , ; clock-names = "can_clk","s_axi_aclk" ; reg = ; interrupt-parent = ; interrupts = ; tx-fifo-depth = ; rx-fifo-depth = ; >; For CAN FD 2.0: axi_can_0: canfd@80000000 < clock-names "can_clk", "can_clk_x2", "s_axi_aclk"; clocks ; compatible "xlnx,canfd-2.0"; interrupt-names "ip2bus_intrevent"; interrupt-parent ; interrupts ; reg ; rx-fifo-depth ; tx-mailbox-count ; >;
Test Procedure
CAN Driver Testing from user space
In order to test Xilinx CAN driver there is user space utilities called can-utils available for the user and user need to cross compile those utilities in order to test
the this driver.
CAN:
Attached the Cross compiled can-utils for the Microblaze and ARM(Cortexa9) architectures.
Microblaze Cross compiled CAN utils:
ARM(ZYNQ) cortexa9 Cross compiled CAN utils:
A53 Cross compiled CAN utils:
CANFD:
Xilinx CANFD hw supports this. The same linux can driver support this can fd feature
But to test this CANFD Support need to download canutils
from https://github.com/linux-can/can-utils
Microblaze Cross compiled CANUtils
ARM(ZYNQ) cortexa9 Cross compiled CAN utils:
To run CAN, use the below command:
1. Set bit-timing
Can supports bitrates upto 1Mb/s. Xilinx CAN h/w and driver supports these bit rates
Note: Triple sampling is not supported by Xilinx CAN H/W.
$ ./ip link set can0 type can bitrate 200000
or
$ ./canconfig can0 bitrate 200000
2. Bring up the device
$ ./ip link set can0 up
or
$ ./canconfig can0 start
3. Bring down the device
$ ./ip link set can0 down
or
$ ./canconfig can0 stop
4. Transmit and receive packets with standard id number
$ ./cansend can0 -i 0x14
$ ./candump can0
5. Transmit and receive packets with extended id number (—loop argument here)
$ ./cansend can0 -i 0x333
$ ./candump can0
6. Loopback mode
$ ./canconfig can0 ctrlmode loopback on
7. Checking link state (checking bitrate/errors/packets)
$ ./ip -d -s link show can0
8. Checking net device state
$ ifconfig can0
9. Getting statistics via proc
$ cat /proc/net/can/stats
10. Socket CAN core uses several filter lists to deliver received CAN frames to CAN protocol modules. These
receive lists, their filters and the count of filter matches can be checked in the appropriate receive list. All entries contain the
device and a protocol module identifier:
$ cat /proc/net/can/rcvlist_all
rcvlist_all — list for unfiltered entries (no filter operations)
rcvlist_eff — list for single extended frame (EFF) entries
rcvlist_err — list for error message frames masks
rcvlist_fil — list for mask/value filters
rcvlist_inv — list for mask/value filters (inverse semantic)
rcvlist_sff — list for single standard frame (SFF) entries
To run CANFD, use the below command:
1. Set bit-timing
Canfd supports two bitrates, one for Arbitration phase and other for Data phase. Xilinx CANFD h/w and driver supports these bit rates
$ ./ip link set can0 type can bitrate 125000 dbitrate 8000000 fd on
2. Bring up the device
$ ./ip link set can0 up
3. Bring down the device
$ ./ip link set can0 down
4. Transmit and receive canfd packets with standard id number
$ ./cansend can0 213##
$ ./candump can0
5. Transmit and receive can packets with same controller, since canfd supports backward can also
$ ./cansend can0 123#
$ ./candump can0
6. Loopback mode
$ ./ip link set can0 type can bitrate 125000 dbitrate 8000000 fd on looopback on
7. Checking link state (checking bitrate/errors/packets)
$ ./ip -d link show can0
8. Checking net device state
$ ifconfig can0
Binding Tests:
Microblaze:
a. correct binding with
XILINX_CAN e0008000.ps7-can: phy mem:0xe0008000..0xe0008fff
XILINX_CAN e0008000.ps7-can: reg_base=0xf0062000 irq=60 clock=23809523, tx fifo depth:64
b. Incorrect binding — tests suppose to fail
I. missing clocks
II. missing clock-names
III. missing register
IV. missing interrupt parent
V. missing interrupts number
Zynq:
a. correct binding with
b. Incorrect binding — tests suppose to fail (done on dummy nodes)
I. missing clocks
II. missing clock-names
III. missing register
IV. missing interrupt parent
V. missing interrupts number
Expected Output
root@Xilinx-ZC702-2013:~# canconfig can3 ctrlmode loopback on can3 ctrlmode: loopback[ON], listen-only[OFF], tripple-sampling[OFF],one-shot[OFF], berr-reporting[OFF] root@Xilinx-ZC702-2013:~# cancon root@Xilinx-ZC702-2013:~# canconfig can3 bitrate 500000 XILINX_CAN e0008000.ps7-can can3: bitrate error 0.7% can3 bitrate: 496031, sample-point: 0.666 root@Xilinx-ZC702-2013:~# canconfig can3 start can3 state: ERROR-ACTIVE root@Xilinx-ZC702-2013:~# cansend can3 -i 0x77 0x33 0x88 0x33 0x88 0x33 0x88 0x33 interface = can3, family = 29, type = 3, proto = 1 root@Xilinx-ZC702-2013:~# ip -d -s link show can3 5: can3: mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 496031 sample-point 0.666 tq 672 prop-seg 0 phase-seg1 1 phase-seg2 1 sjw 1 XILINX_CAN: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..256 brp-inc 1 clock 23809523 re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0 RX: bytes packets errors dropped overrun mcast 7 1 0 0 0 0 TX: bytes packets errors dropped carrier collsns 7 1 0 0 0 0 root@Xilinx-ZC702-2013:~# cansend can3 -i 0x33 0x88 0x33 0x88 0x33 0x99 0x33 0x88 0x88 interface = can3, family = 29, type = 3, proto = 1 root@Xilinx-ZC702-2013:~# ip -d -s link show can3 5: can3: mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 496031 sample-point 0.666 tq 672 prop-seg 0 phase-seg1 1 phase-seg2 1 sjw 1 XILINX_CAN: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..256 brp-inc 1 clock 23809523 re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0 RX: bytes packets errors dropped overrun mcast 15 2 0 0 0 0 TX: bytes packets errors dropped carrier collsns 15 2 0 0 0 0 root@Xilinx-ZC702-2013:~# cansen root@Xilinx-ZC702-2013:~# cansend can3 -i 0x88 0x33 0x88 0x33 0x88 x0x33 0x88 0x33 0x88 --loop=10 interface = can3, family = 29, type = 3, proto = 1 root@Xilinx-ZC702-2013:~# ip -d -s link show can3 5: can3: mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 496031 sample-point 0.666 tq 672 prop-seg 0 phase-seg1 1 phase-seg2 1 sjw 1 XILINX_CAN: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..256 brp-inc 1 clock 23809523 re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0 RX: bytes packets errors dropped overrun mcast 95 12 0 0 0 0 TX: bytes packets errors dropped carrier collsns 95 12 0 0 0 0 root@Xilinx-ZC702-2013:~#
Mainline status
- can: xilinx_can: Check return value of set_reset_mode
can: xilinx_can: Add comment for spinlock_t
can: xilinx_can: Fix alignment match check
can: xilinx_can: Remove unnecessary braces
an: xilinx_can: avoid non-requested bus error frames
can: xilinx_can: fix checkpatch warnings
Change Log
2023.1
Linux CAN driver
The universal LINUX CAN device driver can4linux supports a broad range of CAN interfaces. ports AT-CAN-MINI is supported as well as a a bunch of interfaces from other manufacturers. Source code of the software is available. It compiles for Kernels 2.0, 2.2 2.4 and latest 2.6.
An derived version for embedded Linux-devices using micro controllers with integrated CAN or with external stand alone CAN controllers is available too. This one is configured at compile time for a specific hardware architecture.
can4linux is an universal LINUX™ device driver. It can be used to control ISA or PCI interface boards with CAN interface, or embedded CAN controller solutions. The GPLed sources are currently supporting CAN controllers (Philips SJA1000, Intel 82527, Infineon SAK82C900 and Motorola FlexCAN, TwinCAN). The driver can be compiled for all LINUX™ kernel versions 2.4 to 2.6. (older version for kernel versions 2.0 to 2.2 are available.)
The can4linux Project started already in 1997 in cooperation with the LINUX™ LLP project to control laboratory or automation devices via CAN. Derived from this driver is the new can4linux version line 2.x and follow-up. Designed to be used in embedded applications as well as on the desktop this version is configured at compile time for the right hardware. Originally with support only for SJA1000 there is now support for Intels 82527 and new support for Infineons TwinCAN. Within the scope of the uClinux project a version supporting Motorolas FlexCAN was created.
Driver Interface
Using the LINUX™ kernels /proc interface, the driver is highly configurable. The driver is controlled by the standard driver functions open(), close(), read(), write() and ioctl().
Any number of CAN interfaces can be accessed using the device nodes /dev/can0 . /dev/cann. can4linux uses the device major number 91.
The driver supports different interface boards, ISA, PCI or PC-104, with one or two channels.
- port AT-CAN-MINI (PeliCAN mode 29bit)
- EMS CPC-PCI
- IXXAT PCI03 (only SJA1000)
- Advantech Pcm-3680 (PC 104)
- DIL-NET TRM/816
- DigiTec PCMatic® Feldbusmodul FC-CAN
- ESD PC104/200
- Blackfin BF534/536
Originally the driver worked only on Intel-based PCs. In the mean time we have gained experiences with porting this driver also to embedded LINUX™ architectures. One is a PowerPC 863e with two Intel 82527 controllers, the other is ARM based with an external SJA1000, the microcontroller XC164CS with TwinCAN controller or the NetARM 150 with its four internal CAN channels.
Available Products
can4linux can be used as CAN interface for different products of port. Some of these tools are available as demo versions, to be downloaded from our web site.
The simplest application with access to the CAN layer-2, that means transmit and receive CAN messages, is horch. It can be started interactively within an xterm or in the background as TCP/IP Server. For this server a graphical and programmable CAN-analyzer application CAN-REport is available too.
To implement CANopen protocols for devices in CANopen networks, an ANSI-C communication library is available for development of own applications. Based on the library code, a so-called CANopen Server application is available. The Server provides easy access to CANopen services through a TCP/IP socket interface.
can4linux is freely available under the GPL license. It can be compiled for the LINUX™ kernels 2.0 to 2.6 for different hardware architectures.