23#ifdef PC_RSA_MODMUL_HW
25#include "freertos/FreeRTOS.h"
26#include "freertos/semphr.h"
36 SemaphoreHandle_t lock;
39HalRsaCtx s_rsa = {
nullptr, portMUX_INITIALIZER_UNLOCKED};
45 const bool clocked = (PC_HW_REG(PC_RSA_CLK_REG) & PC_RSA_CLK_BIT) != 0u;
47 const bool powered = (PC_HW_REG(PC_RSA_PD_REG) & PC_RSA_PD_DOWN_BIT) == 0u;
48 return clocked && powered;
60 uint32_t v = PC_HW_REG(PC_RSA_CLK_REG);
62 PC_HW_REG(PC_RSA_CLK_REG) = v;
64 v = PC_HW_REG(PC_RSA_RST_REG);
66 PC_HW_REG(PC_RSA_RST_REG) = v;
67 v = PC_HW_REG(PC_RSA_RST_REG);
69 PC_HW_REG(PC_RSA_RST_REG) = v;
71 v = PC_HW_REG(PC_RSA_HOLD_REG);
72 v &= ~PC_RSA_HOLD_CLEAR;
73 PC_HW_REG(PC_RSA_HOLD_REG) = v;
75#ifdef PC_RSA_HOLD2_REG
76 v = PC_HW_REG(PC_RSA_HOLD2_REG);
77 v &= ~PC_RSA_HOLD2_CLEAR;
78 PC_HW_REG(PC_RSA_HOLD2_REG) = v;
82 v = PC_HW_REG(PC_RSA_PD_REG);
83 v &= ~PC_RSA_PD_UP_CLEAR;
84 PC_HW_REG(PC_RSA_PD_REG) = v;
87 while (PC_HW_REG(PC_RSA_CLEAN) != 0u)
93void pc_rsa_hw_acquire(
void)
95 if (s_rsa.lock ==
nullptr)
97 portENTER_CRITICAL(&s_rsa.hw_mux);
98 if (s_rsa.lock ==
nullptr)
100 s_rsa.lock = xSemaphoreCreateRecursiveMutex();
102 portEXIT_CRITICAL(&s_rsa.hw_mux);
104 xSemaphoreTakeRecursive(s_rsa.lock, portMAX_DELAY);
110 portENTER_CRITICAL(&s_rsa.hw_mux);
112 portEXIT_CRITICAL(&s_rsa.hw_mux);
114 PC_HW_REG(PC_RSA_INTENA) = 0u;
117void pc_rsa_hw_release(
void)
122 xSemaphoreGiveRecursive(s_rsa.lock);
Single owner of the ESP32 RSA/MPI accelerator, by DIRECT register access - a self-contained HAL.