SAE J1939 in Linux
See also on Wikipedia.
SAE J1939 defines a higher layer protocol on CAN. It implements a more sophisticated addressing scheme and extends the maximum packet size above 8 bytes. Several derived specifications exists, which differ from the original j1939 on the application level, like MilCAN, NMEA2000 and especially ISO-11783 (ISOBUS). This last one specifies the so-called ETP (Extended Transport Protocol) which is has been included in this implementation. This inclusion results in a maximum packet size of ((2^24)-1)*7 bytes
- SAE J1939-21 : data link layer
- SAE J1939-81 : network management
- ISO 11783-6 : Virtual Terminal (Extended Transport Protocol)
Support for SAE J1939 in Linux consists of 3 parts:
You probably want all 2 components to get a J1939 linux node working. The J1939 specific code resides in dedicated branches.
The final goal is to have these source trees mainlined.
Note that earlier versions needed a modified iproute2. This requirement has been dropped.
Build the kernel (necessary)
$ git clone <yourfavoritelinuxkernel> linux $ cd linux $ git remote add j1939 git://github.com/kurt-vd/linux $ git remote update j1939 $ git merge j1939/j1939d-vX.X $ make etc.
With j1939-vX.X the branch that matches the closest, but not higher, with your linux version.
Build can-j1939-utils (recommended)
$ git clone git://github.com/kurt-vd/can-utils $ cd can-utils $ make etc.
Or you may merge the j1939 changes into any other can-utils version. This should be fairly simple.
If the branch of linux-can-j1939 that you merged into your kernel was for version 3.7 or higher, use the j1939-v6 branch of can-j1939-utils.
Getting Started with J1939
I prepared a good howto with example program on my github page.