hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*
 * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
 *
 * SPDX-License-Identifier:    GPL-2.0
 */
 
#ifndef _SFC_NOR_H
#define _SFC_NOR_H
 
#include "sfc.h"
 
#define NOR_PAGE_SIZE        256
#define NOR_BLOCK_SIZE        (64 * 1024)
#define NOR_SECS_BLK        (NOR_BLOCK_SIZE / 512)
#define NOR_SECS_PAGE        8
 
#define FEA_READ_STATUE_MASK    (0x3 << 0)
#define FEA_STATUE_MODE1    0
#define FEA_STATUE_MODE2    1
#define FEA_4BIT_READ        BIT(2)
#define FEA_4BIT_PROG        BIT(3)
#define FEA_4BYTE_ADDR        BIT(4)
#define FEA_4BYTE_ADDR_MODE    BIT(5)
 
/*Command Set*/
#define CMD_READ_JEDECID        (0x9F)
#define CMD_READ_DATA           (0x03)
#define CMD_READ_STATUS         (0x05)
#define CMD_WRITE_STATUS        (0x01)
#define CMD_PAGE_PROG           (0x02)
#define CMD_SECTOR_ERASE        (0x20)
#define CMD_BLK64K_ERASE        (0xD8)
#define CMD_BLK32K_ERASE        (0x52)
#define CMD_CHIP_ERASE          (0xC7)
#define CMD_WRITE_EN            (0x06)
#define CMD_WRITE_DIS           (0x04)
#define CMD_PAGE_READ           (0x13)
#define CMD_PAGE_FASTREAD4B     (0x0C)
#define CMD_GET_FEATURE         (0x0F)
#define CMD_SET_FEATURE         (0x1F)
#define CMD_PROG_LOAD           (0x02)
#define CMD_PROG_EXEC           (0x10)
#define CMD_BLOCK_ERASE         (0xD8)
#define CMD_READ_DATA_X2        (0x3B)
#define CMD_READ_DATA_X4        (0x6B)
#define CMD_PROG_LOAD_X4        (0x32)
#define CMD_READ_STATUS2        (0x35)
#define CMD_READ_STATUS3        (0x15)
#define CMD_WRITE_STATUS2       (0x31)
#define CMD_WRITE_STATUS3       (0x11)
/* X1 cmd, X1 addr, X1 data */
#define CMD_FAST_READ_X1        (0x0B)
/* X1 cmd, X1 addr, X2 data */
#define CMD_FAST_READ_X2        (0x3B)
/* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
#define CMD_FAST_READ_X4        (0x6B)
/* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
#define CMD_FAST_4READ_X4       (0x6C)
/* X1 cmd, X4 addr, X4 data SUPPORT EON GD MARCONIX WINBOND */
#define CMD_FAST_READ_A4        (0xEB)
/* X1 cmd, X1 addr, X4 data, SUPPORT GD WINBOND */
#define CMD_PAGE_PROG_X4        (0x32)
/* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
#define CMD_PAGE_PROG_A4        (0x38)
/* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
#define CMD_PAGE_PROG_4PP       (0x3E)
#define CMD_RESET_NAND          (0xFF)
#define CMD_ENTER_4BYTE_MODE    (0xB7)
#define CMD_EXIT_4BYTE_MODE     (0xE9)
#define CMD_ENABLE_RESER    (0x66)
#define CMD_RESET_DEVICE    (0x99)
#define CMD_READ_PARAMETER    (0x5A)
 
enum NOR_ERASE_TYPE {
   ERASE_SECTOR = 0,
   ERASE_BLOCK64K,
   ERASE_CHIP
};
 
enum SNOR_IO_MODE {
   IO_MODE_SPI = 0,
   IO_MODE_QPI
};
 
enum SNOR_READ_MODE {
   READ_MODE_NOMAL = 0,
   READ_MODE_FAST
};
 
enum SNOR_ADDR_MODE {
   ADDR_MODE_3BYTE = 0,
   ADDR_MODE_4BYTE
};
 
typedef int (*SNOR_WRITE_STATUS)(u32 reg_index, u8 status);
 
struct SFNOR_DEV {
   u32    capacity;
   u8    manufacturer;
   u8    mem_type;
   u16    page_size;
   u32    blk_size;
 
   u8    read_cmd;
   u8    prog_cmd;
   u8    sec_erase_cmd;
   u8    blk_erase_cmd;
   u8    QE_bits;
 
   enum SNOR_READ_MODE  read_mode;
   enum SNOR_ADDR_MODE  addr_mode;
   enum SNOR_IO_MODE    io_mode;
 
   enum SFC_DATA_LINES read_lines;
   enum SFC_DATA_LINES prog_lines;
   enum SFC_DATA_LINES prog_addr_lines;
 
   SNOR_WRITE_STATUS write_status;
   u32 max_iosize;
};
 
struct flash_info {
   u32 id;
 
   u8 block_size;
   u8 sector_size;
   u8 read_cmd;
   u8 prog_cmd;
 
   u8 read_cmd_4;
   u8 prog_cmd_4;
   u8 sector_erase_cmd;
   u8 block_erase_cmd;
 
   u8 feature;
   u8 density;  /* (1 << density) sectors*/
   u8 QE_bits;
   u8 reserved2;
};
 
/* flash table packet for easy boot */
#define SNOR_INFO_PACKET_ID    0x464E494E
#define SNOR_INFO_PACKET_HEAD_LEN    14
 
#define SNOR_INFO_PACKET_SPI_MODE_RATE_SHIFT    25
 
struct snor_info_packet {
   u32 id;
   u32 head_hash; /*hash for head, check by bootrom.*/
   u16 head_len;  /*320 - 16 bytes*/
   u16 version;
   u8 read_cmd;
   u8 prog_cmd;
   u8 read_cmd_4;
   u8 prog_cmd_4;
 
   u8 sector_erase_cmd;
   u8 block_erase_cmd;
   u8 feature;
   u8 QE_bits;
 
   u32 spi_mode;
};
 
int snor_init(struct SFNOR_DEV *p_dev);
u32 snor_get_capacity(struct SFNOR_DEV *p_dev);
int snor_read(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
int snor_write(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
int snor_erase(struct SFNOR_DEV *p_dev,
          u32 addr,
          enum NOR_ERASE_TYPE erase_type);
int snor_read_id(u8 *data);
int snor_prog_page(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
int snor_read_data(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
int snor_reset_device(void);
int snor_disable_QE(struct SFNOR_DEV *p_dev);
int snor_reinit_from_table_packet(struct SFNOR_DEV *p_dev,
                 struct snor_info_packet *packet);
#endif