mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	can: can327: CAN/ldisc driver for ELM327 based OBD-II adapters
This is the can327 driver. It does a surprisingly good job at turning ELM327 based OBD-II interfaces into cheap CAN interfaces for simple homebrew projects. Please see the included documentation for details and limitations: Documentation/networking/device_drivers/can/can327.rst Link: https://lore.kernel.org/all/20220618195031.10975-1-max@enpas.org Signed-off-by: Max Staudt <max@enpas.org> Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> [mkl: minor coding style improvements] Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
		
							parent
							
								
									713eb3c126
								
							
						
					
					
						commit
						43da2f0762
					
				
					 6 changed files with 1495 additions and 0 deletions
				
			
		
							
								
								
									
										331
									
								
								Documentation/networking/device_drivers/can/can327.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								Documentation/networking/device_drivers/can/can327.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,331 @@
 | 
			
		|||
.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
 | 
			
		||||
 | 
			
		||||
can327: ELM327 driver for Linux SocketCAN
 | 
			
		||||
==========================================
 | 
			
		||||
 | 
			
		||||
Authors
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
Max Staudt <max@enpas.org>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Motivation
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
This driver aims to lower the initial cost for hackers interested in
 | 
			
		||||
working with CAN buses.
 | 
			
		||||
 | 
			
		||||
CAN adapters are expensive, few, and far between.
 | 
			
		||||
ELM327 interfaces are cheap and plentiful.
 | 
			
		||||
Let's use ELM327s as CAN adapters.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Introduction
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
This driver is an effort to turn abundant ELM327 based OBD interfaces
 | 
			
		||||
into full fledged (as far as possible) CAN interfaces.
 | 
			
		||||
 | 
			
		||||
Since the ELM327 was never meant to be a stand alone CAN controller,
 | 
			
		||||
the driver has to switch between its modes as quickly as possible in
 | 
			
		||||
order to fake full-duplex operation.
 | 
			
		||||
 | 
			
		||||
As such, can327 is a best effort driver. However, this is more than
 | 
			
		||||
enough to implement simple request-response protocols (such as OBD II),
 | 
			
		||||
and to monitor broadcast messages on a bus (such as in a vehicle).
 | 
			
		||||
 | 
			
		||||
Most ELM327s come as nondescript serial devices, attached via USB or
 | 
			
		||||
Bluetooth. The driver cannot recognize them by itself, and as such it
 | 
			
		||||
is up to the user to attach it in form of a TTY line discipline
 | 
			
		||||
(similar to PPP, SLIP, slcan, ...).
 | 
			
		||||
 | 
			
		||||
This driver is meant for ELM327 versions 1.4b and up, see below for
 | 
			
		||||
known limitations in older controllers and clones.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Data sheet
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
The official data sheets can be found at ELM electronics' home page:
 | 
			
		||||
 | 
			
		||||
  https://www.elmelectronics.com/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
How to attach the line discipline
 | 
			
		||||
----------------------------------
 | 
			
		||||
 | 
			
		||||
Every ELM327 chip is factory programmed to operate at a serial setting
 | 
			
		||||
of 38400 baud/s, 8 data bits, no parity, 1 stopbit.
 | 
			
		||||
 | 
			
		||||
If you have kept this default configuration, the line discipline can
 | 
			
		||||
be attached on a command prompt as follows::
 | 
			
		||||
 | 
			
		||||
    sudo ldattach \
 | 
			
		||||
           --debug \
 | 
			
		||||
           --speed 38400 \
 | 
			
		||||
           --eightbits \
 | 
			
		||||
           --noparity \
 | 
			
		||||
           --onestopbit \
 | 
			
		||||
           --iflag -ICRNL,INLCR,-IXOFF \
 | 
			
		||||
           30 \
 | 
			
		||||
           /dev/ttyUSB0
 | 
			
		||||
 | 
			
		||||
To change the ELM327's serial settings, please refer to its data
 | 
			
		||||
