@@ -53,7 +53,31 @@ constexpr int SFDP_BASIC_PARAM_TABLE_ERASE_TYPE_3_SIZE_BYTE = 32; ///< Erase Typ
5353constexpr int SFDP_BASIC_PARAM_TABLE_ERASE_TYPE_4_SIZE_BYTE = 34 ; // /< Erase Type 4 Size
5454constexpr 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+ */
5781int 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