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 {
112  uint32_t version;
114  hpm_stat_t (*get_default_config)(xpi_config_t *xpi_config);
116  hpm_stat_t (*get_default_device_config)(xpi_device_config_t *dev_config);
118  hpm_stat_t (*init)(XPI_Type *base, xpi_config_t *xpi_config);
120  hpm_stat_t (*config_ahb_buffer)(XPI_Type *base, xpi_ahb_buffer_cfg_t *ahb_buf_cfg);
122  hpm_stat_t (*config_device)(XPI_Type *base, xpi_device_config_t *dev_cfg, xpi_channel_t channel);
124  hpm_stat_t (*update_instr_table)(XPI_Type *base, const uint32_t *inst_base, uint32_t seq_idx, uint32_t num);
126  hpm_stat_t (*transfer_blocking)(XPI_Type *base, xpi_xfer_ctx_t *xfer);
128  void (*software_reset)(XPI_Type *base);
130  bool (*is_idle)(XPI_Type *base);
132  void (*update_dllcr)(XPI_Type *base,
133  uint32_t serial_root_clk_freq,
134  uint32_t data_valid_time,
135  xpi_channel_t channel,
136  uint32_t dly_target);
139  (*get_abs_apb_xfer_addr)(XPI_Type *base, xpi_xfer_channel_t channel, uint32_t in_addr, uint32_t *out_addr);
141 
145 typedef struct {
147  uint32_t version;
149  hpm_stat_t (*get_config)(XPI_Type *base, xpi_nor_config_t *nor_cfg, xpi_nor_config_option_t *cfg_option);
151  hpm_stat_t (*init)(XPI_Type *base, xpi_nor_config_t *nor_config);
154  (*enable_write)(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t addr);
156  hpm_stat_t (*get_status)(XPI_Type *base,
157  xpi_xfer_channel_t channel,
158  const xpi_nor_config_t *nor_config,
159  uint32_t addr,
160  uint16_t *out_status);
163  (*wait_busy)(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t addr);
165  hpm_stat_t (*erase)(XPI_Type *base,
166  xpi_xfer_channel_t channel,
167  const xpi_nor_config_t *nor_config,
168  uint32_t start,
169  uint32_t length);
171  hpm_stat_t (*erase_chip)(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config);
174  (*erase_sector)(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t addr);
177  (*erase_block)(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config, uint32_t addr);
179  hpm_stat_t (*program)(XPI_Type *base,
180  xpi_xfer_channel_t channel,
181  const xpi_nor_config_t *nor_config,
182  const uint32_t *src,
183  uint32_t dst_addr,
184  uint32_t length);
187  xpi_xfer_channel_t channel,
188  const xpi_nor_config_t *nor_config,
189  uint32_t *dst,
190  uint32_t start,
191  uint32_t length);
193  hpm_stat_t (*page_program_nonblocking)(XPI_Type *base,
194  xpi_xfer_channel_t channel,
195  const xpi_nor_config_t *nor_config,
196  const uint32_t *src,
197  uint32_t dst_addr,
198  uint32_t length);
200  hpm_stat_t (*erase_sector_nonblocking)(XPI_Type *base,
201  xpi_xfer_channel_t channel,
202  const xpi_nor_config_t *nor_config,
203  uint32_t addr);
205  hpm_stat_t (*erase_block_nonblocking)(XPI_Type *base,
206  xpi_xfer_channel_t channel,
207  const xpi_nor_config_t *nor_config,
208  uint32_t addr);
211  (*erase_chip_nonblocking)(XPI_Type *base, xpi_xfer_channel_t channel, const xpi_nor_config_t *nor_config);
212 
213  uint32_t reserved0[3];
214 
216  hpm_stat_t (*auto_config)(XPI_Type *base, xpi_nor_config_t *nor_cfg, xpi_nor_config_option_t *cfg_option);
217 
219  hpm_stat_t (*get_property)(XPI_Type *base, xpi_nor_config_t *nor_cfg, uint32_t property_id, uint32_t *value);
220 
222 
226 typedef struct {
227  uint32_t version;
228  hpm_stat_t (*enable)(XPI_Type *base);
229  hpm_stat_t (*disable)(XPI_Type *base);
230  hpm_stat_t (*lock_reg_access)(XPI_Type *base);
231  hpm_stat_t (*configure_region)(XPI_Type *base, const exip_region_context_t *ctx);
232 
233  bool (*remap_config)(XPI_Type *base, uint32_t start, uint32_t len, uint32_t offset);
234  bool (*remap_enabled)(XPI_Type *base);
235  void (*remap_disable)(XPI_Type *base);
236  bool (*exip_region_config)(XPI_Type *base, uint32_t index, exip_region_param_t *param);
237  void (*exip_region_disable)(XPI_Type *base, uint32_t index);
239 
243 typedef struct {
245  const uint32_t version;
247  const char *copyright;
249  hpm_stat_t (*run_bootloader)(void *arg);
257  const uint32_t reserved0;
258  const uint32_t reserved[4];
260  const uint32_t family_id;
262 
264 #define ROM_API_TABLE_ROOT ((const bootloader_api_table_t *)0x2001FF00U)
265 
266 
267 #ifdef __cplusplus
268 extern "C" {
269 #endif
270 
271 /***********************************************************************************************************************
272  *
273  *
274  * Enter bootloader Wrapper
275  *
276  *
277  **********************************************************************************************************************/
278 
284 static inline hpm_stat_t rom_enter_bootloader(void *ctx)
285 {
286  return ROM_API_TABLE_ROOT->run_bootloader(ctx);
287 }
288 
289 /***********************************************************************************************************************
290  *
291  *
292  * XPI NOR Driver Wrapper
293  *
294  *
295  **********************************************************************************************************************/
296 
305  xpi_nor_config_t *nor_cfg,
306  xpi_nor_config_option_t *cfg_option)
307 {
308  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_config(base, nor_cfg, cfg_option);
309 }
310 
317 static inline hpm_stat_t rom_xpi_nor_init(XPI_Type *base, xpi_nor_config_t *nor_config)
318 {
319  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->init(base, nor_config);
320 }
321 
332  xpi_xfer_channel_t channel,
333  const xpi_nor_config_t *nor_config,
334  uint32_t start,
335  uint32_t length)
336 {
337  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase(base, channel, nor_config, start, length);
338  fencei();
339  return status;
340 }
341 
351  xpi_xfer_channel_t channel,
352  const xpi_nor_config_t *nor_config,
353  uint32_t start)
354 {
355  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_sector(base, channel, nor_config, start);
356  fencei();
357  return status;
358 }
359 
369  xpi_xfer_channel_t channel,
370  const xpi_nor_config_t *nor_config,
371  uint32_t start)
372 {
373  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_sector_nonblocking(base, channel, nor_config, start);
374 }
375 
385  xpi_xfer_channel_t channel,
386  const xpi_nor_config_t *nor_config,
387  uint32_t start)
388 {
389  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_block(base, channel, nor_config, start);
390  fencei();
391  return status;
392 }
393 
403  xpi_xfer_channel_t channel,
404  const xpi_nor_config_t *nor_config,
405  uint32_t start)
406 {
407  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_block_nonblocking(base, channel, nor_config, start);
408 }
409 
418  xpi_xfer_channel_t channel,
419  const xpi_nor_config_t *nor_config)
420 {
421  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_chip(base, channel, nor_config);
422 }
423 
432  xpi_xfer_channel_t channel,
433  const xpi_nor_config_t *nor_config)
434 {
435  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_chip_nonblocking(base, channel, nor_config);
436  fencei();
437  return status;
438 }
439 
451  xpi_xfer_channel_t channel,
452  const xpi_nor_config_t *nor_config,
453  const uint32_t *src,
454  uint32_t dst_addr,
455  uint32_t length)
456 {
457  hpm_stat_t status = ROM_API_TABLE_ROOT->xpi_nor_driver_if->program(base, channel, nor_config, src, dst_addr, length);
458  fencei();
459  return status;
460 }
461 
473  xpi_xfer_channel_t channel,
474  const xpi_nor_config_t *nor_config,
475  const uint32_t *src,
476  uint32_t dst_addr,
477  uint32_t length)
478 {
479  return ROM_API_TABLE_ROOT->xpi_nor_driver_if
480  ->page_program_nonblocking(base, channel, nor_config, src, dst_addr, length);
481 }
482 
494  xpi_xfer_channel_t channel,
495  const xpi_nor_config_t *nor_config,
496  uint32_t *dst,
497  uint32_t start,
498  uint32_t length)
499 {
500  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->read(base, channel, nor_config, dst, start, length);
501 }
502 
511  xpi_nor_config_t *config,
512  xpi_nor_config_option_t *cfg_option)
513 {
514  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->auto_config(base, config, cfg_option);
515 }
516 
526  xpi_nor_config_t *nor_cfg,
527  uint32_t property_id,
528  uint32_t *value)
529 {
530  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_property(base, nor_cfg, property_id, value);
531 }
532 
544  xpi_xfer_channel_t channel,
545  const xpi_nor_config_t *nor_config,
546  uint32_t addr,
547  uint16_t *out_status)
548 {
549  return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_status(base, channel, nor_config, addr, out_status);
550 }
551 
561 ATTR_RAMFUNC
562 static inline bool rom_xpi_nor_remap_config(XPI_Type *base, uint32_t start, uint32_t len, uint32_t offset)
563 {
564  return ROM_API_TABLE_ROOT->exip_api_if->remap_config(base, start, len, offset);
565 }
566 
571 ATTR_RAMFUNC
572 static inline void rom_xpi_nor_remap_disable(XPI_Type *base)
573 {
574  ROM_API_TABLE_ROOT->exip_api_if->remap_disable(base);
575  fencei();
576 }
577 
585 ATTR_RAMFUNC
586 static inline bool rom_xpi_nor_is_remap_enabled(XPI_Type *base)
587 {
588  return ROM_API_TABLE_ROOT->exip_api_if->remap_enabled(base);
589 }
590 
599 ATTR_RAMFUNC
600 static inline bool rom_xpi_nor_exip_region_config(XPI_Type *base, uint32_t index, exip_region_param_t *param)
601 {
602  bool result = ROM_API_TABLE_ROOT->exip_api_if->exip_region_config(base, index, param);
603  ROM_API_TABLE_ROOT->xpi_driver_if->software_reset(base);
604  fencei();
605  return result;
606 }
607 
613 ATTR_RAMFUNC
614 static inline void rom_xpi_nor_exip_region_disable(XPI_Type *base, uint32_t index)
615 {
616  ROM_API_TABLE_ROOT->exip_api_if->exip_region_disable(base, index);
617  fencei();
618 }
619 
624 ATTR_RAMFUNC
625 static inline void rom_xpi_nor_exip_enable(XPI_Type *base)
626 {
627  ROM_API_TABLE_ROOT->exip_api_if->enable(base);
628  fencei();
629 }
630 
635 ATTR_RAMFUNC
636 static inline void rom_xpi_nor_exip_disable(XPI_Type *base)
637 {
638  ROM_API_TABLE_ROOT->exip_api_if->disable(base);
639  fencei();
640 }
641 
642 #ifdef __cplusplus
643 }
644 #endif
645 
651 #endif /* HPM_ROMAPI_H */
static void init(hpm_panel_t *panel)
Definition: cc10128007.c:86
uint32_t hpm_stat_t
Definition: hpm_common.h:123
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:510
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:317
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:493
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:431
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:417
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:384
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:562
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:600
static ATTR_RAMFUNC void rom_xpi_nor_exip_enable(XPI_Type *base)
Enable global EXiP logic.
Definition: hpm_romapi.h:625
#define ROM_API_TABLE_ROOT
Definition: hpm_romapi.h:264
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:472
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:614
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:368
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:331
static hpm_stat_t rom_enter_bootloader(void *ctx)
Eneter specified Boot mode.
Definition: hpm_romapi.h:284
static ATTR_RAMFUNC void rom_xpi_nor_remap_disable(XPI_Type *base)
Disable XPI Remapping logic.
Definition: hpm_romapi.h:572
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:543
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:402
static ATTR_RAMFUNC void rom_xpi_nor_exip_disable(XPI_Type *base)
Disable global EXiP logic.
Definition: hpm_romapi.h:636
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:450
static ATTR_RAMFUNC bool rom_xpi_nor_is_remap_enabled(XPI_Type *base)
Check whether XPI Remapping is enabled.
Definition: hpm_romapi.h:586
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:525
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:304
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:350
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
xpi_channel_t
XPI Channel definitions.
Definition: hpm_romapi_xpi_def.h:64
static hpm_stat_t read(void *ops, hpm_serial_nor_transfer_seq_t *cmd_seq)
Definition: hpm_serial_nor_host_spi.c:309
#define fencei()
execute fence.i
Definition: riscv_core.h:88
Bootloader API table.
Definition: hpm_romapi.h:243
const uint32_t reserved0
Definition: hpm_romapi.h:257
const otp_driver_interface_t * otp_driver_if
Definition: hpm_romapi.h:251
const uint32_t family_id
Definition: hpm_romapi.h:260
const xpi_nor_driver_interface_t * xpi_nor_driver_if
Definition: hpm_romapi.h:255
const char * copyright
Definition: hpm_romapi.h:247
const xpi_driver_interface_t * xpi_driver_if
Definition: hpm_romapi.h:253
const exip_driver_interface_t * exip_api_if
Definition: hpm_romapi.h:259
const uint32_t version
Definition: hpm_romapi.h:245
EXIP driver interface.
Definition: hpm_romapi.h:226
uint32_t version
Definition: hpm_romapi.h:227
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
Definition: hpm_romapi_xpi_soc_def.h:28
XPI configuration structure.
Definition: hpm_romapi_xpi_def.h:160
XPI Device Configuration structure.
Definition: hpm_romapi_xpi_def.h:173
XPI driver interface.
Definition: hpm_romapi.h:110
uint32_t version
Definition: hpm_romapi.h:112
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.h:145
uint32_t version
Definition: hpm_romapi.h:147
XPI Xfer context.
Definition: hpm_romapi_xpi_def.h:93
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