56#include "trustzone_init.h"
86typedef enum : uintptr_t {
88#ifdef RA8_EREADER_NS_XIP
96#ifdef RA8_TRUSTZONE_ENABLE
109typedef enum : uintptr_t {
110 k_tz_sau_ctrl_addr = 0xE000EDD0U,
111 k_tz_sau_type_addr = 0xE000EDD4U,
112 k_tz_sau_rnr_addr = 0xE000EDD8U,
113 k_tz_sau_rbar_addr = 0xE000EDDCU,
114 k_tz_sau_rlar_addr = 0xE000EDE0U,
115 k_tz_sramsabar0_addr = 0x40008400U,
116 k_tz_prcr_s_addr = 0x4001E3FAU,
117 k_tz_psarb_addr = 0x40204004U,
127typedef enum : uint32_t {
128 k_tz_sau_ctrl_enable = 0x00000001U,
129 k_tz_sau_rlar_enable = 0x00000001U,
130 k_tz_sau_rlar_nsc = 0x00000002U,
131 k_tz_sau_limit_mask = 0xFFFFFFE0U,
132 k_tz_sau_type_mask = 0x000000FFU,
133 k_tz_psarb_usbfs_ns = 0x00000800U,
134 k_tz_psarb_usbhs_ns = 0x00001000U,
135 k_tz_psarb_usb_ns = 0x00001800U,
136 k_tz_psarb_readback_spins = 1000U,
151typedef enum : uint16_t {
153 k_tz_usb_pin_vbusen =
219typedef enum : uint16_t {
220 k_tz_prcr_s_open = 0xA510U,
221 k_tz_prcr_s_close = 0xA500U,
234typedef enum : uint32_t {
235 k_tz_sau_min_regions = 4U,
236 k_tz_ns_code_base = 0x10000000U,
237 k_tz_ns_code_limit = 0x1FFFFFE0U,
238 k_tz_ns_sram_base = 0x30000000U,
239 k_tz_ns_sram_limit = 0x3FFFFFE0U,
240 k_tz_ns_per_base = 0x50000000U,
241 k_tz_ns_per_limit = 0xDFFFFFE0U,
242 k_tz_sramsabar0_val = 0x00080000U,
243 k_tz_sramsabar1_val = 0x00100000U,
244 k_tz_sramsabar2_val = 0x00100000U,
245 k_tz_sramsabar3_val = 0x001A0000U,
251typedef enum : uint8_t {
252 k_tz_region_nsc = 0U,
253 k_tz_region_ns_code = 1U,
254 k_tz_region_ns_sram = 2U,
255 k_tz_region_ns_per = 3U,
273static inline void tz_write32(uintptr_t addr, uint32_t value)
277 *(
volatile uint32_t*)addr = value;
296static inline uint32_t tz_read32(uintptr_t addr)
299 return *(
volatile uint32_t*)addr;
318static void tz_sau_set_region(uint8_t region, uint32_t base, uint32_t limit,
bool is_nsc)
321 tz_write32(k_tz_sau_rnr_addr, (uint32_t)region);
322 tz_write32(k_tz_sau_rbar_addr, base & (uint32_t)k_tz_sau_limit_mask);
323 uint32_t rlar = (limit & (uint32_t)k_tz_sau_limit_mask) | (uint32_t)k_tz_sau_rlar_enable;
325 rlar |= (uint32_t)k_tz_sau_rlar_nsc;
327 tz_write32(k_tz_sau_rlar_addr, rlar);
346static void tz_sram_ns_boundary(
void)
350 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_open;
355 tz_write32(k_tz_sramsabar0_addr + (0U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar0_val);
356 tz_write32(k_tz_sramsabar0_addr + (1U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar1_val);
357 tz_write32(k_tz_sramsabar0_addr + (2U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar2_val);
358 tz_write32(k_tz_sramsabar0_addr + (3U *
sizeof(uint32_t)), (uint32_t)k_tz_sramsabar3_val);
362 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_close;
388 const uint32_t sau_type = tz_read32(k_tz_sau_type_addr);
389 if ((sau_type & (uint32_t)k_tz_sau_type_mask) < (uint32_t)k_tz_sau_min_regions) {
397 tz_sau_set_region((uint8_t)k_tz_region_nsc, nsc_base, nsc_limit,
true);
398 tz_sau_set_region((uint8_t)k_tz_region_ns_code,
399 (uint32_t)k_tz_ns_code_base,
400 (uint32_t)k_tz_ns_code_limit,
402 tz_sau_set_region((uint8_t)k_tz_region_ns_sram,
403 (uint32_t)k_tz_ns_sram_base,
404 (uint32_t)k_tz_ns_sram_limit,
406 tz_sau_set_region((uint8_t)k_tz_region_ns_per,
407 (uint32_t)k_tz_ns_per_base,
408 (uint32_t)k_tz_ns_per_limit,
411 __asm__
volatile(
"dsb 0xF" :::
"memory");
414 tz_write32(k_tz_sau_ctrl_addr, (uint32_t)k_tz_sau_ctrl_enable);
415 __asm__
volatile(
"dsb 0xF" :::
"memory");
416 __asm__
volatile(
"isb" :::
"memory");
426#ifndef RA8_EREADER_NS_XIP
444static void tz_copy_ns_image(
void)
451 for (uintptr_t off = 0U; off < (uintptr_t)
k_tz_ns_copy_size; off +=
sizeof(uint32_t)) {
452 tz_write32(run_base + off, tz_read32(load_base + off));
543static void tz_usb_mark_ns(
void)
553 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_open;
554 const uint32_t want = tz_read32(k_tz_psarb_addr) | (uint32_t)k_tz_psarb_usb_ns;
555 tz_write32(k_tz_psarb_addr, want);
557 for (uint32_t spin = 0U; spin < (uint32_t)k_tz_psarb_readback_spins; spin += 1U) {
558 seen = tz_read32(k_tz_psarb_addr);
564 *(
volatile uint16_t*)k_tz_prcr_s_addr = (uint16_t)k_tz_prcr_s_close;
588static void tz_usb_handoff_prepare(
void)
591 const ra8_err_t pins_err = tz_usb_route_pins();
613#ifdef RA8_TRUSTZONE_ENABLE
615 tz_usb_handoff_prepare();
618 tz_sram_ns_boundary();
625#ifdef RA8_EREADER_NS_XIP
646 __asm__
volatile(
"cpsie i" :::
"memory");
void ra8_trustzone_init(void)
Programme + enable the SAU per the partition.
uint32_t g_ra8_ls_sgstubs_start
Veneer-region start (NSC).
uint32_t g_ra8_ls_sgstubs_end
Veneer-region end (NSC).
tz_ns_image_t
Fixed NS-image addresses (two-project build, #96).
@ k_tz_ns_load_base
NS image LMA (Secure MRAM).
@ k_tz_ns_copy_size
Bytes copied LMA->VMA (192 KB).
@ k_tz_ns_run_base
NS image VMA (SRAM2 NS alias).
volatile uint32_t g_tz_usb_pins_err
First non-OK ra8_err_t from the USB pin + PLL setup (0 = OK).
volatile uint32_t g_tz_usb_psarb_readback
Confirmed PSARB read-back after the USBFS NS-attribution write.
volatile uint32_t g_tz_usb_expander_err
Last ra8_err_t from the U15 I/O-expander host-mode write (0 = OK).
volatile uint32_t g_tz_jump_ns_err
Denial verdict from ra8_tz_secure_boot_jump_ns (0 = never denied).
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_io_expander_set_usbhs_host_mode(void)
Drive the U15 I/O expander to select USB-HS HOST mode.
High-level Clock Generation Circuit driver.
ra8_err_t ra8_cgc_usbhs_pll_enable(void)
Bring up the USBHS PHY reference clock + module clock.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_not_supported
Requested feature not compiled in, not wired, or not supported by this MCU variant.
@ k_ra8_err_busy
Resource busy – blocking operation cannot proceed.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
PSEL codes for peripheral pin routing on the RA8D2.
@ k_ra8_psel_usb_fs
10011b: USB Full-Speed.
@ k_ra8_psel_usb_hs
10100b: USB High-Speed (e.g.
Runtime Pin-Ownership Validator.
void ra8_pin_validator_reset(void)
Reset the validator (release every pin).
Typed Port / Pin Constants for the RA8D2 IOPORT Module.
ra8_port_pin_t
Packed (port << 8) | pin pin identifier.
@ k_ra8_port_13
RA8 port 13.
@ k_ra8_port_4
RA8 port 4.
@ k_ra8_port_5
RA8 port 5.
@ k_ra8_port_8
RA8 port 8.
@ k_ra8_level_high
Drive or read 1.
@ k_ra8_level_low
Drive or read 0.
@ k_ra8_pin_14
RA8 pin 14.
@ k_ra8_pin_15
RA8 pin 15.
High-level GPIO helpers on top of the PORT + PFS register layer.
ra8_err_t ra8_gpio_output_init(ra8_port_pin_t pin, ra8_level_t init_level)
Configure a pin as a digital output and drive it to an initial level.
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.
FSP-style TrustZone secure-boot for the Cortex-M85 (CPU0).
ra8_err_t ra8_tz_secure_boot_jump_ns(const uint32_t *ns_vector_table)
Switch to NS state and jump to the NS image's reset vector.