summaryrefslogtreecommitdiff
path: root/components/drivers/mtd/mtd-cfi.h
blob: daa64debb14d1a989306c02488b56873b543c993 (plain)
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
/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-02-25     GuEe-GUI     the first version
 */

#ifndef __MTD_CFI_H__
#define __MTD_CFI_H__

#include <rtthread.h>

/* Values for the width of the port */
#define FLASH_CFI_8BIT                  0x01
#define FLASH_CFI_16BIT                 0x02
#define FLASH_CFI_32BIT                 0x04
#define FLASH_CFI_64BIT                 0x08
/* Values for the width of the chip */
#define FLASH_CFI_BY8                   0x01
#define FLASH_CFI_BY16                  0x02
#define FLASH_CFI_BY32                  0x04
#define FLASH_CFI_BY64                  0x08
/* Values for the flash device interface */
#define FLASH_CFI_X8                    0x00
#define FLASH_CFI_X16                   0x01
#define FLASH_CFI_X8X16                 0x02
#define FLASH_CFI_X16X32                0x05

/* Convert between bit value and numeric value */
#define FLASH_CFI_SHIFT_WIDTH           3

#define FLASH_CMD_CFI                   0x98
#define FLASH_CMD_READ_ID               0x90
#define FLASH_CMD_RESET                 0xff
#define FLASH_CMD_BLOCK_ERASE           0x20
#define FLASH_CMD_ERASE_CONFIRM         0xd0
#define FLASH_CMD_WRITE                 0x40
#define FLASH_CMD_PROTECT               0x60
#define FLASH_CMD_SETUP                 0x60
#define FLASH_CMD_SET_CR_CONFIRM        0x03
#define FLASH_CMD_PROTECT_SET           0x01
#define FLASH_CMD_PROTECT_CLEAR         0xd0
#define FLASH_CMD_CLEAR_STATUS          0x50
#define FLASH_CMD_READ_STATUS           0x70
#define FLASH_CMD_WRITE_TO_BUFFER       0xe8
#define FLASH_CMD_WRITE_BUFFER_PROG     0xe9
#define FLASH_CMD_WRITE_BUFFER_CONFIRM  0xd0

#define FLASH_STATUS_DONE               0x80
#define FLASH_STATUS_ESS                0x40
#define FLASH_STATUS_ECLBS              0x20
#define FLASH_STATUS_PSLBS              0x10
#define FLASH_STATUS_VPENS              0x08
#define FLASH_STATUS_PSS                0x04
#define FLASH_STATUS_DPS                0x02
#define FLASH_STATUS_R                  0x01
#define FLASH_STATUS_PROTECT            0x01

#define FLASH_CONTINUATION_CODE         0x7f

#define FLASH_OFFSET_MANUFACTURER_ID    0x00
#define FLASH_OFFSET_DEVICE_ID          0x01
#define FLASH_OFFSET_LOWER_SW_BITS      0x0c
#define FLASH_OFFSET_DEVICE_ID2         0x0e
#define FLASH_OFFSET_DEVICE_ID3         0x0f
#define FLASH_OFFSET_CFI                0x55
#define FLASH_OFFSET_CFI_ALT            0x555
#define FLASH_OFFSET_CFI_RESP           0x10    /* "QRY" */
#define FLASH_OFFSET_PRIMARY_VENDOR     0x13    /* Primary OEM command set */
#define FLASH_OFFSET_EXT_QUERY_T_P_ADDR 0x15    /* Extended query table primary address */
#define FLASH_OFFSET_WTOUT              0x1f
#define FLASH_OFFSET_WBTOUT             0x20
#define FLASH_OFFSET_ETOUT              0x21
#define FLASH_OFFSET_CETOUT             0x22
#define FLASH_OFFSET_WMAX_TOUT          0x23
#define FLASH_OFFSET_WBMAX_TOUT         0x24
#define FLASH_OFFSET_EMAX_TOUT          0x25
#define FLASH_OFFSET_CEMAX_TOUT         0x26
#define FLASH_OFFSET_SIZE               0x27    /* 2^N bytes */
#define FLASH_OFFSET_INTERFACE          0x28
#define FLASH_OFFSET_BUFFER_SIZE        0x2a
#define FLASH_OFFSET_NUM_ERASE_REGIONS  0x2c
#define FLASH_OFFSET_ERASE_REGIONS      0x2d
#define FLASH_OFFSET_PROTECT            0x02
#define FLASH_OFFSET_USER_PROTECTION    0x85
#define FLASH_OFFSET_INTEL_PROTECTION   0x81

