Skip to content

Commit 107f003

Browse files
author
Veijo Pesonen
committed
SFDP: sanitizes API
1 parent d3b65d5 commit 107f003

File tree

2 files changed

+43
-48
lines changed

2 files changed

+43
-48
lines changed

drivers/internal/SFDP.h

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ namespace mbed {
3333
* @{
3434
*/
3535

36-
static const int SFDP_HEADER_SIZE = 8; ///< Size of an SFDP header in bytes, 2 DWORDS
37-
static const int SFDP_BASIC_PARAMS_TBL_SIZE = 80; ///< Basic Parameter Table size in bytes, 20 DWORDS
38-
static const int SFDP_SECTOR_MAP_MAX_REGIONS = 10; ///< Maximum number of regions with different erase granularity
36+
constexpr int SFDP_HEADER_SIZE = 8; ///< Size of an SFDP header in bytes, 2 DWORDS
37+
constexpr int SFDP_BASIC_PARAMS_TBL_SIZE = 80; ///< Basic Parameter Table size in bytes, 20 DWORDS
38+
constexpr int SFDP_SECTOR_MAP_MAX_REGIONS = 10; ///< Maximum number of regions with different erase granularity
3939

4040
// Erase Types Per Region BitMask
4141
constexpr int SFDP_ERASE_BITMASK_TYPE4 = 0x08; ///< Erase type 4 (erase granularity) identifier
@@ -73,40 +73,6 @@ struct sfdp_hdr_info {
7373
sfdp_smptbl_info smptbl;
7474
};
7575

76-
/** SFDP Header */
77-
struct sfdp_hdr {
78-
uint8_t SIG_B0; ///< SFDP Signature, Byte 0
79-
uint8_t SIG_B1; ///< SFDP Signature, Byte 1
80-
uint8_t SIG_B2; ///< SFDP Signature, Byte 2
81-
uint8_t SIG_B3; ///< SFDP Signature, Byte 3
82-
uint8_t R_MINOR; ///< SFDP Minor Revision
83-
uint8_t R_MAJOR; ///< SFDP Major Revision
84-
uint8_t NPH; ///< Number of parameter headers (0-based, 0 indicates 1 parameter header)
85-
uint8_t ACP; ///< SFDP Access Protocol
86-
};
87-
88-
/** SFDP Parameter header */
89-
struct sfdp_prm_hdr {
90-
uint8_t PID_LSB; ///< Parameter ID LSB
91-
uint8_t P_MINOR; ///< Parameter Minor Revision
92-
uint8_t P_MAJOR; ///< Parameter Major Revision
93-
uint8_t P_LEN; ///< Parameter length in DWORDS
94-
uint32_t DWORD2; ///< Parameter ID MSB + Parameter Table Pointer
95-
};
96-
97-
/** Parse SFDP Header
98-
* @param sfdp_hdr_ptr Pointer to memory holding an SFDP header
99-
* @return Number of Parameter Headers on success, -1 on failure
100-
*/
101-
int sfdp_parse_sfdp_header(sfdp_hdr *sfdp_hdr_ptr);
102-
103-
/** Parse Parameter Header
104-
* @param parameter_header Pointer to memory holding a single SFDP Parameter header
105-
* @param hdr_info Reference to a Parameter Table structure where info about the table is written
106-
* @return 0 on success, -1 on failure
107-
*/
108-
int sfdp_parse_single_param_header(sfdp_prm_hdr *parameter_header, sfdp_hdr_info &hdr_info);
109-
11076
/** Parse SFDP Headers
11177
* Retrieves SFDP headers from a device and parses the information contained by the headers
11278
*

drivers/source/SFDP.cpp

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,31 @@ constexpr int SFDP_BASIC_PARAM_TABLE_ERASE_TYPE_3_SIZE_BYTE = 32; ///< Erase Typ
5353
constexpr int SFDP_BASIC_PARAM_TABLE_ERASE_TYPE_4_SIZE_BYTE = 34; ///< Erase Type 4 Size
5454
constexpr int SFDP_BASIC_PARAM_TABLE_4K_ERASE_TYPE_BYTE = 1; ///< 4 Kilobyte Erase Instruction
5555

56-
/* Verifies SFDP Header and return number of parameter headers */
56+
/** SFDP Header */
57+
struct sfdp_hdr {
58+
uint8_t SIG_B0; ///< SFDP Signature, Byte 0
59+
uint8_t SIG_B1; ///< SFDP Signature, Byte 1
60+
uint8_t SIG_B2; ///< SFDP Signature, Byte 2
61+
uint8_t SIG_B3; ///< SFDP Signature, Byte 3
62+
uint8_t R_MINOR; ///< SFDP Minor Revision
63+
uint8_t R_MAJOR; ///< SFDP Major Revision
64+
uint8_t NPH; ///< Number of parameter headers (0-based, 0 indicates 1 parameter header)
65+
uint8_t ACP; ///< SFDP Access Protocol
66+
};
67+
68+
/** SFDP Parameter header */
69+
struct sfdp_prm_hdr {
70+
uint8_t PID_LSB; ///< Parameter ID LSB
71+
uint8_t P_MINOR; ///< Parameter Minor Revision
72+
uint8_t P_MAJOR; ///< Parameter Major Revision
73+
uint8_t P_LEN; ///< Parameter length in DWORDS
74+
uint32_t DWORD2; ///< Parameter ID MSB + Parameter Table Pointer
75+
};
76+
77+
/** Parse SFDP Header
78+
* @param sfdp_hdr_ptr Pointer to memory holding an SFDP header
79+
* @return Number of Parameter Headers on success, -1 on failure
80+
*/
5781
int sfdp_parse_sfdp_header(sfdp_hdr *sfdp_hdr_ptr)
5882
{
5983
if (!(memcmp(sfdp_hdr_ptr, "SFDP", 4) == 0 && sfdp_hdr_ptr->R_MAJOR == 1)) {
@@ -69,27 +93,32 @@ int sfdp_parse_sfdp_header(sfdp_hdr *sfdp_hdr_ptr)
6993
return hdr_cnt;
7094
}
7195

72-
int sfdp_parse_single_param_header(sfdp_prm_hdr *phdr, sfdp_hdr_info &hdr_info)
96+
/** Parse Parameter Header
97+
* @param phdr_ptr Pointer to memory holding a single SFDP Parameter header
98+
* @param hdr_info Reference to a Parameter Table structure where info about the table is written
99+
* @return 0 on success, -1 on failure
100+
*/
101+
int sfdp_parse_single_param_header(sfdp_prm_hdr *phdr_ptr, sfdp_hdr_info &hdr_info)
73102
{
74-
if (phdr->P_MAJOR != 1) {
103+
if (phdr_ptr->P_MAJOR != 1) {
75104
tr_error("Param Header: - Major Version should be 1!");
76105
return -1;
77106
}
78107

79-
if ((phdr->PID_LSB == 0) && (sfdp_get_param_id_msb(phdr->DWORD2) == 0xFF)) {
108+
if ((phdr_ptr->PID_LSB == 0) && (sfdp_get_param_id_msb(phdr_ptr->DWORD2) == 0xFF)) {
80109
tr_debug("Parameter Header: Basic Parameter Header");
81-
hdr_info.bptbl.addr = sfdp_get_param_tbl_ptr(phdr->DWORD2);
82-
hdr_info.bptbl.size = std::min((phdr->P_LEN * 4), SFDP_BASIC_PARAMS_TBL_SIZE);
110+
hdr_info.bptbl.addr = sfdp_get_param_tbl_ptr(phdr_ptr->DWORD2);
111+
hdr_info.bptbl.size = std::min((phdr_ptr->P_LEN * 4), SFDP_BASIC_PARAMS_TBL_SIZE);
83112

84-
} else if ((phdr->PID_LSB == 0x81) && (sfdp_get_param_id_msb(phdr->DWORD2) == 0xFF)) {
113+
} else if ((phdr_ptr->PID_LSB == 0x81) && (sfdp_get_param_id_msb(phdr_ptr->DWORD2) == 0xFF)) {
85114
tr_debug("Parameter Header: Sector Map Parameter Header");
86-
hdr_info.smptbl.addr = sfdp_get_param_tbl_ptr(phdr->DWORD2);
87-
hdr_info.smptbl.size = phdr->P_LEN * 4;
115+
hdr_info.smptbl.addr = sfdp_get_param_tbl_ptr(phdr_ptr->DWORD2);
116+
hdr_info.smptbl.size = phdr_ptr->P_LEN * 4;
88117

89118
} else {
90119
tr_debug("Parameter Header vendor specific or unknown. Parameter ID LSB: 0x%" PRIX8 "; MSB: 0x%" PRIX8 "",
91-
phdr->PID_LSB,
92-
sfdp_get_param_id_msb(phdr->DWORD2));
120+
phdr_ptr->PID_LSB,
121+
sfdp_get_param_id_msb(phdr_ptr->DWORD2));
93122
}
94123

95124
return 0;

0 commit comments

Comments
 (0)