sheet. This needs to be done before attaching the line discipline.
 | 
			
		||||
 | 
			
		||||
Once the ldisc is attached, the CAN interface starts out unconfigured.
 | 
			
		||||
Set the speed before starting it::
 | 
			
		||||
 | 
			
		||||
    # The interface needs to be down to change parameters
 | 
			
		||||
    sudo ip link set can0 down
 | 
			
		||||
    sudo ip link set can0 type can bitrate 500000
 | 
			
		||||
    sudo ip link set can0 up
 | 
			
		||||
 | 
			
		||||
500000 bit/s is a common rate for OBD-II diagnostics.
 | 
			
		||||
If you're connecting straight to a car's OBD port, this is the speed
 | 
			
		||||
that most cars (but not all!) expect.
 | 
			
		||||
 | 
			
		||||
After this, you can set out as usual with candump, cansniffer, etc.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
How to check the controller version
 | 
			
		||||
------------------------------------
 | 
			
		||||
 | 
			
		||||
Use a terminal program to attach to the controller.
 | 
			
		||||
 | 
			
		||||
After issuing the "``AT WS``" command, the controller will respond with
 | 
			
		||||
its version::
 | 
			
		||||
 | 
			
		||||
    >AT WS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    ELM327 v1.4b
 | 
			
		||||
 | 
			
		||||
    >
 | 
			
		||||
 | 
			
		||||
Note that clones may claim to be any version they like.
 | 
			
		||||
It is not indicative of their actual feature set.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Communication example
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
This is a short and incomplete introduction on how to talk to an ELM327.
 | 
			
		||||
It is here to guide understanding of the controller's and the driver's
 | 
			
		||||
limitation (listed below) as well as manual testing.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The ELM327 has two modes:
 | 
			
		||||
 | 
			
		||||
- Command mode
 | 
			
		||||
- Reception mode
 | 
			
		||||
 | 
			
		||||
In command mode, it expects one command per line, terminated by CR.
 | 
			
		||||
By default, the prompt is a "``>``", after which a command can be
 | 
			
		||||
entered::
 | 
			
		||||
 | 
			
		||||
    >ATE1
 | 
			
		||||
    OK
 | 
			
		||||
    >
 | 
			
		||||
 | 
			
		||||
The init script in the driver switches off several configuration options
 | 
			
		||||
that are only meaningful in the original OBD scenario the chip is meant
 | 
			
		||||
for, and are actually a hindrance for can327.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
When a command is not recognized, such as by an older version of the
 | 
			
		||||
ELM327, a question mark is printed as a response instead of OK::
 | 
			
		||||
 | 
			
		||||
    >ATUNKNOWN
 | 
			
		||||
    ?
 | 
			
		||||
    >
 | 
			
		||||
 | 
			
		||||
At present, can327 does not evaluate this response. See the section
 | 
			
		||||
below on known limitations for details.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
When a CAN frame is to be sent, the target address is configured, after
 | 
			
		||||
which the frame is sent as a command that consists of the data's hex
 | 
			
		||||
dump::
 | 
			
		||||
 | 
			
		||||
    >ATSH123
 | 
			
		||||
    OK
 | 
			
		||||
    >DEADBEEF12345678
 | 
			
		||||
    OK
 | 
			
		||||
    >
 | 
			
		||||
 | 
			
		||||
The above interaction sends the SFF frame "``DE AD BE EF 12 34 56 78``"
 | 
			
		||||
with (11 bit) CAN ID ``0x123``.
 | 
			
		||||
For this to function, the controller must be configured for SFF sending
 | 
			
		||||
mode (using "``AT PB``", see code or datasheet).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Once a frame has been sent and wait-for-reply mode is on (``ATR1``,
 | 
			
		||||
configured on ``listen-only=off``), or when the reply timeout expires
 | 
			
		||||
and the driver sets the controller into monitoring mode (``ATMA``),
 | 
			
		||||
