/* * 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); }
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); } }