1 /* all about gd factory */
2 
3 #include <string.h>
4 #include <stdlib.h>
5 #include <time.h>
6 #include <pthread.h>
7 #include <errno.h>
8 #include <unistd.h>
9 #include <hal_timer.h>
10 
11 #include "inter.h"
12 
13 #define NOR_GD_QE_BIT BIT(1)
14 #define NOR_GD_CMP_BIT BIT(6)
15 #define NOR_GD_CMD_RDSR2 0x35
16 #define NOR_GD_CMD_WRSR2 0x31
17 
18 static struct nor_info idt_gd[] =
19 {
20     {
21         .model = "GD25Q127C",
22         .id = {0xc8, 0x40, 0x18},
23         .total_size = SZ_16M,
24         .flag = SUPPORT_GENERAL,
25     },
26     {
27         .model = "GD25Q256",
28         .id = {0xc8, 0x40, 0x19},
29         .total_size = SZ_16M,
30         .flag = SUPPORT_GENERAL,
31     },
32 };
33 
nor_gd_quad_mode(struct nor_flash * unused)34 static int nor_gd_quad_mode(struct nor_flash *unused)
35 {
36     int ret;
37     unsigned char cmd[3];
38     char reg[2] = {0};
39 
40     cmd[0] = NOR_GD_CMD_RDSR2;
41     ret = nor_transfer(1, cmd, 1, reg, 2);
42     if (ret) {
43         SPINOR_ERR("read status register2 fail\n");
44         return ret;
45     }
46 
47     if (reg[1] & NOR_GD_QE_BIT)
48         return 0;
49 
50     ret = nor_write_enable();
51     if (ret)
52         return ret;
53 
54     cmd[0] = NOR_GD_CMD_WRSR2;
55     cmd[1] = reg[1] | NOR_GD_QE_BIT;
56     ret = nor_transfer(2, cmd, 2, NULL, 0);
57     if (ret) {
58         SPINOR_ERR("set status register fail\n");
59         return ret;
60     }
61 
62     if (nor_wait_ready(0, 500)) {
63         SPINOR_ERR("wait set qd mode failed\n");
64         return -EBUSY;
65     }
66 
67     cmd[0] = NOR_GD_CMD_RDSR2;
68     ret = nor_transfer(1, cmd, 1, reg, 2);
69     if (ret) {
70         SPINOR_ERR("read status register2 fail\n");
71         return ret;
72     }
73 
74     if (!(reg[1] & NOR_GD_QE_BIT)) {
75         SPINOR_ERR("set gd QE failed\n");
76         return -EINVAL;
77     }
78     return 0;
79 }
80 
81 static struct nor_factory nor_gd = {
82     .factory = FACTORY_GD,
83     .idt = idt_gd,
84     .idt_cnt = sizeof(idt_gd),
85 
86     .init = NULL,
87     .deinit = NULL,
88     .init_lock = NULL,
89     .deinit_lock = NULL,
90     .lock = NULL,
91     .unlock = NULL,
92     .islock = NULL,
93     .set_quad_mode = nor_gd_quad_mode,
94     .set_4bytes_addr = NULL,
95 };
96 
nor_register_factory_gd(void)97 int nor_register_factory_gd(void)
98 {
99     return nor_register_factory(&nor_gd);
100 }
101