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
62
63#include <stdint.h>
64
65#include "cam_ceu.h"
66#include "cam_image.h"
67#include "ra8_board_ek_ra8d2.h"
68#include "ra8_boot_entry.h"
69#include "ra8_camera.h"
71#include "ra8_ceu.h"
72#include "ra8_cgc.h"
73#include "ra8_check.h"
74#include "ra8_err.h"
75#include "ra8_gpt.h"
76#include "ra8_i2c.h"
77#include "ra8_isr.h"
78#include "ra8_mstp.h"
79#include "ra8_ov5640.h"
80#include "ra8_port_utils.h"
81#include "ra8_sdramc.h"
82#include "ra8_time.h"
83
84/* =============================================================================
85 * Tunable constants (typed enums -- no magic numbers)
86 * =============================================================================
87 */
88
101
103typedef enum : uint8_t {
109} cam_u8_t;
110
112typedef enum : uint16_t {
115
117typedef enum : uint8_t {
120
122typedef enum : uint8_t {
124} cam_gpt_t;
125
126/* =============================================================================
127 * J-Link-probable result globals
128 * =============================================================================
129 */
130
134volatile uint32_t g_cam_chipid = 0U;
138volatile uint32_t g_cam_frame_ok = 0U;
142volatile uint32_t g_cam_min = 0U;
146volatile uint32_t g_cam_max = 0U;
150volatile uint32_t g_cam_mean = 0U;
154volatile uint32_t g_cam_verdict = 0U;
155
157static const uint8_t k_cam_tag[] = "cam: ";
158
161
165
168
171
186{
187 const ra8_ov5640_bus_t bus = {
190 .delay_ms = ra8_board_camera_delay_ms,
191 .ctx = nullptr,
192 };
193 return ra8_ov5640_init(&s_camera_sensor, &bus);
194}
195
211{
212 const ra8_camera_source_ceu_cfg_t cfg = {
213 .ceu =
214 {
215 .width_px = (uint16_t)k_cam_image_width_px,
216 .height_px = (uint16_t)k_cam_image_height_px,
217 .x_start_px = 0U,
218 .y_start_px = 0U,
219 .x_capture_px = (uint16_t)k_cam_line_bytes,
220 .y_capture_lines = (uint16_t)k_cam_image_height_px,
221 .dst_stride = (uint16_t)k_cam_line_bytes,
222 .frame_drop = 0U,
223 .bytes_per_pixel = (uint8_t)k_cam_bytes_per_pixel,
224 .interrupts = 0U,
225 .capture_format = k_ra8_ceu_fmt_data_synchronous,
226 .capture_mode = k_ra8_ceu_capture_single,
227 .data_bus = k_ra8_ceu_bus_8_bit,
228 .hsync_polarity = k_ra8_ceu_pol_high_active,
229 .vsync_polarity = k_ra8_ceu_pol_high_active,
230 .field_polarity = k_ra8_ceu_pol_high_active,
231 .input_order = k_ra8_ceu_input_cb0_y0_cr0_y1,
232 .output_format = k_ra8_ceu_output_ycbcr_422,
233 .burst_mode = k_ra8_ceu_burst_32,
234 .first_field = k_ra8_ceu_field_immediate,
235 .edge = {k_ra8_ceu_edge_rising,
239 .byte_swap = {false, true, true},
240 .scale = {0U, 0U, 0U, 0U, (uint16_t)k_cam_image_width_px, (uint16_t)k_cam_image_height_px},
241 .interlace = false,
242 .one_field_only = false,
243 .bundle_write = false,
244 .low_pass_filter = false,
245 .image_area_size = 0U,
246 },
247 .output =
248 {
249 .frame_bytes_max = (uint32_t)k_cam_uyvy_frame_bytes,
250 .stride_bytes = (uint32_t)k_cam_line_bytes,
251 .width = (uint16_t)k_cam_image_width_px,
252 .height = (uint16_t)k_cam_image_height_px,
254 },
255 .poll_interval_ms = (uint32_t)k_cam_capture_poll_ms,
256 .poll_attempts = (uint32_t)k_cam_capture_tries,
257 };
259}
260
261/* =============================================================================
262 * Console helpers
263 * =============================================================================
264 */
265
280static uint32_t cam_strlen(const char* s)
281{
282 RA8_CHECK_NULL_PTR(s, "cam", "strlen");
283 uint32_t n = 0U;
284 while ((n < (uint32_t)k_cam_string_cap) && (s[n] != '\0')) {
285 n += 1U;
286 }
287 return n;
288}
289
305static ra8_err_t cam_puts(const char* s)
306{
307 RA8_CHECK_NULL_PTR(s, "cam", "puts");
308 const uint32_t len = cam_strlen(s);
309 return ra8_board_uart_console_write((const uint8_t*)s, (size_t)len);
310}
311
328static ra8_err_t cam_put_hex(uint32_t value, uint8_t width)
329{
330 static const char k_hex[] = "0123456789ABCDEF";
332 char buf[8];
333 uint8_t i = width;
334 uint32_t v = value;
335 while (i > 0U) {
336 i = (uint8_t)(i - 1U);
337 buf[i] = k_hex[v & (uint32_t)k_cam_nibble_mask];
338 v >>= 4U;
339 }
340 return ra8_board_uart_console_write((const uint8_t*)buf, (size_t)width);
341}
342
358static ra8_err_t cam_put_u32(uint32_t value)
359{
360 if (value > (uint32_t)k_cam_dec_cap) {
362 }
363 char buf[8];
364 uint8_t i = (uint8_t)sizeof(buf);
365 uint32_t v = value;
366 do {
367 i = (uint8_t)(i - 1U);
368 buf[i] = (char)('0' + (v % (uint32_t)k_cam_dec_base));
369 v /= (uint32_t)k_cam_dec_base;
370 } while ((v != 0U) && (i > 0U));
371 const uint32_t len = (uint32_t)((uint8_t)sizeof(buf) - i);
372 return ra8_board_uart_console_write((const uint8_t*)&buf[i], (size_t)len);
373}
374
375/* =============================================================================
376 * Frame plausibility
377 * =============================================================================
378 */
379
398{
399 if ((frame == nullptr) || (frame->data == nullptr)) {
400 return false;
401 }
402 if ((frame->bytes != (uint32_t)k_cam_uyvy_frame_bytes) ||
403 (frame->stride_bytes != (uint32_t)k_cam_line_bytes)) {
404 return false;
405 }
406 if ((frame->width != (uint16_t)k_cam_image_width_px) ||
407 (frame->height != (uint16_t)k_cam_image_height_px)) {
408 return false;
409 }
410 if (frame->format != k_ra8_camera_format_uyvy422) {
411 return false;
412 }
413 const uint32_t n = frame->bytes;
414 uint32_t lo = (uint32_t)k_cam_byte_max;
415 uint32_t hi = 0U;
416 uint32_t sum = 0U;
417 for (uint32_t i = 0U; i < n; i += 1U) {
418 const uint32_t b = (uint32_t)frame->data[i];
419 if (b < lo) {
420 lo = b;
421 }
422 if (b > hi) {
423 hi = b;
424 }
425 sum += b;
426 }
427 g_cam_min = lo;
428 g_cam_max = hi;
429 g_cam_mean = sum / n;
430 return hi != lo;
431}
432
433/* =============================================================================
434 * Discovery
435 * =============================================================================
436 */
437
453static void cam_bus_scan(void)
454{
455 (void)cam_puts(" scan=");
456 for (uint8_t a = (uint8_t)k_cam_scan_lo; a <= (uint8_t)k_cam_scan_hi; a += 1U) {
457 bool acked = false;
458 if (ra8_i2c_scan((uint8_t)k_ra8_board_camera_i2c_channel, a, &acked) != k_ra8_ok) {
459 continue;
460 }
461 if (!acked) {
462 continue;
463 }
464 (void)cam_put_hex((uint32_t)a, 2U);
465 /* Read register 0 (8-bit pointer) as a coarse device-ID fingerprint. */
466 const uint8_t reg = 0U;
467 uint8_t v = 0U;
468 if (ra8_i2c_transfer((uint8_t)k_ra8_board_camera_i2c_channel, a, &reg, 1U, &v, 1U) ==
469 k_ra8_ok) {
470 (void)cam_puts(":");
471 (void)cam_put_hex((uint32_t)v, 2U);
472 }
473 (void)cam_puts(".");
474 }
475}
476
477/* =============================================================================
478 * Orchestration
479 * =============================================================================
480 */
481
490static void cam_park(void)
491{
492 while (1) {
493 __asm__ volatile("wfi");
494 }
495}
496
512{
513 uint32_t cpuclk0_hz = 0U;
514 ra8_err_t err = ra8_cgc_init();
515 if (err != k_ra8_ok) {
516 return err;
517 }
519 if (err != k_ra8_ok) {
520 return err;
521 }
522 err = ra8_mstp_init();
523 if (err != k_ra8_ok) {
524 return err;
525 }
526 err = ra8_time_init(cpuclk0_hz);
527 if (err != k_ra8_ok) {
528 return err;
529 }
531 if (err != k_ra8_ok) {
532 return err;
533 }
534 err = ra8_sdramc_init();
535 if (err != k_ra8_ok) {
536 return err;
537 }
539 if (err != k_ra8_ok) {
540 return err;
541 }
542 /* Force only SW4-6 ON so DVP reaches the sensor without overriding the
543 physical settings used by unrelated board peripherals. */
545 if (err != k_ra8_ok) {
546 return err;
547 }
549 return k_ra8_ok;
550}
551
562{
563 (void)cam_puts(" h=");
564 (void)cam_put_u32(probe->hsync_high_min);
565 (void)cam_puts("-");
566 (void)cam_put_u32(probe->hsync_high_max);
567 (void)cam_puts(" l=");
568 (void)cam_put_u32(probe->hsync_low_min);
569 (void)cam_puts("-");
570 (void)cam_put_u32(probe->hsync_low_max);
571 (void)cam_puts(" hc=");
573 (void)cam_puts("-");
575}
576
587{
588 (void)cam_puts(" pc=");
589 (void)cam_put_u32(probe->pclk_edges);
590 (void)cam_puts(" ph=");
591 (void)cam_put_u32(probe->pclk_half_cycles_min);
592 (void)cam_puts(" data=");
593 (void)cam_put_u32(probe->data_samples);
594 (void)cam_puts("/");
595 (void)cam_put_u32(probe->data_changes);
596 (void)cam_puts(" ");
597 (void)cam_put_hex((uint32_t)probe->data_min, 2U);
598 (void)cam_puts("-");
599 (void)cam_put_hex((uint32_t)probe->data_max, 2U);
600 (void)cam_puts(" &");
601 (void)cam_put_hex((uint32_t)probe->data_and, 2U);
602 (void)cam_puts(" |");
603 (void)cam_put_hex((uint32_t)probe->data_or, 2U);
604}
605
616{
617 (void)cam_puts(" lineclk=");
618 (void)cam_put_u32(probe->measured_lines);
619 (void)cam_puts("/");
620 (void)cam_put_u32(probe->line_pclk_min);
621 (void)cam_puts("-");
622 (void)cam_put_u32(probe->line_pclk_max);
623 (void)cam_puts("/");
624 (void)cam_put_u32(probe->line_pclk_mean);
625 (void)cam_puts(" long=");
626 (void)cam_put_u32(probe->line_pclk_long);
627}
628
641{
642 (void)cam_puts(" dvp_sync_edges=");
643 (void)cam_put_u32(probe->vsync_edges);
644 (void)cam_puts("/");
645 (void)cam_put_u32(probe->hsync_edges);
649}
650
664{
667 if (err == k_ra8_ok) {
668 cam_ceu_sync_probe_t sync_probe = {};
669 err = cam_probe_sync_activity(&sync_probe);
670 cam_print_sync_probe(&sync_probe);
671 }
672 if (err == k_ra8_ok) {
674 }
675 if (err == k_ra8_ok) {
677 }
678 (void)cam_puts(" ceu=");
679 (void)cam_puts((err == k_ra8_ok) ? "OK" : "ERR");
680 return err;
681}
682
697static bool cam_capture_frame_and_report(bool ready)
698{
699 bool frame_ok = false;
700 if (ready) {
701 const ra8_camera_buffer_t capture = {
702 .data = s_camera_capture,
703 .capacity = (uint32_t)sizeof(s_camera_capture),
704 };
706 }
707 g_cam_frame_ok = frame_ok ? 1U : 0U;
708 (void)cam_puts(" bytes=");
709 (void)cam_put_u32(s_camera_frame.bytes);
710 (void)cam_puts(" frame=");
711 (void)cam_puts(frame_ok ? "OK" : "ERR");
712
713 /* Emit CETCR so missing sync and invalid timing remain diagnosable. */
714 uint32_t cetcr = 0U;
716 (void)cam_puts(" cetcr=");
717 (void)cam_put_hex(cetcr, 8U);
718 return frame_ok;
719}
720
732static void cam_finish_verdict(bool frame_ok)
733{
734 bool plausible = false;
735 bool rgb_ok = false;
736 if (frame_ok) {
738 if (plausible) {
739 rgb_ok = (cam_image_generate(s_camera_frame.data, s_camera_frame.bytes) == k_ra8_ok);
740 }
741 }
742 (void)cam_puts(" min=");
743 (void)cam_put_u32(g_cam_min);
744 (void)cam_puts(" max=");
745 (void)cam_put_u32(g_cam_max);
746 (void)cam_puts(" mean=");
747 (void)cam_put_u32(g_cam_mean);
748 (void)cam_puts(" rgb=");
749 (void)cam_puts(rgb_ok ? "OK" : "ERR");
750 (void)cam_puts(" rgb_bytes=");
752 g_cam_verdict = (plausible && rgb_ok) ? 1U : 0U;
753 (void)cam_puts((plausible && rgb_ok) ? " verdict=PASS\r\n" : " verdict=FAIL\r\n");
754}
755
770static void cam_capture_and_verdict(void)
771{
772 const ra8_err_t prep_err = cam_prepare_capture();
773 const bool frame_ok = cam_capture_frame_and_report(prep_err == k_ra8_ok);
774 cam_finish_verdict(frame_ok);
775}
776
792static void cam_run(void)
793{
794 (void)cam_puts((const char*)k_cam_tag);
795
796 /* Confirm the XCLK GPT is actually counting (a proxy that the P501
797 XVCLK square wave is live). The GTCNT wraps every few counts at the
798 ~24 MHz output rate, so sample it in a tight loop and call it live as
799 soon as any read differs from the first; a stuck GTCNT (every sample
800 identical) means the sensor never gets a clock. */
801 uint32_t cnt_ref = 0U;
802 bool gpt_running = false;
803 (void)ra8_gpt_read((uint8_t)k_cam_xclk_gpt_ch, &cnt_ref);
804 for (uint32_t i = 0U; i < (uint32_t)k_cam_gpt_probe_iters; i += 1U) {
805 uint32_t cnt = 0U;
806 (void)ra8_gpt_read((uint8_t)k_cam_xclk_gpt_ch, &cnt);
807 if (cnt != cnt_ref) {
808 gpt_running = true;
809 break;
810 }
811 }
812 (void)cam_puts(" gpt=");
813 (void)cam_puts(gpt_running ? "RUN" : "DEAD");
814
815 /* The OV5640 needs XVCLK (up in cam_bringup) and must be out of
816 hardware reset before it answers on SCCB, so release RST (P709)
817 before scanning and probing the sensor. */
819 if (rst_err == k_ra8_ok) {
820 rst_err = cam_sensor_bind();
821 }
822
823 cam_bus_scan();
824
825 uint16_t chip = 0U;
826 const bool id_ok =
827 (rst_err == k_ra8_ok) && (ra8_ov5640_probe(&s_camera_sensor, &chip) == k_ra8_ok);
828 g_cam_chipid = (uint32_t)chip;
829 (void)cam_puts(" chipid=");
830 (void)cam_put_hex((uint32_t)chip, 4U);
831 (void)cam_puts(" xclk=OK rst=");
832 (void)cam_puts((rst_err == k_ra8_ok) ? "OK" : "ERR");
833 (void)cam_puts(" sccb=");
834 (void)cam_puts(id_ok ? "OK" : "ERR");
835
836 if (!id_ok) {
837 (void)cam_puts(" verdict=FAIL\r\n");
838 return;
839 }
840
842}
843
853void main(void)
854{
855 if (cam_bringup() != k_ra8_ok) {
856 (void)cam_puts("cam: bringup ERROR verdict=FAIL\r\n");
857 cam_park();
858 return;
859 }
861 cam_run();
862 cam_park();
863}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static ra8_ov5640_t s_camera_sensor
Transport-independent OV5640 instance bound to the EK-RA8D2 SCCB bus.
App-specific GPIO diagnostic for the parallel DVP camera signals.
ra8_err_t cam_probe_sync_activity(cam_ceu_sync_probe_t *out_probe)
Measure DVP sync, clock, and data activity before CEU routing.
Definition cam_ceu.c:420
SDRAM-backed RGB888 views of one packed VGA UYVY camera frame.
@ k_cam_uyvy_frame_bytes
640 x 480 x 2-byte packed UYVY input.
Definition cam_image.h:29
@ k_cam_image_height_px
Unrotated and 180-degree height.
Definition cam_image.h:28
@ k_cam_image_width_px
Unrotated and 180-degree width.
Definition cam_image.h:27
ra8_err_t cam_image_generate(const uint8_t *uyvy, uint32_t source_bytes)
Convert one packed Cb-Y0-Cr-Y1 VGA frame into all four RGB views.
Definition cam_image.c:209
const uint32_t g_cam_rgb_frame_bytes
Stable byte count of each exported RGB888 buffer.
Definition cam_image.c:57
static ra8_camera_frame_t s_camera_frame
Last immutable frame view returned by the generic source.
Definition main.c:167
static ra8_err_t cam_sensor_bind(void)
Bind the reusable sensor driver to the EK-RA8D2 SCCB adapter.
Definition main.c:185
static void cam_print_hsync_probe(const cam_ceu_sync_probe_t *probe)
Print horizontal-sync pulse diagnostics.
Definition main.c:561
static void cam_finish_verdict(bool frame_ok)
Validate, convert, and report the completed camera frame.
Definition main.c:732
static ra8_err_t cam_puts(const char *s)
Write a NUL-terminated string to the SCI8 console.
Definition main.c:305
cam_gpt_t
GPT channel that generates XCLK on GTIOC12A (P501).
Definition main.c:122
@ k_cam_xclk_gpt_ch
P501 = GTIOC12A per RA8D2 datasheet pinout.
Definition main.c:123
cam_u8_t
8-bit app constants: hex/decimal printing, bus scan, U15 expander.
Definition main.c:103
@ k_cam_scan_hi
Last 7-bit address in the bus scan.
Definition main.c:108
@ k_cam_scan_lo
First 7-bit address in the bus scan.
Definition main.c:107
@ k_cam_nibble_mask
Low-nibble mask for hex printing.
Definition main.c:104
@ k_cam_byte_max
Maximum byte value (min-scan seed).
Definition main.c:106
@ k_cam_dec_base
Base for decimal printing.
Definition main.c:105
static ra8_camera_source_ceu_state_t s_camera_source_state
Definition main.c:164
static void cam_bus_scan(void)
Probe every 7-bit I2C address on ch1 and print those that ACK.
Definition main.c:453
volatile uint32_t g_cam_verdict
1 = plausible camera frame (PASS), 0 = FAIL.
Definition main.c:154
static ra8_err_t cam_put_u32(uint32_t value)
Write an unsigned decimal integer to the console.
Definition main.c:358
static uint32_t cam_strlen(const char *s)
Bounded length of a NUL-terminated C string.
Definition main.c:280
static ra8_err_t cam_prepare_capture(void)
Configure the sensor, sample DVP, and prepare the CEU.
Definition main.c:663
static ra8_camera_source_t s_camera_source
Generic CEU source handle and caller-owned backend state.
Definition main.c:163
volatile uint32_t g_cam_chipid
Chip ID read over SCCB (0x300A<<8 | 0x300B).
Definition main.c:134
static bool cam_capture_frame_and_report(bool ready)
Attempt one frame capture and print CEU completion diagnostics.
Definition main.c:697
static void cam_run(void)
Run the capture pipeline and emit the plausibility banner.
Definition main.c:792
static ra8_err_t cam_bringup(void)
Bring up clocks, console, SDRAM, XCLK, SCCB and parallel camera.
Definition main.c:511
static uint8_t s_camera_capture[k_cam_uyvy_frame_bytes]
App-owned, cache-line-aligned target for one packed VGA capture.
Definition main.c:170
static void cam_park(void)
Park forever after the self-test has reported its verdict.
Definition main.c:490
static ra8_err_t cam_capture_source_bind(void)
Bind the generic CEU source to app-owned state and VGA metadata.
Definition main.c:210
cam_capture_geom_t
Packed VGA UYVY CEU geometry.
Definition main.c:112
@ k_cam_line_bytes
640 pixels x 2 packed bytes.
Definition main.c:113
volatile uint32_t g_cam_mean
Mean byte value across the captured frame.
Definition main.c:150
static void cam_print_data_probe(const cam_ceu_sync_probe_t *probe)
Print pixel-clock and sampled data diagnostics.
Definition main.c:586
static void cam_print_sync_probe(const cam_ceu_sync_probe_t *probe)
Print the complete GPIO-observed DVP diagnostic snapshot.
Definition main.c:640
volatile uint32_t g_cam_max
Maximum byte value across the captured frame.
Definition main.c:146
static bool cam_frame_is_plausible(const ra8_camera_frame_t *frame)
Compute min / max / mean over the CEU frame and store to globals.
Definition main.c:397
cam_u32_t
Scalar app tunables (baud, clocks, GPT limits, decimal cap).
Definition main.c:90
@ k_cam_capture_poll_ms
CEU completion-poll interval.
Definition main.c:94
@ k_cam_dec_cap
Max value cam_put_u32 can render.
Definition main.c:98
@ k_cam_baud
SCI8 console baud.
Definition main.c:91
@ k_cam_mode_settle_ms
Settle after selecting parallel mode.
Definition main.c:93
@ k_cam_string_cap
Console-string scan safety bound.
Definition main.c:97
@ k_cam_cache_line
DMA buffer cache-line alignment.
Definition main.c:96
@ k_cam_gpt_probe_iters
GTCNT samples to prove the timer runs.
Definition main.c:99
@ k_cam_xclk_hz
OV5640 XVCLK input-clock target, Hz.
Definition main.c:92
@ k_cam_capture_tries
CEU poll cap (~4 seconds).
Definition main.c:95
volatile uint32_t g_cam_min
Minimum byte value across the captured frame.
Definition main.c:142
static ra8_err_t cam_put_hex(uint32_t value, uint8_t width)
Write width hex nibbles of value (big-endian) to the console.
Definition main.c:328
static void cam_print_line_probe(const cam_ceu_sync_probe_t *probe)
Print per-line pixel-clock diagnostics.
Definition main.c:615
static const uint8_t k_cam_tag[]
Console tag prefix for every banner line.
Definition main.c:157
volatile uint32_t g_cam_frame_ok
1 when the CEU signalled a completed capture, else 0.
Definition main.c:138
cam_capture_layout_t
Packed VGA UYVY storage layout.
Definition main.c:117
@ k_cam_bytes_per_pixel
UYVY bytes per pixel.
Definition main.c:118
static void cam_capture_and_verdict(void)
Configure the sensor, capture one frame, and print the verdict.
Definition main.c:770
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_camera_reset(void)
Pulse the J35 camera reset input and leave the sensor released.
ra8_err_t ra8_board_camera_sccb_write_reg(void *ctx, uint8_t address, uint16_t reg, uint8_t value)
Write one 16-bit-addressed SCCB register on the J35 camera bus.
ra8_err_t ra8_board_camera_sccb_read_reg(void *ctx, uint8_t address, uint16_t reg, uint8_t *out_value)
Read one 16-bit-addressed SCCB register on the J35 camera bus.
@ k_ra8_board_camera_i2c_channel
RIIC1 serves J35 SCCB.
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_camera_xclk_start(uint32_t frequency_hz)
Start the J35 camera sensor input clock (XCLK) on P501/GTIOC12A.
ra8_err_t ra8_board_uart_console_init(uint32_t baud)
Configure SCI8 + PD02/PD03 as the debug-console UART.
ra8_err_t ra8_board_camera_route_parallel_pins(void)
Route J35 D[7:0], VSYNC, HSYNC and PCLK to the CEU peripheral.
ra8_err_t ra8_board_camera_select_parallel(void)
Drive only SW4-6 ON through U15, selecting J35 parallel DVP.
void ra8_board_camera_delay_ms(void *ctx, uint32_t milliseconds)
Millisecond delay adapter for transport-independent camera drivers.
Boot entry points shared between a vector table and its startup code.
Transport-neutral camera source and image-codec facade.
@ k_ra8_camera_format_uyvy422
Packed Cb, Y0, Cr, Y1 pixel pairs.
Definition ra8_camera.h:65
ra8_err_t ra8_camera_source_capture(ra8_camera_source_t *source, const ra8_camera_buffer_t *buffer, ra8_camera_frame_t *out_frame)
Capture one frame into a caller-owned buffer.
Definition ra8_camera.c:146
RA8 CEU capture backend for the transport-neutral camera facade.
ra8_err_t ra8_camera_source_ceu_get_last_events(const ra8_camera_source_ceu_state_t *state, uint32_t *out_events)
Read the most recent CEU event snapshot retained by the backend.
ra8_err_t ra8_camera_source_ceu_init(ra8_camera_source_t *source, ra8_camera_source_ceu_state_t *state, const ra8_camera_source_ceu_cfg_t *cfg)
Initialize the CEU and bind it as a generic camera source.
Capture Engine Unit (CEU) camera-capture driver.
@ k_ra8_ceu_input_cb0_y0_cr0_y1
Cb0 Y0 Cr0 Y1.
@ k_ra8_ceu_burst_32
32-byte bus bursts.
@ k_ra8_ceu_capture_single
CE auto-clears after CPE.
@ k_ra8_ceu_fmt_data_synchronous
Raw synchronous data fetch.
@ k_ra8_ceu_field_immediate
Capture starts at next VD.
@ k_ra8_ceu_pol_high_active
Sync signal is active high.
@ k_ra8_ceu_bus_8_bit
VIO_D[7:0] used.
@ k_ra8_ceu_edge_rising
Sample on rising VIO_CLK edge.
@ k_ra8_ceu_output_ycbcr_422
Pass-through (no conversion).
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
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_RANGE(value, min, max, errcode)
Reject out-of-range value, returning errcode.
Definition ra8_check.h:292
#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
Full-featured General PWM Timer (GPT) driver.
ra8_err_t ra8_gpt_read(uint8_t channel, uint32_t *out)
Read the current counter value.
Definition ra8_gpt.c:314
I2C Bus Interface (IIC) controller driver – polling mode.
ra8_err_t ra8_i2c_scan(uint8_t channel, uint8_t peripheral_7b, bool *out_acked)
Probe whether a 7-bit peripheral address ACKs.
Definition ra8_i2c.c:762
ra8_err_t ra8_i2c_transfer(uint8_t channel, uint8_t peripheral_7b, const uint8_t *wr, uint32_t wr_len, uint8_t *rd, uint32_t rd_len)
Combined write-then-RESTART-then-read in one bus transaction.
Definition ra8_i2c.c:726
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_init(void)
Re-establish the ra8_mstp ref-count table from current hardware state.
Definition ra8_mstp.c:291
Transport-independent OmniVision OV5640 sensor driver.
ra8_err_t ra8_ov5640_configure(ra8_ov5640_t *dev, ra8_ov5640_mode_t mode)
Software-reset and program one validated output mode.
Definition ra8_ov5640.c:801
ra8_err_t ra8_ov5640_probe(ra8_ov5640_t *dev, uint16_t *out_id)
Probe both legal SCCB addresses and verify chip ID 0x5640.
Definition ra8_ov5640.c:612
@ k_ra8_ov5640_mode_vga_uyvy
Packed VGA UYVY DVP stream.
Definition ra8_ov5640.h:41
ra8_err_t ra8_ov5640_init(ra8_ov5640_t *dev, const ra8_ov5640_bus_t *bus)
Bind a caller-supplied SCCB transport without touching the sensor.
Definition ra8_ov5640.c:484
High-level GPIO helpers on top of the PORT + PFS register layer.
External SDRAM controller driver (framework).
ra8_err_t ra8_sdramc_init(void)
Initialise the external SDRAM at k_ra8_sdram_base_addr.
Definition ra8_sdramc.c:257
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
Snapshot of DVP sync activity observed through GPIO input samples.
Definition cam_ceu.h:26
uint32_t vsync_edges
Observed VIO_VD transitions.
Definition cam_ceu.h:27
uint32_t hsync_edges
Observed VIO_HD transitions.
Definition cam_ceu.h:28
uint32_t measured_lines
Completed HREF pulses measured in PCLK edges.
Definition cam_ceu.h:39
uint8_t data_and
AND reduction of sampled VIO_D[7:0].
Definition cam_ceu.h:46
uint32_t hsync_high_cycles_min
Shortest high run, CPU cycles.
Definition cam_ceu.h:33
uint32_t hsync_low_min
Shortest observed low run, samples.
Definition cam_ceu.h:31
uint32_t line_pclk_long
HREF pulses exceeding 1024 sampled PCLK rises.
Definition cam_ceu.h:43
uint8_t data_min
Minimum sampled VIO_D[7:0] value.
Definition cam_ceu.h:44
uint32_t pclk_edges
Observed VIO_CLK transitions.
Definition cam_ceu.h:35
uint32_t pclk_half_cycles_min
Shortest observed VIO_CLK half-period.
Definition cam_ceu.h:36
uint32_t hsync_high_max
Longest observed high run, samples.
Definition cam_ceu.h:30
uint8_t data_or
OR reduction of sampled VIO_D[7:0].
Definition cam_ceu.h:47
uint32_t line_pclk_mean
Mean PCLK rises inside measured HREF pulses.
Definition cam_ceu.h:42
uint32_t line_pclk_max
Maximum PCLK rises inside one HREF pulse.
Definition cam_ceu.h:41
uint32_t line_pclk_min
Minimum PCLK rises inside one HREF pulse.
Definition cam_ceu.h:40
uint32_t data_samples
Data bytes sampled on active-line PCLK rises.
Definition cam_ceu.h:37
uint8_t data_max
Maximum sampled VIO_D[7:0] value.
Definition cam_ceu.h:45
uint32_t hsync_high_min
Shortest observed high run, samples.
Definition cam_ceu.h:29
uint32_t data_changes
Changes between consecutive sampled bytes.
Definition cam_ceu.h:38
uint32_t hsync_low_max
Longest observed low run, samples.
Definition cam_ceu.h:32
uint32_t hsync_high_cycles_max
Longest high run, CPU cycles.
Definition cam_ceu.h:34
Caller-owned writable byte-buffer description.
Definition ra8_camera.h:80
Immutable view of one captured or encoded image.
Definition ra8_camera.h:96
ra8_camera_format_t format
Pixel or compressed-image layout.
Definition ra8_camera.h:102
const uint8_t * data
Borrowed immutable image bytes.
Definition ra8_camera.h:97
uint32_t bytes
Valid bytes beginning at data.
Definition ra8_camera.h:98
uint16_t height
Image height in pixels.
Definition ra8_camera.h:101
uint16_t width
Image width in pixels.
Definition ra8_camera.h:100
uint32_t stride_bytes
Bytes between uncompressed rows.
Definition ra8_camera.h:99
Backend configuration, including native CEU register descriptor.
Caller-owned CEU source state.
Caller-owned handle binding one source backend and its context.
Definition ra8_camera.h:131
Injected SCCB and time services.
Definition ra8_ov5640.h:60
Caller-owned sensor instance; supports multiple independent parts.
Definition ra8_ov5640.h:68