ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_cgc_regs.h
Go to the documentation of this file.
1
31
32#pragma once
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38#include <stdint.h>
39
40/* =============================================================================
41 * SCKDIVCR (System Clock Division Control Register) bit fields
42 * =============================================================================
43 *
44 * SCKDIVCR is 32 bits wide. Each nibble selects a divider for one of
45 * the clock domains. The divider code-to-ratio map below comes from
46 * HUM section 10.2.2.
47 */
48
63
82
83/* =============================================================================
84 * SCKDIVCR2 bit fields (CPU clocks + MRAM clock)
85 * =============================================================================
86 */
87
98
99/* =============================================================================
100 * SCKSCR (System Clock Source Control Register)
101 * =============================================================================
102 */
103
117
118/* =============================================================================
119 * PLLCCR (PLL1 Clock Control Register) -- RA8D2 layout
120 * =============================================================================
121 *
122 * Cited from FSP CMSIS device header `R7KA8D2KF_core0.h` and
123 * FSP `bsp_clocks.c`:
124 * - PLIDIV [1:0] -- input divider code
125 * (0=/1, 1=/2, 2=/3, 3=/4, ... ratio = code+1 for /1../6)
126 * - PLSRCSEL [4] -- PLL input source (0 = Main / XTAL, 1 = HOCO)
127 * - PLLMULNF [7:6] -- fractional multiplier in 0.25 steps
128 * - PLLMUL [16:8] -- integer multiplier (9 bits, 1..511)
129 *
130 * Composite multiplier = PLLMUL + (PLLMULNF / 4). FSP packs the value
131 * as `(integer_mul * 4 + fraction_quarters) << 6`, which puts the
132 * integer part in [16:8] and the fraction in [7:6] simultaneously.
133 *
134 * For the EK-RA8D2 quickstart target (XTAL=24 MHz, /3 in, x250.00,
135 * P=/2, Q=/6, R=/5): PLLCCR = 0xFA02.
136 */
137
147
152typedef enum : uint32_t {
156
165typedef enum : uint8_t {
170
175typedef enum : uint8_t {
179
180/* =============================================================================
181 * PLLCCR2 (PLL1 Output Divider Register) -- RA8D2 layout
182 * =============================================================================
183 *
184 * Cited from FSP CMSIS device header `R7KA8D2KF_core0.h` and
185 * FSP `bsp_clocks.c`:
186 * - PLODIVP [3:0] -- PLL1P output divider code
187 * - PLODIVQ [7:4] -- PLL1Q output divider code
188 * - PLODIVR [11:8] -- PLL1R output divider code
189 *
190 * Code-to-ratio map matches FSP `BSP_CLOCKS_PLL_DIV_*`:
191 * /1=0, /2=1, /3=2, /4=3, /5=4, /6=5, /8=7, /9=8, /16=15.
192 * For ratios 1..6 the code is `ratio - 1`; /7 is not supported.
193 *
194 * Quickstart EK-RA8D2: P=/2 (1), Q=/6 (5), R=/5 (4) -> PLLCCR2 = 0x451.
195 */
196
206
233
234/* =============================================================================
235 * PLL2CCR / PLL2CR / PLL2CCR2 -- PLL2 register encodings
236 * =============================================================================
237 *
238 * PLL2 has the same field layout as PLL1 except the multiplier is 8 bits
239 * (vs 9 for PLL1) and the register width is 16 bits (vs 32). The shifts
240 * and the (mul*4 + quarters) packing trick are identical, so we reuse
241 * `k_ra8_pllccr_shift_*`, `k_ra8_plidiv_*`, `k_ra8_plsrcsel_*` and
242 * `k_ra8_plodiv_*` from above and only add what is unique to PLL2:
243 *
244 * - PLL2CR.PLL2STP at bit 0 (write 1 = stop, 0 = run).
245 * - PLL2MUL is 8 bits (1..255), still encoded as `mul * 4 + quarters`
246 * shifted by 6 so the integer part falls in [15:8] and the fraction
247 * in [7:6].
248 *
249 * Cross-reference: FSP CMSIS device header (RA8 Gen2 family)
250 * `R_SYSTEM_PLL2CR_PLL2STP_Pos`, `R_SYSTEM_PLL2CCR_PL2IDIV_Pos`,
251 * `R_SYSTEM_PLL2CCR_PL2SRCSEL_Pos`, `R_SYSTEM_PLL2CCR_PLL2MUL_Pos`,
252 * `R_SYSTEM_PLL2CCR2_PL2ODIVP_Pos` etc.
253 */
254
259typedef enum : uint8_t {
263
272typedef enum : uint32_t {
276
277/* =============================================================================
278 * HOCOCR / MOSCWTCR bit fields
279 * =============================================================================
280 */
281
286typedef enum : uint8_t {
289
299typedef enum : uint8_t {
302
303#ifdef __cplusplus
304}
305#endif
ra8_clock_div_t
Divider codes written into SCKDIVCR nibbles.
@ k_ra8_clock_div_1
Divide by 1.
@ k_ra8_clock_div_2
Divide by 2.
@ k_ra8_clock_div_64
Divide by 64.
@ k_ra8_clock_div_8
Divide by 8.
@ k_ra8_clock_div_4
Divide by 4.
@ k_ra8_clock_div_16
Divide by 16.
@ k_ra8_clock_div_32
Divide by 32.
ra8_pll2cr_val_t
Discrete values written to the 8-bit PLL2CR register.
@ k_ra8_pll2cr_run
Clear PLL2STP -> PLL2 runs.
@ k_ra8_pll2cr_stop
Set PLL2STP -> PLL2 stops.
ra8_pll2ccr_mask_t
Field masks (post-shift) inside PLL2CCR.
@ k_ra8_pll2ccr_mask_quarters
11-bit (mul*4) field.
@ k_ra8_pll2ccr_mask_plidiv
PL2IDIV 2-bit field.
ra8_sckdivcr_shift_t
Bit shifts for the divider nibbles in SCKDIVCR.
@ k_ra8_sckdivcr_pckd_shift
PCLKD divider nibble @ [3:0].
@ k_ra8_sckdivcr_pcke_shift
PCLKE divider nibble @ [23:20].
@ k_ra8_sckdivcr_pcka_shift
PCLKA divider nibble @ [15:12].
@ k_ra8_sckdivcr_ick_shift
ICLK divider nibble @ [27:24].
@ k_ra8_sckdivcr_bck_shift
BCLK divider nibble @ [19:16].
@ k_ra8_sckdivcr_fck_shift
FCLK divider nibble @ [31:28].
@ k_ra8_sckdivcr_pckb_shift
PCLKB divider nibble @ [11:8].
@ k_ra8_sckdivcr_pckc_shift
PCLKC divider nibble @ [7:4].
ra8_pllccr_mask_t
Bitfield masks (post-shift) inside PLLCCR.
@ k_ra8_pllccr_mask_quarters
11-bit (mul*4) field.
@ k_ra8_pllccr_mask_plidiv
PLIDIV 2-bit field.
ra8_moscwtcr_val_t
Values written to MOSCWTCR to control main-osc wait cycles.
@ k_ra8_moscwtcr_2_to_16_cycles
RA8 moscwtcr 2 to 16 cycles.
ra8_plidiv_t
PLL input divider codes for PLIDIV[1:0] in PLLCCR.
@ k_ra8_plidiv_div2
PLL input divide by 2.
@ k_ra8_plidiv_div3
PLL input divide by 3.
@ k_ra8_plidiv_div1
PLL input divide by 1.
ra8_plodiv_t
PLL output divider codes for PLODIVP/Q/R fields in PLLCCR2.
@ k_ra8_plodiv_div2
PLL output divide by 2.
@ k_ra8_plodiv_div5
PLL output divide by 5.
@ k_ra8_plodiv_div3
PLL output divide by 3.
@ k_ra8_plodiv_div6
PLL output divide by 6.
@ k_ra8_plodiv_div8
PLL output divide by 8.
@ k_ra8_plodiv_div16
PLL output divide by 16.
@ k_ra8_plodiv_div4
PLL output divide by 4.
@ k_ra8_plodiv_div9
PLL output divide by 9.
ra8_pllccr2_shift_t
Field shifts inside the 16-bit PLLCCR2.
@ k_ra8_pllccr2_shift_plodivp
PLODIVP field starts at bit 0.
@ k_ra8_pllccr2_shift_plodivr
PLODIVR field starts at bit 8.
@ k_ra8_pllccr2_shift_plodivq
PLODIVQ field starts at bit 4.
ra8_sckdivcr2_shift_t
Bit shifts for the divider nibbles in SCKDIVCR2.
@ k_ra8_sckdivcr2_cpuclk0_shift
CPUCLK0 (M85) divider @ [3:0].
@ k_ra8_sckdivcr2_mriclk_shift
MRAM bus clk divider @ [15:12].
@ k_ra8_sckdivcr2_cpuclk1_shift
CPUCLK1 (M33) divider @ [7:4].
@ k_ra8_sckdivcr2_npuclk_shift
NPUCLK divider @ [11:8].
ra8_pllccr_shift_t
Field shifts inside the 32-bit PLLCCR.
@ k_ra8_pllccr_shift_plidiv
PLIDIV field starts at bit 0.
@ k_ra8_pllccr_shift_quarters
(mul * 4) goes here.
@ k_ra8_pllccr_shift_plsrcsel
PLSRCSEL field is bit 4.
ra8_plsrcsel_t
PLL1 input source selection (PLLCCR.PLSRCSEL, bit 4).
@ k_ra8_plsrcsel_main
Main-oscillator input (default on EK board).
@ k_ra8_plsrcsel_hoco
HOCO input (useful for XTAL-less boards).
ra8_hococr_bit_t
Bit positions in HOCOCR.
@ k_ra8_hococr_hcstp
HCSTP: 0 operating, 1 stopped.
ra8_cksel_t
System clock source selector values written to SCKSCR.CKSEL.
@ k_ra8_cksel_subck
Sub-clock osc.
@ k_ra8_cksel_pll2
PLL2 output.
@ k_ra8_cksel_main
Main oscillator (XTAL).
@ k_ra8_cksel_hoco
High-speed on-chip oscillator.
@ k_ra8_cksel_moco
Middle-speed on-chip osc.
@ k_ra8_cksel_loco
Low-speed on-chip osc.
@ k_ra8_cksel_pll1
PLL1 output.