HPM SDK
HPMicro Software Development Kit
hpm_romapi.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2023 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_ROMAPI_H
9 #define HPM_ROMAPI_H
10 
17 #include "hpm_common.h"
18 #include "hpm_otp_drv.h"
19 #include "hpm_romapi_xpi_def.h"
20 #include "hpm_romapi_xpi_soc_def.h"
21 #include "hpm_romapi_xpi_nor_def.h"
22 #include "hpm_romapi_xpi_ram_def.h"
23 #include "hpm_soc_feature.h"
24 
25 /* XPI0 base address */
26 #define HPM_XPI0_BASE (0xF3000000UL)
27 /* XPI0 base pointer */
28 #define HPM_XPI0 ((XPI_Type *) HPM_XPI0_BASE)
31 /***********************************************************************************************************************
32  *
33  *
34  * Definitions
35  *
36  *
37  **********************************************************************************************************************/
41 typedef union {
42  uint32_t U;
43  struct {
44  uint32_t index: 8;
45  uint32_t peripheral: 8;
46  uint32_t src: 8;
47  uint32_t tag: 8;
48  };
50 
51 /*EXiP Region Parameter */
52 typedef struct {
53  uint32_t start;
54  uint32_t len;
55  uint8_t key[16];
56  uint8_t ctr[8];
58 
59 typedef struct {
60  uint32_t region_start;
61  uint32_t region_end;
62  uint8_t aes_key[16];
63  uint8_t nonce[8];
64  uint8_t index;
65  bool enable;
66  bool valid;
67  bool lock;
69 
70 #define API_BOOT_TAG (0xEBU)
71 #define API_BOOT_SRC_OTP (0U)
72 #define API_BOOT_SRC_PRIMARY (1U)
73 #define API_BOOT_SRC_SERIAL_BOOT (2U)
74 #define API_BOOT_SRC_ISP (3U)
75 #define API_BOOT_PERIPH_AUTO (0U)
76 #define API_BOOT_PERIPH_UART (1U)
77 #define API_BOOT_PERIPH_USBHID (2U)
82 typedef struct {
84  uint32_t version;
86  void (*init)(void);
88  void (*deinit)(void);
90  uint32_t (*read_from_shadow)(uint32_t addr);
92  uint32_t (*read_from_ip)(uint32_t addr);
94  hpm_stat_t (*program)(uint32_t addr, const uint32_t *src, uint32_t num_of_words);
96  hpm_stat_t (*reload)(otp_region_t region);
98  hpm_stat_t (*lock)(uint32_t addr, otp_lock_option_t lock_option);
100  hpm_stat_t (*lock_shadow)(uint32_t addr, otp_lock_option_t lock_option);
102  hpm_stat_t (*set_configurable_region)(uint32_t start, uint32_t num_of_words);
104  hpm_stat_t (*write_shadow_register)(uint32_t addr, uint32_t data);
106 
110 typedef struct {
111  uint32_t version;
112  hpm_stat_t (*enable)(XPI_Type *base);
113  hpm_stat_t (*disable)(XPI_Type *base);
114  hpm_stat_t (*lock_reg_access)(XPI_Type *base);
115  hpm_stat_t (*configure_region)(XPI_Type *base, const exip_region_context_t *ctx);
116 
117  bool (*remap_config)(XPI_Type *base, uint32_t start, uint32_t len, uint32_t offset);
118  bool (*remap_enabled)(XPI_Type *base);
119  void (*remap_disable)(XPI_Type *base);
120  bool (*exip_region_config)(XPI_Type *base, uint32_t index, exip_region_param_t *param);
121  void (*exip_region_disable)(XPI_Type *base, uint32_t index);
123 
127 typedef struct {
129  const uint32_t version;
131  const char *copyright;
133  hpm_stat_t (*run_bootloader)(void *arg);
141  const uint32_t reserved0;
142  const uint32_t reserved[4];
144  const uint32_t family_id;
146 
148 #define ROM_API_TABLE_ROOT ((const bootloader_api_table_t *)0x2001FF00U)
149 
150 
151 #ifdef __cplusplus
152 extern "C" {
153 #endif
154 
155 /***********************************************************************************************************************
156  *
157  *
158  * Enter bootloader Wrapper
159  *
160  *
161  **********************************************************************************************************************/
162 
168 static inline hpm_stat_t rom_enter_bootloader(void *ctx)
169 {
170  return ROM_API_TABLE_ROOT->run_bootloader(ctx);
171 }
172 
173 /***********************************************************************************************************************
174  *
175  *
176  * XPI NOR Driver Wrapper
177  *
178  *
179  **********************************************************************************************************************/
180 
189  xpi_nor_config_t *nor_cfg,
190  xpi_nor_config_option_t *cfg_option)
191 {
192  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_config(base, nor_cfg, cfg_option);
193 }
194 
201 static inline hpm_stat_t rom_xpi_nor_init(XPI_Type *base, xpi_nor_config_t *nor_config)
202 {
203  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->init(base, nor_config);
204 }
205 
216  xpi_xfer_channel_t channel,
217  const xpi_nor_config_t *nor_config,
218  uint32_t start,
219  uint32_t length)
220 {
221  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase(base, channel, nor_config, start, length);
222  fencei();
223  return status;
224 }
225 
235  xpi_xfer_channel_t channel,
236  const xpi_nor_config_t *nor_config,
237  uint32_t start)
238 {
239  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_sector(base, channel, nor_config, start);
240  fencei();
241  return status;
242 }
243 
253  xpi_xfer_channel_t channel,
254  const xpi_nor_config_t *nor_config,
255  uint32_t start)
256 {
257  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_sector_nonblocking(base, channel, nor_config, start);
258 }
259 
269  xpi_xfer_channel_t channel,
270  const xpi_nor_config_t *nor_config,
271  uint32_t start)
272 {
273  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_block(base, channel, nor_config, start);
274  fencei();
275  return status;
276 }
277 
287  xpi_xfer_channel_t channel,
288  const xpi_nor_config_t *nor_config,
289  uint32_t start)
290 {
291  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_block_nonblocking(base, channel, nor_config, start);
292 }
293 
302  xpi_xfer_channel_t channel,
303  const xpi_nor_config_t *nor_config)
304 {
305  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_chip(base, channel, nor_config);
306 }
307 
316  xpi_xfer_channel_t channel,
317  const xpi_nor_config_t *nor_config)
318 {
319  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_chip_nonblocking(base, channel, nor_config);
320  fencei();
321  return status;
322 }
323 
335  xpi_xfer_channel_t channel,
336  const xpi_nor_config_t *nor_config,
337  const uint32_t *src,
338  uint32_t dst_addr,
339  uint32_t length)
340 {
341  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->program(base, channel, nor_config, src, dst_addr, length);
342  fencei();
343  return status;
344 }
345 
357  xpi_xfer_channel_t channel,
358  const xpi_nor_config_t *nor_config,
359  const uint32_t *src,
360  uint32_t dst_addr,
361  uint32_t length)
362 {
363  return ROM_API_TABLE_ROOT->xpi_nor_driver_if
364  ->page_program_nonblocking(base, channel, nor_config, src, dst_addr, length);
365 }
366 
378  xpi_xfer_channel_t channel,
379  const xpi_nor_config_t *nor_config,
380  uint32_t *dst,
381  uint32_t start,
382  uint32_t length)
383 {
384  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->read(base, channel, nor_config, dst, start, length);
385 }
386 
395  xpi_nor_config_t *config,
396  xpi_nor_config_option_t *cfg_option)
397 {
398  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->auto_config(base, config, cfg_option);
399 }
400 
410  xpi_nor_config_t *nor_cfg,
411  uint32_t property_id,
412  uint32_t *value)
413 {
414  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_property(base, nor_cfg, property_id, value);
415 }
416 
428  xpi_xfer_channel_t channel,
429  const xpi_nor_config_t *nor_config,
430  uint32_t addr,
431  uint16_t *out_status)
432 {
433  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_status(base, channel, nor_config, addr, out_status);
434 }
435 
445 ATTR_RAMFUNC
446 static inline bool rom_xpi_nor_remap_config(XPI_Type *base, uint32_t start, uint32_t len, uint32_t offset)
447 {
448  return ROM_API_TABLE_ROOT->exip_api_if->remap_config(base, start, len, offset);
449 }
450 
455 ATTR_RAMFUNC
456 static inline void rom_xpi_nor_remap_disable(XPI_Type *base)
457 {
458  ROM_API_TABLE_ROOT->exip_api_if->remap_disable(base);
459  fencei();
460 }
461 
469 ATTR_RAMFUNC
470 static inline bool rom_xpi_nor_is_remap_enabled(XPI_Type *base)
471 {
472  return ROM_API_TABLE_ROOT->exip_api_if->remap_enabled(base);
473 }
474 
483 ATTR_RAMFUNC
484 static inline bool rom_xpi_nor_exip_region_config(XPI_Type *base, uint32_t index, exip_region_param_t *param)
485 {
486  bool result = ROM_API_TABLE_ROOT->exip_api_if->exip_region_config(base, index, param);
487  ROM_API_TABLE_ROOT->xpi_driver_if->software_reset(base);
488  fencei();
489  return result;
490 }
491 
497 ATTR_RAMFUNC
498 static inline void rom_xpi_nor_exip_region_disable(XPI_Type *base, uint32_t index)
499 {
500  ROM_API_TABLE_ROOT->exip_api_if->exip_region_disable(base, index);
501  fencei();
502 }
503 
508 ATTR_RAMFUNC
509 static inline void rom_xpi_nor_exip_enable(XPI_Type *base)
510 {
511  ROM_API_TABLE_ROOT->exip_api_if->enable(base);
512  fencei();
513 }
514 
519 ATTR_RAMFUNC
520 static inline void rom_xpi_nor_exip_disable(XPI_Type *base)
521 {
522  ROM_API_TABLE_ROOT->exip_api_if->disable(base);
523  fencei();
524 }
525 
526 #ifdef __cplusplus
527 }
528 #endif
529 
535 #endif /* HPM_ROMAPI_H */
static void init(hpm_panel_t *panel)
Definition: cc10128007.c:86
uint32_t hpm_stat_t
Definition: hpm_common.h:126
otp_region_t
OTP region definitions.
Definition: hpm_otp_drv.h:24
otp_lock_option_t
OTP lock options.
Definition: hpm_otp_drv.h:34
static hpm_stat_t rom_xpi_nor_auto_config(XPI_Type *base, xpi_nor_config_t *config, xpi_nor_config_option_t *cfg_option)
Automatically configure XPI NOR based on cfg_option.
Definition: hpm_romapi.h:394
static hpm_stat_t rom_xpi_nor_init(XPI_Type *base, xpi_nor_config_t *nor_config)
Initialize XPI NOR based on nor_config.
Definition: hpm_romapi.h:201
static hpm_stat_t rom_xpi_nor_read(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t *dst, uint32_t start, uint32_t length)
Read data from specified FLASH address.
Definition: hpm_romapi.h:377
static hpm_stat_t rom_xpi_nor_erase_chip_nonblocking(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config)
Erase the whole FLASH in non-blocking way.
Definition: hpm_romapi.h:315
static hpm_stat_t rom_xpi_nor_erase_chip(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config)
Erase the whole FLASH in blocking way.
Definition: hpm_romapi.h:301
static hpm_stat_t rom_xpi_nor_erase_block(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t start)
Erase specified FLASH blcok in blocking way.
Definition: hpm_romapi.h:268
static ATTR_RAMFUNC bool rom_xpi_nor_remap_config(XPI_Type *base, uint32_t start, uint32_t len, uint32_t offset)
Configure the XPI Address Remapping Logic.
Definition: hpm_romapi.h:446
static ATTR_RAMFUNC bool rom_xpi_nor_exip_region_config(XPI_Type *base, uint32_t index, exip_region_param_t *param)
Configure Specified EXiP Region.
Definition: hpm_romapi.h:484
static ATTR_RAMFUNC void rom_xpi_nor_exip_enable(XPI_Type *base)
Enable global EXiP logic.
Definition: hpm_romapi.h:509
#define ROM_API_TABLE_ROOT
Definition: hpm_romapi.h:148
static hpm_stat_t rom_xpi_nor_page_program_nonblocking(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, const uint32_t *src, uint32_t dst_addr, uint32_t length)
Page-Program data to specified FLASH address in non-blocking way.
Definition: hpm_romapi.h:356
static ATTR_RAMFUNC void rom_xpi_nor_exip_region_disable(XPI_Type *base, uint32_t index)
Disable EXiP Feature on specified EXiP Region.
Definition: hpm_romapi.h:498
static hpm_stat_t rom_xpi_nor_erase_sector_nonblocking(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t start)
Erase specified FLASH sector in non-blocking way.
Definition: hpm_romapi.h:252
static hpm_stat_t rom_xpi_nor_erase(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t start, uint32_t length)
Erase specified FLASH region.
Definition: hpm_romapi.h:215
static hpm_stat_t rom_enter_bootloader(void *ctx)
Eneter specified Boot mode.
Definition: hpm_romapi.h:168
static ATTR_RAMFUNC void rom_xpi_nor_remap_disable(XPI_Type *base)
Disable XPI Remapping logic.
Definition: hpm_romapi.h:456
static hpm_stat_t rom_xpi_nor_get_status(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t addr, uint16_t *out_status)
Return the status register value on XPI NOR FLASH.
Definition: hpm_romapi.h:427
static hpm_stat_t rom_xpi_nor_erase_block_nonblocking(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t start)
Erase specified FLASH blcok in non-blocking way.
Definition: hpm_romapi.h:286
static ATTR_RAMFUNC void rom_xpi_nor_exip_disable(XPI_Type *base)
Disable global EXiP logic.
Definition: hpm_romapi.h:520
static hpm_stat_t rom_xpi_nor_program(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, const uint32_t *src, uint32_t dst_addr, uint32_t length)
Program data to specified FLASH address in blocking way.
Definition: hpm_romapi.h:334
static ATTR_RAMFUNC bool rom_xpi_nor_is_remap_enabled(XPI_Type *base)
Check whether XPI Remapping is enabled.
Definition: hpm_romapi.h:470
static hpm_stat_t rom_xpi_nor_get_property(XPI_Type *base, xpi_nor_config_t *nor_cfg, uint32_t property_id, uint32_t *value)
Get XPI NOR properties.
Definition: hpm_romapi.h:409
static hpm_stat_t rom_xpi_nor_get_config(XPI_Type *base, xpi_nor_config_t *nor_cfg, xpi_nor_config_option_t *cfg_option)
Get XPI NOR configuration via cfg_option.
Definition: hpm_romapi.h:188
static hpm_stat_t rom_xpi_nor_erase_sector(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t start)
Erase specified FLASH sector in blocking way.
Definition: hpm_romapi.h:234
xpi_xfer_channel_t
XPI Transfer Channel type definitions.
Definition: hpm_romapi_xpi_def.h:53
uint32_t XPI_Type
XPI_Type definitions for.
Definition: hpm_romapi_xpi_def.h:22
#define fencei()
execute fence.i
Definition: riscv_core.h:88
Bootloader API table.
Definition: hpm_romapi.h:127
const uint32_t reserved0
Definition: hpm_romapi.h:141
const otp_driver_interface_t * otp_driver_if
Definition: hpm_romapi.h:135
const uint32_t family_id
Definition: hpm_romapi.h:144
const xpi_nor_driver_interface_t * xpi_nor_driver_if
Definition: hpm_romapi.h:139
const char * copyright
Definition: hpm_romapi.h:131
const xpi_driver_interface_t * xpi_driver_if
Definition: hpm_romapi.h:137
const exip_driver_interface_t * exip_api_if
Definition: hpm_romapi.h:143
const uint32_t version
Definition: hpm_romapi.h:129
EXIP driver interface.
Definition: hpm_romapi.h:110
uint32_t version
Definition: hpm_romapi.h:111
Definition: hpm_romapi.h:59
uint8_t index
Definition: hpm_romapi.h:64
bool valid
Definition: hpm_romapi.h:66
uint32_t region_end
Definition: hpm_romapi.h:61
uint32_t region_start
Definition: hpm_romapi.h:60
bool lock
Definition: hpm_romapi.h:67
bool enable
Definition: hpm_romapi.h:65
Definition: hpm_romapi.h:52
uint32_t len
Definition: hpm_romapi.h:54
uint32_t start
Definition: hpm_romapi.h:53
OTP driver interface.
Definition: hpm_romapi.h:82
uint32_t version
Definition: hpm_romapi.h:84
XPI driver interface.
Definition: hpm_romapi_xpi_def.h:225
XPI NOR configuration option The ROM SW can detect the FLASH configuration based on the following str...
Definition: hpm_romapi_xpi_nor_def.h:136
XPI NOR configuration structure.
Definition: hpm_romapi_xpi_nor_def.h:261
XPI NOR driver interface.
Definition: hpm_romapi_xpi_nor_def.h:308
Enter Bootloader API argument.
Definition: hpm_romapi.h:41
uint32_t peripheral
Definition: hpm_romapi.h:45
uint32_t src
Definition: hpm_romapi.h:46
uint32_t tag
Definition: hpm_romapi.h:47
uint32_t index
Definition: hpm_romapi.h:44
uint32_t U
Definition: hpm_romapi.h:42