int ChainingBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size) { MBED_ASSERT(is_valid_read(addr, size)); if (!_is_initialized) { return BD_ERROR_DEVICE_ERROR; } uint8_t *buffer = static_cast<uint8_t *>(b); // Find block devices containing blocks, may span multiple block devices for (size_t i = 0; i < _bd_count && size > 0; i++) { bd_size_t bdsize = _bds[i]->size(); if (addr < bdsize) { bd_size_t read = size; if (addr + read > bdsize) { read = bdsize - addr; } int err = _bds[i]->read(buffer, addr, read); if (err) { return err; } buffer += read; addr += read; size -= read; } addr -= bdsize; } return 0; }
int HeapBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size) { MBED_ASSERT(_blocks != NULL); MBED_ASSERT(is_valid_read(addr, size)); if (!_is_initialized) { return BD_ERROR_DEVICE_ERROR; } uint8_t *buffer = static_cast<uint8_t *>(b); while (size > 0) { bd_addr_t hi = addr / _erase_size; bd_addr_t lo = addr % _erase_size; if (_blocks[hi]) { memcpy(buffer, &_blocks[hi][lo], _read_size); } else { memset(buffer, 0, _read_size); } buffer += _read_size; addr += _read_size; size -= _read_size; } return 0; }
int SlicingBlockDevice::read(void *b, bd_addr_t addr, bd_size_t size) { MBED_ASSERT(is_valid_read(addr, size)); return _bd->read(b, addr + _start, size); }