SmartSnippets DA1459x SDK
qspi_winbond_v2.h
Go to the documentation of this file.
1 
42 #ifndef _QSPI_WINBOND_V2_H_
43 #define _QSPI_WINBOND_V2_H_
44 
45 #include "qspi_common.h"
46 
47 #ifndef QSPI_WINBOND_UNLOCK_PROTECTION
48 #define QSPI_WINBOND_UNLOCK_PROTECTION (0)
49 #endif
50 
51 #define QSPI_WINBOND_MANUFACTURER_ID (0xEF)
52 #define QSPI_WINBOND_W25QXXXJWIQ_TYPE (0x60)
53 #define QSPI_WINBOND_W25QXXXJWIM_TYPE (0x80)
54 
55 #define QSPI_WINBOND_READ_STATUS_REG2_OPCODE (0x35)
56 #define QSPI_WINBOND_READ_STATUS_REG3_OPCODE (0x15)
57 #define QSPI_WINBOND_WRITE_STATUS_REG2_OPCODE (0x31)
58 #define QSPI_WINBOND_WRITE_STATUS_REG3_OPCODE (0x11)
59 
60 #define QSPI_WINBOND_SUSPEND_OPCODE (0x75)
61 #define QSPI_WINBOND_RESUME_OPCODE (0x7A)
62 
63 #define QSPI_WINBOND_STATUS_REG_BP0_POS (2) // Block Protection Bit 0
64 #define QSPI_WINBOND_STATUS_REG_BP1_POS (3) // Block Protection Bit 1
65 #define QSPI_WINBOND_STATUS_REG_BP2_POS (4) // Block Protection Bit 2
66 #define QSPI_WINBOND_STATUS_REG_TB_POS (5) // Top/Bottom Protection Bit
67 #define QSPI_WINBOND_STATUS_REG_SEC_POS (6) // Sector/Block Protection Bit
68 #define QSPI_WINBOND_STATUS_REG_SRP_POS (7) // Status Register Protection Bit 0
69 
70 #define QSPI_WINBOND_STATUS_REG_PROTECTION_MASK ((1 << QSPI_WINBOND_STATUS_REG_BP0_POS) | \
71  (1 << QSPI_WINBOND_STATUS_REG_BP1_POS) | \
72  (1 << QSPI_WINBOND_STATUS_REG_BP2_POS) | \
73  (1 << QSPI_WINBOND_STATUS_REG_TB_POS) | \
74  (1 << QSPI_WINBOND_STATUS_REG_SEC_POS) | \
75  (1 << QSPI_WINBOND_STATUS_REG_SRP_POS))
76 
77 #define QSPI_WINBOND_STATUS_REG2_SRL_POS (0) // Status Register2 Protection Bit 1
78 #define QSPI_WINBOND_STATUS_REG2_CMP_POS (6) // Complement Protect Bit 1
79 
80 #define QSPI_WINBOND_STATUS_REG2_PROTECTION_MASK ((1 << QSPI_WINBOND_STATUS_REG2_SRL_POS) | \
81  (1 << QSPI_WINBOND_STATUS_REG2_CMP_POS))
82 
83 #define QSPI_WINBOND_STATUS_REG2_SUSPEND_POS (7)
84 #define QSPI_WINBOND_STATUS_REG2_SUSPEND_MASK (1 << QSPI_WINBOND_STATUS_REG2_SUSPEND_POS)
85 
86 #define QSPI_WINBOND_STATUS_REG2_QUAD_ENABLE_POS (1)
87 #define QSPI_WINBOND_STATUS_REG2_QUAD_ENABLE_MASK (1 << QSPI_WINBOND_STATUS_REG2_QUAD_ENABLE_POS)
88 
89 #define QSPI_WINBOND_STATUS_REG3_ADDR_MODE_POS (0)
90 #define QSPI_WINBOND_STATUS_REG3_ADDR_MODE_MASK (1 << QSPI_WINBOND_STATUS_REG3_ADDR_MODE_POS)
91 
92 #define QSPI_WINBOND_STATUS_REG3_DRV_STRENGTH_POS (5)
93 #define QSPI_WINBOND_STATUS_REG3_DRV_STRENGTH_MASK (3 << QSPI_WINBOND_STATUS_REG3_DRV_STRENGTH_POS)
94 
95 __RETAINED_CODE static uint8_t qspi_winbond_read_register(HW_QSPIC_ID id, uint8_t opcode, uint8_t mask)
96 {
97  __DBG_QSPI_VOLATILE__ uint8_t reg_val;
98 
99  ASSERT_WARNING((opcode == QSPI_READ_STATUS_REG_OPCODE) ||
100  (opcode == QSPI_WINBOND_READ_STATUS_REG2_OPCODE) ||
101  (opcode == QSPI_WINBOND_READ_STATUS_REG3_OPCODE));
102 
103  hw_qspi_cs_enable(id);
104  hw_qspi_write8(id, opcode);
105  reg_val = hw_qspi_read8(id);
106  hw_qspi_cs_disable(id);
107 
108  return (reg_val & mask);
109 }
110 
111 __RETAINED_CODE static void qspi_winbond_write_register(HW_QSPIC_ID id, uint8_t opcode, uint8_t value)
112 {
113  ASSERT_WARNING((opcode == QSPI_WRITE_STATUS_REG_OPCODE) ||
114  (opcode == QSPI_WINBOND_WRITE_STATUS_REG2_OPCODE) ||
115  (opcode == QSPI_WINBOND_WRITE_STATUS_REG3_OPCODE));
116 
117  hw_qspi_cs_enable(id);
118  hw_qspi_write8(id, opcode);
119  hw_qspi_write8(id, value);
120  hw_qspi_cs_disable(id);
121 }
122 
123 __RETAINED_CODE static uint8_t qspi_winbond_read_status_reg(HW_QSPIC_ID id)
124 {
125  return qspi_winbond_read_register(id, QSPI_READ_STATUS_REG_OPCODE, 0xFF);
126 }
127 
128 __RETAINED_CODE static void qspi_winbond_write_status_reg(HW_QSPIC_ID id, uint8_t status_reg)
129 {
130  qspi_winbond_write_register(id, QSPI_WRITE_STATUS_REG_OPCODE, status_reg);
131 }
132 
133 __RETAINED_CODE static uint8_t qspi_winbond_get_dummy_bytes(HW_QSPIC_ID id, sys_clk_t sys_clk)
134 {
135  return 2;
136 }
137 
138 __RETAINED_CODE static void qspi_winbond_sys_clock_cfg(HW_QSPIC_ID id, sys_clk_t sys_clk)
139 {
140 
141 }
142 
143 __RETAINED_CODE static bool qspi_winbond_is_suspended(HW_QSPIC_ID id)
144 {
145  __DBG_QSPI_VOLATILE__ uint8_t is_suspended;
146 
147  is_suspended = qspi_winbond_read_register(id, QSPI_WINBOND_READ_STATUS_REG2_OPCODE,
148  QSPI_WINBOND_STATUS_REG2_SUSPEND_MASK);
149  return (bool) is_suspended;
150 }
151 
152 __RETAINED_CODE static bool qspi_winbond_is_busy(HW_QSPIC_ID id, HW_QSPI_BUSY_LEVEL busy_level)
153 {
154  __DBG_QSPI_VOLATILE__ HW_QSPI_BUSY_LEVEL is_busy;
155 
156  is_busy = (HW_QSPI_BUSY_LEVEL ) (qspi_winbond_read_status_reg(id) & QSPI_STATUS_REG_BUSY_MASK);
157 
158  return (bool) is_busy;
159 }
160 
161 __RETAINED_CODE static void qspi_winbond_enable_quad_mode(HW_QSPIC_ID id)
162 {
163  __DBG_QSPI_VOLATILE__ uint8_t status_reg2;
164  __DBG_QSPI_VOLATILE__ uint8_t verify;
165 
166  status_reg2 = qspi_winbond_read_register(id, QSPI_WINBOND_READ_STATUS_REG2_OPCODE, 0xFF);
167 
168  if (!(status_reg2 & QSPI_WINBOND_STATUS_REG2_QUAD_ENABLE_MASK)) {
169  status_reg2 |= QSPI_WINBOND_STATUS_REG2_QUAD_ENABLE_MASK;
170  qspi_flash_write_enable(id);
171  qspi_winbond_write_register(id, QSPI_WINBOND_WRITE_STATUS_REG2_OPCODE, status_reg2);
172  while (qspi_winbond_is_busy(id, HW_QSPI_BUSY_LEVEL_HIGH));
173  verify = qspi_winbond_read_register(id, QSPI_WINBOND_READ_STATUS_REG2_OPCODE, 0xFF);
174  ASSERT_WARNING(status_reg2 == verify);
175  }
176 }
177 
178 __UNUSED __RETAINED_CODE static void qspi_winbond_set_max_drive_strength(HW_QSPIC_ID id)
179 {
180  __DBG_QSPI_VOLATILE__ uint8_t status_reg3;
181  __DBG_QSPI_VOLATILE__ uint8_t verify;
182 
183  status_reg3 = qspi_winbond_read_register(id, QSPI_WINBOND_READ_STATUS_REG3_OPCODE, 0xFF);
184 
185  if ((status_reg3 & QSPI_WINBOND_STATUS_REG3_DRV_STRENGTH_MASK) != 0) {
186  status_reg3 &= ~QSPI_WINBOND_STATUS_REG3_DRV_STRENGTH_MASK;
187  qspi_flash_write_enable(id);
188  qspi_winbond_write_register(id, QSPI_WINBOND_WRITE_STATUS_REG3_OPCODE, status_reg3);
189  while (qspi_winbond_is_busy(id, HW_QSPI_BUSY_LEVEL_HIGH));
190  verify = qspi_winbond_read_register(id, QSPI_WINBOND_READ_STATUS_REG3_OPCODE, 0xFF);
191  ASSERT_WARNING(status_reg3 == verify);
192  }
193 }
194 
195 __UNUSED __RETAINED_CODE static void qspi_winbond_unlock_protection(HW_QSPIC_ID id)
196 {
197  __DBG_QSPI_VOLATILE__ uint8_t status_reg;
198  __DBG_QSPI_VOLATILE__ uint8_t status_reg2;
199  __DBG_QSPI_VOLATILE__ uint8_t verify;
200 
201  status_reg = qspi_winbond_read_status_reg(id);
202  status_reg2 = qspi_winbond_read_register(id, QSPI_WINBOND_READ_STATUS_REG2_OPCODE, 0xFF);
203 
204  // Clear Protection Bits [SRP TB BP3 BP2 BP1 BP0]
205  if (status_reg & QSPI_WINBOND_STATUS_REG_PROTECTION_MASK) {
206  status_reg &= ~QSPI_WINBOND_STATUS_REG_PROTECTION_MASK;
207  qspi_flash_write_enable(id);
208  qspi_winbond_write_status_reg(id, status_reg);
209  while (qspi_winbond_is_busy(id, HW_QSPI_BUSY_LEVEL_HIGH));
210  verify = qspi_winbond_read_status_reg(id);
211  ASSERT_WARNING(status_reg == verify);
212  }
213 
214  if (status_reg2 & QSPI_WINBOND_STATUS_REG2_PROTECTION_MASK) {
215  status_reg2 &= ~QSPI_WINBOND_STATUS_REG2_PROTECTION_MASK;
216  qspi_flash_write_enable(id);
217  qspi_winbond_write_register(id, QSPI_WINBOND_WRITE_STATUS_REG2_OPCODE, status_reg2);
218  while (qspi_winbond_is_busy(id, HW_QSPI_BUSY_LEVEL_HIGH));
219  verify = qspi_winbond_read_register(id, QSPI_WINBOND_READ_STATUS_REG2_OPCODE, 0xFF);
220  ASSERT_WARNING(status_reg2 == verify);
221  }
222 }
223 
224 #endif /* _QSPI_WINBOND_V2_H_ */
225 
HW_QSPIC_ID
void * HW_QSPIC_ID
QSPI Controller ID.
Definition: hw_qspi_v2.h:439
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
__UNUSED
#define __UNUSED
Attribute to silence warnings about unused parameters/variables/function.
Definition: sdk_defs.h:380
sys_clk_t
enum sysclk_type sys_clk_t
The system clock type.
HW_QSPI_BUSY_LEVEL
HW_QSPI_BUSY_LEVEL
QSPIC device busy status setting.
Definition: hw_qspi_v2.h:94
hw_qspi_read8
__STATIC_FORCEINLINE uint8_t hw_qspi_read8(HW_QSPIC_ID id)
Generate 8 bits data transfer from the external device to the QSPIC (manual mode)
Definition: hw_qspi_v2.h:1127
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
qspi_common.h
QSPI flash driver common definitions.