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);
    }
}
Exemple #2
0
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();
}
Exemple #3
0
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();
}
Exemple #4
0
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;
}
Exemple #5
0
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
}