@@ -53,7 +53,31 @@ constexpr int SFDP_BASIC_PARAM_TABLE_ERASE_TYPE_3_SIZE_BYTE = 32; ///< Erase Typ
53
53
constexpr int SFDP_BASIC_PARAM_TABLE_ERASE_TYPE_4_SIZE_BYTE = 34 ; // /< Erase Type 4 Size
54
54
constexpr int SFDP_BASIC_PARAM_TABLE_4K_ERASE_TYPE_BYTE = 1 ; // /< 4 Kilobyte Erase Instruction
55
55
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
+ */
57
81
int sfdp_parse_sfdp_header (sfdp_hdr *sfdp_hdr_ptr)
58
82
{
59
83
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)
69
93
return hdr_cnt;
70
94
}
71
95
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)
73
102
{
74
- if (phdr ->P_MAJOR != 1 ) {
103
+ if (phdr_ptr ->P_MAJOR != 1 ) {
75
104
tr_error (" Param Header: - Major Version should be 1!" );
76
105
return -1 ;
77
106
}
78
107
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 )) {
80
109
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);
83
112
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 )) {
85
114
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 ;
88
117
89
118
} else {
90
119
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 ));
93
122
}
94
123
95
124
return 0 ;
0 commit comments