示例#1
0
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;
}
示例#2
0
文件: udps.c 项目: alexeyk13/rexos
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);
}
示例#3
0
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;
}
示例#4
0
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);
    }
}