I’ve tried to enable CAN on my BeagleBone Green board. I had to stop the work before verification, because my logic analyzer is unavailable now. I record what I did in this article to make things reproducible when the logic analyzer is back.
There are several helpful links:
http://www.embedded-things.com/bbb/enable-canbus-on-the-beaglebone-black/
http://electronics.stackexchange.com/questions/195416/beaglebone-black-can-bus-setup
Readings to understand device tree overlay:
Device Tree for Dummies:
http://events.linuxfoundation.jp/sites/events/files/slides/petazzoni-device-tree-dummies.pdf
Device Tree Overlays (in adafruit)
https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/device-tree-overlays
Here are what I did:
# make a workspace root@beaglebone:~# mkdir can root@beaglebone:~# cd can root@beaglebone:~/can# pwd /root/can # check if CAN is enabled ... no root@beaglebone:~/can# dmesg | grep can # take backup of the original device tree blob file for CAN root@beaglebone:~/can# cp /lib/firmware/BB-CAN1-00A0.dtbo BB-CAN1-00A0.dtbo.orig # make the device tree overlay root@beaglebone:~/can# vi BB-DCAN1-00A0.dts root@beaglebone:~/can# cat !$ cat BB-DCAN1-00A0.dts /dts-v1/; /plugin/; / { compatible = "ti,beaglebone", "ti,beaglebone-black"; /* identification */ part-number = "dcan1pinmux"; fragment@0 { target = <&am33xx_pinmux>; __overlay__ { dcan1_pins_s0: dcan1_pins_s0 { pinctrl-single,pins = < 0x180 0x12 /* d_can1_tx, SLEWCTRL_FAST | INPUT_PULLUP | MODE2 */ 0x184 0x32 /* d_can1_rx, SLEWCTRL_FAST | RECV_ENABLE | INPUT_PULLUP | MODE2 */ >; }; }; }; fragment@1 { target = <&dcan1>; __overlay__ { #address-cells = <1>; #size-cells = <0>; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&dcan1_pins_s0>; }; }; }; # install the new device tree blob for CAN root@beaglebone:~/can# dtc -O dtb -o BB-DCAN1-00A0.dtbo -b 0 -@ BB-DCAN1-00A0.dts root@beaglebone:~/can# ls BB-CAN1-00A0.dtbo.orig BB-DCAN1-00A0.dtbo BB-DCAN1-00A0.dts root@beaglebone:~/can# cp BB-DCAN1-00A0.dtbo /lib/firmware/ root@beaglebone:~/can# cmp BB-DCAN1-00A0.dtbo /lib/firmware/BB-DCAN1-00A0.dtbo # add the device root@beaglebone:/lib/firmware# cat /sys/devices/platform/bone_capemgr/slots 0: PF---- -1 1: PF---- -1 2: PF---- -1 3: PF---- -1 root@beaglebone:~/can# echo BB-DCAN1 > /sys/devices/platform/bone_capemgr/slots root@beaglebone:~/can# cat !$ cat /sys/devices/platform/bone_capemgr/slots 0: PF---- -1 1: PF---- -1 2: PF---- -1 3: PF---- -1 4: P-O-L- 0 Override Board Name,00A0,Override Manuf,BB-DCAN1 # check dmesg ... looks fine root@beaglebone:~/can# dmesg | tail -n15 [ 25.499860] wlan0: send auth to 00:1d:73:33:47:a0 (try 1/3) [ 25.522620] wlan0: authenticated [ 25.524815] wl18xx_driver wl18xx.2.auto wlan0: disabling HT/VHT due to WEP/TKIP use [ 25.528911] wlan0: associate with 00:1d:73:33:47:a0 (try 1/3) [ 25.538576] wlan0: RX AssocResp from 00:1d:73:33:47:a0 (capab=0x431 status=0 aid=4) [ 25.764831] wlan0: associated [ 25.765114] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready [ 26.579282] wlcore: Association completed. [ 3395.588267] bone_capemgr bone_capemgr: part_number 'BB-DCAN1', version 'N/A' [ 3395.588337] bone_capemgr bone_capemgr: slot #4: override [ 3395.588380] bone_capemgr bone_capemgr: Using override eeprom data at slot 4 [ 3395.588425] bone_capemgr bone_capemgr: slot #4: 'Override Board Name,00A0,Override Manuf,BB-DCAN1' [ 3395.613523] bone_capemgr bone_capemgr: slot #4: dtbo 'BB-DCAN1-00A0.dtbo' loaded; overlay id #0 [ 3395.648848] CAN device driver interface [ 3395.689001] c_can_platform 481d0000.can: c_can_platform device registered (regs=fa1d0000, irq=192) # load CAN modules root@beaglebone:~/can# sudo modprobe can root@beaglebone:~/can# sudo modprobe can-dev root@beaglebone:~/can# sudo modprobe can-raw root@beaglebone:~/can# lsmod | grep can can_raw 5852 0 can 28397 1 can_raw c_can_platform 6602 0 c_can 9577 1 c_can_platform can_dev 11663 1 c_can # Startup the CAN interface. Set CAN channel rate 500kbps. root@beaglebone:~# ip link set can0 up type can bitrate 500000 root@beaglebone:~# ifconfig can0 can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 UP RUNNING NOARP MTU:16 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:10 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:192 # Check the device status. Status UNKNOWN doesn't sound right... root@beaglebone:~/can# ip -d -s link show can0 4: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 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 0 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 0 0 0 0 0 0
Then I have to stop here.