Add CAN controller device statistics support.
Initially the following per-device statistics are supported:
- Dominant bit transmission errors
- Recessive bit transmission errors
- Bit stuffing errors
- CRC errors
- Format errors
- Acknowledge errors
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Document the expected CAN controller driver behavior when multiple CAN
frames are queued for transmission.
Fixes: #26541
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Deprecate the can_write() API wrapper function in favor of using
can_send() directly.
The can_write() API wrapper function:
- Does not support CAN-FD data lengths.
- Auto-selects between standard/extended CAN identifiers based on the
CAN ID (something which should be selected by the caller as the
selection affects filters on the receiving end).
- Does not support callbacks for frame transmission results.
- Has no in-tree users.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Use the @deprecated Doxygen command for documenting alternatives to
deprecated CAN API functions and macros.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
The CAN_BUS_UNKNOWN CAN controller state is only used to indicate that
the current CAN controller state could not be read.
Remove it and change the signature of the can_get_state() API function
to return an integer indicating success or failure.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Add CAN controller error-warning state and document the relationship
between CAN controller states and CAN controller RX/TX error counter
values.
Fixes: #21010
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Remove "return" statement from can_set_state_change_callback() API
wrappper function (which is a void function).
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Document the expected driver behavior for can_send()/can_write() when
loosing bus arbitration or when a frame is not acknowledged.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Add optional user data argument to can_set_state_change_callback() to
comply with Zephyr API design guidelines.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Rename a few CAN API functions for clarity and consistency with other
Zephyr RTOS APIs.
CAN_DEFINE_MSGQ() becomes CAN_MSGQ_DEFINE() to match K_MSGQ_DEFINE().
can_attach_isr() becomes can_add_rx_filter() since a filter callback
function is not an interrupt service routine (although it is called in
isr context). The word "attach" is replaced with "add" since filters are
added, not attached. This matches the terminology used is other Zephyr
APIs better.
can_detach() becomes can_remove_rx_filter() to pair with
can_add_rx_filter().
can_attach_msgq() becomes can_add_rx_filter_msgq() and documentation is
updated to mention its relationship with can_add_rx_filter().
can_register_state_change_isr() becomes can_set_state_change_callback()
since a state change callback function is not an interrupt service
routine (although it is called in isr context). The word "register" is
replaced with "set" since only one state change callback can be in
place.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Change the can_tx_callback_t function signature to use an "int" (not an
uint32_t) for representing transmission errors.
The "error" callback function parameter is functionally equivalent to
the return value from can_send() and thus needs to use the same data
type and needs to be able to hold negative errno values.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Deprecate the can_attach_workq() API call.
This API is limited in its functionality (it does not work with
userspace, it uses one common buffer size for all work queue instances).
Similar functionality can easily be implemented using the
can_attach_msgq() API along with the generic triggered work API
(e.g. using k_work_poll_submit()).
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Move the deprecated CAN APIs to the bottom of the include file and
exclude them from the documentation.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Deprecate the use of CAN-specific error return values and replace them
with standard errno values.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Improve the CAN driver API documentation:
- Reorder API declarations and organize them into logical groups.
- Add doxygen strings where missing.
- Improve and unify wording of existing doxygen strings.
- Unify naming of callback function pointers as "callback".
- Unify naming of user-specified callback function arguments as
"user_data".
- Instances and pointers to struct zcan_frame are named "frame",
not "msg", to avoid confusion with the CAN message queue support.
- Check for __DOXYGEN__ to include documentation for optional APIs in
the documentation.
- Use "@cond INTERNAL_HIDDEN" to hide internal API details such as padding.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
Currently, can_configure() pass a hard-coded 0 for the data bitrate
(which is only used for CAN-FD), breaking this API for CAN-FD enabled
applications.
Instead pass in the provided bitrate for both arbitration phase and data
phase.
Fixes: #34375
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
The can_configure() API call does not handle CAN-FD bitrates. Deprecate
the can_configure() API wrapper function in favour of the newer
can_set_bitrate() and can_set_mode() functions.
Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
The maximum number of concurrent filters depends on the hardware and
the driver implementation. This API allows the application to obtain
the maximum number of available filters.
Signed-off-by: Martin Jäger <martin@libre.solar>
- Hide internal driver API from public documentation
- Use consistent upper-case naming for CAN, RTR, etc.
- Fix indentation of some comments so that they are
rendered with monospace font.
Signed-off-by: Martin Jäger <martin@libre.solar>
If the supplied sjw in the timing parameters is zero,
the sjw parameter should not be changed.
This fixes the uninitialized swj in can_set_bitrate.
Signed-off-by: Alexander Wachter <alexander@wachter.cloud>
Implementation of the Bosch M_CAN IP driver.
This driver is just the base for a specific SoC implementation.
Signed-off-by: Alexander Wachter <alexander@wachter.cloud>
Reordering of the struct elements to match the Linux format.
The __packed() is not necessary anymore.
std_id and ext_id is merged to id in the frame and filter.
Additionally, the frames are ready for CAN-FD.
Signed-off-by: Alexander Wachter <alexander@wachter.cloud>
The previous API can't change the sampling-point and only allowed
bitrates that fit the time segments.
The new API allows for shifting the sampling-point and adjusts the
number of time quantum in a bit to all more possible bitrates.
The functions to calculate the timings are moved to the can_common file.
They can be used for all drivers.
Signed-off-by: Alexander Wachter <alexander@wachter.cloud>
Now that device_api attribute is unmodified at runtime, as well as all
the other attributes, it is possible to switch all device driver
instance to be constant.
A coccinelle rule is used for this:
@r_const_dev_1
disable optional_qualifier
@
@@
-struct device *
+const struct device *
@r_const_dev_2
disable optional_qualifier
@
@@
-struct device * const
+const struct device *
Fixes#27399
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Convert all canbus related API/samples/tests/subsys
to the new timeout API with k_timeout_t.
Signed-off-by: Alexander Wachter <alexander@wachter.cloud>
API documentation for parameters that accept a duration specified in
milliseconds is updated to replace references to K_NO_WAIT with 0, and
K_FOREVER with SYS_FOREVER_MS.
Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
This change removes the hardcoded subsystem list in gen_kobject_list.py
favor of marking the relevant driver API structs with the _subsystem
sentinel.
Signed-off-by: Corey Wharton <coreyw7@fb.com>
The automated process used to remove implicit casts resulted in code
that exceeded the documented line length limits. Break the assignment
into two lines where this happened.
Signed-off-by: Peter A. Bigot <pab@pabigot.com>
C++ disallows implicit cast of void pointers to a non-void pointer
type. Presence of implicit casts prevents use of these headers in C++
applications.
Process: Run the following coccinelle script:
@@
identifier V;
identifier TAG =~ "driver_api";
type T;
expression E;
@@
T* V =
+(T *)
E->TAG;
in this command line from $ZEPHYR_BASE:
spatch --sp-file expcast.cocci \
--include-headers --dir include/ --very-quiet \
| sed -e '/^\+/s@\*) @*)@' \
| (cd include/ ; patch -p1)
Signed-off-by: Peter A. Bigot <pab@pabigot.com>
This commit limits the data length code to eight.
DLC > 8 returns a newly introduced CAN_TX_EINVAL error code.
Signed-off-by: Alexander Wachter <alexander.wachter@student.tugraz.at>
can_copy_zframe_to_frame did not distinguish between the standard and
extended frames. As a result, uninitialized bits were copied to the
destination frame. This commit changes the function to use the correct
bitfields.
Signed-off-by: Alexander Wachter <alexander.wachter@student.tugraz.at>
This commit extends the CAN API with the following functions:
- can_get_state
- can_recover
- can_register_state_change_isr
This functions can be used to get the error-counters and the state
of the CAN controller. The recover function can be used to recover
from bus-off state when automatic recovery is disabled.
Signed-off-by: Alexander Wachter <alexander.wachter@student.tugraz.at>
Changed return parameter description from
"@retval filter id on success" to
"@retval filter_id on success".
This change suppresses the doxy warnings.
Signed-off-by: Alexander Wachter <alexander.wachter@student.tugraz.at>
This commit introduces a timestamp for received CAN frames.
The timestamp is optional and can be activated via Kconfig.
Signed-off-by: Alexander Wachter <alexander.wachter@student.tugraz.at>
move can.h to drivers/can.h and
create a shim for backward-compatibility.
No functional changes to the headers.
A warning in the shim can be controlled with CONFIG_COMPAT_INCLUDES.
Related to #16539
Signed-off-by: Anas Nashif <anas.nashif@intel.com>