aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorIvan Meleca <ivan@artekit.eu>2016-03-05 19:14:52 +0100
committerFreddie Chopin <freddie.chopin@gmail.com>2016-05-04 22:32:23 +0100
commit5396ec5dcc64354c8101f8d3f16d498ca3b10326 (patch)
tree3fa9bf1219acb3a8436d33df5aed09a7cfc9d04a /contrib
parentbfb02d5ba1238bb88cdf28863492cf1521ab2bab (diff)
downloadriscv-openocd-5396ec5dcc64354c8101f8d3f16d498ca3b10326.zip
riscv-openocd-5396ec5dcc64354c8101f8d3f16d498ca3b10326.tar.gz
riscv-openocd-5396ec5dcc64354c8101f8d3f16d498ca3b10326.tar.bz2
flash: Added support for Freescale Kinetis KE family.
Tested with MKE04Z8VTG4, MKE02Z64VLC4 and MKE02Z64VLD2. Change-Id: I606e32a2746a3b96d3e50f3656ba78d40c41c1ea Signed-off-by: Ivan Meleca <ivan@artekit.eu> Reviewed-on: http://openocd.zylin.com/3380 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'contrib')
-rw-r--r--contrib/loaders/flash/kinetis_ke/Makefile19
-rw-r--r--contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.inc15
-rw-r--r--contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.s184
-rw-r--r--contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.inc4
-rw-r--r--contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.s47
5 files changed, 269 insertions, 0 deletions
diff --git a/contrib/loaders/flash/kinetis_ke/Makefile b/contrib/loaders/flash/kinetis_ke/Makefile
new file mode 100644
index 0000000..5077912
--- /dev/null
+++ b/contrib/loaders/flash/kinetis_ke/Makefile
@@ -0,0 +1,19 @@
+BIN2C = ../../../../src/helper/bin2char.sh
+
+ARM_CROSS_COMPILE ?= arm-none-eabi-
+ARM_AS ?= $(ARM_CROSS_COMPILE)as
+ARM_OBJCOPY ?= $(ARM_CROSS_COMPILE)objcopy
+
+arm: kinetis_ke_flash.inc kinetis_ke_watchdog.inc
+
+kinetis_ke_%.elf: kinetis_ke_%.s
+ $(ARM_AS) $< -o $@
+
+kinetis_ke_%.bin: kinetis_ke_%.elf
+ $(ARM_OBJCOPY) -Obinary $< $@
+
+kinetis_ke_%.inc: kinetis_ke_%.bin
+ $(BIN2C) < $< > $@
+
+clean:
+ -rm -f *.elf *.bin *.inc
diff --git a/contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.inc b/contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.inc
new file mode 100644
index 0000000..9bb0fa8
--- /dev/null
+++ b/contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.inc
@@ -0,0 +1,15 @@
+/* Autogenerated with ../../../../src/helper/bin2char.sh */
+0x16,0x68,0x00,0x2e,0xfe,0xd0,0x55,0x68,0xb5,0x42,0xf9,0xd0,0x2f,0x4e,0x30,0x27,
+0x37,0x70,0x2f,0x4e,0x00,0x27,0x37,0x70,0x2e,0x4e,0x06,0x27,0x37,0x70,0x07,0x0c,
+0x2d,0x4e,0x37,0x70,0x2a,0x4e,0x01,0x27,0x37,0x70,0xc7,0xb2,0x2a,0x4e,0x37,0x70,
+0x07,0x0a,0x28,0x4e,0x37,0x70,0x26,0x4e,0x02,0x27,0x37,0x70,0x6f,0x78,0x25,0x4e,
+0x37,0x70,0x2f,0x78,0x24,0x4e,0x37,0x70,0x21,0x4e,0x03,0x27,0x37,0x70,0xef,0x78,
+0x20,0x4e,0x37,0x70,0xaf,0x78,0x20,0x4e,0x37,0x70,0x01,0x39,0x04,0x30,0x04,0x35,
+0x9d,0x42,0x01,0xd3,0x15,0x1c,0x08,0x35,0x00,0x29,0x1b,0xd0,0x16,0x68,0xae,0x42,
+0x18,0xd0,0x17,0x4e,0x04,0x27,0x37,0x70,0x6f,0x78,0x16,0x4e,0x37,0x70,0x2f,0x78,
+0x15,0x4e,0x37,0x70,0x12,0x4e,0x05,0x27,0x37,0x70,0xef,0x78,0x11,0x4e,0x37,0x70,
+0xaf,0x78,0x11,0x4e,0x37,0x70,0x01,0x39,0x04,0x30,0x04,0x35,0x9d,0x42,0x01,0xd3,
+0x15,0x1c,0x08,0x35,0x09,0x4e,0x80,0x27,0x37,0x70,0x08,0x4e,0x36,0x78,0x3e,0x42,
+0xfb,0xd0,0x30,0x27,0x3e,0x42,0x04,0xd1,0x00,0x26,0x55,0x60,0x00,0x29,0x02,0xd0,
+0x9e,0xe7,0x00,0x20,0x50,0x60,0x30,0x1c,0x00,0xbe,0xc0,0x46,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
diff --git a/contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.s b/contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.s
new file mode 100644
index 0000000..1fa7613
--- /dev/null
+++ b/contrib/loaders/flash/kinetis_ke/kinetis_ke_flash.s
@@ -0,0 +1,184 @@
+/***************************************************************************
+ * Copyright (C) 2015 by Ivan Meleca *
+ * ivan@artekit.eu *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ ***************************************************************************/
+
+ /* Params:
+ * r0 = flash destination address, status
+ * r1 = longword count
+ * r2 = workarea start address
+ * r3 = workarea end address
+ */
+
+ .text
+ .cpu cortex-m0plus
+ .code 16
+ .thumb_func
+
+ .align 2
+
+ /* r5 = rp
+ * r6 = wp, tmp
+ * r7 = tmp
+ */
+
+wait_fifo:
+ ldr r6, [r2, #0] /* read wp */
+ cmp r6, #0 /* abort if wp == 0 */
+ beq exit
+ ldr r5, [r2, #4] /* read rp */
+ cmp r5, r6 /* wait until rp != wp */
+ beq wait_fifo
+
+ ldr r6, fstat /* Clear error flags */
+ mov r7, #48
+ strb r7, [r6]
+
+ ldr r6, fccobix /* FCCOBIX = 0 */
+ mov r7, #0
+ strb r7, [r6]
+
+ ldr r6, fccobhi /* Program FLASH command */
+ mov r7, #6 /* FCCOBHI = 6 */
+ strb r7, [r6]
+
+ lsr r7, r0, #16 /* FCCOBLO = flash destination address >> 16 */
+ ldr r6, fccoblo
+ strb r7, [r6]
+
+ ldr r6, fccobix /* Index for lower byte address bits[15:0] */
+ mov r7, #1
+ strb r7, [r6] /* FCCOBIX = 1*/
+
+ uxtb r7, r0 /* Memory address bits[15:0] */
+ ldr r6, fccoblo
+ strb r7, [r6] /* FCCOBLO = flash destination address */
+
+ lsr r7, r0, #8
+ ldr r6, fccobhi
+ strb r7, [r6] /* FCCOBHI = flash destination address >> 8 */
+
+ ldr r6, fccobix /* FCCOBIX = 2 */
+ mov r7, #2
+ strb r7, [r6]
+
+ ldrb r7, [r5, #1] /* FCCOBHI = rp >> 8 */
+ ldr r6, fccobhi
+ strb r7, [r6]
+
+ ldrb r7, [r5] /* FCCOBLO = rp */
+ ldr r6, fccoblo
+ strb r7, [r6]
+
+ ldr r6, fccobix /* FCCOBIX = 3 */
+ mov r7, #3
+ strb r7, [r6]
+
+ ldrb r7, [r5, #3] /* FCCOBHI = rp >> 24 */
+ ldr r6, fccobhi
+ strb r7, [r6]
+
+ ldrb r7, [r5, #2] /* FCCOBLO = rp >> 16 */
+ ldr r6, fccoblo
+ strb r7, [r6]
+
+ sub r1, r1, #1 /* Two words (4 bytes) queued, decrement counter */
+ add r0, r0, #4 /* flash address += 4 */
+ add r5, r5, #4 /* rp += 4 */
+
+ cmp r5, r3 /* Wrap? */
+ bcc no_wrap
+ mov r5, r2
+ add r5, r5, #8
+
+no_wrap:
+ cmp r1, #0 /* Done? */
+ beq execute
+
+ ldr r6, [r2, #0] /* read wp */
+ cmp r6, r5
+ beq execute /* execute if rp == wp */
+
+ ldr r6, fccobix /* FCCOBIX = 4 */
+ mov r7, #4
+ strb r7, [r6]
+
+ ldrb r7, [r5, #1] /* FCCOBHI = rp >> 8 */
+ ldr r6, fccobhi
+ strb r7, [r6]
+
+ ldrb r7, [r5] /* FCCOBLO = rp */
+ ldr r6, fccoblo
+ strb r7, [r6]
+
+ ldr r6, fccobix /* FCCOBIX = 5 */
+ mov r7, #5
+ strb r7, [r6]
+
+ ldrb r7, [r5, #3] /* FCCOBHI = rp >> 24 */
+ ldr r6, fccobhi
+ strb r7, [r6]
+
+ ldrb r7, [r5, #2] /* FCCOBLO = rp >> 16 */
+ ldr r6, fccoblo
+ strb r7, [r6]
+
+ sub r1, r1, #1 /* Two words (4 bytes) queued, decrement counter */
+ add r0, r0, #4 /* flash address += 4 */
+ add r5, r5, #4 /* rp += 4 */
+
+ cmp r5, r3 /* Wrap? */
+ bcc execute
+ mov r5, r2
+ add r5, r5, #8
+
+execute:
+ ldr r6, fstat /* Launch the command */
+ mov r7, #128
+ strb r7, [r6]
+
+wait_busy:
+ ldr r6, fstat
+ ldrb r6, [r6] /* Wait until finished */
+ tst r6, r7
+ beq wait_busy
+
+ mov r7, #48 /* Check error */
+ tst r6, r7
+ bne error
+
+ mov r6, #0 /* Clear error */
+
+ str r5, [r2, #4] /* Store rp */
+
+ cmp r1, #0 /* Done? */
+ beq done
+ b wait_fifo
+
+error:
+ mov r0, #0
+ str r0, [r2, #4] /* set rp = 0 on error */
+
+done:
+ mov r0, r6 /* Set result code */
+ bkpt #0
+
+ .align 2
+fstat:
+ .word 0
+fccobix:
+ .word 0
+fccobhi:
+ .word 0
+fccoblo:
+ .word 0
diff --git a/contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.inc b/contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.inc
new file mode 100644
index 0000000..44a9d5e
--- /dev/null
+++ b/contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.inc
@@ -0,0 +1,4 @@
+/* Autogenerated with ../../../../src/helper/bin2char.sh */
+0x07,0x4b,0x7f,0x22,0x1d,0x78,0x5c,0x78,0x2a,0x40,0x06,0x4d,0x98,0x88,0xd9,0x88,
+0x5d,0x80,0x05,0x4d,0x5d,0x80,0x5c,0x70,0x98,0x80,0xd9,0x80,0x1a,0x70,0x00,0xbe,
+0x00,0x20,0x05,0x40,0xc5,0x20,0x00,0x00,0xd9,0x28,0x00,0x00,
diff --git a/contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.s b/contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.s
new file mode 100644
index 0000000..289662d
--- /dev/null
+++ b/contrib/loaders/flash/kinetis_ke/kinetis_ke_watchdog.s
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2015 by Ivan Meleca *
+ * ivan@artekit.eu *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ ***************************************************************************/
+
+ .text
+ .cpu cortex-m0plus
+ .code 16
+ .thumb_func
+
+ .align 2
+
+ ldr r3, wdog_cs1
+ mov r2, #127
+ ldrb r5, [r3]
+ ldrb r4, [r3, #1]
+ and r2, r5
+ ldr r5, unlock1
+ ldrh r0, [r3, #4]
+ ldrh r1, [r3, #6]
+ strh r5, [r3, #2]
+ ldr r5, unlock2
+ strh r5, [r3, #2]
+ strb r4, [r3, #1]
+ strh r0, [r3, #4]
+ strh r1, [r3, #6]
+ strb r2, [r3]
+ bkpt #0
+
+ .align 2
+
+wdog_cs1:
+ .word 0x40052000 // Watchdog Control and Status Register 1
+unlock1:
+ .word 0x20C5 // 1st unlock word
+unlock2:
+ .word 0x28D9 // 2nd unlock word