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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}