ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1
45
46#include <stdint.h>
47
48#include "ra8_board_ek_ra8d2.h"
49#include "ra8_boot_entry.h"
50#include "ra8_cgc.h"
51#include "ra8_err.h"
52#include "ra8_gpio_constants.h"
53#include "ra8_isr.h"
54#include "ra8_port_constants.h"
55#include "ra8_port_utils.h"
56#include "ra8_sci_lin.h"
57#include "ra8_time.h"
58
60typedef enum : uint32_t {
63 k_lin_hil_pclk_hz = 60000000U,
66
73
82typedef enum : uint16_t {
85
87typedef enum : uint8_t {
93
95typedef enum : uint8_t {
99
101static const uint8_t k_lin_hil_ids[k_lin_hil_id_count] = {
102 (uint8_t)k_lin_hil_id_0,
103 (uint8_t)k_lin_hil_id_1,
104 (uint8_t)k_lin_hil_id_2,
105 (uint8_t)k_lin_hil_id_3,
106};
107
109static const uint8_t k_lin_hil_payload[k_lin_hil_data_len] = {
110 (uint8_t)k_lin_hil_pay_0,
111 (uint8_t)k_lin_hil_pay_1,
112};
113
115static const uint8_t k_lin_hil_banner[] = "lin_commander_hil: SCI2 LIN commander up\r\n";
116static const uint8_t k_lin_hil_frame_msg[] = "lin_commander_hil: frame sent\r\n";
117static const uint8_t k_lin_hil_fault_msg[] = "lin_commander_hil: LIN TX error\r\n";
118
126static void lin_hil_panic_halt(void)
127{
128 while (1) {
129 __asm__ volatile("wfi");
130 }
131}
132
146static void lin_hil_setup_or_halt(void)
147{
148 uint32_t cpuclk0_hz = 0U;
149
150 if (ra8_cgc_init() != k_ra8_ok) {
152 }
155 }
156 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
158 }
161 }
164 }
165
166 /* Route the Pmod1 UART pins to SCI async so the LIN signals reach P801/P802. */
169 "lin.txd2") != k_ra8_ok) {
171 }
174 "lin.rxd2") != k_ra8_ok) {
176 }
177
178 const ra8_sci_lin_cfg_t lin_cfg = {
179 .uart =
180 {
181 .baud = (uint32_t)k_lin_hil_lin_baud,
182 .data_bits = k_ra8_sci_data_8,
183 .parity = k_ra8_sci_parity_none,
184 .stop_bits = k_ra8_sci_stop_1,
185 .pclk_hz = (uint32_t)k_lin_hil_pclk_hz,
186 },
188 .timer_clk = k_ra8_sci_lin_clk_div16,
189 .break_field_len = (uint16_t)k_lin_hil_break_len,
190 };
191 if (ra8_sci_lin_init((uint8_t)k_lin_hil_channel, &lin_cfg) != k_ra8_ok) {
193 }
194}
195
217{
218 const ra8_err_t herr = ra8_sci_lin_send_header((uint8_t)k_lin_hil_channel, id);
219 if (herr != k_ra8_ok) {
220 return herr;
221 }
222 const uint8_t pid = ra8_sci_lin_pid(id);
225 pid,
227 (uint8_t)k_lin_hil_data_len);
228}
229
239void main(void)
240{
244
245 uint8_t idx = 0U;
246 while (1) {
247 const uint8_t id = k_lin_hil_ids[idx];
248 const ra8_err_t err = lin_hil_send_frame(id);
249 if (err == k_ra8_ok) {
251 (size_t)(sizeof(k_lin_hil_frame_msg) - 1U));
252 } else {
254 (size_t)(sizeof(k_lin_hil_fault_msg) - 1U));
255 }
256
258 break;
259 }
260 idx = (uint8_t)((idx + 1U) % (uint8_t)k_lin_hil_id_count);
262 }
263
265}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static void lin_hil_setup_or_halt(void)
Bring up CGC + SysTick + console + LED, route Pmod1, init LIN.
Definition main.c:146
lin_hil_id_t
The four rotating demo frame ids (arbitrary 6-bit LIN identifiers).
Definition main.c:87
@ k_lin_hil_id_0
Demo frame id 0.
Definition main.c:88
@ k_lin_hil_id_2
Demo frame id 2.
Definition main.c:90
@ k_lin_hil_id_1
Demo frame id 1.
Definition main.c:89
@ k_lin_hil_id_3
Demo frame id 3.
Definition main.c:91
static const uint8_t k_lin_hil_frame_msg[]
Definition main.c:116
static const uint8_t k_lin_hil_fault_msg[]
Definition main.c:117
lin_hil_payload_byte_t
The two-byte demo response payload bytes.
Definition main.c:95
@ k_lin_hil_pay_1
Response payload byte 1.
Definition main.c:97
@ k_lin_hil_pay_0
Response payload byte 0.
Definition main.c:96
static void lin_hil_panic_halt(void)
Halt forever in WFI – used as a panic stop on init failure.
Definition main.c:126
lin_hil_config_t
Compile-time settings for the LIN commander demo.
Definition main.c:60
@ k_lin_hil_console_baud
SCI8 status-console baud.
Definition main.c:61
@ k_lin_hil_period_ms
Delay between LIN frames.
Definition main.c:64
@ k_lin_hil_pclk_hz
PCLKB used for the LIN BRR calc.
Definition main.c:63
@ k_lin_hil_lin_baud
SCI2 LIN bus baud (<= 20 kbps).
Definition main.c:62
lin_hil_frame_t
LIN channel + frame constants.
Definition main.c:68
@ k_lin_hil_data_len
Response payload length.
Definition main.c:71
@ k_lin_hil_channel
SCI2 (Pmod1 TXD2/RXD2) is the LIN bus.
Definition main.c:69
@ k_lin_hil_id_count
Number of rotating demo frame ids.
Definition main.c:70
static const uint8_t k_lin_hil_ids[k_lin_hil_id_count]
Rotating demo frame ids (arbitrary 6-bit LIN identifiers).
Definition main.c:101
static const uint8_t k_lin_hil_payload[k_lin_hil_data_len]
Two-byte response payload published for every frame.
Definition main.c:109
static ra8_err_t lin_hil_send_frame(uint8_t id)
Send one LIN frame: header + published data response.
Definition main.c:216
static const uint8_t k_lin_hil_banner[]
Banner + per-frame markers (must remain 7-bit ASCII).
Definition main.c:115
lin_hil_break_t
Break-field length programmed into XCR2.BFLW.
Definition main.c:82
@ k_lin_hil_break_len
XCR2.BFLW break-field length.
Definition main.c:83
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_led_toggle(ra8_board_led_id_t led)
Toggle led's output state.
ra8_err_t ra8_board_led_init(ra8_board_led_id_t led)
Configure led as a digital output, initial level low (off).
@ k_ra8_board_pmod1_uart_txd
Pmod1 UART TXD (TXD2), P801.
@ k_ra8_board_pmod1_uart_rxd
Pmod1 UART RXD (RXD2), P802.
@ k_ra8_board_led1
LED1, BLUE, P600 (jumper E27).
ra8_err_t ra8_board_uart_console_write(const uint8_t *data, size_t len)
Polled blocking write to the J-Link OB VCOM console.
ra8_err_t ra8_board_uart_console_init(uint32_t baud)
Configure SCI8 + PD02/PD03 as the debug-console UART.
Boot entry points shared between a vector table and its startup code.
High-level Clock Generation Circuit driver.
ra8_err_t ra8_cgc_get_clock_hz(ra8_clock_id_t id, uint32_t *out_hz)
Query the current frequency of a clock-tree domain.
Definition ra8_cgc.c:132
@ k_ra8_clock_id_cpuclk0
Cortex-M85 CPUCLK0.
Definition ra8_cgc.h:70
ra8_err_t ra8_cgc_init(void)
Configure the clock tree to a safe default.
Definition ra8_cgc.c:727
Error Code Definitions for ra8-firmware.
@ 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
PSEL codes for peripheral pin routing on the RA8D2.
@ k_ra8_psel_sci_async
00100b: SCI async serial (UART).
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
Typed Port / Pin Constants for the RA8D2 IOPORT Module.
ra8_port_pin_t
Packed (port << 8) | pin pin identifier.
High-level GPIO helpers on top of the PORT + PFS register layer.
ra8_err_t ra8_pfs_route_peripheral(ra8_port_pin_t pin, ra8_psel_t psel, const char *owner)
Route a pin to a non-IRQ peripheral function via PFS.PSEL.
Definition gpio.c:238
@ k_ra8_sci_stop_1
RA8 SCI stop 1.
Definition ra8_sci.h:81
@ k_ra8_sci_parity_none
RA8 SCI parity none.
Definition ra8_sci.h:71
@ k_ra8_sci_data_8
RA8 SCI data 8.
Definition ra8_sci.h:91
LIN (Local Interconnect Network) commander + responder driver on SCI_B.
uint8_t ra8_sci_lin_pid(uint8_t id)
Compute the LIN protected identifier (PID) from a frame id.
@ k_ra8_sci_lin_role_commander
Generate the header (bus controller).
ra8_err_t ra8_sci_lin_init(uint8_t channel, const ra8_sci_lin_cfg_t *cfg)
Configure an SCI_B channel for a LIN role (commander or responder).
@ k_ra8_sci_lin_checksum_enhanced
LIN 2.x: sum of PID + data bytes.
@ k_ra8_sci_lin_clk_div16
Break timer clock = TCLK / 16.
ra8_err_t ra8_sci_lin_send_header(uint8_t channel, uint8_t id)
Transmit a full LIN header: break + SYNC (0x55) + PID.
ra8_err_t ra8_sci_lin_send_response(uint8_t channel, ra8_sci_lin_checksum_mode_t mode, uint8_t pid, const uint8_t *data, uint8_t len)
Publish a LIN response: data bytes followed by the checksum.
SysTick-based tick counter, delay and timestamp helpers.
ra8_err_t ra8_time_init(uint32_t cpu_hz)
Initialise SysTick for a 1 kHz tick interrupt.
Definition ra8_time.c:59
void ra8_delay_ms(uint32_t ms)
Busy-wait for at least ms milliseconds.
Definition ra8_time.c:129
Configuration descriptor for ra8_sci_lin_init.