SmartSnippets DA1459x SDK
qspi_mx25u3235_v2.h
Go to the documentation of this file.
1 
41 #ifndef _QSPI_MX25U3235_V2_H_
42 #define _QSPI_MX25U3235_V2_H_
43 
44 #include "hw_clk.h"
45 #include "hw_qspi.h"
46 #include "qspi_common.h"
47 #include "qspi_macronix_v2.h"
48 
49 #define QSPI_MX25U3235_DENSITY (0x36)
50 
51 __RETAINED_CODE static void qspi_mx25u3235_initialize(HW_QSPIC_ID id, sys_clk_t sys_clk);
52 __RETAINED_CODE static void qspi_mx25u3235_sys_clock_cfg(HW_QSPIC_ID id, sys_clk_t sys_clk);
53 __RETAINED_CODE static uint8_t qspi_mx25u3235_get_dummy_bytes(HW_QSPIC_ID id, sys_clk_t sys_clk);
54 __RETAINED_CODE static void qspi_mx25u3235_write_status_reg(HW_QSPIC_ID id, uint8_t status_reg);
55 
56 static const qspi_flash_config_t qspi_mx25u3235_cfg = {
57  .jedec.manufacturer_id = QSPI_MACRONIX_MANUFACTURER_ID,
58  .jedec.type = QSPI_MACRONIX_MX25U_TYPE,
59  .jedec.density = QSPI_MX25U3235_DENSITY,
60  .jedec.density_mask = 0xFF,
61 
62  .size_bits = QSPI_MEMORY_SIZE_32Mbits,
63  .address_size = HW_QSPI_ADDR_SIZE_24,
64  .clk_mode = HW_QSPI_CLK_MODE_LOW,
65 
66  .read_instr_cfg.opcode_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
67  .read_instr_cfg.addr_bus_mode = HW_QSPI_BUS_MODE_QUAD,
68  .read_instr_cfg.extra_byte_bus_mode = HW_QSPI_BUS_MODE_QUAD,
69  .read_instr_cfg.dummy_bus_mode = HW_QSPI_BUS_MODE_QUAD,
70  .read_instr_cfg.data_bus_mode = HW_QSPI_BUS_MODE_QUAD,
71  .read_instr_cfg.continuous_mode = HW_QSPI_CONTINUOUS_MODE_ENABLE,
72  .read_instr_cfg.extra_byte_cfg = HW_QSPI_EXTRA_BYTE_ENABLE,
73  .read_instr_cfg.extra_byte_half_cfg = HW_QSPI_EXTRA_BYTE_HALF_DISABLE,
74  .read_instr_cfg.opcode = QSPI_FAST_READ_QUAD_OPCODE,
75  .read_instr_cfg.extra_byte_value = 0xA5,
76  .read_instr_cfg.cs_idle_delay_nsec = 5, // tSHSL (read)
77 
78  .erase_instr_cfg.opcode_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
79  .erase_instr_cfg.addr_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
80  .erase_instr_cfg.hclk_cycles = 0,
81  .erase_instr_cfg.opcode = QSPI_SECTOR_ERASE_OPCODE,
82  .erase_instr_cfg.cs_idle_delay_nsec = 30, // tSHSL (erase)
83 
84  .read_status_instr_cfg.opcode_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
85  .read_status_instr_cfg.receive_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
86  .read_status_instr_cfg.busy_level = HW_QSPI_BUSY_LEVEL_HIGH,
87  .read_status_instr_cfg.busy_pos = QSPI_STATUS_REG_BUSY_BIT,
88  .read_status_instr_cfg.opcode = QSPI_READ_STATUS_REG_OPCODE,
89  .read_status_instr_cfg.delay_nsec = 0,
90 
91  .write_enable_instr_cfg.opcode_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
92  .write_enable_instr_cfg.opcode = QSPI_WRITE_ENABLE_OPCODE,
93 
94  .page_program_instr_cfg.opcode_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
95  .page_program_instr_cfg.addr_bus_mode = HW_QSPI_BUS_MODE_QUAD,
96  .page_program_instr_cfg.data_bus_mode = HW_QSPI_BUS_MODE_QUAD,
97  .page_program_instr_cfg.opcode = QSPI_MACRONIX_PAGE_PROGRAM_4IO_OPCODE,
98 
99  .suspend_resume_instr_cfg.suspend_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
100  .suspend_resume_instr_cfg.resume_bus_mode = HW_QSPI_BUS_MODE_SINGLE,
101  .suspend_resume_instr_cfg.suspend_opcode = QSPI_MACRONIX_SUSPEND_OPCODE,
102  .suspend_resume_instr_cfg.resume_opcode = QSPI_MACRONIX_RESUME_OPCODE,
103  .suspend_resume_instr_cfg.suspend_latency_usec = 25, // tESL
104  .suspend_resume_instr_cfg.resume_latency_usec = 1, // no latency
105  .suspend_resume_instr_cfg.res_sus_latency_usec = 100, // tERS
106 
107  .delay.reset_usec = 12000, // tREADY2
108  .delay.power_down_usec = 10, // tDP
109  .delay.release_power_down_usec = 30, // tRDP
110  .delay.power_up_usec = 800, // tVSL
111 
112  .callback.initialize_cb = qspi_mx25u3235_initialize,
113  .callback.sys_clk_cfg_cb = qspi_mx25u3235_sys_clock_cfg,
114  .callback.exit_qpi_cb = qspi_exit_qpi,
115  .callback.get_dummy_bytes_cb = qspi_mx25u3235_get_dummy_bytes,
116  .callback.is_suspended_cb = qspi_macronix_is_suspended,
117  .callback.is_busy_cb = qspi_macronix_is_busy,
118  .callback.read_status_reg_cb = qspi_macronix_read_status_reg,
119  .callback.write_status_reg_cb = qspi_mx25u3235_write_status_reg,
120 
121  .resume_before_writing_regs = false,
122 };
123 
124 __RETAINED_CODE static uint8_t qspi_mx25u3235_get_dummy_bytes(HW_QSPIC_ID id, sys_clk_t sys_clk)
125 {
126  return 2;
127 }
128 
129 __RETAINED_CODE static void qspi_mx25u3235_write_status_reg(HW_QSPIC_ID id, uint8_t status_reg)
130 {
131  hw_qspi_cs_enable(id);
132  hw_qspi_write8(id, QSPI_WRITE_STATUS_REG_OPCODE);
133  hw_qspi_write8(id, status_reg);
134  hw_qspi_cs_disable(id);
135 }
136 
137 __RETAINED_CODE static void qspi_mx25u3235_enable_quad_mode(HW_QSPIC_ID id)
138 {
139  __DBG_QSPI_VOLATILE__ uint8_t status_reg;
140  __DBG_QSPI_VOLATILE__ uint8_t verify;
141 
142  status_reg = qspi_flash_read_status_register(id);
143 
144  if (!(status_reg & QSPI_MACRONIX_STATUS_REG_QUAD_ENABLE_MASK)) {
145  status_reg |= QSPI_MACRONIX_STATUS_REG_QUAD_ENABLE_MASK;
146  qspi_flash_write_enable(id);
147  qspi_flash_write_status_register(id, status_reg);
148  while (qspi_macronix_is_busy(id, HW_QSPI_BUSY_LEVEL_HIGH));
149  verify = qspi_flash_read_status_register(id);
150  ASSERT_WARNING((status_reg & QSPI_MACRONIX_STATUS_REG_QUAD_ENABLE_MASK) ==
151  (verify & QSPI_MACRONIX_STATUS_REG_QUAD_ENABLE_MASK));
152  }
153 }
154 
155 __RETAINED_CODE static void qspi_mx25u3235_initialize(HW_QSPIC_ID id, sys_clk_t sys_clk)
156 {
157  qspi_mx25u3235_enable_quad_mode(id);
158 }
159 
160 __RETAINED_CODE static void qspi_mx25u3235_sys_clock_cfg(HW_QSPIC_ID id, sys_clk_t sys_clk)
161 {
162 
163 }
164 
165 #if (dg_configCODE_LOCATION == NON_VOLATILE_IS_QSPI_FLASH) & (dg_configQSPI_FLASH_AUTODETECT == 0)
166 __attribute__((used, __section__("__product_header_primary__")))
167 static const PRODUCT_HEADER_STRUCT(3) ph_primary = {
168  .burstcmdA = 0xA8A500EB,
169  .burstcmdB = 0x00000066,
170  .flash_config_section = 0x11AA,
171  .flash_config_length = 0x3,
172  .config_seq = {0x01, 0x40, 0x02},
173  .crc = 0x51D4
174 };
175 
176 __attribute__((used, __section__("__product_header_backup__")))
177 static const PRODUCT_HEADER_STRUCT(3) ph_backup = {
178  .burstcmdA = 0xA8A500EB,
179  .burstcmdB = 0x00000066,
180  .flash_config_section = 0x11AA,
181  .flash_config_length = 0x3,
182  .config_seq = {0x01, 0x40, 0x02},
183  .crc = 0x51D4
184 };
185 #endif /* (dg_configUSE_SEGGER_FLASH_LOADER == 1) && (dg_configFLASH_AUTODETECT == 0) */
186 
187 #endif /* _QSPI_MX25U3235_V2_H_ */
188 
HW_QSPI_ADDR_SIZE_24
Definition: hw_qspi_v2.h:69
HW_QSPIC_ID
void * HW_QSPIC_ID
QSPI Controller ID.
Definition: hw_qspi_v2.h:439
qspi_flash_config_t::jedec
jedec_id_t jedec
Definition: qspi_common_v2.h:167
HW_QSPI_EXTRA_BYTE_ENABLE
Definition: hw_qspi_v2.h:141
hw_qspi_cs_enable
__STATIC_FORCEINLINE void hw_qspi_cs_enable(HW_QSPIC_ID id)
Enable CS on QSPI bus in manual access mode.
Definition: hw_qspi_v2.h:525
__attribute__::crc
uint32_t crc
Definition: suota.h:90
HW_QSPI_BUS_MODE_QUAD
Definition: hw_qspi_v2.h:79
HW_QSPI_BUS_MODE_SINGLE
Definition: hw_qspi_v2.h:77
sys_clk_t
enum sysclk_type sys_clk_t
The system clock type.
jedec_id_t::manufacturer_id
uint8_t manufacturer_id
Definition: qspi_common_v2.h:120
HW_QSPI_CLK_MODE_LOW
Definition: hw_qspi_v2.h:113
HW_QSPI_EXTRA_BYTE_HALF_DISABLE
Definition: hw_qspi_v2.h:150
hw_qspi_write8
__STATIC_FORCEINLINE void hw_qspi_write8(HW_QSPIC_ID id, uint8_t data)
Generate 8 bits data transfer from the QSPIC to the external device (manual mode)
Definition: hw_qspi_v2.h:1167
HW_QSPI_BUSY_LEVEL_HIGH
Definition: hw_qspi_v2.h:96
hw_qspi_cs_disable
__STATIC_FORCEINLINE void hw_qspi_cs_disable(HW_QSPIC_ID id)
Disable CS on QSPI bus in manual access mode.
Definition: hw_qspi_v2.h:535
hw_qspi.h
Low Level Driver of QSPI controllers.
hw_clk.h
Clock Driver header file.
__attribute__
Definition: suota.h:67
qspi_macronix_v2.h
The macros and functions of this header file are utilized by the memory drivers of the Macronix QSPI ...
HW_QSPI_CONTINUOUS_MODE_ENABLE
Definition: hw_qspi_v2.h:122
qspi_common.h
QSPI flash driver common definitions.
qspi_flash_config_t
QSPI memory configuration structure.
Definition: qspi_common_v2.h:166