static void decode_ersr() { if (mec_ersr & 0x01) { if (!(mec_mcr & 0x20)) { if (mec_mcr & 0x40) { sys_reset(); mec_ersr = 0x8000; if (sis_verbose) printf("Error manager reset - IU in error mode\n"); } else { sys_halt(); mec_ersr |= 0x2000; if (sis_verbose) printf("Error manager halt - IU in error mode\n"); } } else mec_irq(1); } if (mec_ersr & 0x04) { if (!(mec_mcr & 0x200)) { if (mec_mcr & 0x400) { sys_reset(); mec_ersr = 0x8000; if (sis_verbose) printf("Error manager reset - IU comparison error\n"); } else { sys_halt(); mec_ersr |= 0x2000; if (sis_verbose) printf("Error manager halt - IU comparison error\n"); } } else mec_irq(1); } if (mec_ersr & 0x20) { if (!(mec_mcr & 0x2000)) { if (mec_mcr & 0x4000) { sys_reset(); mec_ersr = 0x8000; if (sis_verbose) printf("Error manager reset - MEC hardware error\n"); } else { sys_halt(); mec_ersr |= 0x2000; if (sis_verbose) printf("Error manager halt - MEC hardware error\n"); } } else mec_irq(1); } }
void ui_reset_cb(GtkWidget* widget, gpointer data) { printf("Reset action\n"); GtkWidget* dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(ui_window), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "Reset all changes?"); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "This operation is irreversible, " "all changes made to current " "file will be lost."); gtk_dialog_add_buttons(GTK_DIALOG(dialog), "Don't reset", GTK_RESPONSE_NO, "Reset", GTK_RESPONSE_YES, NULL); gint response = gtk_dialog_run(GTK_DIALOG(dialog)); if(response == GTK_RESPONSE_YES) { sys_reset(); } gtk_widget_destroy(dialog); ui_window_force_redraw(); }
void cmd_factory_reset(int argc, char **argv) { // Read setupcode char setup_code[11]; FlashSetupcodeRead(setup_code); flash_erase_sector(&flash, FLASH_DATA_ADDR); // Restore setupcode if(strlen(setup_code) == 10) FlashSetupcodeWrite(setup_code); // Turn off Wi-Fi and reboot system wifi_off(); sys_reset(); }
int OTAClass::beginLocal(uint16_t port, bool reboot_when_success) { int ret = -1; // variables for image processing flash_t flash; uint32_t img2_addr, img2_len, img3_addr, img3_len; uint32_t img_upper_bound; uint32_t checksum = 0; uint32_t signature1, signature2; // variables for network processing int server_socket = -1; int client_socket = -1; struct sockaddr_in localHost; struct sockaddr_in client_addr; int socket_error, socket_timeout; socklen_t optlen; // variables for OTA unsigned char *buf = NULL; int read_bytes = 0, processed_len; uint32_t file_info[3]; uint32_t ota_len; uint32_t ota_blk_size = 0; int i, n; do { sync_ota_addr(); get_image_info(&img2_addr, &img2_len, &img3_addr, &img3_len); img_upper_bound = img2_addr + 0x10 + img2_len; // image2 base + header + len if (img3_len > 0) { img_upper_bound += 0x10 + img3_len; // image 3 header + len } if ((ota_addr & 0xfff != 0) || (ota_addr == ~0x0) || (ota_addr < img_upper_bound)) { OTA_PRINTF("Invalid OTA address: %08X\r\n", ota_addr); break; } buf = (unsigned char *) malloc (BUFSIZE); if (buf == NULL) { OTA_PRINTF("Fail to allocate memory\r\n"); break; } server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_socket < 0) { OTA_PRINTF("Fail to create socket\r\n"); break; } memset(&localHost, 0, sizeof(localHost)); localHost.sin_family = AF_INET; localHost.sin_port = htons(port); localHost.sin_addr.s_addr = INADDR_ANY; if (lwip_bind(server_socket, (struct sockaddr *)&localHost, sizeof(localHost)) < 0) { OTA_PRINTF("Bind fail\r\n"); break; } if (lwip_listen(server_socket , 1) < 0) { OTA_PRINTF("Listen fail\r\n"); break; } OTA_PRINTF("Wait for client\r\n"); n = (int) sizeof( client_addr ); memset(&client_addr, 0, sizeof(client_addr)); client_socket = lwip_accept(server_socket, (struct sockaddr *) &client_addr, (socklen_t *)&n); OTA_PRINTF("Client connected. IP:%s port:%d\r\n\r\n", inet_ntoa(client_addr.sin_addr.s_addr), ntohs(client_addr.sin_port)); socket_timeout = DEFAULT_IMAGE_DOWNLOAD_TIMEOUT; lwip_setsockopt(client_socket, SOL_SOCKET, SO_RCVTIMEO, &socket_timeout, sizeof(socket_timeout)); OTA_PRINTF("Read OTA info...\r\n"); read_bytes = read(client_socket, file_info, sizeof(file_info)); if (read_bytes < 0) { OTA_PRINTF("Fail to read OTA info\r\n"); break; } if (file_info[2] == 0) { OTA_PRINTF("OTA image len is 0\r\n"); break; } ota_len = file_info[2]; ota_blk_size = ((ota_len - 1) / 4096) + 1; for (i = 0; i < ota_blk_size; i++) { flash_erase_sector(&flash, ota_addr + i * 4096); } OTA_PRINTF("Start download\r\n"); // Now download OTA image processed_len = 0; while( processed_len < ota_len ) { memset(buf, 0, BUFSIZE); read_bytes = read(client_socket, buf, BUFSIZE); if (read_bytes < 0) { optlen = sizeof(socket_error); getsockopt(client_socket, SOL_SOCKET, SO_ERROR, &socket_error, &optlen); if (socket_error == EAGAIN) { // socket timeout } break; } if (flash_stream_write(&flash, ota_addr + processed_len, read_bytes, buf) < 0) { OTA_PRINTF("Write sector fail\r\n"); break; } processed_len += read_bytes; } if (processed_len != ota_len) { OTA_PRINTF("Download fail\r\n"); break; } // Read OTA image from flash and calculate checksum checksum = processed_len = 0; while ( processed_len < ota_len ) { n = (processed_len + BUFSIZE < ota_len) ? BUFSIZE : (ota_len - processed_len); flash_stream_read(&flash, ota_addr + processed_len, n, buf); for (i=0; i<n; i++) checksum += (buf[i] & 0xFF); processed_len += n; } if (checksum != file_info[0]) { OTA_PRINTF("Bad checksum:%d expected:%d\r\n", checksum, file_info[0]); break; } // Put signature for OTA image flash_write_word(&flash, ota_addr + 8, 0x35393138); flash_write_word(&flash, ota_addr + 12, 0x31313738); flash_read_word(&flash, ota_addr + 8, &signature1); flash_read_word(&flash, ota_addr + 12, &signature2); if (signature1 != 0x35393138 || signature2 != 0x31313738) { OTA_PRINTF("Put signature fail\r\n"); break; } // Mark image 2 as old image flash_write_word(&flash, img2_addr + 8, 0x35393130); ret = 0; OTA_PRINTF("OTA success\r\n"); } while (0); if (buf != NULL) { free(buf); } if (server_socket >= 0) { close(server_socket); } if (client_socket >= 0) { close(client_socket); } if (ret < 0) { OTA_PRINTF("OTA fail\r\n"); } else { if (reboot_when_success) { sys_reset(); } } return ret; }
void cgenie_key_dn(void *cookie, osd_key_t *key) { int32_t i; #if DUMP_KEYCODE printf("keydn: %s sym:%#x uni:%#x '%c' ", osd_key_name(key), key->sym, key->unicode, PRINTABLE(key->unicode)); #endif if (key->flags & OSD_KEY_UNICODE) { switch (key->unicode) { case 8: key_dn(key, K_LEFT); break; case 9: key_dn(key, K_RIGHT); break; case 13: key_dn(key, K_ENTER); break; case 27: key_dn(key, K_BREAK); break; case 32: key_dn(key, K_SPACE); break; case '!': key_dn(key, K_1 | K_SHIFTED); break; case '"': key_dn(key, K_2 | K_SHIFTED); break; case '#': key_dn(key, K_3 | K_SHIFTED); break; case '$': key_dn(key, K_4 | K_SHIFTED); break; case '%': key_dn(key, K_5 | K_SHIFTED); break; case '&': key_dn(key, K_6 | K_SHIFTED); break; case 39: key_dn(key, K_7 | K_SHIFTED); break; case '(': key_dn(key, K_8 | K_SHIFTED); break; case ')': key_dn(key, K_9 | K_SHIFTED); break; case '*': key_dn(key, K_COLON | K_SHIFTED); break; case '+': key_dn(key, K_SEMICOLON | K_SHIFTED); break; case ',': key_dn(key, K_COMMA); break; case '-': key_dn(key, K_MINUS); break; case '.': key_dn(key, K_PERIOD); break; case '/': key_dn(key, K_SLASH); break; case '0': key_dn(key, K_0); break; case '1': key_dn(key, K_1); break; case '2': key_dn(key, K_2); break; case '3': key_dn(key, K_3); break; case '4': key_dn(key, K_4); break; case '5': key_dn(key, K_5); break; case '6': key_dn(key, K_6); break; case '7': key_dn(key, K_7); break; case '8': key_dn(key, K_8); break; case '9': key_dn(key, K_9); break; case ':': key_dn(key, K_COLON); break; case ';': key_dn(key, K_SEMICOLON); break; case '<': key_dn(key, K_COMMA | K_SHIFTED); break; case '=': key_dn(key, K_MINUS | K_SHIFTED); break; case '>': key_dn(key, K_PERIOD | K_SHIFTED); break; case '?': key_dn(key, K_SLASH | K_SHIFTED); break; case '@': key_dn(key, K_AT); break; case 'A': key_dn(key, K_A | K_SHIFTED); break; case 'B': key_dn(key, K_B | K_SHIFTED); break; case 'C': key_dn(key, K_C | K_SHIFTED); break; case 'D': key_dn(key, K_D | K_SHIFTED); break; case 'E': key_dn(key, K_E | K_SHIFTED); break; case 'F': key_dn(key, K_F | K_SHIFTED); break; case 'G': key_dn(key, K_G | K_SHIFTED); break; case 'H': key_dn(key, K_H | K_SHIFTED); break; case 'I': key_dn(key, K_I | K_SHIFTED); break; case 'J': key_dn(key, K_J | K_SHIFTED); break; case 'K': key_dn(key, K_K | K_SHIFTED); break; case 'L': key_dn(key, K_L | K_SHIFTED); break; case 'M': key_dn(key, K_M | K_SHIFTED); break; case 'N': key_dn(key, K_N | K_SHIFTED); break; case 'O': key_dn(key, K_O | K_SHIFTED); break; case 'P': key_dn(key, K_P | K_SHIFTED); break; case 'Q': key_dn(key, K_Q | K_SHIFTED); break; case 'R': key_dn(key, K_R | K_SHIFTED); break; case 'S': key_dn(key, K_S | K_SHIFTED); break; case 'T': key_dn(key, K_T | K_SHIFTED); break; case 'U': key_dn(key, K_U | K_SHIFTED); break; case 'V': key_dn(key, K_V | K_SHIFTED); break; case 'W': key_dn(key, K_W | K_SHIFTED); break; case 'X': key_dn(key, K_X | K_SHIFTED); break; case 'Y': key_dn(key, K_Y | K_SHIFTED); break; case 'Z': key_dn(key, K_Z | K_SHIFTED); break; case '[': key_dn(key, K_LEFTBRACKET); break; case '\\': key_dn(key, K_BACKSLASH); break; case ']': key_dn(key, K_RIGHTBRACKET); break; case '^': key_dn(key, K_CARET); break; case '_': key_dn(key, K_UNDERSCORE); break; case '`': key_dn(key, K_AT | K_SHIFTED); break; case 'a': key_dn(key, K_A); break; case 'b': key_dn(key, K_B); break; case 'c': key_dn(key, K_C); break; case 'd': key_dn(key, K_D); break; case 'e': key_dn(key, K_E); break; case 'f': key_dn(key, K_F); break; case 'g': key_dn(key, K_G); break; case 'h': key_dn(key, K_H); break; case 'i': key_dn(key, K_I); break; case 'j': key_dn(key, K_J); break; case 'k': key_dn(key, K_K); break; case 'l': key_dn(key, K_L); break; case 'm': key_dn(key, K_M); break; case 'n': key_dn(key, K_N); break; case 'o': key_dn(key, K_O); break; case 'p': key_dn(key, K_P); break; case 'q': key_dn(key, K_Q); break; case 'r': key_dn(key, K_R); break; case 's': key_dn(key, K_S); break; case 't': key_dn(key, K_T); break; case 'u': key_dn(key, K_U); break; case 'v': key_dn(key, K_V); break; case 'w': key_dn(key, K_W); break; case 'x': key_dn(key, K_X); break; case 'y': key_dn(key, K_Y); break; case 'z': key_dn(key, K_Z); break; case '{': key_dn(key, K_LEFTBRACKET | K_SHIFTED); break; case '|': key_dn(key, K_BACKSLASH | K_SHIFTED); break; case '}': key_dn(key, K_RIGHTBRACKET | K_SHIFTED); break; case '~': key_dn(key, K_CARET | K_SHIFTED); break; case 127: key_dn(key, K_UNDERSCORE | K_SHIFTED); break; case 223: key_dn(key, K_UNDERSCORE); break; /* szlig */ case 228: key_dn(key, K_BACKSLASH); break; /* auml */ case 246: key_dn(key, K_RIGHTBRACKET); break; /* ouml */ case 252: key_dn(key, K_CARET); break; /* uuml */ default: if (key->unicode) printf("unicode: %d (%#x) %s\n", key->unicode, key->unicode, osd_key_name(key)); goto lookup; } #if DUMP_KEYCODE printf("%02x %02x %02x %02x %02x %02x %02x %02x\n", keymap[0], keymap[1], keymap[2], keymap[3], keymap[4], keymap[5], keymap[6], keymap[7]); #endif return; } lookup: /* find non-unicode keyboard symbols in the lookup table */ for (i = 0; i < sizeof(map)/sizeof(map[0]); i++) { if (key->sym == map[i].sym) { switch (map[i].key) { case K_NMI: sys_reset(SYS_NMI); break; case K_RESET: sys_reset(SYS_RST); break; default: key_dn(key, map[i].key); break; } } } #if DUMP_KEYCODE printf("%02x %02x %02x %02x %02x %02x %02x %02x\n", keymap[0], keymap[1], keymap[2], keymap[3], keymap[4], keymap[5], keymap[6], keymap[7]); #endif }