#define CFI_CMDSET_NONE                 0
#define CFI_CMDSET_INTEL_EXTENDED       1
#define CFI_CMDSET_AMD_STANDARD         2
#define CFI_CMDSET_INTEL_STANDARD       3
#define CFI_CMDSET_AMD_EXTENDED         4
#define CFI_CMDSET_MITSU_STANDARD       256
#define CFI_CMDSET_MITSU_EXTENDED       257
#define CFI_CMDSET_SST                  258
#define CFI_CMDSET_INTEL_PROG_REGIONS   512

#define AMD_CMD_RESET                   0xf0
#define AMD_CMD_WRITE                   0xa0
#define AMD_CMD_ERASE_START             0x80
#define AMD_CMD_ERASE_SECTOR            0x30
#define AMD_CMD_UNLOCK_START            0xaa
#define AMD_CMD_UNLOCK_ACK              0x55
#define AMD_CMD_WRITE_TO_BUFFER         0x25
#define AMD_CMD_WRITE_BUFFER_CONFIRM    0x29
#define AMD_CMD_SET_PPB_ENTRY           0xc0
#define AMD_CMD_SET_PPB_EXIT_BC1        0x90
#define AMD_CMD_SET_PPB_EXIT_BC2        0x00
#define AMD_CMD_PPB_UNLOCK_BC1          0x80
#define AMD_CMD_PPB_UNLOCK_BC2          0x30
#define AMD_CMD_PPB_LOCK_BC1            0xa0
#define AMD_CMD_PPB_LOCK_BC2            0x00

#define AMD_STATUS_TOGGLE               0x40
#define AMD_STATUS_ERROR                0x20

#define ATM_CMD_UNLOCK_SECT             0x70
#define ATM_CMD_SOFTLOCK_START          0x80
#define ATM_CMD_LOCK_SECT               0x40

union cfi_word
{
    rt_uint8_t w8;
    rt_uint16_t w16;
    rt_uint32_t w32;
    rt_uint64_t w64;
};

#ifndef CFI_FLASH_SECT_MAX
#define CFI_FLASH_SECT_MAX              512
#endif

#ifndef CFI_QUERY_ERASE_REGIONS_MAX
#define CFI_QUERY_ERASE_REGIONS_MAX     CFI_FLASH_SECT_MAX
#endif

rt_packed(struct cfi_query
{
    rt_uint8_t query[3];            /* "Q" "R" "Y" */
    rt_uint16_t primary_id;         /* Unaligned */
    rt_uint16_t primary_address;    /* Unaligned */
    rt_uint16_t alternate_id;       /* Unaligned */
    rt_uint16_t alternate_address;  /* Unaligned */
    rt_uint8_t vcc_min;
    rt_uint8_t vcc_max;
    rt_uint8_t vpp_min;
    rt_uint8_t vpp_max;
    rt_uint8_t word_write_timeout_type;
    rt_uint8_t buf_write_timeout_type;
    rt_uint8_t block_erase_timeout_type;
    rt_uint8_t chip_erase_timeout_type;
    rt_uint8_t word_write_timeout_max;
    rt_uint8_t buf_write_timeout_max;
    rt_uint8_t block_erase_timeout_max;
    rt_uint8_t chip_erase_timeout_max;
    rt_uint8_t dev_size;
    rt_uint16_t interface_desc;     /* Aligned */
    rt_uint16_t max_buf_write_size; /* Aligned */
    rt_uint8_t num_erase_regions;
    rt_uint32_t erase_region_info[CFI_QUERY_ERASE_REGIONS_MAX]; /* Unaligned */
});

#endif /* __MTD_CFI_H__ */