14
14
* limitations under the License.
15
15
*/
16
16
17
+ #include " drivers/internal/SFDP.h"
17
18
#include " SPIFBlockDevice.h"
18
19
#include " rtos/ThisThread.h"
19
20
#include " mbed_critical.h"
@@ -133,12 +134,11 @@ int SPIFBlockDevice::init()
133
134
uint8_t vendor_device_ids[4 ];
134
135
size_t data_length = 3 ;
135
136
int status = SPIF_BD_ERROR_OK;
136
- uint32_t basic_table_addr = 0 ;
137
- size_t basic_table_size = 0 ;
138
- uint32_t sector_map_table_addr = 0 ;
139
- size_t sector_map_table_size = 0 ;
137
+ struct sfdp_hdr_info hdr_info;
140
138
spif_bd_error spi_status = SPIF_BD_ERROR_OK;
141
139
140
+ memset (&hdr_info, 0 , sizeof hdr_info);
141
+
142
142
_mutex->lock ();
143
143
144
144
if (!_is_initialized) {
@@ -186,15 +186,15 @@ int SPIFBlockDevice::init()
186
186
}
187
187
188
188
/* *************************** Parse SFDP Header ***********************************/
189
- if (0 != _sfdp_parse_sfdp_headers (basic_table_addr, basic_table_size, sector_map_table_addr, sector_map_table_size )) {
189
+ if (0 != _sfdp_parse_sfdp_headers (hdr_info )) {
190
190
tr_error (" init - Parse SFDP Headers Failed" );
191
191
status = SPIF_BD_ERROR_PARSING_FAILED;
192
192
goto exit_point;
193
193
}
194
194
195
195
196
196
/* *************************** Parse Basic Parameters Table ***********************************/
197
- if (0 != _sfdp_parse_basic_param_table (basic_table_addr, basic_table_size)) {
197
+ if (0 != _sfdp_parse_basic_param_table (hdr_info. basic_table_addr , hdr_info. basic_table_size )) {
198
198
tr_error (" init - Parse Basic Param Table Failed" );
199
199
status = SPIF_BD_ERROR_PARSING_FAILED;
200
200
goto exit_point;
@@ -205,10 +205,10 @@ int SPIFBlockDevice::init()
205
205
_device_size_bytes; // If there's no region map, we have a single region sized the entire device size
206
206
_region_high_boundary[0 ] = _device_size_bytes - 1 ;
207
207
208
- if ((sector_map_table_addr != 0 ) && (0 != sector_map_table_size)) {
209
- tr_debug (" init - Parsing Sector Map Table - addr: 0x%" PRIx32 " h, Size: %d" , sector_map_table_addr,
210
- sector_map_table_size);
211
- if (0 != _sfdp_parse_sector_map_table (sector_map_table_addr, sector_map_table_size)) {
208
+ if ((hdr_info. sector_map_table_addr != 0 ) && (0 != hdr_info. sector_map_table_size )) {
209
+ tr_debug (" init - Parsing Sector Map Table - addr: 0x%" PRIx32 " h, Size: %d" , hdr_info. sector_map_table_addr ,
210
+ hdr_info. sector_map_table_size );
211
+ if (0 != _sfdp_parse_sector_map_table (hdr_info. sector_map_table_addr , hdr_info. sector_map_table_size )) {
212
212
tr_error (" init - Parse Sector Map Table Failed" );
213
213
status = SPIF_BD_ERROR_PARSING_FAILED;
214
214
goto exit_point;
@@ -719,73 +719,57 @@ int SPIFBlockDevice::_sfdp_parse_basic_param_table(uint32_t basic_table_addr, si
719
719
return 0 ;
720
720
}
721
721
722
- int SPIFBlockDevice::_sfdp_parse_sfdp_headers (uint32_t &basic_table_addr, size_t &basic_table_size,
723
- uint32_t §or_map_table_addr, size_t §or_map_table_size)
722
+ int SPIFBlockDevice::_sfdp_parse_sfdp_headers (sfdp_hdr_info &hdr_info)
724
723
{
725
- uint8_t sfdp_header[16 ];
726
- uint8_t param_header[SPIF_SFDP_HEADER_SIZE];
727
- size_t data_length = SPIF_SFDP_HEADER_SIZE;
728
724
bd_addr_t addr = 0x0 ;
725
+ int number_of_param_headers = 0 ;
726
+ size_t data_length;
729
727
730
- // Set 1-1-1 bus mode for SFDP header parsing
731
- // Initial SFDP read tables are read with 8 dummy cycles
732
- _read_dummy_and_mode_cycles = 8 ;
733
- _dummy_and_mode_cycles = 8 ;
734
-
735
- spif_bd_error status = _spi_send_read_command (SPIF_SFDP, sfdp_header, addr /* address*/ , data_length);
736
- if (status != SPIF_BD_ERROR_OK) {
737
- tr_error (" init - Read SFDP Failed" );
738
- return -1 ;
739
- }
740
-
741
- // Verify SFDP signature for sanity
742
- // Also check that major/minor version is acceptable
743
- if (!(memcmp (&sfdp_header[0 ], " SFDP" , 4 ) == 0 && sfdp_header[5 ] == 1 )) {
744
- tr_error (" init - _verify SFDP signature and version Failed" );
745
- return -1 ;
746
- } else {
747
- tr_debug (" init - verified SFDP Signature and version Successfully" );
748
- }
749
-
750
- // Discover Number of Parameter Headers
751
- int number_of_param_headers = (int )(sfdp_header[6 ]) + 1 ;
752
- tr_debug (" number of Param Headers: %d" , number_of_param_headers);
728
+ {
729
+ data_length = SPIF_SFDP_HEADER_SIZE;
730
+ uint8_t sfdp_header[SPIF_SFDP_HEADER_SIZE];
753
731
754
- addr += SPIF_SFDP_HEADER_SIZE;
755
- data_length = SPIF_PARAM_HEADER_SIZE;
756
-
757
- // Loop over Param Headers and parse them (currently supported Basic Param Table and Sector Region Map Table)
758
- for (int i_ind = 0 ; i_ind < number_of_param_headers; i_ind++) {
732
+ // Set 1-1-1 bus mode for SFDP header parsing
733
+ // Initial SFDP read tables are read with 8 dummy cycles
734
+ _read_dummy_and_mode_cycles = 8 ;
735
+ _dummy_and_mode_cycles = 8 ;
759
736
760
- status = _spi_send_read_command (SPIF_SFDP, param_header , addr, data_length);
737
+ spif_bd_error status = _spi_send_read_command (SPIF_SFDP, sfdp_header , addr /* address */ , data_length);
761
738
if (status != SPIF_BD_ERROR_OK) {
762
- tr_error (" init - Read Param Table %d Failed" , i_ind + 1 );
739
+ tr_error (" init - Read SFDP Failed" );
763
740
return -1 ;
764
741
}
765
742
766
- // The SFDP spec indicates the standard table is always at offset 0
767
- // in the parameter headers, we check just to be safe
768
- if (param_header[2 ] != 1 ) {
769
- tr_error (" Param Table %d - Major Version should be 1!" , i_ind + 1 );
770
- return -1 ;
743
+ number_of_param_headers = sfdp_parse_sfdp_header ((sfdp_hdr *)sfdp_header);
744
+ if (number_of_param_headers < 0 ) {
745
+ return number_of_param_headers;
771
746
}
747
+ }
772
748
773
- if ((param_header[0 ] == 0 ) && (param_header[7 ] == 0xFF )) {
774
- tr_debug (" Parameter Header %d: Basic Parameter Header" , i_ind);
775
- basic_table_addr = ((param_header[6 ] << 16 ) | (param_header[5 ] << 8 ) | (param_header[4 ]));
776
- // Supporting up to 64 Bytes Table (16 DWORDS)
777
- basic_table_size = ((param_header[3 ] * 4 ) < SFDP_DEFAULT_BASIC_PARAMS_TABLE_SIZE_BYTES) ? (param_header[3 ] * 4 ) : 64 ;
749
+ addr += SPIF_SFDP_HEADER_SIZE;
778
750
779
- } else if ((param_header[0 ] == 0x81 ) && (param_header[7 ] == 0xFF )) {
780
- tr_debug (" Parameter Header %d: Sector Map Parameter Header" , i_ind);
781
- sector_map_table_addr = ((param_header[6 ] << 16 ) | (param_header[5 ] << 8 ) | (param_header[4 ]));
782
- sector_map_table_size = param_header[3 ] * 4 ;
751
+ {
752
+ data_length = SPIF_PARAM_HEADER_SIZE;
753
+ uint8_t param_header[SPIF_SFDP_HEADER_SIZE];
754
+ spif_bd_error status;
755
+ int hdr_status;
783
756
784
- } else {
785
- tr_debug (" Parameter Header %d: Vendor specific or unknown header" , i_ind);
786
- }
787
- addr += SPIF_PARAM_HEADER_SIZE;
757
+ // Loop over Param Headers and parse them (currently supported Basic Param Table and Sector Region Map Table)
758
+ for (int i_ind = 0 ; i_ind < number_of_param_headers; i_ind++) {
759
+
760
+ status = _spi_send_read_command (SPIF_SFDP, param_header, addr, data_length);
761
+ if (status != SPIF_BD_ERROR_OK) {
762
+ tr_error (" init - Read Param Table %d Failed" , i_ind + 1 );
763
+ return -1 ;
764
+ }
788
765
766
+ hdr_status = sfdp_parse_single_param_header ((sfdp_prm_hdr *)param_header, hdr_info);
767
+ if (hdr_status < 0 ) {
768
+ return hdr_status;
769
+ }
770
+
771
+ addr += SPIF_PARAM_HEADER_SIZE;
772
+ }
789
773
}
790
774
return 0 ;
791
775
}
0 commit comments