boards: Update arc em_starterkit support from 2.2 to 2.3
Here are the main changes:
* board: Update EMSK onboard resources such as Button, Switch and LEDs
+ update soc.h for em7d, em9d, em11d
+ update board.h for em_starterkit board
* arc: Add floating point support and code density support
+ add kconfig configuration
+ add compiler options
+ add register definitions, marcos, assembly codes
+ fixes in existing codes and configurations.
* arc: Update detailed board configurations for cores of emsk 2.3
* script: Provide arc_debugger.sh for debugging em_starterkit board
+ make BOARD=em_starterkit debug
This will start openocd server for emsk, and arc gdb will connect
to this debug server, user can run `continue` command if user just
want to run the application, or other commands if debugging needed.
+ make BOARD=em_starterkit debugserver
This will start an openocd debugger server for emsk, and user can
connect to this debugserver using arc gdb and do what they want to.
+ make BOARD=em_starterkit flash
This will download the zephyr application elf file to emsk,
and run it.
Signed-off-by: Huaqi Fang <huaqi.fang@synopsys.com>
diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig
index 44404b1..c38fd40 100644
--- a/arch/arc/Kconfig
+++ b/arch/arc/Kconfig
@@ -24,6 +24,21 @@
string
default "arch/arc/defconfig"
+config CPU_HAS_MPU
+ bool
+ # Omit prompt to signify "hidden" option
+ default n
+ help
+ This option is enabled when the CPU has a Memory Protection Unit (MPU).
+
+config CPU_HAS_FPU
+ # Hidden config selected by CPU family
+ bool
+ default n
+ help
+ This option is enabled when the CPU has hardware floating point
+ unit.
+
menu "ARC EM4 processor options"
config CPU_ARCEM4
@@ -44,17 +59,6 @@
help
This option signifies the use of a CPU of the ARCv2 family.
-config NSIM
- prompt "Running on the MetaWare nSIM simulator"
- bool
- default n
- help
- For running on nSIM simulator.
-
- a) Uses non-XIP to run in RAM.
- b) Linked at address 0x4000 with 0x4000 of RAM so that it works with
- a pc_size of 16 (default).
-
config DATA_ENDIANNESS_LITTLE
bool
default y
@@ -156,8 +160,40 @@
bool
default n
help
- The ARC CPU can be configured to have two busses;
- one for instruction fetching and another that serves as a data bus.
+ The ARC CPU can be configured to have two busses;
+ one for instruction fetching and another that serves as a data bus.
+
+config CODE_DENSITY
+ prompt "Code Density Option"
+ bool
+ default n
+ help
+ Enbale code density option to get better code desntiy
+
+menu "Floating Point Options"
+depends on CPU_HAS_FPU
+
+config FLOAT
+ bool
+ prompt "Floating point registers"
+ default n
+ help
+ This option allows tasks and fibers to use the floating point registers.
+ By default, only a single task or fiber may use the registers.
+
+ Disabling this option means that any task or fiber that uses a
+ floating point register will get a fatal exception.
+
+config FP_SHARING
+ bool
+ prompt "Floating point register sharing"
+ depends on FLOAT
+ default n
+ help
+ This option allows multiple tasks and fibers to use the floating point
+ registers.
+
+endmenu
config ICCM_SIZE
int "ICCM Size in kB"
diff --git a/arch/arc/Makefile b/arch/arc/Makefile
index 58ac46b..e3ab74b 100644
--- a/arch/arc/Makefile
+++ b/arch/arc/Makefile
@@ -1,3 +1,8 @@
+# Enable debug support in mdb
+# Dwarf version 2 can be recognized by mdb
+# The default dwarf version in gdb is not recognized by mdb
+cflags-y += $(call cc-option, -g3 -gdwarf-2)
+
cflags-y += $(call cc-option,-ffunction-sections,) $(call cc-option,-fdata-sections,)
# Without this (poorly named) option, compiler may generate undefined
@@ -16,5 +21,4 @@
soc-aflags ?= $(soc-cflags)
KBUILD_CFLAGS += $(soc-cflags)
KBUILD_CXXFLAGS += $(soc-cxxflags)
-KBUILD_AFLAGS += $(soc-aflags)
-
+KBUILD_AFLAGS += $(soc-aflags)
\ No newline at end of file
diff --git a/arch/arc/core/fast_irq.S b/arch/arc/core/fast_irq.S
index 5d1f1be..31b69cf 100644
--- a/arch/arc/core/fast_irq.S
+++ b/arch/arc/core/fast_irq.S
@@ -181,6 +181,14 @@
pop_s r0
mov lp_count,r0
ld r0,[saved_r0]
+#ifdef CONFIG_CODE_DENSITY
+ pop_s r0
+ sr r0, [_ARC_V2_EI_BASE]
+ pop_s r0
+ sr r0, [_ARC_V2_LDI_BASE]
+ pop_s r0
+ sr r0, [_ARC_V2_JLI_BASE]
+#endif
add sp,sp,8 /* don't need ilink & status32_po from stack */
#endif
rtie
diff --git a/arch/arc/core/offsets/offsets.c b/arch/arc/core/offsets/offsets.c
index 09419c7..fd21524 100644
--- a/arch/arc/core/offsets/offsets.c
+++ b/arch/arc/core/offsets/offsets.c
@@ -52,6 +52,11 @@
GEN_OFFSET_SYM(_isf_t, lp_end);
GEN_OFFSET_SYM(_isf_t, lp_start);
GEN_OFFSET_SYM(_isf_t, lp_count);
+#ifdef CONFIG_CODE_DENSITY
+GEN_OFFSET_SYM(_isf_t, ei_base);
+GEN_OFFSET_SYM(_isf_t, ldi_base);
+GEN_OFFSET_SYM(_isf_t, jli_base);
+#endif
GEN_OFFSET_SYM(_isf_t, pc);
GEN_OFFSET_SYM(_isf_t, status32);
GEN_ABSOLUTE_SYM(___isf_t_SIZEOF, sizeof(_isf_t));
@@ -75,6 +80,19 @@
GEN_OFFSET_SYM(_callee_saved_stack_t, r26);
GEN_OFFSET_SYM(_callee_saved_stack_t, fp);
GEN_OFFSET_SYM(_callee_saved_stack_t, r30);
+#ifdef CONFIG_FP_SHARING
+GEN_OFFSET_SYM(_callee_saved_stack_t, r58);
+GEN_OFFSET_SYM(_callee_saved_stack_t, r59);
+GEN_OFFSET_SYM(_callee_saved_stack_t, fpu_status);
+GEN_OFFSET_SYM(_callee_saved_stack_t, fpu_ctrl);
+#ifdef CONFIG_FP_FPU_DA
+GEN_OFFSET_SYM(_callee_saved_stack_t, dpfp2h);
+GEN_OFFSET_SYM(_callee_saved_stack_t, dpfp2l);
+GEN_OFFSET_SYM(_callee_saved_stack_t, dpfp1h);
+GEN_OFFSET_SYM(_callee_saved_stack_t, dpfp1l);
+#endif
+
+#endif
GEN_ABSOLUTE_SYM(___callee_saved_stack_t_SIZEOF, sizeof(_callee_saved_stack_t));
GEN_ABSOLUTE_SYM(_K_THREAD_NO_FLOAT_SIZEOF, sizeof(struct k_thread));
diff --git a/arch/arc/core/regular_irq.S b/arch/arc/core/regular_irq.S
index d69f6b3..12ab5d7 100644
--- a/arch/arc/core/regular_irq.S
+++ b/arch/arc/core/regular_irq.S
@@ -121,7 +121,8 @@
*/
ldh_s r0, [r2, _thread_offset_to_preempt]
mov r3, _NON_PREEMPT_THRESHOLD
- brhs.d r0, r3, _rirq_no_reschedule
+ cmp_s r0, r3
+ bhs.d _rirq_no_reschedule
/*
* Both (a)reschedule and (b)non-reschedule cases need to load the
@@ -137,7 +138,8 @@
/* check if the current thread needs to be rescheduled */
ld_s r0, [r1, _kernel_offset_to_ready_q_cache]
- breq r0, r2, _rirq_no_reschedule
+ cmp_s r0, r2
+ beq _rirq_no_reschedule
/* cached thread to run is in r0, fall through */
diff --git a/arch/arc/include/kernel_arch_data.h b/arch/arc/include/kernel_arch_data.h
index afb370b..d43a8fc 100644
--- a/arch/arc/include/kernel_arch_data.h
+++ b/arch/arc/include/kernel_arch_data.h
@@ -74,6 +74,8 @@
typedef struct _irq_stack_frame _isf_t;
+
+
/* callee-saved registers pushed on the stack, not in k_thread */
struct _callee_saved_stack {
u32_t r13;
@@ -94,6 +96,19 @@
/* r28 is the stack pointer and saved separately */
/* r29 is ILINK and does not need to be saved */
u32_t r30;
+#ifdef CONFIG_FP_SHARING
+ u32_t r58;
+ u32_t r59;
+ u32_t fpu_status;
+ u32_t fpu_ctrl;
+#ifdef CONFIG_FP_FPU_DA
+ u32_t dpfp2h;
+ u32_t dpfp2l;
+ u32_t dpfp1h;
+ u32_t dpfp1l;
+#endif
+
+#endif
/*
* No need to save r31 (blink), it's either alread pushed as the pc or
* blink on an irq stack frame.
diff --git a/arch/arc/include/swap_macros.h b/arch/arc/include/swap_macros.h
index c8859d5..1d2a417 100644
--- a/arch/arc/include/swap_macros.h
+++ b/arch/arc/include/swap_macros.h
@@ -42,6 +42,26 @@
st r26, [sp, ___callee_saved_stack_t_r26_OFFSET]
st fp, [sp, ___callee_saved_stack_t_fp_OFFSET]
st r30, [sp, ___callee_saved_stack_t_r30_OFFSET]
+#ifdef CONFIG_FP_SHARING
+ st r58, [sp, ___callee_saved_stack_t_r58_OFFSET]
+ st r59, [sp, ___callee_saved_stack_t_r59_OFFSET]
+ lr r13, [_ARC_V2_FPU_STATUS]
+ st_s r13, [sp, ___callee_saved_stack_t_fpu_status_OFFSET]
+ lr r13, [_ARC_V2_FPU_CTRL]
+ st_s r13, [sp, ___callee_saved_stack_t_fpu_ctrl_OFFSET]
+
+#ifdef CONFIG_FP_FPU_DA
+ lr r13, [_ARC_V2_FPU_DPFP1L]
+ st_s r13, [sp, ___callee_saved_stack_t_dpfp1l_OFFSET]
+ lr r13, [_ARC_V2_FPU_DPFP1H]
+ st_s r13, [sp, ___callee_saved_stack_t_dpfp1h_OFFSET]
+ lr r13, [_ARC_V2_FPU_DPFP2L]
+ st_s r13, [sp, ___callee_saved_stack_t_dpfp2l_OFFSET]
+ lr r13, [_ARC_V2_FPU_DPFP2H]
+ st_s r13, [sp, ___callee_saved_stack_t_dpfp2h_OFFSET]
+#endif
+
+#endif
/* save stack pointer in struct tcs */
st sp, [r2, _thread_offset_to_sp]
@@ -69,6 +89,31 @@
ld fp, [sp, ___callee_saved_stack_t_fp_OFFSET]
ld r30, [sp, ___callee_saved_stack_t_r30_OFFSET]
+#ifdef CONFIG_FP_SHARING
+ ld r58, [sp, ___callee_saved_stack_t_r58_OFFSET]
+ ld r59, [sp, ___callee_saved_stack_t_r59_OFFSET]
+
+ ld_s r13, [sp, ___callee_saved_stack_t_fpu_status_OFFSET]
+ sr r13, [_ARC_V2_FPU_STATUS]
+
+ ld_s r13, [sp, ___callee_saved_stack_t_fpu_ctrl_OFFSET]
+ sr r13, [_ARC_V2_FPU_CTRL]
+
+
+#ifdef CONFIG_FP_FPU_DA
+ ld_s r13, [sp, ___callee_saved_stack_t_dpfp1l_OFFSET]
+ sr r13, [_ARC_V2_FPU_DPFP1L]
+ ld_s r13, [sp, ___callee_saved_stack_t_dpfp1h_OFFSET]
+ sr r13, [_ARC_V2_FPU_DPFP1H]
+ ld_s r13, [sp, ___callee_saved_stack_t_dpfp2l_OFFSET]
+ sr r13, [_ARC_V2_FPU_DPFP2L]
+ ld_s r13, [sp, ___callee_saved_stack_t_dpfp2h_OFFSET]
+ sr r13, [_ARC_V2_FPU_DPFP2H]
+#endif
+
+#endif
+
+
add_s sp, sp, ___callee_saved_stack_t_SIZEOF
.endm
@@ -111,6 +156,15 @@
st_s r1, [sp, ___isf_t_lp_start_OFFSET]
st_s r0, [sp, ___isf_t_lp_end_OFFSET]
+#ifdef CONFIG_CODE_DENSITY
+ lr r1, [_ARC_V2_JLI_BASE]
+ lr r0, [_ARC_V2_LDI_BASE]
+ lr r2, [_ARC_V2_EI_BASE]
+ st_s r1, [sp, ___isf_t_jli_base_OFFSET]
+ st_s r0, [sp, ___isf_t_ldi_base_OFFSET]
+ st_s r2, [sp, ___isf_t_ei_base_OFFSET]
+#endif
+
.endm
/*
@@ -121,6 +175,15 @@
ld blink, [sp, ___isf_t_blink_OFFSET]
+#ifdef CONFIG_CODE_DENSITY
+ ld_s r1, [sp, ___isf_t_jli_base_OFFSET]
+ ld_s r0, [sp, ___isf_t_ldi_base_OFFSET]
+ ld_s r2, [sp, ___isf_t_ei_base_OFFSET]
+ sr r1, [_ARC_V2_JLI_BASE]
+ sr r0, [_ARC_V2_LDI_BASE]
+ sr r2, [_ARC_V2_EI_BASE]
+#endif
+
ld_s r0, [sp, ___isf_t_lp_count_OFFSET]
mov lp_count, r0
ld_s r1, [sp, ___isf_t_lp_start_OFFSET]
@@ -143,6 +206,7 @@
ld_s r1, [sp, ___isf_t_r1_OFFSET]
ld_s r0, [sp, ___isf_t_r0_OFFSET]
+
/*
* All gprs have been reloaded, the only one that is still usable is
* ilink.
diff --git a/arch/arc/include/v2/irq.h b/arch/arc/include/v2/irq.h
index 9de86d6..8c3fe82 100644
--- a/arch/arc/include/v2/irq.h
+++ b/arch/arc/include/v2/irq.h
@@ -26,6 +26,7 @@
#define _ARC_V2_AUX_IRQ_CTRL_16_REGS 8
#define _ARC_V2_AUX_IRQ_CTRL_32_REGS 16
+
#define _ARC_V2_DEF_IRQ_LEVEL (CONFIG_NUM_IRQ_PRIO_LEVELS-1)
#define _ARC_V2_WAKE_IRQ_LEVEL _ARC_V2_DEF_IRQ_LEVEL
@@ -43,6 +44,9 @@
{
u32_t aux_irq_ctrl_value = (
_ARC_V2_AUX_IRQ_CTRL_LOOP_REGS | /* save lp_xxx registers */
+#ifdef CONFIG_CODE_DENSITY
+ _ARC_V2_AUX_IRQ_CTRL_LP | /* save code density registers */
+#endif
_ARC_V2_AUX_IRQ_CTRL_BLINK | /* save blink */
_ARC_V2_AUX_IRQ_CTRL_14_REGS /* save r0 -> r13 (caller-saved) */
);
diff --git a/arch/arc/soc/em11d/Kconfig.defconfig b/arch/arc/soc/em11d/Kconfig.defconfig
index c12e3d3..776211c 100644
--- a/arch/arc/soc/em11d/Kconfig.defconfig
+++ b/arch/arc/soc/em11d/Kconfig.defconfig
@@ -19,7 +19,7 @@
config NUM_IRQS
# must be > the highest interrupt number used
- default 36
+ default 38
config RGF_NUM_BANKS
default 2
@@ -58,6 +58,9 @@
config CACHE_FLUSHING
def_bool y
+config FP_FPU_DA
+ def_bool y
+
if GPIO
config GPIO_DW
diff --git a/arch/arc/soc/em11d/Kconfig.soc b/arch/arc/soc/em11d/Kconfig.soc
index 3fe6eeb..dd931a5 100644
--- a/arch/arc/soc/em11d/Kconfig.soc
+++ b/arch/arc/soc/em11d/Kconfig.soc
@@ -1,3 +1,5 @@
config SOC_EM11D
bool "Synopsys ARC EM11D"
+ select CPU_HAS_FPU
+
diff --git a/arch/arc/soc/em11d/Makefile b/arch/arc/soc/em11d/Makefile
index a86cfcb..13ccc91 100644
--- a/arch/arc/soc/em11d/Makefile
+++ b/arch/arc/soc/em11d/Makefile
@@ -1,2 +1,16 @@
-soc-cflags = $(call cc-option,-mcpu=arcem) \
- $(call cc-option,-mno-sdata)
+# -mcpu=em4_fpuda is added to KBUILD_CFLAGS to make cc-option check the options correctly
+KBUILD_CFLAGS += -mcpu=em4_fpuda
+
+soc-cflags += $(call cc-option, -mcpu=em4_fpuda -mno-sdata -mdiv-rem -mswap -mnorm) \
+ $(call cc-option,-mmpy-option=6 -mbarrel-shifter) \
+ $(call cc-option,--param l1-cache-size=16384) \
+ $(call cc-option,--param l1-cache-line-size=32)
+
+ifeq ($(CONFIG_CODE_DENSITY), y)
+soc-cflags += $(call cc-option, -mcode-density)
+endif
+
+ifeq ($(CONFIG_FLOAT), y)
+soc-cflags += $(call cc-option, -mfpu=fpuda_all)
+endif
+
diff --git a/arch/arc/soc/em11d/soc.h b/arch/arc/soc/em11d/soc.h
index 3e78bfe..be88505 100644
--- a/arch/arc/soc/em11d/soc.h
+++ b/arch/arc/soc/em11d/soc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016 Synopsys, Inc. All rights reserved.
+ * Copyright (c) 2017 Synopsys, Inc. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -18,63 +18,68 @@
/* default system clock */
-#define SYSCLK_DEFAULT_IOSC_HZ MHZ(50)
+#define SYSCLK_DEFAULT_IOSC_HZ MHZ(50)
/* On the EM Starter Kit board, the peripheral bus clock frequency is 50Mhz */
/* IRQs */
-#define IRQ_TIMER0 16
-#define IRQ_TIMER1 17
+#define IRQ_TIMER0 16
+#define IRQ_TIMER1 17
+#define IRQ_CORE_DMA_COMPLETE 22
+#define IRQ_CORE_DMA_ERROR 23
#ifndef _ASMLANGUAGE
#include <misc/util.h>
#include <drivers/rand32.h>
-#define ARCV2_TIMER0_INT_LVL IRQ_TIMER0
-#define ARCV2_TIMER0_INT_PRI 0
+#define ARCV2_TIMER0_INT_LVL IRQ_TIMER0
+#define ARCV2_TIMER0_INT_PRI 0
-#define ARCV2_TIMER1_INT_LVL IRQ_TIMER1
-#define ARCV2_TIMER1_INT_PRI 1
+#define ARCV2_TIMER1_INT_LVL IRQ_TIMER1
+#define ARCV2_TIMER1_INT_PRI 1
-#define INT_ENABLE_ARC ~(0x00000001 << 8)
-#define INT_ENABLE_ARC_BIT_POS (8)
+#define CONFIG_ARCV2_TIMER1_INT_LVL IRQ_TIMER1
+#define CONFIG_ARCV2_TIMER1_INT_PRI 1
+
+#define INT_ENABLE_ARC ~(0x00000001 << 8)
+#define INT_ENABLE_ARC_BIT_POS (8)
/* I2C */
/* I2C_0 is on Pmod2 connector */
-#define I2C_DW_0_BASE_ADDR 0xF0004000
-#define I2C_DW_0_IRQ 23
+#define I2C_DW_0_BASE_ADDR 0xF0004000
+#define I2C_DW_0_IRQ 25
/* I2C_1 is on Pmod4 connector */
-#define I2C_DW_1_BASE_ADDR 0xF0005000
-#define I2C_DW_1_IRQ 24
+#define I2C_DW_1_BASE_ADDR 0xF0005000
+#define I2C_DW_1_IRQ 26
#define I2C_DW_IRQ_FLAGS 0
/* GPIO */
-#define GPIO_DW_0_BASE_ADDR 0xF0002000 /* GPIO 0 : PORTA */
-#define GPIO_DW_0_IRQ 22
-#define GPIO_DW_0_BITS 32
-#define GPIO_DW_PORT_0_INT_MASK 0 /* n/a */
+#define GPIO_DW_0_BASE_ADDR 0xF0002000 /* GPIO 0 : PORTA */
+#define GPIO_DW_0_IRQ 24
+#define GPIO_DW_0_BITS 32
+#define GPIO_DW_PORT_0_INT_MASK 0 /* n/a */
#define GPIO_DW_0_IRQ_FLAGS 0 /* Defaults */
-#define GPIO_DW_1_BASE_ADDR 0xF000200C /* GPIO 1 : PORTB */
-#define GPIO_DW_1_IRQ 0 /* can't interrupt */
-#define GPIO_DW_1_BITS 9 /* 9 LEDs on board */
-#define GPIO_DW_PORT_1_INT_MASK 0 /* n/a */
+#define GPIO_DW_1_BASE_ADDR 0xF000200C /* GPIO 1 : PORTB */
+#define GPIO_DW_1_IRQ 0 /* can't interrupt */
+#define GPIO_DW_1_BITS 9 /* 9 LEDs on board */
+#define GPIO_DW_PORT_1_INT_MASK 0 /* n/a */
-#define GPIO_DW_2_BASE_ADDR 0xF0002018 /* GPIO 2 : PORTC */
-#define GPIO_DW_2_IRQ 0 /* can't interrupt */
-#define GPIO_DW_2_BITS 32
-#define GPIO_DW_PORT_2_INT_MASK 0 /* n/a */
+#define GPIO_DW_2_BASE_ADDR 0xF0002018 /* GPIO 2 : PORTC */
+#define GPIO_DW_2_IRQ 0 /* can't interrupt */
+#define GPIO_DW_2_BITS 32
+#define GPIO_DW_PORT_2_INT_MASK 0 /* n/a */
-#define GPIO_DW_3_BASE_ADDR 0xF0002024 /* GPIO 3 : PORTD */
-#define GPIO_DW_3_IRQ 0 /* can't interrupt */
-#define GPIO_DW_3_BITS 12
-#define GPIO_DW_PORT_3_INT_MASK 0 /* n/a */
+#define GPIO_DW_3_BASE_ADDR 0xF0002024 /* GPIO 3 : PORTD */
+#define GPIO_DW_3_IRQ 0 /* can't interrupt */
+#define GPIO_DW_3_BITS 12
+#define GPIO_DW_PORT_3_INT_MASK 0 /* n/a */
/* undef GPIO_DW_IO_ACCESS .. because memory mapped */
/* undef CONFIG_GPIO_DW_0_IRQ_SHARED */
@@ -83,15 +88,15 @@
/* SPI */
-#define SPI_DW_SPI_CLOCK SYSCLK_DEFAULT_IOSC_HZ
+#define SPI_DW_SPI_CLOCK SYSCLK_DEFAULT_IOSC_HZ
-#define SPI_DW_PORT_0_REGS 0xF0006000
-#define SPI_DW_PORT_1_REGS 0xF0007000
+#define SPI_DW_PORT_0_REGS 0xF0006000
+#define SPI_DW_PORT_1_REGS 0xF0007000
-#define SPI_DW_PORT_0_IRQ 25
-#define SPI_DW_PORT_1_IRQ 26
+#define SPI_DW_PORT_0_IRQ 27
+#define SPI_DW_PORT_1_IRQ 28
-#define SPI_DW_IRQ_FLAGS 0
+#define SPI_DW_IRQ_FLAGS 0
/*
* SPI Chip Select Assignments on EM Starter Kit
@@ -106,18 +111,22 @@
/*
* UART
- UART0 vector 27 0xF0008000
- UART1 vector 28 0xF0009000
- UART2 vector 29 0xF000A000
+ UART0 vector 29 0xF0008000
+ UART1 vector 30 0xF0009000
+ UART2 vector 31 0xF000A000
*/
#define UART_NS16550_PORT_0_BASE_ADDR 0xF0008000
-#define UART_NS16550_PORT_0_IRQ 27
+#define UART_NS16550_PORT_0_IRQ 29
#define UART_NS16550_PORT_0_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
#define UART_NS16550_PORT_1_BASE_ADDR 0xF0009000
-#define UART_NS16550_PORT_1_IRQ 28
+#define UART_NS16550_PORT_1_IRQ 30
#define UART_NS16550_PORT_1_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
+#define UART_NS16550_PORT_2_BASE_ADDR 0xF000A000
+#define UART_NS16550_PORT_2_IRQ 31
+#define UART_NS16550_PORT_2_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
+
#define UART_IRQ_FLAGS 0 /* Default */
#endif /* !_ASMLANGUAGE */
diff --git a/arch/arc/soc/em7d/Kconfig.defconfig b/arch/arc/soc/em7d/Kconfig.defconfig
index cecf493..9bd5c91 100644
--- a/arch/arc/soc/em7d/Kconfig.defconfig
+++ b/arch/arc/soc/em7d/Kconfig.defconfig
@@ -19,13 +19,13 @@
config NUM_IRQS
# must be > the highest interrupt number used
- default 36
+ default 38
config RGF_NUM_BANKS
default 1
config SYS_CLOCK_HW_CYCLES_PER_SEC
- default 30000000
+ default 25000000
config HARVARD
def_bool n
diff --git a/arch/arc/soc/em7d/Makefile b/arch/arc/soc/em7d/Makefile
index a86cfcb..9fe42ab 100644
--- a/arch/arc/soc/em7d/Makefile
+++ b/arch/arc/soc/em7d/Makefile
@@ -1,2 +1,12 @@
-soc-cflags = $(call cc-option,-mcpu=arcem) \
- $(call cc-option,-mno-sdata)
+# -mcpu=em4_dmips is added to KBUILD_CFLAGS to make cc-option check the options correctly
+KBUILD_CFLAGS += -mcpu=em4_dmips
+
+soc-cflags = $(call cc-option,-mcpu=em4_dmips -mno-sdata) \
+ $(call cc-option,-mdiv-rem -mswap -mnormm) \
+ $(call cc-option,-mmpy-option=6 -mbarrel-shifter) \
+ $(call cc-option,--param l1-cache-size=16384) \
+ $(call cc-option,--param l1-cache-line-size=32)
+
+ifeq ($(CONFIG_CODE_DENSITY), y)
+soc-cflags += $(call cc-option,-mcode-density)
+endif
diff --git a/arch/arc/soc/em7d/soc.h b/arch/arc/soc/em7d/soc.h
index ea8cf45..91f60ab 100644
--- a/arch/arc/soc/em7d/soc.h
+++ b/arch/arc/soc/em7d/soc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016 Synopsys, Inc. All rights reserved.
+ * Copyright (c) 2017 Synopsys, Inc. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -18,63 +18,69 @@
/* default system clock */
-#define SYSCLK_DEFAULT_IOSC_HZ MHZ(50)
+#define SYSCLK_DEFAULT_IOSC_HZ MHZ(50)
/* On the EM Starter Kit board, the peripheral bus clock frequency is 50Mhz */
/* IRQs */
-#define IRQ_TIMER0 16
-#define IRQ_TIMER1 17
+#define IRQ_TIMER0 16
+#define IRQ_TIMER1 17
+#define IRQ_SEC_TIMER0 20
+#define IRQ_CORE_DMA_COMPLETE 22
+#define IRQ_CORE_DMA_ERROR 23
#ifndef _ASMLANGUAGE
#include <misc/util.h>
#include <drivers/rand32.h>
-#define ARCV2_TIMER0_INT_LVL IRQ_TIMER0
-#define ARCV2_TIMER0_INT_PRI 0
+#define ARCV2_TIMER0_INT_LVL IRQ_TIMER0
+#define ARCV2_TIMER0_INT_PRI 0
-#define CONFIG_ARCV2_TIMER1_INT_LVL IRQ_TIMER1
-#define CONFIG_ARCV2_TIMER1_INT_PRI 1
+#define ARCV2_TIMER1_INT_LVL IRQ_TIMER1
+#define ARCV2_TIMER1_INT_PRI 1
-#define INT_ENABLE_ARC ~(0x00000001 << 8)
-#define INT_ENABLE_ARC_BIT_POS (8)
+#define CONFIG_ARCV2_TIMER1_INT_LVL IRQ_TIMER1
+#define CONFIG_ARCV2_TIMER1_INT_PRI 1
+
+#define INT_ENABLE_ARC ~(0x00000001 << 8)
+#define INT_ENABLE_ARC_BIT_POS (8)
/* I2C */
/* I2C_0 is on Pmod2 connector */
-#define I2C_DW_0_BASE_ADDR 0xF0004000
-#define I2C_DW_0_IRQ 23
+#define I2C_DW_0_BASE_ADDR 0xF0004000
+#define I2C_DW_0_IRQ 25
/* I2C_1 is on Pmod4 connector */
-#define I2C_DW_1_BASE_ADDR 0xF0005000
-#define I2C_DW_1_IRQ 24
+#define I2C_DW_1_BASE_ADDR 0xF0005000
+#define I2C_DW_1_IRQ 26
#define I2C_DW_IRQ_FLAGS 0
/* GPIO */
-#define GPIO_DW_0_BASE_ADDR 0xF0002000 /* GPIO 0 : PORTA */
-#define GPIO_DW_0_IRQ 22
-#define GPIO_DW_0_BITS 32
-#define GPIO_DW_PORT_0_INT_MASK 0 /* n/a */
+#define GPIO_DW_0_BASE_ADDR 0xF0002000 /* GPIO 0 : PORTA */
+#define GPIO_DW_0_IRQ 24
+#define GPIO_DW_0_BITS 32
+#define GPIO_DW_PORT_0_INT_MASK 0 /* n/a */
#define GPIO_DW_0_IRQ_FLAGS 0 /* Defaults */
-#define GPIO_DW_1_BASE_ADDR 0xF000200C /* GPIO 1 : PORTB */
-#define GPIO_DW_1_IRQ 0 /* can't interrupt */
-#define GPIO_DW_1_BITS 9 /* 9 LEDs on board */
-#define GPIO_DW_PORT_1_INT_MASK 0 /* n/a */
+#define GPIO_DW_1_BASE_ADDR 0xF000200C /* GPIO 1 : PORTB */
+#define GPIO_DW_1_IRQ 0 /* can't interrupt */
+#define GPIO_DW_1_BITS 9 /* 9 LEDs on board */
+#define GPIO_DW_PORT_1_INT_MASK 0 /* n/a */
-#define GPIO_DW_2_BASE_ADDR 0xF0002018 /* GPIO 2 : PORTC */
-#define GPIO_DW_2_IRQ 0 /* can't interrupt */
-#define GPIO_DW_2_BITS 32
-#define GPIO_DW_PORT_2_INT_MASK 0 /* n/a */
+#define GPIO_DW_2_BASE_ADDR 0xF0002018 /* GPIO 2 : PORTC */
+#define GPIO_DW_2_IRQ 0 /* can't interrupt */
+#define GPIO_DW_2_BITS 32
+#define GPIO_DW_PORT_2_INT_MASK 0 /* n/a */
-#define GPIO_DW_3_BASE_ADDR 0xF0002024 /* GPIO 3 : PORTD */
-#define GPIO_DW_3_IRQ 0 /* can't interrupt */
-#define GPIO_DW_3_BITS 12
-#define GPIO_DW_PORT_3_INT_MASK 0 /* n/a */
+#define GPIO_DW_3_BASE_ADDR 0xF0002024 /* GPIO 3 : PORTD */
+#define GPIO_DW_3_IRQ 0 /* can't interrupt */
+#define GPIO_DW_3_BITS 12
+#define GPIO_DW_PORT_3_INT_MASK 0 /* n/a */
/* undef GPIO_DW_IO_ACCESS .. because memory mapped */
/* undef CONFIG_GPIO_DW_0_IRQ_SHARED */
@@ -83,15 +89,15 @@
/* SPI */
-#define SPI_DW_SPI_CLOCK SYSCLK_DEFAULT_IOSC_HZ
+#define SPI_DW_SPI_CLOCK SYSCLK_DEFAULT_IOSC_HZ
-#define SPI_DW_PORT_0_REGS 0xF0006000
-#define SPI_DW_PORT_1_REGS 0xF0007000
+#define SPI_DW_PORT_0_REGS 0xF0006000
+#define SPI_DW_PORT_1_REGS 0xF0007000
-#define SPI_DW_PORT_0_IRQ 25
-#define SPI_DW_PORT_1_IRQ 26
+#define SPI_DW_PORT_0_IRQ 27
+#define SPI_DW_PORT_1_IRQ 28
-#define SPI_DW_IRQ_FLAGS 0
+#define SPI_DW_IRQ_FLAGS 0
/*
* SPI Chip Select Assignments on EM Starter Kit
@@ -106,18 +112,22 @@
/*
* UART
- UART0 vector 27 0xF0008000
- UART1 vector 28 0xF0009000
- UART2 vector 29 0xF000A000
+ UART0 vector 29 0xF0008000
+ UART1 vector 30 0xF0009000
+ UART2 vector 31 0xF000A000
*/
#define UART_NS16550_PORT_0_BASE_ADDR 0xF0008000
-#define UART_NS16550_PORT_0_IRQ 27
+#define UART_NS16550_PORT_0_IRQ 29
#define UART_NS16550_PORT_0_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
#define UART_NS16550_PORT_1_BASE_ADDR 0xF0009000
-#define UART_NS16550_PORT_1_IRQ 28
+#define UART_NS16550_PORT_1_IRQ 30
#define UART_NS16550_PORT_1_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
+#define UART_NS16550_PORT_2_BASE_ADDR 0xF000A000
+#define UART_NS16550_PORT_2_IRQ 31
+#define UART_NS16550_PORT_2_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
+
#define UART_IRQ_FLAGS 0 /* Default */
#endif /* !_ASMLANGUAGE */
diff --git a/arch/arc/soc/em9d/Kconfig.defconfig b/arch/arc/soc/em9d/Kconfig.defconfig
index 3731fd7..1cdff89 100644
--- a/arch/arc/soc/em9d/Kconfig.defconfig
+++ b/arch/arc/soc/em9d/Kconfig.defconfig
@@ -19,7 +19,7 @@
config NUM_IRQS
# must be > the highest interrupt number used
- default 36
+ default 38
config RGF_NUM_BANKS
default 2
diff --git a/arch/arc/soc/em9d/Kconfig.soc b/arch/arc/soc/em9d/Kconfig.soc
index 81eb02b..d0af561 100644
--- a/arch/arc/soc/em9d/Kconfig.soc
+++ b/arch/arc/soc/em9d/Kconfig.soc
@@ -1,3 +1,4 @@
config SOC_EM9D
bool "Synopsys ARC EM9D"
+ select CPU_HAS_FPU
diff --git a/arch/arc/soc/em9d/Makefile b/arch/arc/soc/em9d/Makefile
index 268ad0c..5c96dcf 100644
--- a/arch/arc/soc/em9d/Makefile
+++ b/arch/arc/soc/em9d/Makefile
@@ -1,2 +1,14 @@
-soc-cflags = $(call cc-option,-mcpu=arcem) \
- $(call cc-option,-mno-sdata)
+# -mcpu=em4_dmips is added to KBUILD_CFLAGS to make cc-option check the options correctly
+KBUILD_CFLAGS += -mcpu=em4_fpus
+
+soc-cflags += $(call cc-option,-mcpu=em4_fpus -mno-sdata) \
+ $(call cc-option,-mdiv-rem -mswap -mnormm) \
+ $(call cc-option,-mmpy-option=6 -mbarrel-shifter) \
+
+ifeq ($(CONFIG_CODE_DENSITY), y)
+soc-cflags += $(call cc-option,-mcode-density)
+endif
+
+ifeq ($(CONFIG_FLOAT), y)
+soc-cflags += $(call cc-option,-mfpu=fpus_all)
+endif
\ No newline at end of file
diff --git a/arch/arc/soc/em9d/soc.h b/arch/arc/soc/em9d/soc.h
index ea8cf45..be88505 100644
--- a/arch/arc/soc/em9d/soc.h
+++ b/arch/arc/soc/em9d/soc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016 Synopsys, Inc. All rights reserved.
+ * Copyright (c) 2017 Synopsys, Inc. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -18,63 +18,68 @@
/* default system clock */
-#define SYSCLK_DEFAULT_IOSC_HZ MHZ(50)
+#define SYSCLK_DEFAULT_IOSC_HZ MHZ(50)
/* On the EM Starter Kit board, the peripheral bus clock frequency is 50Mhz */
/* IRQs */
-#define IRQ_TIMER0 16
-#define IRQ_TIMER1 17
+#define IRQ_TIMER0 16
+#define IRQ_TIMER1 17
+#define IRQ_CORE_DMA_COMPLETE 22
+#define IRQ_CORE_DMA_ERROR 23
#ifndef _ASMLANGUAGE
#include <misc/util.h>
#include <drivers/rand32.h>
-#define ARCV2_TIMER0_INT_LVL IRQ_TIMER0
-#define ARCV2_TIMER0_INT_PRI 0
+#define ARCV2_TIMER0_INT_LVL IRQ_TIMER0
+#define ARCV2_TIMER0_INT_PRI 0
-#define CONFIG_ARCV2_TIMER1_INT_LVL IRQ_TIMER1
-#define CONFIG_ARCV2_TIMER1_INT_PRI 1
+#define ARCV2_TIMER1_INT_LVL IRQ_TIMER1
+#define ARCV2_TIMER1_INT_PRI 1
-#define INT_ENABLE_ARC ~(0x00000001 << 8)
-#define INT_ENABLE_ARC_BIT_POS (8)
+#define CONFIG_ARCV2_TIMER1_INT_LVL IRQ_TIMER1
+#define CONFIG_ARCV2_TIMER1_INT_PRI 1
+
+#define INT_ENABLE_ARC ~(0x00000001 << 8)
+#define INT_ENABLE_ARC_BIT_POS (8)
/* I2C */
/* I2C_0 is on Pmod2 connector */
-#define I2C_DW_0_BASE_ADDR 0xF0004000
-#define I2C_DW_0_IRQ 23
+#define I2C_DW_0_BASE_ADDR 0xF0004000
+#define I2C_DW_0_IRQ 25
/* I2C_1 is on Pmod4 connector */
-#define I2C_DW_1_BASE_ADDR 0xF0005000
-#define I2C_DW_1_IRQ 24
+#define I2C_DW_1_BASE_ADDR 0xF0005000
+#define I2C_DW_1_IRQ 26
#define I2C_DW_IRQ_FLAGS 0
/* GPIO */
-#define GPIO_DW_0_BASE_ADDR 0xF0002000 /* GPIO 0 : PORTA */
-#define GPIO_DW_0_IRQ 22
-#define GPIO_DW_0_BITS 32
-#define GPIO_DW_PORT_0_INT_MASK 0 /* n/a */
+#define GPIO_DW_0_BASE_ADDR 0xF0002000 /* GPIO 0 : PORTA */
+#define GPIO_DW_0_IRQ 24
+#define GPIO_DW_0_BITS 32
+#define GPIO_DW_PORT_0_INT_MASK 0 /* n/a */
#define GPIO_DW_0_IRQ_FLAGS 0 /* Defaults */
-#define GPIO_DW_1_BASE_ADDR 0xF000200C /* GPIO 1 : PORTB */
-#define GPIO_DW_1_IRQ 0 /* can't interrupt */
-#define GPIO_DW_1_BITS 9 /* 9 LEDs on board */
-#define GPIO_DW_PORT_1_INT_MASK 0 /* n/a */
+#define GPIO_DW_1_BASE_ADDR 0xF000200C /* GPIO 1 : PORTB */
+#define GPIO_DW_1_IRQ 0 /* can't interrupt */
+#define GPIO_DW_1_BITS 9 /* 9 LEDs on board */
+#define GPIO_DW_PORT_1_INT_MASK 0 /* n/a */
-#define GPIO_DW_2_BASE_ADDR 0xF0002018 /* GPIO 2 : PORTC */
-#define GPIO_DW_2_IRQ 0 /* can't interrupt */
-#define GPIO_DW_2_BITS 32
-#define GPIO_DW_PORT_2_INT_MASK 0 /* n/a */
+#define GPIO_DW_2_BASE_ADDR 0xF0002018 /* GPIO 2 : PORTC */
+#define GPIO_DW_2_IRQ 0 /* can't interrupt */
+#define GPIO_DW_2_BITS 32
+#define GPIO_DW_PORT_2_INT_MASK 0 /* n/a */
-#define GPIO_DW_3_BASE_ADDR 0xF0002024 /* GPIO 3 : PORTD */
-#define GPIO_DW_3_IRQ 0 /* can't interrupt */
-#define GPIO_DW_3_BITS 12
-#define GPIO_DW_PORT_3_INT_MASK 0 /* n/a */
+#define GPIO_DW_3_BASE_ADDR 0xF0002024 /* GPIO 3 : PORTD */
+#define GPIO_DW_3_IRQ 0 /* can't interrupt */
+#define GPIO_DW_3_BITS 12
+#define GPIO_DW_PORT_3_INT_MASK 0 /* n/a */
/* undef GPIO_DW_IO_ACCESS .. because memory mapped */
/* undef CONFIG_GPIO_DW_0_IRQ_SHARED */
@@ -83,15 +88,15 @@
/* SPI */
-#define SPI_DW_SPI_CLOCK SYSCLK_DEFAULT_IOSC_HZ
+#define SPI_DW_SPI_CLOCK SYSCLK_DEFAULT_IOSC_HZ
-#define SPI_DW_PORT_0_REGS 0xF0006000
-#define SPI_DW_PORT_1_REGS 0xF0007000
+#define SPI_DW_PORT_0_REGS 0xF0006000
+#define SPI_DW_PORT_1_REGS 0xF0007000
-#define SPI_DW_PORT_0_IRQ 25
-#define SPI_DW_PORT_1_IRQ 26
+#define SPI_DW_PORT_0_IRQ 27
+#define SPI_DW_PORT_1_IRQ 28
-#define SPI_DW_IRQ_FLAGS 0
+#define SPI_DW_IRQ_FLAGS 0
/*
* SPI Chip Select Assignments on EM Starter Kit
@@ -106,18 +111,22 @@
/*
* UART
- UART0 vector 27 0xF0008000
- UART1 vector 28 0xF0009000
- UART2 vector 29 0xF000A000
+ UART0 vector 29 0xF0008000
+ UART1 vector 30 0xF0009000
+ UART2 vector 31 0xF000A000
*/
#define UART_NS16550_PORT_0_BASE_ADDR 0xF0008000
-#define UART_NS16550_PORT_0_IRQ 27
+#define UART_NS16550_PORT_0_IRQ 29
#define UART_NS16550_PORT_0_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
#define UART_NS16550_PORT_1_BASE_ADDR 0xF0009000
-#define UART_NS16550_PORT_1_IRQ 28
+#define UART_NS16550_PORT_1_IRQ 30
#define UART_NS16550_PORT_1_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
+#define UART_NS16550_PORT_2_BASE_ADDR 0xF000A000
+#define UART_NS16550_PORT_2_IRQ 31
+#define UART_NS16550_PORT_2_CLK_FREQ SYSCLK_DEFAULT_IOSC_HZ
+
#define UART_IRQ_FLAGS 0 /* Default */
#endif /* !_ASMLANGUAGE */
diff --git a/boards/arc/em_starterkit/Kconfig.board b/boards/arc/em_starterkit/Kconfig.board
index c323e15..ce54761 100644
--- a/boards/arc/em_starterkit/Kconfig.board
+++ b/boards/arc/em_starterkit/Kconfig.board
@@ -10,7 +10,7 @@
help
The DesignWare ARC EM Starter Kit board is a board
that can host up to 3 different SOC FPGA bit files.
- Version 2.2 firmware supports EM7D, EM9D and EM11D configurations.
+ Version 2.3 firmware supports EM7D, EM9D and EM11D configurations.
EM9D using CCM memories and is a Harvard Architecture.
EM7D and EM11D have access to 128MB DRAM and use i-cache and d-cache.
-
+ EM7D has secureshield feature, which is not supported in Zephyr currently.
diff --git a/boards/arc/em_starterkit/Makefile.board b/boards/arc/em_starterkit/Makefile.board
index 4ee729b..48f70fb 100644
--- a/boards/arc/em_starterkit/Makefile.board
+++ b/boards/arc/em_starterkit/Makefile.board
@@ -1,16 +1,7 @@
-#
-# TODO: This file is WRONG currently.
-# The Zephyr-SDK tools don't yet support working with the ARC EM Starter Kit
-# See doc/board/em_starterkit.rst for more details.
-#
-#FLASH_SCRIPT = openocd.sh
-# ^^ Keep FLASH_SCRIPT undefined for now since flashing a self-boot image
-# is not yet supported by Zephyr Makefile.
-OPENOCD_PRE_CMD = "targets 1"
-OPENOCD_LOAD_CMD = "load_image ${O}/${KERNEL_BIN_NAME} $(CONFIG_ICCM_BASE_ADDRESS)"
-OPENOCD_VERIFY_CMD = "verify_image ${O}/${KERNEL_BIN_NAME} $(CONFIG_ICCM_BASE_ADDRESS)"
+FLASH_SCRIPT = arc_debugger.sh
+DEBUG_SCRIPT = arc_debugger.sh
-GDB_PORT = 3333
+OPENOCD_LOAD_CMD = "load_image ${O}/${KERNEL_ELF_NAME}"
+OPENOCD_VERIFY_CMD = "verify_image ${O}/${KERNEL_ELF_NAME}"
-export OPENOCD_PRE_CMD FLASH_SCRIPT OPENOCD_VERIFY_CMD OPENOCD_LOAD_CMD GDB_PORT
-
+export FLASH_SCRIPT DEBUG_SCRIPT OPENOCD_VERIFY_CMD OPENOCD_LOAD_CMD
\ No newline at end of file
diff --git a/boards/arc/em_starterkit/board.h b/boards/arc/em_starterkit/board.h
index 5580515..7a8ede8 100644
--- a/boards/arc/em_starterkit/board.h
+++ b/boards/arc/em_starterkit/board.h
@@ -9,4 +9,55 @@
#include <soc.h>
+/* Switches */
+#define SW0_GPIO_PIN 0
+#define SW0_GPIO_NAME CONFIG_GPIO_DW_2_NAME
+
+#define SW1_GPIO_PIN 1
+#define SW1_GPIO_NAME CONFIG_GPIO_DW_2_NAME
+
+#define SW2_GPIO_PIN 2
+#define SW2_GPIO_NAME CONFIG_GPIO_DW_2_NAME
+
+#define SW3_GPIO_PIN 3
+#define SW3_GPIO_NAME CONFIG_GPIO_DW_2_NAME
+
+/* Buttons */
+#define BTN0_GPIO_PIN 0
+#define BTN0_GPIO_NAME CONFIG_GPIO_DW_0_NAME
+
+#define BTN1_GPIO_PIN 1
+#define BTN1_GPIO_NAME CONFIG_GPIO_DW_0_NAME
+
+#define BTN2_GPIO_PIN 2
+#define BTN2_GPIO_NAME CONFIG_GPIO_DW_0_NAME
+
+/* Onboard LEDs */
+#define LED0_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED0_GPIO_PIN 0
+
+#define LED1_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED1_GPIO_PIN 1
+
+#define LED2_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED2_GPIO_PIN 2
+
+#define LED3_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED3_GPIO_PIN 3
+
+#define LED4_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED4_GPIO_PIN 4
+
+#define LED5_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED5_GPIO_PIN 5
+
+#define LED6_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED6_GPIO_PIN 6
+
+#define LED7_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED7_GPIO_PIN 7
+
+#define LED8_GPIO_PORT CONFIG_GPIO_DW_1_NAME
+#define LED8_GPIO_PIN 8
+
#endif /* __INC_BOARD_H */
diff --git a/boards/arc/em_starterkit/em_starterkit_defconfig b/boards/arc/em_starterkit/em_starterkit_defconfig
index 086f3fd..513a3d0 100644
--- a/boards/arc/em_starterkit/em_starterkit_defconfig
+++ b/boards/arc/em_starterkit/em_starterkit_defconfig
@@ -1,5 +1,5 @@
CONFIG_ARC=y
-CONFIG_SOC_EM7D=y
+CONFIG_SOC_EM11D=y
CONFIG_BOARD_EM_STARTERKIT=y
CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000
CONFIG_XIP=n
diff --git a/boards/arc/em_starterkit/support/openocd.cfg b/boards/arc/em_starterkit/support/openocd.cfg
index b9359d4..f2cd062 100644
--- a/boards/arc/em_starterkit/support/openocd.cfg
+++ b/boards/arc/em_starterkit/support/openocd.cfg
@@ -1,17 +1,12 @@
-#
-# TODO: This file cannot be used yet. snps_em_sk.cfg is WRONG in Zephyr-SDK.
-# Instead the user must download newer ARC GNU tools from github.
-# See doc/board/em_starterkit.rst for more details.
-#
-#source [find interface/digilent-hs1.cfg] ...done in board file.
-source [find board/snps_em_sk.cfg]
+# Configure JTAG cable
+# EM Starter Kit has built-in FT2232 chip, which is similar to Digilent HS-1.
+source [find interface/ftdi/digilent-hs1.cfg]
-#em_starterkit.em9d configure -event gdb-attach {
-# reset halt
-## gdb_breakpoint_override hard
-#}
+# EM11D reportedly requires 5 MHz. Other cores and board can work faster.
+adapter_khz 5000
-#em_starterkit.em9d configure -event gdb-detach {
-# resume
-# shutdown
-#}
+# ARCs support only JTAG.
+transport select jtag
+
+# Configure FPGA. This script supports both LX45 and LX150.
+source [find target/snps_em_sk_fpga.cfg]
\ No newline at end of file
diff --git a/include/arch/arc/v2/aux_regs.h b/include/arch/arc/v2/aux_regs.h
index 41ae4c5..fd2583a 100644
--- a/include/arch/arc/v2/aux_regs.h
+++ b/include/arch/arc/v2/aux_regs.h
@@ -73,6 +73,9 @@
#define _ARC_V2_IRQ_PRIORITY 0x206
#define _ARC_V2_KSTACK_TOP 0x264
#define _ARC_V2_KSTACK_BASE 0x265
+#define _ARC_V2_JLI_BASE 0x290
+#define _ARC_V2_LDI_BASE 0x291
+#define _ARC_V2_EI_BASE 0x292
#define _ARC_V2_ERET 0x400
#define _ARC_V2_ERSTATUS 0x402
#define _ARC_V2_ECR 0x403
@@ -84,6 +87,12 @@
#define _ARC_V2_IRQ_STATUS 0x40f
#define _ARC_V2_IRQ_PULSE_CANCEL 0x415
#define _ARC_V2_IRQ_PENDING 0x416
+#define _ARC_V2_FPU_CTRL 0x300
+#define _ARC_V2_FPU_STATUS 0x301
+#define _ARC_V2_FPU_DPFP1L 0x302
+#define _ARC_V2_FPU_DPFP1H 0x303
+#define _ARC_V2_FPU_DPFP2L 0x304
+#define _ARC_V2_FPU_DPFP2H 0x305
/* STATUS32/STATUS32_P0 bits */
#define _ARC_V2_STATUS32_H (1 << 0)
diff --git a/scripts/support/arc_debugger.sh b/scripts/support/arc_debugger.sh
new file mode 100755
index 0000000..02aa926
--- /dev/null
+++ b/scripts/support/arc_debugger.sh
@@ -0,0 +1,127 @@
+#!/bin/sh
+
+# This script is loosly based on a script with same purpose provided
+# by RIOT-OS (https://github.com/RIOT-OS/RIOT)
+
+OPENOCD=${OPENOCD:-openocd}
+OPENOCD_CMD="${OPENOCD}${OPENOCD_DEFAULT_PATH:+ -s $OPENOCD_DEFAULT_PATH}"
+OPENOCD_CONFIG=${ZEPHYR_BASE}/boards/${ARCH}/${BOARD_NAME}/support/openocd.cfg
+BIN_NAME=${O}/${KERNEL_BIN_NAME}
+ELF_NAME=${O}/${KERNEL_ELF_NAME}
+
+test_config() {
+ if [ ! -f "${OPENOCD_CONFIG}" ]; then
+ echo "Error: Unable to locate OpenOCD configuration file: ${OPENOCD_CONFIG}"
+ exit 1
+ fi
+ if ! which ${OPENOCD} >/dev/null 2>&1; then
+ echo "Error: Unable to locate OpenOCD executable: ${OPENOCD}"
+ exit 1
+ fi
+}
+
+test_bin() {
+ if [ ! -f "${BIN_NAME}" ]; then
+ echo "Error: Unable to locate image binary: ${BIN_NAME}"
+ exit 1
+ fi
+}
+
+do_flash() {
+ test_config
+ test_bin
+
+ # flash device with specified image
+ # setsid is needed so that Ctrl+C in GDB doesn't kill OpenOCD
+ [ -z "${SETSID}" ] && SETSID="$(which setsid)"
+ # temporary file that saves OpenOCD pid
+ OCD_PIDFILE=$(mktemp -t "openocd_pid.XXXXXXXXXX")
+ # cleanup after script terminates
+ trap "cleanup ${OCD_PIDFILE}" EXIT
+ # don't trap on Ctrl+C, because GDB keeps running
+ trap '' INT
+ # start OpenOCD as GDB server
+ ${SETSID} sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
+ ${OPENOCD_EXTRA_INIT} \
+ -c 'tcl_port ${TCL_PORT:-6333}' \
+ -c 'telnet_port ${TELNET_PORT:-4444}' \
+ -c 'gdb_port ${GDB_PORT:-3333}' \
+ -c 'init' \
+ -c 'targets' \
+ -c 'halt' \
+ & \
+ echo \$! > $OCD_PIDFILE" &
+ # connect to the GDB server
+ ${GDB} ${TUI} -ex "target remote :${GDB_PORT:-3333}" \
+ -ex "load" -ex "c" ${ELF_NAME}
+ # will be called by trap
+ cleanup() {
+ OCD_PID="$(cat $OCD_PIDFILE)"
+ kill ${OCD_PID} &>/dev/null
+ rm -f "$OCD_PIDFILE"
+ exit 0
+ }
+}
+
+
+do_debug() {
+ test_config
+ test_bin
+ # setsid is needed so that Ctrl+C in GDB doesn't kill OpenOCD
+ [ -z "${SETSID}" ] && SETSID="$(which setsid)"
+ # temporary file that saves OpenOCD pid
+ OCD_PIDFILE=$(mktemp -t "openocd_pid.XXXXXXXXXX")
+ # cleanup after script terminates
+ trap "cleanup ${OCD_PIDFILE}" EXIT
+ # don't trap on Ctrl+C, because GDB keeps running
+ trap '' INT
+ # start OpenOCD as GDB server
+ ${SETSID} sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
+ ${OPENOCD_EXTRA_INIT} \
+ -c 'tcl_port ${TCL_PORT:-6333}' \
+ -c 'telnet_port ${TELNET_PORT:-4444}' \
+ -c 'gdb_port ${GDB_PORT:-3333}' \
+ -c 'init' \
+ -c 'targets' \
+ -c 'halt' \
+ & \
+ echo \$! > $OCD_PIDFILE" &
+ # connect to the GDB server
+ ${GDB} ${TUI} -ex "target remote :${GDB_PORT:-3333}" -ex "load" ${ELF_NAME}
+ # will be called by trap
+ cleanup() {
+ OCD_PID="$(cat $OCD_PIDFILE)"
+ kill ${OCD_PID} &>/dev/null
+ rm -f "$OCD_PIDFILE"
+ exit 0
+ }
+}
+
+do_debugserver() {
+ test_config
+ sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
+ -c 'init' \
+ -c 'targets' \
+ -c 'reset halt'"
+}
+
+CMD="$1"
+shift
+
+if [ "$KBUILD_VERBOSE" -eq 1 ]
+then
+ set -x
+fi
+
+case "${CMD}" in
+ flash)
+ echo "Flashing Target Device"
+ do_flash "$@"
+ ;;
+ debugserver)
+ do_debugserver "$@"
+ ;;
+ debug)
+ do_debug "$@"
+ ;;
+esac