HPM SDK
HPMicro Software Development Kit
hpm_sdxc_soc_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022-2023 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_SDXC_SOC_DRV_H
9 #define HPM_SDXC_SOC_DRV_H
10 
11 #include "hpm_soc.h"
12 #include "hpm_sdxc_regs.h"
13 
14 #if defined(__cplusplus)
15 extern "C" {
16 #endif
17 
18 
19 static inline void sdxc_enable_tm_clock(SDXC_Type *base)
20 {
22 }
23 
24 static inline void sdxc_enable_freq_selection(SDXC_Type *base)
25 {
27 }
28 
29 static inline void sdxc_disable_freq_selection(SDXC_Type *base)
30 {
32 }
33 
39 static inline void sdxc_set_clock_divider(SDXC_Type *base, uint32_t div)
40 {
41  base->MISC_CTRL0 =
44 }
45 
51 static inline uint32_t sdxc_get_clock_divider(SDXC_Type *base)
52 {
53  return (1U + SDXC_MISC_CTRL0_FREQ_SEL_SW_GET(base->MISC_CTRL0));
54 }
55 
59 static inline void sdxc_wait_card_active(SDXC_Type *base)
60 {
62 
64 
66  }
67 }
68 
74 static inline void sdxc_enable_inverse_clock(SDXC_Type *base, bool enable)
75 {
76  if (enable) {
78  } else {
80  }
81 }
82 
89 static inline bool sdxc_is_inverse_clock_enabled(SDXC_Type *base)
90 {
91  return ((base->MISC_CTRL0 & SDXC_MISC_CTRL0_CARDCLK_INV_EN_MASK) != 0U);
92 }
93 
99 static inline void sdxc_select_cardclk_delay_source(SDXC_Type *base, bool loopback_from_pad)
100 {
101  if (loopback_from_pad) {
103  } else {
105  }
106 }
107 
113 static inline void sdxc_set_cardclk_delay_chain(SDXC_Type *base, uint32_t num_delaycells)
114 {
116  SDXC_MISC_CTRL1_CARDCLK_DLYSEL_SET(num_delaycells);
117 }
118 
124 static inline void sdxc_set_data_strobe_delay(SDXC_Type *base, uint8_t num_of_delaycells)
125 {
127  SDXC_MISC_CTRL1_STROBE_DLYSEL_SET(num_of_delaycells);
128 }
129 
130 static inline uint32_t sdxc_get_default_strobe_delay(SDXC_Type *base)
131 {
132  (void) base;
133  uint32_t num_delaycells = 0;
135  num_delaycells = 2;
136  }
137  return num_delaycells;
138 }
139 
140 static inline uint32_t sdxc_get_default_cardclk_delay_chain(SDXC_Type *base, uint32_t clock_freq)
141 {
142  (void) base;
143  uint32_t num_delaycells = 3;
144  if (clock_freq <= 52000000) {
145  num_delaycells = 26;
146  }
147  return num_delaycells;
148 }
149 
150 static inline bool sdxc_is_ddr50_supported(SDXC_Type *base)
151 {
152  (void) base;
153  return true;
154 }
155 
156 
157 #if defined(__cplusplus)
158 }
159 #endif
160 
161 
162 #endif /* HPM_SDXC_SOC_DRV_H */
#define HPM_IOC
Definition: hpm_soc_ip.h:267
#define IOC_PAD_FUNC_CTL_ALT_SELECT_GET(x)
Definition: hpm_ioc_regs.h:57
#define IOC_PAD_PC00
Definition: hpm_ioc_regs.h:239
#define SDXC_MISC_CTRL0_FREQ_SEL_SW_SET(x)
Definition: hpm_sdxc_regs.h:4350
#define SDXC_MISC_CTRL0_PAD_CLK_SEL_B_MASK
Definition: hpm_sdxc_regs.h:4316
#define SDXC_MISC_CTRL0_FREQ_SEL_SW_MASK
Definition: hpm_sdxc_regs.h:4348
#define SDXC_MISC_CTRL0_FREQ_SEL_SW_EN_MASK
Definition: hpm_sdxc_regs.h:4327
#define SDXC_MISC_CTRL0_TMCLK_EN_MASK
Definition: hpm_sdxc_regs.h:4338
#define SDXC_SYS_CTRL_SD_CLK_EN_MASK
Definition: hpm_sdxc_regs.h:1087
#define SDXC_MISC_CTRL1_CARD_ACTIVE_MASK
Definition: hpm_sdxc_regs.h:4361
#define SDXC_MISC_CTRL0_CARDCLK_INV_EN_MASK
Definition: hpm_sdxc_regs.h:4305
#define SDXC_MISC_CTRL0_FREQ_SEL_SW_GET(x)
Definition: hpm_sdxc_regs.h:4351
#define IOC_PC00_FUNC_CTL_SDC0_DS
Definition: hpm_iomux.h:562
static void sdxc_enable_freq_selection(SDXC_Type *base)
Definition: hpm_sdxc_soc_drv.h:24
static bool sdxc_is_ddr50_supported(SDXC_Type *base)
Definition: hpm_sdxc_soc_drv.h:150
static void sdxc_set_clock_divider(SDXC_Type *base, uint32_t div)
Set SDXC clock divider.
Definition: hpm_sdxc_soc_drv.h:39
static void sdxc_enable_inverse_clock(SDXC_Type *base, bool enable)
Inverse SDXC clock.
Definition: hpm_sdxc_soc_drv.h:74
static uint32_t sdxc_get_default_strobe_delay(SDXC_Type *base)
Definition: hpm_sdxc_soc_drv.h:130
static uint32_t sdxc_get_clock_divider(SDXC_Type *base)
Get SDXC divider.
Definition: hpm_sdxc_soc_drv.h:51
static uint32_t sdxc_get_default_cardclk_delay_chain(SDXC_Type *base, uint32_t clock_freq)
Definition: hpm_sdxc_soc_drv.h:140
static void sdxc_select_cardclk_delay_source(SDXC_Type *base, bool loopback_from_pad)
Select the Card Clock Delay source.
Definition: hpm_sdxc_soc_drv.h:99
static void sdxc_enable_tm_clock(SDXC_Type *base)
Definition: hpm_sdxc_soc_drv.h:19
static void sdxc_set_cardclk_delay_chain(SDXC_Type *base, uint32_t num_delaycells)
Set Card Clock delay chain.
Definition: hpm_sdxc_soc_drv.h:113
static bool sdxc_is_inverse_clock_enabled(SDXC_Type *base)
Check whether SDXC inverse clock is enabled or not.
Definition: hpm_sdxc_soc_drv.h:89
static void sdxc_disable_freq_selection(SDXC_Type *base)
Definition: hpm_sdxc_soc_drv.h:29
static void sdxc_wait_card_active(SDXC_Type *base)
Wait at least 74 clocks until card is ready to receive the first command.
Definition: hpm_sdxc_soc_drv.h:59
static void sdxc_set_data_strobe_delay(SDXC_Type *base, uint8_t num_of_delaycells)
Set SDXC data strobe delay chain.
Definition: hpm_sdxc_soc_drv.h:124
#define SDXC_MISC_CTRL1_CARDCLK_DLYSEL_MASK
Definition: hpm_sdxc_regs.h:4382
#define SDXC_MISC_CTRL1_CARDCLK_DLYSEL_SET(x)
Definition: hpm_sdxc_regs.h:4384
#define SDXC_MISC_CTRL1_STROBE_DLYSEL_MASK
Definition: hpm_sdxc_regs.h:4392
#define SDXC_MISC_CTRL1_STROBE_DLYSEL_SET(x)
Definition: hpm_sdxc_regs.h:4394
#define IS_HPM_BITMASK_SET(val, mask)
Definition: hpm_common.h:61
Definition: hpm_sdxc_regs.h:12
__RW uint32_t MISC_CTRL1
Definition: hpm_sdxc_regs.h:78
__RW uint32_t MISC_CTRL0
Definition: hpm_sdxc_regs.h:77
__RW uint32_t SYS_CTRL
Definition: hpm_sdxc_regs.h:21