bool sd_mmc_spi_read_word(uint32_t* value) { uint16_t dummy = 0xFF; sd_mmc_spi_err = SD_MMC_SPI_NO_ERR; Assert(sd_mmc_spi_nb_block > (sd_mmc_spi_transfert_pos / sd_mmc_spi_block_size)); if (!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size)) { // New block if (!sd_mmc_spi_start_read_block()) { return false; } } // Read data spi_read_buffer_wait(&sd_mmc_master, (uint8_t *)&value, 4, dummy); *value = le32_to_cpu(*value); sd_mmc_spi_transfert_pos += 4; if (!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size)) { // End of block sd_mmc_spi_stop_read_block(); } return true; }
bool sd_mmc_spi_start_read_blocks(void *dest, uint16_t nb_block) { uint32_t pos; sd_mmc_spi_err = SD_MMC_SPI_NO_ERR; pos = 0; while (nb_block--) { Assert(sd_mmc_spi_nb_block > (sd_mmc_spi_transfert_pos / sd_mmc_spi_block_size)); if (!sd_mmc_spi_start_read_block()) { return false; } // Read block sspi_read_packet(&((uint8_t*)dest)[pos], sd_mmc_spi_block_size); pos += sd_mmc_spi_block_size; sd_mmc_spi_transfert_pos += sd_mmc_spi_block_size; sd_mmc_spi_stop_read_block(); } return true; }
bool sd_mmc_spi_read_word(uint32_t* value) { sd_mmc_spi_err = SD_MMC_SPI_NO_ERR; Assert(sd_mmc_spi_nb_block > (sd_mmc_spi_transfert_pos / sd_mmc_spi_block_size)); if (!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size)) { // New block if (!sd_mmc_spi_start_read_block()) { return false; } } // Read data sspi_read_packet((uint8_t*)value, 4); *value = le32_to_cpu(*value); sd_mmc_spi_transfert_pos += 4; if (!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size)) { // End of block sd_mmc_spi_stop_read_block(); } return true; }
bool sd_mmc_spi_start_read_blocks(void *dest, uint16_t nb_block) { uint32_t pos; uint16_t dummy = 0xFF; sd_mmc_spi_err = SD_MMC_SPI_NO_ERR; pos = 0; while (nb_block--) { Assert(sd_mmc_spi_nb_block > (sd_mmc_spi_transfert_pos / sd_mmc_spi_block_size)); if (!sd_mmc_spi_start_read_block()) { return false; } // Read block spi_read_buffer_wait(&sd_mmc_master, &((uint8_t*)dest)[pos], sd_mmc_spi_block_size, dummy); pos += sd_mmc_spi_block_size; sd_mmc_spi_transfert_pos += sd_mmc_spi_block_size; sd_mmc_spi_stop_read_block(); } return true; }