1 /*
2  * SPDX-FileCopyrightText: 2019-2025 SiFli Technologies(Nanjing) Co., Ltd
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <string.h>
8 #include "flash_table.h"
9 
10 
11 typedef enum
12 {
13     NAND_TYPE0 = 0,  // normal type, base on winbond w25n01gw, with NON-BUF, NO QE, EB with 4 dummy
14     NAND_TYPE1,      // based on XT26G01D, BUF, QE, EB, EB with 2 dummy
15     NAND_TYPE2,      // based on ds35x1gaxxx, BUF , QE, NO EB
16     NAND_TYPE3,      // based on tc58cyg0s3hraij, BUF, NO QE, NO EB
17     NAND_TYPE4,      // based on FM25LS01, BUF, NO QE, EB   with 4 dummy
18     NAND_TYPE5,      // based on GD5F1GM7RE, BUF, QE, EB, EB with 4 dummy
19     NAND_CMD_TABLE_CNT
20 } NAND_CMD_TABLE_ID_T;
21 
22 
23 __weak FT_CONST SPI_FLASH_FACT_CFG_T nand_cmd_table_list[] =
24 {
25     {
26         //winb_w25n01gw_ops
27         1,    /* NAND flash */
28         0XEF, /* winbond manuf id */
29         0xba,    /* Device ID*/
30         0x21, /* device id, for winbond, they have 16 bit device, just use 8 now */
31         0xC0, /* bit0 as busy, bit1 as WEL */
32         0xA0, /* protect, WPE */
33         0xB0, /* bit3 as buf mode, bit4 as ECC-C */
34         0x30, /* bit 4 and 5 in status register C0*/
35         0x00, /* not support QE configure */
36         0x08, /* bit 3 in mode register B0 for continue mode*/
37         0x10, /* bit 4 in mode register B0 for ecc enable */
38         64,
39         131072, /* 128KB */
40         {
41             {0x06, 0, 0, 0, 0, 0,  0, 0, 1}, /* SPI_FLASH_CMD_WREN*/
42             {0x04, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_WRDI*/
43             {0x0f, 0, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_RDSR*/
44             {0x1f, 1, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_WRSR*/
45             {0x13, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PREAD*/
46             {0x03, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_READ*/
47             {0x0b, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_FREAD*/
48             {0x3b, 0, 2, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_DREAD*/
49             {0x6b, 0, 3, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QREAD*/
50             {0xbb, 0, 2, 4, 0, 0, 1, 2, 1}, /* SPI_FLASH_CMD_2READ*/
51             {0xeb, 0, 3, 4, 0, 0, 1, 3, 1}, /* SPI_FLASH_CMD_4READ*/
52             {0x9f, 0, 1, 8, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RDID*/
53             {0x02, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLD*/
54             {0x32, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLD*/
55             {0x84, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLDR*/
56             {0x34, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLDR*/
57             {0x10, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PEXE*/
58             {0xd8, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_BE*/
59             {0xff, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RST*/
60             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RST_EN*/
61             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR2*/
62             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WVSR*/
63             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP*/
64             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP*/
65             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDEAR*/
66             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WREAR*/
67             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PE*/
68             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE*/
69             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE32*/
70             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE64*/
71             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CE*/
72             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR3*/
73             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR3*/
74             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_EN4BM*/
75             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ET4BM*/
76             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RD4BA*/
77             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FR4BA*/
78             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FQR4BA*/
79             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_4RD4BA*/
80             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP4BA*/
81             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP4BA*/
82             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE4BA*/
83             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE4BA*/
84             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR2*/
85             {0xA9, 0, 1, 8, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_LEFPA*/
86             {0xA1, 0, 0, 0, 0, 0, 3, 1, 1}, /* SPI_FLASH_CMD_BBM*/
87             {0xA5, 0, 1, 8, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RBLUT*/
88             {0x0B, 0, 3, 32, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_CFREAD*/
89             {0xEB, 0, 3, 12, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_C4READ*/
90             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RUID*/
91             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSCUR*/
92             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PRSCUR*/
93             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ERSCUR*/
94             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DPD*/
95             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDP*/
96             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DTR4R*/
97             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSFDP*/
98         }
99     },
100     {
101         //gd5f1gq4xc_ops
102         1,    /* NAND flash */
103         0XC8, /* giga device manuf id */
104         0xA1,    /* Device ID*/
105         0x48, /* device id, for winbond, they have 16 bit device, just use 8 now */
106         0xC0, /* bit0 as busy, bit1 as WEL */
107         0xA0, /* protect, WPE */
108         0xB0, /* bit3 as buf mode, bit4 as ECC-C */
109         0x30, /* bit 4 and 5 and 6in status register C0*/
110         0x01,   /* bit 1 in mode register B0 for QE set*/
111         0x00,   /* Not support continue mode, only buf mode */
112         0x10,   /* bit 4 in mode register B0 for ecc enable*/
113         128,
114         131072, /* 128KB */
115         {
116             {0x06, 0, 0, 0, 0, 0,  0, 0, 1}, /* SPI_FLASH_CMD_WREN*/
117             {0x04, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_WRDI*/
118             {0x0F, 0, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_RDSR*/
119             {0x1F, 1, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_WRSR*/
120             {0x13, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PREAD*/
121             {0x03, 0, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_READ*/
122             {0x0b, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_FREAD*/
123             {0x3b, 0, 2, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_DREAD*/
124             {0x6b, 0, 3, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QREAD*/
125             {0xbb, 0, 2, 4, 0, 0, 1, 2, 1}, /* SPI_FLASH_CMD_2READ*/
126             {0xeb, 0, 3, 2, 0, 0, 1, 3, 1}, /* SPI_FLASH_CMD_4READ*/
127             {0x9f, 0, 1, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RDID*/
128             {0x02, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLD*/
129             {0x32, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLD*/
130             {0x84, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLDR*/
131             {0x34, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLDR*/
132             {0x10, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PEXE*/
133             {0xd8, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_BE*/
134             {0xff, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RST*/
135             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RST_EN*/
136             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR2*/
137             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WVSR*/
138             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP*/
139             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP*/
140             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDEAR*/
141             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WREAR*/
142             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PE*/
143             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE*/
144             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE32*/
145             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE64*/
146             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CE*/
147             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR3*/
148             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR3*/
149             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_EN4BM*/
150             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ET4BM*/
151             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RD4BA*/
152             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FR4BA*/
153             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FQR4BA*/
154             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_4RD4BA*/
155             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP4BA*/
156             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP4BA*/
157             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE4BA*/
158             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE4BA*/
159             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR2*/
160             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_LEFPA*/
161             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BBM*/
162             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RBLUT*/
163             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CFREAD*/
164             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_C4READ*/
165             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RUID*/
166             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSCUR*/
167             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PRSCUR*/
168             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ERSCUR*/
169             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DPD*/
170             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDP*/
171             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DTR4R*/
172             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSFDP*/
173         }
174     },
175     {
176         //ds35x1gaxxx_ops
177         1,    /* NAND flash */
178         0XE5, /* manuf id */
179         0x21,    /* Device ID*/
180         0XE5, /* device id, for winbond, they have 16 bit device, just use 8 now */
181         0xC0, /* bit0 as busy, bit1 as WEL */
182         0xA0, /* protect, WPE */
183         0xB0, /* bit3 as buf mode, bit4 as ECC-C */
184         0x30, /* bit 4 and 5 in status register C0*/
185         0x01,   /* bit 1 in mode register B0  for QE set*/
186         0x00,   /* Not support continue mode, only buf mode */
187         0x10,   /* bit 4 in mode register B0 for ecc enable*/
188         64,
189         131072, /* 128KB */
190         {
191             {0x06, 0, 0, 0, 0, 0,  0, 0, 1}, /* SPI_FLASH_CMD_WREN*/
192             {0x04, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_WRDI*/
193             {0x0F, 0, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_RDSR*/
194             {0x1F, 1, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_WRSR*/
195             {0x13, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PREAD*/
196             {0x03, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_READ*/
197             {0x0b, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_FREAD*/
198             {0x3b, 0, 2, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_DREAD*/
199             {0x6b, 0, 3, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QREAD*/
200             {0xbb, 0, 2, 4, 0, 0, 1, 2, 1}, /* SPI_FLASH_CMD_2READ*/
201             // {0xeb, 0, 3, 4, 0, 0, 1, 3}, /* SPI_FLASH_CMD_4READ*/
202             {0x6b, 0, 3, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_4READ*/
203             {0x9f, 0, 1, 8, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RDID*/
204             {0x02, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLD*/
205             {0x32, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLD*/
206             {0x84, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLDR*/
207             {0x34, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLDR*/
208             {0x10, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PEXE*/
209             {0xd8, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_BE*/
210             {0xff, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RST*/
211             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RST_EN*/
212             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR2*/
213             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WVSR*/
214             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP*/
215             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP*/
216             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDEAR*/
217             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WREAR*/
218             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PE*/
219             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE*/
220             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE32*/
221             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE64*/
222             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CE*/
223             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR3*/
224             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR3*/
225             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_EN4BM*/
226             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ET4BM*/
227             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RD4BA*/
228             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FR4BA*/
229             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FQR4BA*/
230             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_4RD4BA*/
231             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP4BA*/
232             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP4BA*/
233             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE4BA*/
234             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE4BA*/
235             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR2*/
236             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_LEFPA*/
237             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BBM*/
238             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RBLUT*/
239             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CFREAD*/
240             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_C4READ*/
241             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RUID*/
242             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSCUR*/
243             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PRSCUR*/
244             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ERSCUR*/
245             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DPD*/
246             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDP*/
247             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DTR4R*/
248             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSFDP*/
249         }
250     },
251     {
252         //kioxia_tc58cyg0s3hraij_ops
253         1,    /* NAND flash */
254         0X98, /* manufacture ID : KIOXIA*/
255         0xd2,   /* Device ID*/
256         0X40, /* Organization ID */
257         0xC0, /* status regiser ,bit0 as busy, bit1 as WEL */
258         0xA0, /* protect register address, WPE */
259         0xB0, /* for qe/continue/ecc-e  mode register */
260         0x30, /* ecc status bits: bit 4 and 5 in status register C0*/
261         0x00,   /* no need set qe setting bits*/
262         0x00,   /* Not support continue mode, only buf mode */
263         0x10,   /* ecc enable bits: 4 in mode register B0*/
264         64,
265         131072, /* 128KB */
266         {
267             {0x06, 0, 0, 0, 0, 0,  0, 0, 1}, /* SPI_FLASH_CMD_WREN*/
268             {0x04, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_WRDI*/
269             {0x0F, 0, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_RDSR*/
270             {0x1F, 1, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_WRSR*/
271             {0x13, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PREAD*/
272             {0x03, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_READ*/
273             {0x0b, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_FREAD*/
274             {0x3b, 0, 2, 8, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_DREAD*/
275             {0x6b, 0, 3, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QREAD*/
276             {0xbb, 0, 2, 4, 0, 0, 1, 2, 1}, /* SPI_FLASH_CMD_2READ*/
277             // {0xeb, 0, 3, 4, 0, 0, 1, 3}, /* SPI_FLASH_CMD_4READ*/
278             {0x6b, 0, 3, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_4READ*/
279             {0x9f, 0, 1, 8, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RDID*/
280             {0x02, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLD*/
281             {0x32, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLD*/
282             {0x84, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLDR*/
283             {0x34, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLDR*/
284             {0x10, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PEXE*/
285             {0xd8, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_BE*/
286             {0xff, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RST*/
287             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RST_EN*/
288             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR2*/
289             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WVSR*/
290             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP*/
291             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP*/
292             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDEAR*/
293             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WREAR*/
294             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PE*/
295             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE*/
296             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE32*/
297             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE64*/
298             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CE*/
299             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR3*/
300             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR3*/
301             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_EN4BM*/
302             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ET4BM*/
303             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RD4BA*/
304             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FR4BA*/
305             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FQR4BA*/
306             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_4RD4BA*/
307             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP4BA*/
308             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP4BA*/
309             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE4BA*/
310             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE4BA*/
311             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR2*/
312             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_LEFPA*/
313             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BBM*/
314             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RBLUT*/
315             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CFREAD*/
316             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_C4READ*/
317             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RUID*/
318             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSCUR*/
319             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PRSCUR*/
320             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ERSCUR*/
321             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DPD*/
322             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDP*/
323             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DTR4R*/
324             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSFDP*/
325         }
326     },
327     {
328         //FUDAN_FM25LS01_ops
329         1,    /* NAND flash */
330         0XA1, /* manufacture ID : FUDAN MICRO*/
331         0xA5,   /* Device ID*/
332         0X7F, /* Organization ID, NO USE FOR this type */
333         0xC0, /* status regiser ,bit0 as busy, bit1 as WEL */
334         0xA0, /* protect register address, WPE */
335         0xB0, /* for qe/continue/ecc-e  mode register */
336         0x30, /* ecc status bits: bit 4 and 5 in status register C0*/
337         0x00,   /* no need set qe setting bits*/
338         0x00,   /* Not support continue mode, only buf mode */
339         0x10,   /* ecc enable bits: 4 in mode register B0*/
340         64,
341         131072, /* 128KB */
342         {
343             {0x06, 0, 0, 0, 0, 0,  0, 0, 1}, /* SPI_FLASH_CMD_WREN*/
344             {0x04, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_WRDI*/
345             {0x0F, 0, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_RDSR*/
346             {0x1F, 1, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_WRSR*/
347             {0x13, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PREAD*/
348             {0x03, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_READ*/
349             {0x0b, 0, 1, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_FREAD*/
350             {0x3b, 0, 2, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_DREAD*/
351             {0x6b, 0, 3, 8, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QREAD*/
352             {0xbb, 0, 2, 4, 0, 0, 1, 2, 1}, /* SPI_FLASH_CMD_2READ*/
353             {0xeb, 0, 3, 4, 0, 0, 1, 3, 1}, /* SPI_FLASH_CMD_4READ*/
354             {0x9f, 0, 1, 8, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RDID*/
355             {0x02, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLD*/
356             {0x32, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLD*/
357             {0x84, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLDR*/
358             {0x34, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLDR*/
359             {0x10, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PEXE*/
360             {0xd8, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_BE*/
361             {0xff, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RST*/
362             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RST_EN*/
363             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR2*/
364             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WVSR*/
365             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP*/
366             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP*/
367             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDEAR*/
368             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WREAR*/
369             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PE*/
370             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE*/
371             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE32*/
372             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE64*/
373             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CE*/
374             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR3*/
375             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR3*/
376             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_EN4BM*/
377             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ET4BM*/
378             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RD4BA*/
379             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FR4BA*/
380             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FQR4BA*/
381             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_4RD4BA*/
382             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP4BA*/
383             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP4BA*/
384             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE4BA*/
385             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE4BA*/
386             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR2*/
387             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_LEFPA*/
388             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BBM*/
389             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RBLUT*/
390             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CFREAD*/
391             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_C4READ*/
392             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RUID*/
393             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSCUR*/
394             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PRSCUR*/
395             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ERSCUR*/
396             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DPD*/
397             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDP*/
398             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DTR4R*/
399             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSFDP*/
400         }
401     },
402     {
403         //gd5f1gm7re_ops
404         1,    /* NAND flash */
405         0XC8, /* winbond manuf id */
406         0x81,    /* Device ID*/
407         0xC8, /* device id, for winbond, they have 16 bit device, just use 8 now */
408         0xC0, /* bit0 as busy, bit1 as WEL */
409         0xA0, /* protect, WPE */
410         0xB0, /* bit3 as buf mode, bit4 as ECC-C */
411         0x30, /* bit 4 and 5 in status register C0*/
412         0x01,   /* bit 1 in mode register B0 for QE set*/
413         0x00,   /* Not support continue mode, only buf mode */
414         0x10,   /* bit 4 in mode register B0 for ecc enable*/
415         128,
416         131072, /* 128KB */
417         {
418             {0x06, 0, 0, 0, 0, 0,  0, 0, 1}, /* SPI_FLASH_CMD_WREN*/
419             {0x04, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_WRDI*/
420             {0x0F, 0, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_RDSR*/
421             {0x1F, 1, 1, 0, 0, 0, 0, 1, 1}, /* SPI_FLASH_CMD_WRSR*/
422             {0x13, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PREAD*/
423             {0x03, 0, 1, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_READ*/
424             {0x0b, 0, 1, 8, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_FREAD*/
425             {0x3b, 0, 2, 8, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_DREAD*/
426             {0x6b, 0, 3, 8, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_QREAD*/
427             {0xbb, 0, 2, 4, 0, 0, 1, 2, 1}, /* SPI_FLASH_CMD_2READ*/
428             {0xeb, 0, 3, 4, 0, 0, 1, 3, 1}, /* SPI_FLASH_CMD_4READ*/
429             {0x9f, 0, 1, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RDID*/
430             {0x02, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLD*/
431             {0x32, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLD*/
432             {0x84, 1, 1, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_PLDR*/
433             {0x34, 1, 3, 0, 0, 0, 1, 1, 1}, /* SPI_FLASH_CMD_QPLDR*/
434             {0x10, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_PEXE*/
435             {0xd8, 0, 0, 0, 0, 0, 2, 1, 1}, /* SPI_FLASH_CMD_BE*/
436             {0xff, 0, 0, 0, 0, 0, 0, 0, 1}, /* SPI_FLASH_CMD_RST*/
437             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RST_EN*/
438             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR2*/
439             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WVSR*/
440             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP*/
441             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP*/
442             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDEAR*/
443             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WREAR*/
444             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PE*/
445             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE*/
446             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE32*/
447             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE64*/
448             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CE*/
449             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSR3*/
450             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR3*/
451             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_EN4BM*/
452             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ET4BM*/
453             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RD4BA*/
454             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FR4BA*/
455             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_FQR4BA*/
456             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_4RD4BA*/
457             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PP4BA*/
458             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_QPP4BA*/
459             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_SE4BA*/
460             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BE4BA*/
461             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_WRSR2*/
462             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_LEFPA*/
463             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_BBM*/
464             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RBLUT*/
465             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_CFREAD*/
466             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_C4READ*/
467             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RUID*/
468             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSCUR*/
469             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_PRSCUR*/
470             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_ERSCUR*/
471             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DPD*/
472             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDP*/
473             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_DTR4R*/
474             {0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SPI_FLASH_CMD_RDSFDP*/
475         }
476     },
477 };
478 
479 FT_CONST FLASH_RDID_TYPE_T nand_cmd_id_pool_type0[] =
480 {
481     {0xef, 0xba, 0x21, 0, 0x8000000},    //W25N01GW_RDID
482     {0xef, 0xaa, 0x21, 0, 0x8000000},    //W25N01GV_RDID
483     {0xef, 0xba, 0x23, 0, 0x20000000},   //W25N04KW_RDID
484     {FLASH_INVALID_ID, 0, 0, 0, 0},      //last one
485 };
486 
487 FT_CONST FLASH_RDID_TYPE_T nand_cmd_id_pool_type1[] =
488 {
489     {0xC9, 0x81, 0x00, 0x10, 0x8000000}, //HYF1GQ4IDACAE_RDID
490     {0x81, 0xc9, 0x81, 0x10, 0x8000000}, //HYF1GQ4IDACAE_RDID
491     {0x01, 0x81, 0xc9, 0x10, 0x8000000}, //HYF1GQ4IDACAE_RDID
492     {0x01, 0xc9, 0x81, 0x10, 0x8000000}, //HYF1GQ4IDACAE_RDID
493     {0x5e, 0x44, 0x5e, 0, 0x20000000},   //ZB35Q04A_RDID, used as 2KB page
494     {0x0b, 0x31, 0x00, 0x40, 0x8000000}, //XT26G01DXXX_RDID
495     {0x8c, 0x01, 0x8c, 0x10, 0x8000000}, //XCSP1AAPK-IT_RDID
496     {0x8c, 0xb1, 0x8c, 0x18, 0x20000000}, //XCSP4AAPK-IT_RDID
497     {0x0b, 0x33, 0X00, 0x44, 0x20000000},//XT26G04DXXX_RDID
498     {0xc8, 0xd9, 0xc8, 0x10, 0x8000000}, //GD5F1GQ4UxxH_RDID
499     {0xc8, 0xc9, 0xc8, 0x10, 0x8000000}, //GD5F1GQ4RxxH_RDID
500     {FLASH_INVALID_ID, 0, 0, 0, 0},      //last one
501 };
502 
503 FT_CONST FLASH_RDID_TYPE_T nand_cmd_id_pool_type2[] =
504 {
505     {0xE5, 0x21, 0XE5, 0, 0x8000000},       //DS35X1GAXXX_RDID
506     {0xE5, 0xA5, 0XE5, 0x20, 0x4000000},    //DS35M12BXXX_RDID
507     {0xE5, 0xF5, 0XE5, 0x20, 0x4000000},    //DS35Q12BXXX_RDID
508     {0xE5, 0xF1, 0XE5, 0x20, 0x8000000},    //DS35Q1GBXXX_RDID
509     {0xE5, 0xA1, 0XE5, 0x20, 0x8000000},    //DS35M1GBXXX_RDID
510     {0xE5, 0xA2, 0XE5, 0x22, 0x10000000},   //DS35M2GBXXX_RDID
511     {0xE5, 0xF4, 0XE5, 0x22, 0x20000000},   //DS35X4GMXXX_RDID rev01
512     {0xE5, 0x74, 0xE5, 0x22, 0x20000000},   //DS35X4GMXXX_RDID diff version?
513     {0xE5, 0xB4, 0XE5, 0x20, 0x20000000},   //DS35Q4GBXXX_RDID
514     {0xE5, 0x75, 0XE5, 0x20, 0x4000000},   //DS35Q12CXXX_RDID
515     {0xCD, 0x70, 0X70, 0, 0x4000000},       //F35SQA512MX_RDID
516     {0xCD, 0x60, 0X60, 0, 0x4000000},       //F35UQA512MXXX_RDID
517     {0xCD, 0x61, 0x61, 0, 0x8000000},      //F35UQA001GXXX_RDID
518     {0xCD, 0x71, 0X71, 0, 0x8000000},       //F35SQA0001GXXX_RDID
519     {0xCD, 0x72, 0X72, 0, 0x10000000},      //F35SQA0002GXXX_RDID
520     {0xCD, 0x53, 0X53, 0x34, 0x20000000},    //F35SQB004G_RDID
521     {0x0B, 0x51, 0X00, 0x40, 0x8000000},    //XT26Q01DXXX_RDID
522     {0x0B, 0x11, 0X00, 0x50, 0x8000000},    //XT26G01CXXX_RDID
523     {0x3C, 0xD1, 0xD1, 0, 0x8000000},       //HSESYHDSW1G_RDID
524     {0x3C, 0xD2, 0xD2, 0, 0x10000000},      //HSESYHDSW2G_RDID
525     {0xa1, 0xd4, 0xa1, 0x20, 0x8000000},    //FM25S01BI3_RDID
526     {0xc9, 0xd4, 0xc9, 0x14, 0x20000000},   //HYF4GQ4UAACBE_RDID
527     {0xE5, 0xB2, 0XE5, 0x20, 0x10000000},   //DS35Q2GBS-IB_RDID
528     {0xB0, 0x14, 0xB0, 0x20, 0x8000000},   //UM19A0HISW_RDID
529     {FLASH_INVALID_ID, 0, 0, 0, 0},         //last one
530 };
531 
532 FT_CONST FLASH_RDID_TYPE_T nand_cmd_id_pool_type3[] =
533 {
534     {0x98, 0xd2, 0X40, 0x10, 0x8000000},    //TC58CYG0S3HRAIJ_RDID
535     {0x3C, 0xD1, 0x3C, 0, 0x8000000},       //HSESDDDSW1G_RDID
536     {0x01, 0x15, 0X01, 0x60, 0x8000000},    //HYF1GQ4UTXCAE_RDID
537     {0x01, 0x35, 0X01, 0x60, 0x20000000},   //HYF4GQ4UTACAE_RDID
538     {FLASH_INVALID_ID, 0, 0, 0, 0},         //last one
539 };
540 
541 FT_CONST FLASH_RDID_TYPE_T nand_cmd_id_pool_type4[] =
542 {
543     {0xa1, 0xa5, 0X7f, 0, 0x8000000},       //FM25LS01_RDID
544     {0xc9, 0x21, 0xc9, 0x10, 0x8000000},    //HYF1GQ4UDA_RDID
545     {0x5e, 0xa1, 0xa1, 0, 0x8000000},       //ZB35Q01B_RDID
546     {0x5e, 0xa2, 0xa1, 0, 0x10000000},      //ZB35Q02BYIG_RDID
547     {FLASH_INVALID_ID, 0, 0, 0, 0},         //last one
548 };
549 
550 FT_CONST FLASH_RDID_TYPE_T nand_cmd_id_pool_type5[] =
551 {
552     {0xc8, 0x81, 0xc8, 0x10, 0x8000000},    //GD5F1GM7RE_RDID
553     {0xc8, 0x91, 0xc8, 0x10, 0x8000000},    //GD5F1GM7UE_RDID
554     {0xc8, 0x92, 0xc8, 0x10, 0x10000000},   //GD5F2GM7UE_RDID
555     {0xc8, 0x82, 0xc8, 0x10, 0x10000000},   //GD5F2GM7RE_RDID
556     {0xc8, 0x95, 0xc8, 0x10, 0x20000000},   //GD5F4GM8UE_RDID
557     {0xc8, 0x85, 0xc8, 0x10, 0x20000000},   //GD5F4GM8RE_RDID
558     {0x52, 0xCA, 0x13, 0x10, 0x8000000},    //GSS01GSAX1_RDID
559     {FLASH_INVALID_ID, 0, 0, 0, 0},         //last one
560 };
561 
562 
563 #if defined(JLINK) || defined(KEIL)
564 /* For Jlink device, as it does not have scatter loading, need assign this table in Jlink init code.*/
565 FLASH_RDID_TYPE_T    *nand_cmd_id_pool[NAND_CMD_TABLE_CNT];
566 #else
567 /* For bootloader, need compress to reduce code size */
568 __weak FT_CONST FLASH_RDID_TYPE_T   *FT_CONST nand_cmd_id_pool[] =
569 {
570     &nand_cmd_id_pool_type0[0],      // type 0, NON-BUF,NO QE, EB with 4 dummy
571     &nand_cmd_id_pool_type1[0],      // type 1, BUF,    QE,    EB, EB with 2 dummy
572     &nand_cmd_id_pool_type2[0],      // type 2, BUF,    QE,    NO EB
573     &nand_cmd_id_pool_type3[0],      // type 3, BUF,    NO QE, NO EB
574     &nand_cmd_id_pool_type4[0],      // type 4, BUF,    NO QE, EB   with 4 dummy
575     &nand_cmd_id_pool_type5[0],      // type 5, BUF,    QE,    EB, EB with 4 dummy
576 };
577 #endif /* JLINK || KEIL */
578 
579 #if defined(CFG_FACTORY_DEBUG)
get_user_flash_cfg(uint8_t isnand,uint8_t fid,uint8_t did,uint8_t type,uint8_t * flash_type)580 __WEAK void *get_user_flash_cfg(uint8_t isnand, uint8_t fid, uint8_t did, uint8_t type, uint8_t *flash_type)
581 {
582     return NULL;
583 }
584 #endif
585 
586 
587 #if defined(JLINK) || defined(KEIL)
spi_nand_table_init(void)588 __weak void spi_nand_table_init(void)
589 {
590     if (NAND_CMD_TABLE_CNT != 6)
591     {
592         while (1);
593     }
594 
595     nand_cmd_id_pool[0] = &nand_cmd_id_pool_type0[0];
596     nand_cmd_id_pool[1] = &nand_cmd_id_pool_type1[0];
597     nand_cmd_id_pool[2] = &nand_cmd_id_pool_type2[0];
598     nand_cmd_id_pool[3] = &nand_cmd_id_pool_type3[0];
599     nand_cmd_id_pool[4] = &nand_cmd_id_pool_type4[0];
600     nand_cmd_id_pool[5] = &nand_cmd_id_pool_type5[0];
601 }
602 #endif /* JLINK || KEIL */
603 
604 
spi_nand_get_rdid(uint8_t fid,uint8_t did,uint8_t type,uint8_t * flash_type)605 FT_CONST FLASH_RDID_TYPE_T *spi_nand_get_rdid(uint8_t fid, uint8_t did, uint8_t type, uint8_t *flash_type)
606 {
607     int i;
608     FT_CONST FLASH_RDID_TYPE_T *res;
609 
610     // check flash id valid
611     if ((fid == FLASH_INVALID_ID) || (fid == FLASH_UNKNOW_ID))
612         return NULL;
613 
614     for (i = 0; i < NAND_CMD_TABLE_CNT; i++)
615     {
616         res = nand_cmd_id_pool[i];
617         while (res->manufacture_id != FLASH_INVALID_ID)
618         {
619             if (fid == res->manufacture_id &&
620                     type == res->memory_type &&
621                     did == res->memory_density)
622                 break;
623             res++;
624         };
625         if (res->manufacture_id != FLASH_INVALID_ID)      // Found flash ID
626             break;
627     }
628 
629     if (i == NAND_CMD_TABLE_CNT)
630     {
631 #if defined(CFG_FACTORY_DEBUG)
632         res = (FLASH_RDID_TYPE_T *)get_user_flash_cfg(1, fid, did, type, flash_type);
633 #else
634         res = NULL;
635 #endif
636     }
637     else if (flash_type)
638     {
639         *flash_type = i;
640     }
641     return res;
642 }
643 
644 // get command table by index from register table
spi_nand_get_cmd_by_id(uint8_t fid,uint8_t did,uint8_t type)645 const SPI_FLASH_FACT_CFG_T *spi_nand_get_cmd_by_id(uint8_t fid, uint8_t did, uint8_t type)
646 {
647     uint8_t i;
648     const SPI_FLASH_FACT_CFG_T *res = NULL;
649 
650     FT_CONST FLASH_RDID_TYPE_T *rdid = spi_nand_get_rdid(fid, did, type, &i);
651     if (rdid)
652         res = (const SPI_FLASH_FACT_CFG_T *)&nand_cmd_table_list[i];
653 
654     return res;
655 }
656 
HAL_GET_FLASH_DEFAUT_INX(void)657 __weak int HAL_GET_FLASH_DEFAUT_INX(void)
658 {
659     return -1;
660 }
661 
662 // get default command table if default index valid
spi_nand_get_default_ctable(void)663 const SPI_FLASH_FACT_CFG_T *spi_nand_get_default_ctable(void)
664 {
665     int deft;
666     const SPI_FLASH_FACT_CFG_T *res = NULL;
667 
668     deft = HAL_GET_FLASH_DEFAUT_INX();
669     if (deft >= 0)
670     {
671         res = (const SPI_FLASH_FACT_CFG_T *)&nand_cmd_table_list[deft];
672     }
673 
674     return res;
675 }
676 
677 // get nand size by id from register table
spi_nand_get_size_by_id(uint8_t fid,uint8_t did,uint8_t type)678 int spi_nand_get_size_by_id(uint8_t fid, uint8_t did, uint8_t type)
679 {
680     int res = 0x4000000;
681 
682     FT_CONST FLASH_RDID_TYPE_T *rdid = spi_nand_get_rdid(fid, did, type, NULL);
683     if (rdid)
684         res = rdid->mem_size;
685 
686     return res;
687 }
688 
689 // get plane slect flag by id from register table
spi_nand_get_plane_select_flag(uint8_t fid,uint8_t did,uint8_t type)690 int spi_nand_get_plane_select_flag(uint8_t fid, uint8_t did, uint8_t type)
691 {
692     int res = 0;
693 
694     FT_CONST FLASH_RDID_TYPE_T *rdid = spi_nand_get_rdid(fid, did, type, NULL);
695     if (rdid && (rdid->ext_flags & PLANE_SELEC_FLAG) != 0)
696         res = 1;
697 
698     return res;
699 }
700 
spi_nand_get_big_page_flag(uint8_t fid,uint8_t did,uint8_t type)701 int spi_nand_get_big_page_flag(uint8_t fid, uint8_t did, uint8_t type)
702 {
703     int res = 0;
704 
705     FT_CONST FLASH_RDID_TYPE_T *rdid = spi_nand_get_rdid(fid, did, type, NULL);
706     if (rdid)
707         res = (rdid->ext_flags & (BIG_PAGE_FLAG | BIG_BLK_FLAG)) >> 2;
708     return res;
709 }
710 
spi_nand_get_ecc_mode(uint8_t fid,uint8_t did,uint8_t type)711 int spi_nand_get_ecc_mode(uint8_t fid, uint8_t did, uint8_t type)
712 {
713     int res = 0;
714 
715     FT_CONST FLASH_RDID_TYPE_T *rdid = spi_nand_get_rdid(fid, did, type, NULL);
716     if (rdid)
717         res = (rdid->ext_flags & NAND_ECC_FULL_RESERVED) >> NAND_ECC_START_POS;
718     return res;
719 }