+static const uint32_t pic32mx_flash_write_code[] = {
+ /* write: */
+ 0x3C08AA99, /* lui $t0, 0xaa99 */
+ 0x35086655, /* ori $t0, 0x6655 */
+ 0x3C095566, /* lui $t1, 0x5566 */
+ 0x352999AA, /* ori $t1, 0x99aa */
+ 0x3C0ABF80, /* lui $t2, 0xbf80 */
+ 0x354AF400, /* ori $t2, 0xf400 */
+ 0x340B4003, /* ori $t3, $zero, 0x4003 */
+ 0x340C8000, /* ori $t4, $zero, 0x8000 */
+ /* write_row: */
+ 0x2CD30080, /* sltiu $s3, $a2, 128 */
+ 0x16600008, /* bne $s3, $zero, write_word */
+ 0x340D4000, /* ori $t5, $zero, 0x4000 */
+ 0xAD450020, /* sw $a1, 32($t2) */
+ 0xAD440040, /* sw $a0, 64($t2) */
+ 0x04110016, /* bal progflash */
+ 0x24840200, /* addiu $a0, $a0, 512 */
+ 0x24A50200, /* addiu $a1, $a1, 512 */
+ 0x1000FFF7, /* beq $zero, $zero, write_row */
+ 0x24C6FF80, /* addiu $a2, $a2, -128 */
+ /* write_word: */
+ 0x3C15A000, /* lui $s5, 0xa000 */
+ 0x36B50000, /* ori $s5, $s5, 0x0 */
+ 0x00952025, /* or $a0, $a0, $s5 */
+ 0x10000008, /* beq $zero, $zero, next_word */
+ 0x340B4001, /* ori $t3, $zero, 0x4001 */
+ /* prog_word: */
+ 0x8C940000, /* lw $s4, 0($a0) */
+ 0xAD540030, /* sw $s4, 48($t2) */
+ 0xAD450020, /* sw $a1, 32($t2) */
+ 0x04110009, /* bal progflash */
+ 0x24840004, /* addiu $a0, $a0, 4 */
+ 0x24A50004, /* addiu $a1, $a1, 4 */
+ 0x24C6FFFF, /* addiu $a2, $a2, -1 */
+ /* next_word: */
+ 0x14C0FFF8, /* bne $a2, $zero, prog_word */
+ 0x00000000, /* nop */
+ /* done: */
+ 0x10000002, /* beq $zero, $zero, exit */
+ 0x24040000, /* addiu $a0, $zero, 0 */
+ /* error: */
+ 0x26240000, /* addiu $a0, $s1, 0 */
+ /* exit: */
+ 0x7000003F, /* sdbbp */
+ /* progflash: */
+ 0xAD4B0000, /* sw $t3, 0($t2) */
+ 0xAD480010, /* sw $t0, 16($t2) */
+ 0xAD490010, /* sw $t1, 16($t2) */
+ 0xAD4C0008, /* sw $t4, 8($t2) */
+ /* waitflash: */
+ 0x8D500000, /* lw $s0, 0($t2) */
+ 0x020C8024, /* and $s0, $s0, $t4 */
+ 0x1600FFFD, /* bne $s0, $zero, waitflash */
+ 0x00000000, /* nop */
+ 0x00000000, /* nop */
+ 0x00000000, /* nop */
+ 0x00000000, /* nop */
+ 0x00000000, /* nop */
+ 0x8D510000, /* lw $s1, 0($t2) */
+ 0x30113000, /* andi $s1, $zero, 0x3000 */
+ 0x1620FFEF, /* bne $s1, $zero, error */
+ 0xAD4D0004, /* sw $t5, 4($t2) */
+ 0x03E00008, /* jr $ra */
+ 0x00000000 /* nop */
+};
+
+static int pic32mx_write_block(struct flash_bank *bank, uint8_t *buffer,
+ uint32_t offset, uint32_t count)