static nxt_error_t nxt_flash_alter_lock(nxt_t *nxt, int region_num, enum nxt_flash_commands cmd) { nxt_word_t w = 0x5A000000 | ((64 * region_num) << 8); w += cmd; NXT_ERR(nxt_flash_wait_ready(nxt)); /* Flash mode register: FCMN 0x5, FWS 0x1 * Flash command register: KEY 0x5A, FCMD = clear-lock-bit (0x4) * Flash mode register: FCMN 0x34, FWS 0x1 */ NXT_ERR(nxt_write_word(nxt, 0xFFFFFF60, 0x00050100)); NXT_ERR(nxt_write_word(nxt, 0xFFFFFF64, w)); NXT_ERR(nxt_write_word(nxt, 0xFFFFFF60, 0x00340100)); return NXT_OK; }
static nxt_error_t nxt_flash_block(nxt_t *nxt, nxt_word_t block_num, char *buf) { // Set the target block number NXT_ERR(nxt_write_word(nxt, 0x202300, block_num)); // Send the block to flash NXT_ERR(nxt_send_file(nxt, 0x202100, buf, 256)); // Jump into the flash writing routine NXT_ERR(nxt_jump(nxt, 0x202000)); return NXT_OK; }
static nxt_error_t nxt_flash_prepare(nxt_t *nxt, int unlock) { // Put the clock in PLL/2 mode NXT_ERR(nxt_write_word(nxt, 0xFFFFFC30, 0x7)); // Unlock the flash chip if (unlock) NXT_ERR(nxt_flash_unlock_all_regions(nxt)); // Send the flash writing routine NXT_ERR(nxt_send_file(nxt, 0x202000, flash_bin, flash_len)); return NXT_OK; }