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
67
68#include <stdint.h>
69
70#include "ra8_attributes.h"
71#include "ra8_board_ek_ra8d2.h"
72#include "ra8_boot_entry.h"
73#include "ra8_cgc.h"
74#include "ra8_err.h"
75#include "ra8_isr.h"
76#include "ra8_nsc_comms.h"
77#include "ra8_time.h"
78#include "ra8_usb.h"
79#include "ra8_usb_paud.h"
80
95
113
118typedef enum : int16_t {
121
137 /* sample 0 : 0x0000 L,R */ 0x00U, 0x00U, 0x00U, 0x00U,
138 /* sample 1 : 0x086FU */ 0x6FU, 0x08U, 0x6FU, 0x08U,
139 /* sample 2 : 0x10B5U */ 0xB5U, 0x10U, 0xB5U, 0x10U,
140 /* sample 3 : 0x18F8U */ 0xF8U, 0x18U, 0xF8U, 0x18U,
141 /* sample 4 : 0x2120U */ 0x20U, 0x21U, 0x20U, 0x21U,
142 /* sample 5 : 0x2924U */ 0x24U, 0x29U, 0x24U, 0x29U,
143 /* sample 6 : 0x30FBU */ 0xFBU, 0x30U, 0xFBU, 0x30U,
144 /* sample 7 : 0x389DU */ 0x9DU, 0x38U, 0x9DU, 0x38U,
145 /* sample 8 : 0x3FFFU */ 0xFFU, 0x3FU, 0xFFU, 0x3FU,
146 /* sample 9 : 0x471CU */ 0x1CU, 0x47U, 0x1CU, 0x47U,
147 /* sample 10 : 0x4DECU */ 0xECU, 0x4DU, 0xECU, 0x4DU,
148 /* sample 11 : 0x5468U */ 0x68U, 0x54U, 0x68U, 0x54U,
149 /* sample 12 : 0x4000U */ 0x00U, 0x40U, 0x00U, 0x40U,
150 /* sample 13 : 0x5468U */ 0x68U, 0x54U, 0x68U, 0x54U,
151 /* sample 14 : 0x4DECU */ 0xECU, 0x4DU, 0xECU, 0x4DU,
152 /* sample 15 : 0x471CU */ 0x1CU, 0x47U, 0x1CU, 0x47U,
153 /* sample 16 : 0x3FFFU */ 0xFFU, 0x3FU, 0xFFU, 0x3FU,
154 /* sample 17 : 0x389DU */ 0x9DU, 0x38U, 0x9DU, 0x38U,
155 /* sample 18 : 0x30FBU */ 0xFBU, 0x30U, 0xFBU, 0x30U,
156 /* sample 19 : 0x2924U */ 0x24U, 0x29U, 0x24U, 0x29U,
157 /* sample 20 : 0x2120U */ 0x20U, 0x21U, 0x20U, 0x21U,
158 /* sample 21 : 0x18F8U */ 0xF8U, 0x18U, 0xF8U, 0x18U,
159 /* sample 22 : 0x10B5U */ 0xB5U, 0x10U, 0xB5U, 0x10U,
160 /* sample 23 : 0x086FU */ 0x6FU, 0x08U, 0x6FU, 0x08U,
161 /* sample 24 : 0x0000 */ 0x00U, 0x00U, 0x00U, 0x00U,
162 /* sample 25 : -0x086FU */ 0x91U, 0xF7U, 0x91U, 0xF7U,
163 /* sample 26 : -0x10B5U */ 0x4BU, 0xEFU, 0x4BU, 0xEFU,
164 /* sample 27 : -0x18F8U */ 0x08U, 0xE7U, 0x08U, 0xE7U,
165 /* sample 28 : -0x2120U */ 0xE0U, 0xDEU, 0xE0U, 0xDEU,
166 /* sample 29 : -0x2924U */ 0xDCU, 0xD6U, 0xDCU, 0xD6U,
167 /* sample 30 : -0x30FBU */ 0x05U, 0xCFU, 0x05U, 0xCFU,
168 /* sample 31 : -0x389DU */ 0x63U, 0xC7U, 0x63U, 0xC7U,
169 /* sample 32 : -0x3FFFU */ 0x01U, 0xC0U, 0x01U, 0xC0U,
170 /* sample 33 : -0x471CU */ 0xE4U, 0xB8U, 0xE4U, 0xB8U,
171 /* sample 34 : -0x4DECU */ 0x14U, 0xB2U, 0x14U, 0xB2U,
172 /* sample 35 : -0x5468U */ 0x98U, 0xABU, 0x98U, 0xABU,
173 /* sample 36 : -0x4000U */ 0x00U, 0xC0U, 0x00U, 0xC0U,
174 /* sample 37 : -0x5468U */ 0x98U, 0xABU, 0x98U, 0xABU,
175 /* sample 38 : -0x4DECU */ 0x14U, 0xB2U, 0x14U, 0xB2U,
176 /* sample 39 : -0x471CU */ 0xE4U, 0xB8U, 0xE4U, 0xB8U,
177 /* sample 40 : -0x3FFFU */ 0x01U, 0xC0U, 0x01U, 0xC0U,
178 /* sample 41 : -0x389DU */ 0x63U, 0xC7U, 0x63U, 0xC7U,
179 /* sample 42 : -0x30FBU */ 0x05U, 0xCFU, 0x05U, 0xCFU,
180 /* sample 43 : -0x2924U */ 0xDCU, 0xD6U, 0xDCU, 0xD6U,
181 /* sample 44 : -0x2120U */ 0xE0U, 0xDEU, 0xE0U, 0xDEU,
182 /* sample 45 : -0x18F8U */ 0x08U, 0xE7U, 0x08U, 0xE7U,
183 /* sample 46 : -0x10B5U */ 0x4BU, 0xEFU, 0x4BU, 0xEFU,
184 /* sample 47 : -0x086FU */ 0x91U, 0xF7U, 0x91U, 0xF7U,
185};
186
203{
204 while (1) {
205 __asm__ volatile("wfi");
206 }
207}
208
227RA8_INTERNAL static void internal_usb_audio_log(const char* s)
228{
229 if (s == nullptr) {
230 return;
231 }
232 uint32_t len = 0U;
233 while (s[len] != '\0') {
234 len++;
235 }
236 (void)ra8_board_uart_console_write((const uint8_t*)s, (size_t)len);
237}
238
259RA8_INTERNAL static void internal_usb_audio_u32_to_ascii(uint32_t value, char* buf, uint32_t cap)
260{
261 enum : uint32_t {
262 k_dec_radix = 10U,
263 k_max_digits = 10U,
264 };
265 if (buf == nullptr || cap == 0U) {
266 return;
267 }
268 char tmp[k_max_digits + 1U];
269 uint32_t n = 0U;
270 if (value == 0U) {
271 tmp[n] = '0';
272 n++;
273 } else {
274 while (value > 0U && n < k_max_digits) {
275 const uint32_t digit = value % k_dec_radix;
276 tmp[n] = (char)('0' + (char)digit);
277 value /= k_dec_radix;
278 n++;
279 }
280 }
281 uint32_t out = 0U;
282 while (n > 0U && out < (cap - 1U)) {
283 n--;
284 buf[out] = tmp[n];
285 out++;
286 }
287 buf[out] = '\0';
288}
289
322
367
387{
388 uint32_t cpuclk0_hz = 0U;
389
393 }
395}
396
422
440RA8_INTERNAL static void internal_usb_audio_log_frames(uint32_t frames)
441{
442 enum : uint32_t {
443 k_log_buf_bytes = 16U,
444 };
445 char buf[k_log_buf_bytes] = {};
446 internal_usb_audio_u32_to_ascii(frames, buf, k_log_buf_bytes);
447 internal_usb_audio_log("audio: ");
449 internal_usb_audio_log(" frames sent\r\n");
451}
452
464void main(void)
465{
468 internal_usb_audio_log("ra8d2: USB Audio device ready (UAC1 48 kHz / 16-bit / stereo)\r\n");
469
470 uint32_t frames = 0U;
471 while (1) {
473 break;
474 }
475 frames++;
476 if ((frames % k_usb_audio_log_period) == 0U) {
478 }
480 }
481
483}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static const uint8_t s_usb_audio_sine_lut[k_usb_audio_lut_bytes]
1 kHz sine LUT, 48 stereo 16-bit samples per cycle.
Definition main.c:136
static void internal_usb_audio_clocks_or_halt(uint32_t *cpuclk0_hz)
Bring up clocks, time, GPIO.
Definition main.c:307
usb_audio_config_t
Numeric configuration constants for the demo.
Definition main.c:90
@ k_usb_audio_baud
J-Link OB CDC log baud.
Definition main.c:91
@ k_usb_audio_idle_step_ms
USB-FS frame period.
Definition main.c:93
@ k_usb_audio_log_period
Frames per SCI8 log line.
Definition main.c:92
static void internal_usb_audio_usb_or_halt(void)
Bring up USB-FS pin mux + UAC1 class layer + format/volume shadows.
Definition main.c:343
static ra8_err_t internal_usb_audio_send_one_frame(void)
Push one iso frame (1 ms = 48 stereo samples) on PIPE1.
Definition main.c:418
static void internal_usb_audio_panic_halt(void)
Park the CPU forever in WFI on fatal init failure.
Definition main.c:202
static void internal_usb_audio_log(const char *s)
Send a NUL-terminated ASCII line over SCI8 (best-effort).
Definition main.c:227
static void internal_usb_audio_log_frames(uint32_t frames)
Emit one log line announcing the running frame count.
Definition main.c:440
static void internal_usb_audio_u32_to_ascii(uint32_t value, char *buf, uint32_t cap)
Convert a uint32_t to ASCII decimal in caller-supplied buffer.
Definition main.c:259
usb_audio_volume_t
Q8.8-format volume constant (USB Audio 1.0 sec 5.2.2.4.3.2).
Definition main.c:118
@ k_usb_audio_volume_0_db
0 dB attenuation, full scale.
Definition main.c:119
usb_audio_format_t
Audio format constants used to seed the format shadow.
Definition main.c:106
@ k_usb_audio_sample_rate_hz
Sample rate (Hz).
Definition main.c:107
@ k_usb_audio_channels
Stereo.
Definition main.c:108
@ k_usb_audio_lut_samples
48 stereo samples per frame.
Definition main.c:110
@ k_usb_audio_lut_bytes
48 samples * 2 ch * 2 bytes = 192 B.
Definition main.c:111
@ k_usb_audio_bytes_per_samp
16-bit.
Definition main.c:109
static void internal_usb_audio_setup_or_halt(void)
Bring up CGC + SysTick + GPIO + SCI8 + USB-FS + UAC1.
Definition main.c:386
@ k_dec_radix
Base-10 radix for the digit extraction.
Definition main.c:111
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
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_led1
LED1, BLUE, P600 (jumper E27).
ra8_err_t ra8_board_usbhs_device_init(void)
Bring the chip USBHS module up in device mode (HS PHY).
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
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
NSC veneers for the communications drivers.
ra8_err_t ra8_nsc_usb_attach(ra8_usb_speed_t speed, bool attached)
NSC veneer: raise / drop USB D+ pull-up.
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
Native USB controller driver public API (device + host modes).
@ k_ra8_usb_speed_fs
Full-Speed controller (USBFS @ 0x40250000).
Native USB device-side Audio (UAC) class layer.
ra8_err_t ra8_usb_paud_set_volume(int16_t volume_q8_8)
Apply a SET_CUR(volume) shadow update on the feature unit.
ra8_err_t ra8_usb_paud_set_format(ra8_usb_paud_format_t format)
Apply a SET_CUR(sampling-frequency) shadow update.
ra8_err_t ra8_usb_paud_send_frame(const uint8_t *frame, uint16_t len)
Push a captured audio frame on the iso-IN endpoint.
ra8_err_t ra8_usb_paud_init(ra8_usb_speed_t speed)
Bring up the device-Audio function on a chosen USB controller.
Current iso stream format negotiated with the host.