ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_canfd_tdc.c
Go to the documentation of this file.
1
24
25#include <stdint.h>
26
27#include "ra8_canfd.h"
28#include "ra8_canfd_regs.h"
29#include "ra8_check.h"
30#include "ra8_err.h"
31#include "ra8_hal_internal.h"
32#include "ra8_log.h"
33
34static const char* s_tag = "CANFD";
35
38{
39 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
40 volatile r_canfd_t* reg = ra8_canfd(channel);
41 RA8_CHECK_NULL_PTR(reg, s_tag, "channel out of range");
42 if (cfg->offset > (uint8_t)k_ra8_canfd_tdc_offset_max) {
44 }
45
46 /* FDCFG is only writable in CH_RESET or CH_HALT; use CH_RESET as
47 * the immediate abort path (mirrors ra8_canfd_set_bitrate). */
48 /* HUM Ch 41 "CFDCnFDCFG" p 2788 */
50 if (rst_err != k_ra8_ok) {
51 return rst_err;
52 }
53
54 /* Read-modify-write FDCFG: preserve FDOE, REFE, CLOE, ESIC, EOCCFG.
55 * Clear TDE, TDCOC, and the TDCO slot before re-stamping. */
56 /* HUM Ch 41 "CFDCnFDCFG" p 2788 */
57 uint32_t fdcfg = reg->CFDC2[0].FDCFG;
58 const uint32_t tdco_slot = (uint32_t)k_ra8_fdcfg_mask_tdco << (uint32_t)k_ra8_fdcfg_shift_tdco;
59 fdcfg &= ~(k_ra8_fdcfg_mask_tde | k_ra8_fdcfg_mask_tdcoc | tdco_slot);
60 if (cfg->enable) {
61 fdcfg |= k_ra8_fdcfg_mask_tde;
62 fdcfg |= ((uint32_t)cfg->offset & (uint32_t)k_ra8_fdcfg_mask_tdco)
63 << (uint32_t)k_ra8_fdcfg_shift_tdco;
64 if (cfg->manual) {
66 }
67 }
68 /* HUM Ch 41 "CFDCnFDCFG" p 2788 */
69 reg->CFDC2[0].FDCFG = fdcfg;
70
72 if (op_err != k_ra8_ok) {
73 return op_err;
74 }
75 ra8_log_info(s_tag, "tdc configured");
76 return k_ra8_ok;
77}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
ra8_err_t priv_ra8_canfd_internal_set_channel_mode(volatile r_canfd_t *reg, ra8_chmdc_mode_t mode)
Drive CFDC[0].CTR.CHMDC and wait for the matching status bit.
Definition ra8_canfd.c:138
CANFD Lite driver (bit-timing, TX, RX, error state).
CANFD controller register layout for the Renesas RA8D2.
@ k_ra8_chmdc_operation
Bus operation mode.
@ k_ra8_chmdc_reset
Reset mode.
@ k_ra8_fdcfg_mask_tde
TDE positioned mask (bit 16).
@ k_ra8_fdcfg_mask_tdco
TDCO pre-shift 7-bit mask.
@ k_ra8_fdcfg_mask_tdcoc
TDCOC positioned mask (bit 15).
@ k_ra8_canfd_tdc_offset_max
Maximum TDCO value: 7-bit field cap.
static volatile r_canfd_t * ra8_canfd(uint8_t channel)
Get pointer to CANFD instance N (0..1).
@ k_ra8_fdcfg_shift_tdco
TDCO[14:8]: 7-bit TDC offset bit-shift.
ra8_err_t ra8_canfd_set_tdc(uint8_t channel, const ra8_canfd_tdc_cfg_t *cfg)
Implementation of ra8_canfd_set_tdc() – RMW CFDCnFDCFG in CH_RESET.
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Cross-translation-unit private helpers shared inside ra8_hal.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info(tag, message)
RA8 log info.
Definition ra8_log.h:364
volatile uint32_t FDCFG
+0x004 CAN-FD Config.
r_canfd_cfdc2_t CFDC2[1]
CFDC2 register (offset 0x100 (0x20)).
Transmitter Delay Compensation (TDC) configuration for one CANFD channel.
Definition ra8_canfd.h:385
bool enable
true = enable TDC (FDCFG.TDE = 1).
Definition ra8_canfd.h:386
bool manual
true = use TDCO offset (FDCOC = 1), false = measured FDSTS.TDCR.
Definition ra8_canfd.h:387
uint8_t offset
TDCO offset in time quanta (0..k_ra8_canfd_tdc_offset_max).
Definition ra8_canfd.h:388