/** @brief Read sectors from a disk. @param bVolNum The volume number of the volume whose block device is being read from. @param ullSectorStart The starting sector number. @param ulSectorCount The number of sectors to read. @param pBuffer The buffer into which to read the sector data. @return A negated ::REDSTATUS code indicating the operation result. @retval 0 Operation was successful. @retval -RED_EIO A disk I/O error occurred. */ static REDSTATUS DiskRead( uint8_t bVolNum, uint64_t ullSectorStart, uint32_t ulSectorCount, void *pBuffer) { REDSTATUS ret = 0; F_DRIVER *pDriver = gapFDriver[bVolNum]; if(pDriver == NULL) { ret = -RED_EINVAL; } else { uint8_t *pbBuffer = CAST_VOID_PTR_TO_UINT8_PTR(pBuffer); uint32_t ulSectorSize = gaRedVolConf[bVolNum].ulSectorSize; uint32_t ulSectorIdx; int iErr; for(ulSectorIdx = 0U; ulSectorIdx < ulSectorCount; ulSectorIdx++) { iErr = pDriver->readsector(pDriver, &pbBuffer[ulSectorIdx * ulSectorSize], CAST_ULONG(ullSectorStart + ulSectorCount)); if(iErr != 0) { ret = -RED_EIO; break; } } } return ret; }
/** @brief Write sectors to a disk. @param bVolNum The volume number of the volume whose block device is being written to. @param ullSectorStart The starting sector number. @param ulSectorCount The number of sectors to write. @param pBuffer The buffer from which to write the sector data. @return A negated ::REDSTATUS code indicating the operation result. @retval 0 Operation was successful. @retval -RED_EINVAL The block device is not open. @retval -RED_EIO A disk I/O error occurred. */ static REDSTATUS DiskWrite( uint8_t bVolNum, uint64_t ullSectorStart, uint32_t ulSectorCount, const void *pBuffer) { REDSTATUS ret = 0; F_DRIVER *pDriver = gapFDriver[bVolNum]; if(pDriver == NULL) { ret = -RED_EINVAL; } else { const uint8_t *pbBuffer = CAST_VOID_PTR_TO_CONST_UINT8_PTR(pBuffer); uint32_t ulSectorSize = gaRedVolConf[bVolNum].ulSectorSize; uint32_t ulSectorIdx; int iErr; for(ulSectorIdx = 0U; ulSectorIdx < ulSectorCount; ulSectorIdx++) { /* We have to cast pbBuffer to non-const since the writesector prototype is flawed, using a non-const pointer for the buffer. */ iErr = pDriver->writesector(pDriver, CAST_AWAY_CONST(uint8_t, &pbBuffer[ulSectorIdx * ulSectorSize]), CAST_ULONG(ullSectorStart + ulSectorCount)); if(iErr != 0) { ret = -RED_EIO; break; } } } return ret; }