Files
mikkeli f651eba2ac Point PCAN rebuild steps at ~/infra instead of /tmp
The driver source sat in /tmp and was gone after a reboot, leaving the
"after a kernel update" steps unusable. Re-fetched PEAK 9.2.0 into
~/infra/peak-linux-driver-9.2.0 per GUIDELINES §1; it is the same
release as the installed pcan.ko (Release_20260707_n).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 01:38:33 +09:00

6.5 KiB

type, date
type date
report 2026-08-04

PCAN-USB Adapter Setup on Jetson Orin Nano

Hardware

  • Board: NVIDIA Jetson Orin Nano Engineering Reference Developer Kit Super
  • Hostname: mikkeli-orin-nano-2
  • OS: Ubuntu 22.04.5 LTS (aarch64)
  • Kernel: 5.15.148-tegra (L4T 36.4.4, JetPack r36.4)
  • Adapter: PEAK-System PCAN-USB (ID 0c72:000c)

Onboard CAN

The Jetson Orin Nano has a built-in CAN controller:

  • Interface: can0
  • Controller: MTTCan (c310000.mttcan) — SoC peripheral at memory address 0xc310000
  • Driver: mttcan (built into NVIDIA Tegra kernel)
  • Module: can_dev
  • Clock: 50 MHz
  • Status: Always present, currently DOWN

USB CAN Adapter — Initial Detection

Problem

The PCAN-USB adapter was physically connected and detected by the USB subsystem:

Bus 001 Device 005: ID 0c72:000c PEAK System PCAN-USB

But no CAN interface appeared. The mainline kernel driver peak_usb (which supports this device since kernel v3.4) was not compiled into this NVIDIA Tegra kernel.

Investigation

  1. Checked for the peak_usb module — not present
  2. Checked kernel config (/boot/config-$(uname -r)) — not available (NVIDIA kernel)
  3. Checked for kernel headers — none matched the 5.15.148-tegra kernel
  4. The NVIDIA Tegra kernel from JetPack r36.4 (repo.download.nvidia.com/jetson/t234) uses a custom versioning scheme and does not include PEAK's mainline drivers

Solution — Build PEAK's Proprietary Driver

Why PEAK's driver instead of mainline?

PEAK's mainline peak_usb driver would be the preferred approach (SocketCAN netdev, auto-loading, no rebuild needed on kernel updates). However, the NVIDIA Tegra kernel does not include it. PEAK's proprietary driver package can be built against any kernel that has headers available.

Step 1: Download PEAK Linux Driver Package

curl -L "https://www.peak-system.com/quick/PCAN-Linux-Driver" -o /tmp/pcan-driver.tar.gz
cd /tmp && tar -xzf pcan-driver.tar.gz
# Extracts to: /tmp/peak-linux-driver-9.2.0/

Step 2: Build with SocketCAN (netdev) Support

The PEAK driver defaults to chardev mode (character devices like /dev/pcanusb32). For standard SocketCAN tools (candump, ip link, etc.), we need netdev mode:

cd /tmp/peak-linux-driver-9.2.0/driver
sudo make clean
sudo make NET=NETDEV_SUPPORT all

Key output confirming netdev build:

CC [M]  /tmp/peak-linux-driver-9.2.0/driver/src/pcan_netdev.o
LD [M]  /tmp/peak-linux-driver-9.2.0/driver/pcan.ko

Step 3: Install the Module

cd /tmp/peak-linux-driver-9.2.0/driver
sudo cp pcan.ko /lib/modules/5.15.148-tegra/misc/pcan.ko
sudo depmod 5.15.148-tegra

Step 4: Load the Module

sudo modprobe -r pcan 2>/dev/null
sudo modprobe pcan

Result

$ ip link show type can
3: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
    link/can
8: can1: <NOARP> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
    link/can
  • can0 = onboard MTTCan
  • can1 = PCAN-USB adapter

2026-10-08: canN order is not stable across boots. Interfaces are now pinned to can_onboard / can_pcan by a udev rule; read can1 below as can_pcan. See device naming.

Step 5: Bring Up the Interface

sudo ip link set can1 up type can bitrate 500000

Step 6: Read CAN Traffic

sudo candump can1

Build Environment

  • GCC: 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04.2)
  • make: Available
  • Kernel headers: Located at /lib/modules/5.15.148-tegra/build
  • Driver version: PEAK Linux Driver 9.2.0

Important Notes

  1. Out-of-tree module: This driver is built from PEAK's source against the running kernel. It will not survive a kernel update — you must rebuild after any kernel upgrade.

  2. Netdev vs chardev: The PEAK driver defaults to chardev mode. For SocketCAN tools, you must build with NET=NETDEV_SUPPORT. The chardev mode creates /dev/pcan* devices and requires PEAK's proprietary API.

  3. Blacklisting: The PEAK installer (make install) blacklists the mainline peak_* drivers in /etc/modprobe.d/blacklist-peak.conf. Since the mainline drivers aren't available on this kernel anyway, this is harmless.

  4. Bitrate: The default CAN bitrate is 500 kbps. Adjust as needed for your car's bus (common values: 500000, 250000, 1000000).

  5. Read-only use: For reading car CAN traffic without transmitting, you only need to bring the interface up. No special configuration is needed.

Cleanup

Source files left at /tmp/peak-linux-driver-9.2.0/ and /tmp/pcan-driver.tar.gz. Can be removed after verifying everything works.

2026-10-08: /tmp copies are gone (cleared on reboot). Source now kept at ~/infra/peak-linux-driver-9.2.0/ (fetched from https://www.peak-system.com/fileadmin/media/linux/files/peak-linux-driver-9.2.0.tar.gz).

Current Status — 2026-08-05

This report was written during an earlier session. On this machine (hostname: mikkeli-orin-nano, kernel 5.15.148-tegra, L4T 36.4.4) the driver has been built and installed:

Step Status
Download PEAK Linux Driver 9.2.0 Done (source at /tmp/peak-linux-driver-9.2.0/)
Build with NET=NETDEV_SUPPORT Done — module compiled successfully
Install to /lib/modules/.../misc/pcan.ko Done
depmod 5.15.148-tegra Done
modprobe pcan Done — module loaded (`lsmod
Boot persistence (/etc/modules) Done — pcan added to /etc/modules

Device not yet physically connected. The USB adapter (0c72:000c) will be auto-detected and a canX interface created when plugged in. No udev rule is needed since the module loads at boot and the kernel matches the USB VID/PID against the module's built-in aliases.

Verification (after plugging in the device)

# Confirm module is loaded
lsmod | grep pcan

# Check for new CAN interface
ip link show type can

# Bring it up at 500 kbps
sudo ip link set canX up type can bitrate 500000

# Read traffic
sudo candump canX

After a kernel update

This is an out-of-tree module. The source was lost from /tmp on reboot and re-fetched on 2026-10-08 into ~/infra/peak-linux-driver-9.2.0/ (per GUIDELINES §1). It is the same release as the installed module, Release_20260707_n. Rebuild with:

cd ~/infra/peak-linux-driver-9.2.0/driver
make clean
make NET=NETDEV_SUPPORT all
sudo cp pcan.ko /lib/modules/$(uname -r)/misc/pcan.ko
sudo depmod
sudo modprobe pcan