static inline void lpc_sdmmc_verify(CORE* core) { SHA1_CTX sha1; uint8_t hash_in[SHA1_BLOCK_SIZE]; if ((core->sdmmc.state != SDMMC_STATE_VERIFY) && (core->sdmmc.state != SDMMC_STATE_WRITE_VERIFY)) return; sha1_init(&sha1); sha1_update(&sha1, io_data(core->sdmmc.io), core->sdmmc.total); sha1_final(&sha1, core->sdmmc.state == SDMMC_STATE_VERIFY ? hash_in : core->sdmmc.hash); if (core->sdmmc.state == SDMMC_STATE_WRITE_VERIFY) { core->sdmmc.state = SDMMC_STATE_VERIFY; lpc_sdmmc_prepare_descriptors(core); if (sdmmcs_read(&core->sdmmc.sdmmcs, core->sdmmc.sector, core->sdmmc.total / core->sdmmc.sdmmcs.sector_size)) return; } else { if (memcmp(core->sdmmc.hash, hash_in, SHA1_BLOCK_SIZE) == 0) { io_complete(core->sdmmc.process, HAL_IO_CMD(HAL_SDMMC, IPC_WRITE), core->sdmmc.user, core->sdmmc.io); core->sdmmc.io = NULL; core->sdmmc.process = INVALID_HANDLE; core->sdmmc.state = SDMMC_STATE_IDLE; return; } } io_complete_ex(core->sdmmc.process, HAL_IO_CMD(HAL_SDMMC, IPC_WRITE), core->sdmmc.user, core->sdmmc.io, get_last_error()); core->sdmmc.io = NULL; core->sdmmc.process = INVALID_HANDLE; core->sdmmc.state = SDMMC_STATE_IDLE; }
static void udps_flush(TCPIPS* tcpips, HANDLE handle) { IO* io; UDP_HANDLE* uh; int err; uh = so_get(&tcpips->udps.handles, handle); if (uh == NULL) return; err = ERROR_IO_CANCELLED; #if (ICMP) if (uh->err != ERROR_OK) err = uh->err; #endif //ICMP while ((io = udps_peek_head(tcpips, uh)) != NULL) io_complete_ex(uh->process, HAL_CMD(HAL_UDP, IPC_READ), handle, io, err); }
bool lpc_usb_ep_flush(CORE* core, int num) { EP* ep = ep_data(core, num); if (ep == NULL) { error(ERROR_NOT_CONFIGURED); return false; } ep->io_active = false; lpc_usb_ep_reset(core, num); if (ep->io != NULL) { io_complete_ex(core->usb.device, HAL_IO_CMD(HAL_USB, (num & USB_EP_IN) ? IPC_WRITE : IPC_READ), num, ep->io, ERROR_IO_CANCELLED); ep->io = NULL; } return true; }
static void lpc_sdmmc_flush(CORE* core) { IO* io; HANDLE process; SDMMC_STATE state = SDMMC_STATE_IDLE; __disable_irq(); if (core->sdmmc.state != SDMMC_STATE_IDLE) { process = core->sdmmc.process; io = core->sdmmc.io; state = core->sdmmc.state; core->sdmmc.state = SDMMC_STATE_IDLE; } __enable_irq(); if (state != SDMMC_STATE_IDLE) { sdmmcs_stop(&core->sdmmc.sdmmcs); io_complete_ex(process, HAL_IO_CMD(HAL_SDMMC, state == SDMMC_STATE_READ ? IPC_READ : IPC_WRITE), core->sdmmc.user, io, ERROR_IO_CANCELLED); } }