the ELM327 will send one line for each received CAN frame, consisting
 | 
			
		||||
of CAN ID, DLC, and data::
 | 
			
		||||
 | 
			
		||||
    123 8 DEADBEEF12345678
 | 
			
		||||
 | 
			
		||||
For EFF (29 bit) CAN frames, the address format is slightly different,
 | 
			
		||||
which can327 uses to tell the two apart::
 | 
			
		||||
 | 
			
		||||
    12 34 56 78 8 DEADBEEF12345678
 | 
			
		||||
 | 
			
		||||
The ELM327 will receive both SFF and EFF frames - the current CAN
 | 
			
		||||
config (``ATPB``) does not matter.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
If the ELM327's internal UART sending buffer runs full, it will abort
 | 
			
		||||
the monitoring mode, print "BUFFER FULL" and drop back into command
 | 
			
		||||
mode. Note that in this case, unlike with other error messages, the
 | 
			
		||||
error message may appear on the same line as the last (usually
 | 
			
		||||
incomplete) data frame::
 | 
			
		||||
 | 
			
		||||
    12 34 56 78 8 DEADBEEF123 BUFFER FULL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Known limitations of the controller
 | 
			
		||||
------------------------------------
 | 
			
		||||
 | 
			
		||||
- Clone devices ("v1.5" and others)
 | 
			
		||||
 | 
			
		||||
  Sending RTR frames is not supported and will be dropped silently.
 | 
			
		||||
 | 
			
		||||
  Receiving RTR with DLC 8 will appear to be a regular frame with
 | 
			
		||||
  the last received frame's DLC and payload.
 | 
			
		||||
 | 
			
		||||
  "``AT CSM``" (CAN Silent Monitoring, i.e. don't send CAN ACKs) is
 | 
			
		||||
  not supported, and is hard coded to ON. Thus, frames are not ACKed
 | 
			
		||||
  while listening: "``AT MA``" (Monitor All) will always be "silent".
 | 
			
		||||
  However, immediately after sending a frame, the ELM327 will be in
 | 
			
		||||
  "receive reply" mode, in which it *does* ACK any received frames.
 | 
			
		||||
  Once the bus goes silent, or an error occurs (such as BUFFER FULL),
 | 
			
		||||
  or the receive reply timeout runs out, the ELM327 will end reply
 | 
			
		||||
  reception mode on its own and can327 will fall back to "``AT MA``"
 | 
			
		||||
  in order to keep monitoring the bus.
 | 
			
		||||
 | 
			
		||||
  Other limitations may apply, depending on the clone and the quality
 | 
			
		||||
  of its firmware.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- All versions
 | 
			
		||||
 | 
			
		||||
  No full duplex operation is supported. The driver will switch
 | 
			
		||||
  between input/output mode as quickly as possible.
 | 
			
		||||
 | 
			
		||||
  The length of outgoing RTR frames cannot be set. In fact, some
 | 
			
		||||
  clones (tested with one identifying as "``v1.5``") are unable to
 | 
			
		||||
  send RTR frames at all.
 | 
			
		||||
 | 
			
		||||
  We don't have a way to get real-time notifications on CAN errors.
 | 
			
		||||
  While there is a command (``AT CS``) to retrieve some basic stats,
 | 
			
		||||
  we don't poll it as it would force us to interrupt reception mode.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- Versions prior to 1.4b
 | 
			
		||||
 | 
			
		||||
  These versions do not send CAN ACKs when in monitoring mode (AT MA).
 | 
			
		||||
  However, they do send ACKs while waiting for a reply immediately
 | 
			
		||||
  after sending a frame. The driver maximizes this time to make the
 | 
			
		||||
  controller as useful as possible.
 | 
			
		||||
 | 
			
		||||
  Starting with version 1.4b, the ELM327 supports the "``AT CSM``"
 | 
			
		||||
  command, and the "listen-only" CAN option will take effect.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- Versions prior to 1.4
 | 
			
		||||
 | 
			
		||||
  These chips do not support the "``AT PB``" command, and thus cannot
 | 
			
		||||
  change bitrate or SFF/EFF mode on-the-fly. This will have to be
 | 
			
		||||
  programmed by the user before attaching the line discipline. See the
 | 
			
		||||
  data sheet for details.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- Versions prior to 1.3
 | 
			
		||||
 | 
			
		||||
  These chips cannot be used at all with can327. They do not support
 | 
			
		||||
  the "``AT D1``" command, which is necessary to avoid parsing conflicts
 | 
			
		||||
  on incoming data, as well as distinction of RTR frame lengths.
 | 
			
		||||
 | 
			
		||||
  Specifically, this allows for easy distinction of SFF and EFF
 | 
			
		||||
  frames, and to check whether frames are complete. While it is possible
 | 
			
		||||
  to deduce the type and length from the length of the line the ELM327
 | 
			
		||||
  sends us, this method fails when the ELM327's UART output buffer
 | 
			
		||||
  overruns. It may abort sending in the middle of the line, which will
 | 
			
		||||
  then be mistaken for something else.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Known limitations of the driver
 | 
			
		||||
--------------------------------
 | 
			
		||||
 | 
			
		||||
- No 8/7 timing.
 | 
			
		||||
 | 
			
		||||
  ELM327 can only set CAN bitrates that are of the form 500000/n, where
 | 
			
		||||
  n is an integer divisor.
 | 
			
		||||
  However there is an exception: With a separate flag, it may set the
 | 
			
		||||
  speed to be 8/7 of the speed indicated by the divisor.
 | 
			
		||||
  This mode is not currently implemented.
 | 
			
		||||
 | 
			
		||||
- No evaluation of command responses.
 | 
			
		||||
 | 
			
		||||
  The ELM327 will reply with OK when a command is understood, and with ?
 | 
			
		||||
  when it is not. The driver does not currently check this, and simply
 | 
			
		||||
  assumes that the chip understands every command.
 | 
			
		||||
  The driver is built such that functionality degrades gracefully
 | 
			
		||||
  nevertheless. See the section on known limitations of the controller.
 | 
			
		||||
 | 
			
		||||
- No use of hardware CAN ID filtering
 | 
			
		||||
 | 
			
		||||
  An ELM327's UART sending buffer will easily overflow on heavy CAN bus
 | 
			
		||||
  load, resulting in the "``BUFFER FULL``" message. Using the hardware
 | 
			
		||||
  filters available through "``AT CF xxx``" and "``AT CM xxx``" would be
 | 
			
		||||
  helpful here, however SocketCAN does not currently provide a facility
 | 
			
		||||
  to make use of such hardware features.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Rationale behind the chosen configuration
 | 
			
		||||
------------------------------------------
 | 
			
		||||
 | 
			
		||||
``AT E1``
 | 
			
		||||
  Echo on
 | 
			
		||||
 | 
			
		||||
  We need this to be able to get a prompt reliably.
 | 
			
		||||
 | 
			
		||||
``AT S1``
 | 
			
		||||
  Spaces on
 | 
			
		||||
 | 
			
		||||
  We need this to distinguish 11/29 bit CAN addresses received.
 | 
			
		||||
 | 
			
		||||
  Note:
 | 
			
		||||
  We can usually do this using the line length (odd/even),
 | 
			
		||||
  but this fails if the line is not transmitted fully to
 | 
			
		||||
  the host (BUFFER FULL).
 | 
			
		||||
 | 
			
		||||
``AT D1``
 | 
			
		||||
  DLC on
 | 
			
		||||
 | 
			
		||||
  We need this to tell the "length" of RTR frames.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
A note on CAN bus termination
 | 
			
		||||
------------------------------
 | 
			
		||||
 | 
			
		||||
Your adapter may have resistors soldered in which are meant to terminate
 | 
			
		||||
the bus. This is correct when it is plugged into a OBD-II socket, but
 | 
			
		||||
not helpful when trying to tap into the middle of an existing CAN bus.
 | 
			
		||||
 | 
			
		||||
If communications don't work with the adapter connected, check for the
 | 
			
		||||
termination resistors on its PCB and try removing them.
 | 
			
		||||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ Contents:
 | 
			
		|||
.. toctree::
 | 
			
		||||
   :maxdepth: 2
 | 
			
		||||
 | 
			
		||||
   can327
 | 
			
		||||
   ctu/ctucanfd-driver
 | 
			
		||||
   freescale/flexcan
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7315,6 +7315,13 @@ L:	netdev@vger.kernel.org
 | 
			
		|||
S:	Maintained
 | 
			
		||||
F:	drivers/net/ethernet/ibm/ehea/
 | 
			
		||||
 | 
			
		||||
ELM327 CAN NETWORK DRIVER
 | 
			
		||||
M:	Max Staudt <max@enpas.org>
 | 
			
		||||
L:	linux-can@vger.kernel.org
 | 
			
		||||
S:	Maintained
 | 
			
		||||
F:	Documentation/networking/device_drivers/can/can327.rst
 | 
			
		||||
F:	drivers/net/can/can327.c
 | 
			
		||||
 | 
			
		||||
EM28XX VIDEO4LINUX DRIVER
 | 
			
		||||
M:	Mauro Carvalho Chehab <mchehab@kernel.org>
 | 
			
		||||
L:	linux-media@vger.kernel.org
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,6 +113,24 @@ config CAN_AT91
 | 
			
		|||
	  This is a driver for the SoC CAN controller in Atmel's AT91SAM9263
 | 
			
		||||
	  and AT91SAM9X5 processors.
 | 
			
		||||
 | 
			
		||||
config CAN_CAN327
 | 
			
		||||
	tristate "Serial / USB serial ELM327 based OBD-II Interfaces (can327)"
 | 
			
		||||
	depends on TTY
 | 
			
		||||
	select CAN_RX_OFFLOAD
 | 
			
		||||
	help
 | 
			
		||||
	  CAN driver for several 'low cost' OBD-II interfaces based on the
 | 
			
		||||
	  ELM327 OBD-II interpreter chip.
 | 
			
		||||
 | 
			
		||||
	  This is a best effort driver - the ELM327 interface was never
 | 
			
		||||
	  designed to be used as a standalone CAN interface. However, it can
 | 
			
		||||
	  still be used for simple request-response protocols (such as OBD II),
 | 
			
		||||
	  and to monitor broadcast messages on a bus (such as in a vehicle).
 | 
			
		||||
 | 
			
		||||
	  Please refer to the documentation for information on how to use it:
 | 
			
		||||
	  Documentation/networking/device_drivers/can/can327.rst
 | 
			
		||||
 | 
			
		||||
	  If this driver is built as a module, it will be called can327.
 | 
			
		||||
 | 
			
		||||
config CAN_FLEXCAN
 | 
			
		||||
	tristate "Support for Freescale FLEXCAN based chips"
 | 
			
		||||
	depends on OF || COLDFIRE || COMPILE_TEST
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@ obj-y				+= usb/
 | 
			
		|||
obj-y				+= softing/
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_CAN_AT91)		+= at91_can.o
 | 
			
		||||
obj-$(CONFIG_CAN_CAN327)	+= can327.o
 | 
			
		||||
obj-$(CONFIG_CAN_CC770)		+= cc770/
 | 
			
		||||
obj-$(CONFIG_CAN_C_CAN)		+= c_can/
 | 
			
		||||
obj-$(CONFIG_CAN_CTUCANFD)	+= ctucanfd/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1137
									
								
								drivers/net/can/can327.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1137
									
								
								drivers/net/can/can327.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
		Reference in a new issue