/** @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. */ static REDSTATUS DiskWrite( uint8_t bVolNum, uint64_t ullSectorStart, uint32_t ulSectorCount, const void *pBuffer) { REDSTATUS ret = 0; uint32_t ulSectorIdx = 0U; uint32_t ulSectorSize = gaRedVolConf[bVolNum].ulSectorSize; const uint8_t *pbBuffer = CAST_VOID_PTR_TO_CONST_UINT8_PTR(pBuffer); while(ulSectorIdx < ulSectorCount) { uint32_t ulTransfer = REDMIN(ulSectorCount - ulSectorIdx, MAX_SECTOR_TRANSFER); Ctrl_status cs; cs = sd_mmc_ram_2_mem_multi(bVolNum, (uint32_t)(ullSectorStart + ulSectorIdx), (uint16_t)ulTransfer, &pbBuffer[ulSectorIdx * ulSectorSize]); if(cs != CTRL_GOOD) { ret = -RED_EIO; break; } ulSectorIdx += ulTransfer; } return ret; }
void *realloc(void *ptr, size_t size) { void *newptr; size_t oldsize; if(ptr == NULL) { return malloc(size); } oldsize = *((size_t *) (ptr - sizeof(size_t))); if(size == 0) { newptr = NULL; } else { newptr = malloc(size); RedMemCpy(newptr, ptr, REDMIN(size, oldsize)); } free(ptr); return newptr; }
/** @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_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; uint32_t ulSectorIdx = 0U; uint32_t ulSectorSize = gaRedVolConf[bVolNum].ulSectorSize; const uint8_t *pbBuffer = CAST_VOID_PTR_TO_CONST_UINT8_PTR(pBuffer); while(ulSectorIdx < ulSectorCount) { uint32_t ulTransfer = REDMIN(ulSectorCount - ulSectorIdx, MAX_SECTOR_TRANSFER); DRESULT result; result = disk_write(bVolNum, &pbBuffer[ulSectorIdx * ulSectorSize], (DWORD)(ullSectorStart + ulSectorIdx), (BYTE)ulTransfer); if(result != RES_OK) { ret = -RED_EIO; break; } ulSectorIdx += ulTransfer; } return ret; }