예제 #1
0
/*
 *  boot() - Runs through application firmware checking, and then boots
 *
 *  INPUT
 *      none
 *  OUTPUT
 *      true/false whether boot was successful
 *
 */
static bool boot(void)
{
    if(magic_ok())
    {
        layout_home();

        if(signatures_ok() == 0) /* Signature check failed */
        {
            delay_ms(500);

            if(!confirm_without_button_request("Unofficial Firmware",
                                               "Do you want to continue booting?"))
            {
                layout_simple_message("Boot Aborted");
                goto cancel_boot;
            }

            layout_home();
        }

        led_func(CLR_RED_LED);
        cm_disable_interrupts();
        set_vector_table_application();
        application_jump();
    }
    else
    {
        layout_simple_message("Please Reinstall Firmware");
        goto cancel_boot;
    }

cancel_boot:
    return(false);
}
예제 #2
0
static void tcp_pcb_service(void *arg, struct tcp_pcb *pcb)
{
    struct net_server_connstate *cs;
    struct net_server_instance *instance;
    int remaining_in_pbuf;
    char *rpp;
    struct pbuf *next;
    int r;

    cs = (struct net_server_connstate *)arg;
    instance = cs->instance;

    /* Reader interface */
    while(cs->rp) {
        remaining_in_pbuf = cs->rp->len - cs->rp_offset;
        rpp = (char *)cs->rp->payload;
        while(remaining_in_pbuf > 0) {
            if(cs == instance->open_session_cs) {
                r = instance->input(&rpp[cs->rp_offset], remaining_in_pbuf);
                if(r > 0) {
                    tcp_recved(pcb, r);
                    cs->rp_offset += r;
                    remaining_in_pbuf -= r;
                } else if(r == 0)
                    return;
                else
                    net_server_close(cs, pcb);
            } else {
                if(rpp[cs->rp_offset] == net_server_magic[cs->magic_recognized]) {
                    cs->magic_recognized++;
                    if(magic_ok(cs)) {
                        if(instance->open_session_cs)
                            net_server_close(instance->open_session_cs,
                                             instance->open_session_pcb);
                        instance->start();
                        instance->open_session_cs = cs;
                        instance->open_session_pcb = pcb;
                        tcp_sent(pcb, net_server_sent);
                    }
                } else {
                    net_server_close(cs, pcb);
                    return;
                }
                remaining_in_pbuf--;
                cs->rp_offset++;
                tcp_recved(pcb, 1);
            }
        }
        next = cs->rp->next;
        if(cs->rp->tot_len != cs->rp->len) {
            pbuf_ref(next);
            pbuf_free(cs->rp);
            cs->rp = next;
            cs->rp_offset = 0;
        } else {
            pbuf_free(cs->rp);
            cs->rp = NULL;
        }
    }

    /* Writer interface */
    if(cs == instance->open_session_cs) {
        void *data;
        int len, sndbuf;

        cs->instance->poll(&data, &len);
        if(len > 0) {
            sndbuf = tcp_sndbuf(pcb);
            if(len > sndbuf)
                len = sndbuf;
            tcp_write(pcb, data, len, 0);
            instance->ack_consumed(len);
        }
        if(len < 0)
            net_server_close(cs, pcb);
    }
}