8000 qemu-arm: Add support for Cortex-A9 via sabrelite board. · davidgiven/micropython@b84406f · GitHub
[go: up one dir, main page]

Skip to content

Commit b84406f

Browse files
committed
qemu-arm: Add support for Cortex-A9 via sabrelite board.
Signed-off-by: Damien George <damien@micropython.org>
1 parent f5cba77 commit b84406f

File tree

6 files changed

+131
-9
lines changed

6 files changed

+131
-9
lines changed

ports/qemu-arm/Makefile

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,35 @@ ifeq ($(BOARD),netduino2)
1616
CFLAGS += -mthumb -mcpu=cortex-m3 -mfloat-abi=soft
1717
CFLAGS += -DQEMU_SOC_STM32
1818
LDSCRIPT = stm32.ld
19-
SRC_BOARD_O = lib/utils/gchelper_m3.o
19+
SRC_BOARD_O = lib/utils/gchelper_native.o lib/utils/gchelper_m3.o
20+
MPY_CROSS_FLAGS += -march=armv7m
2021
endif
2122

2223
ifeq ($(BOARD),microbit)
2324
CFLAGS += -mthumb -mcpu=cortex-m0 -mfloat-abi=soft
2425
CFLAGS += -DQEMU_SOC_NRF51
2526
LDSCRIPT = nrf51.ld
2627
QEMU_EXTRA = -global nrf51-soc.flash-size=1048576 -global nrf51-soc.sram-size=262144
27-
SRC_BOARD_O = lib/utils/gchelper_m0.o
28+
SRC_BOARD_O = lib/utils/gchelper_native.o lib/utils/gchelper_m0.o
29+
MPY_CROSS_FLAGS += -march=armv7m
2830
endif
2931

3032
ifeq ($(BOARD),mps2-an385)
3133
CFLAGS += -mthumb -mcpu=cortex-m3 -mfloat-abi=soft
3234
CFLAGS += -DQEMU_SOC_MPS2
3335
LDSCRIPT = mps2.ld
34-
SRC_BOARD_O = lib/utils/gchelper_m3.o
36+
SRC_BOARD_O = lib/utils/gchelper_native.o lib/utils/gchelper_m3.o
37+
MPY_CROSS_FLAGS += -march=armv7m
38+
endif
39+
40+
ifeq ($(BOARD),sabrelite)
41+
CFLAGS += -mcpu=cortex-a9
42+
CFLAGS += -DQEMU_SOC_IMX6
43+
LDSCRIPT = imx6.ld
44+
QEMU_EXTRA = -m 128M
45+
SRC_BOARD_O = lib/utils/gchelper_generic.o
46+
# It's really armv7a but closest supported value is armv6.
47+
MPY_CROSS_FLAGS += -march=armv6
3548
endif
3649

3750
CROSS_COMPILE ?= arm-none-eabi-
@@ -95,7 +108,6 @@ LIB_SRC_C += $(addprefix lib/,\
95108
libm/atanf.c \
96109
libm/atan2f.c \
97110
libm/roundf.c \
98-
utils/gchelper_native.c \
99111
utils/sys_stdio_mphal.c \
100112
)
101113

@@ -125,7 +137,6 @@ ifneq ($(FROZEN_MANIFEST),)
125137
CFLAGS += -DMICROPY_MODULE_FROZEN_STR
126138
CFLAGS += -DMICROPY_MODULE_FROZEN_MPY
127139
CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool
128-
MPY_CROSS_FLAGS += -march=armv7m
129140
endif
130141

131142
all: run

ports/qemu-arm/Makefile.test

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@ FROZEN_MANIFEST ?= "freeze('test-frzmpy')"
44

55
include Makefile
66

7+
ifeq ($(BOARD),sabrelite)
8+
# These don't work on Cortex-A9.
9+
TESTS_EXCLUDE = inlineasm/asmdiv.py inlineasm/asmspecialregs.py
10+
endif
11+
712
CFLAGS += -DTEST
813

914
.PHONY: $(BUILD)/genhdr/tests.h
1015

1116
$(BUILD)/test_main.o: $(BUILD)/genhdr/tests.h
1217
$(BUILD)/genhdr/tests.h:
1318
(cd $(TOP)/tests; ./run-tests.py --target=qemu-arm --write-exp)
14-
$(Q)echo "Generating $@";(cd $(TOP)/tests; ../tools/tinytest-codegen.py) > $@
19+
$(Q)echo "Generating $@";(cd $(TOP)/tests; ../tools/tinytest-codegen.py $(addprefix --exclude ,$(TESTS_EXCLUDE))) > $@
1520

1621
$(BUILD)/lib/tinytest/tinytest.o: CFLAGS += -DNO_FORKING
1722

ports/qemu-arm/imx6.ld

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* Vector table is at 0x00000000, entry point is 0x10000000. */
2+
3+
MEMORY
4+
{
5+
ROM : ORIGIN = 0x00000000, LENGTH = 96K
6+
RAM : ORIGIN = 0x10000000, LENGTH = 128M
7+
}
8+
9+
_estack = ORIGIN(RAM) + LENGTH(RAM);
10+
11+
SECTIONS
12+
{
13+
.rom : {
14+
. = ALIGN(4);
15+
KEEP(*(.isr_vector))
16+
. = ALIGN(4);
17+
} > ROM
18+
19+
.text : {
20+
. = ALIGN(4);
21+
*(.text.Reset_Handler)
22+
*(.text*)
23+
*(.rodata*)
24+
. = ALIGN(4);
25+
_etext = .;
26+
_sidata = _etext;
27+
} > RAM
28+
29+
.data : AT ( _sidata )
30+
{
31+
. = ALIGN(4);
32+
_sdata = .;
33+
*(.data*)
34+
. = ALIGN(4);
35+
_edata = .;
36+
} > RAM
37+
38+
.bss :
39+
{
40+
. = ALIGN(4);
41+
_sbss = .;
42+
*(.bss*)
43+
*(COMMON)
44+
. = ALIGN(4);
45+
_ebss = .;
46+
} > RAM
47+
}

ports/qemu-arm/mpconfigport.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,16 @@
33
// options to control how MicroPython is built
44

55
#define MICROPY_ALLOC_PATH_MAX (512)
6-
#define MICROPY_EMIT_X64 (0)
6+
7+
#if defined(__ARM_ARCH_ISA_ARM)
8+
#define MICROPY_EMIT_ARM (1)
9+
#define MICROPY_EMIT_INLINE_THUMB (1)
10+
#elif defined(__ARM_ARCH_ISA_THUMB)
711
#define MICROPY_EMIT_THUMB (1)
812
#define MICROPY_EMIT_INLINE_THUMB (1)
13+
#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void *)((mp_uint_t)(p) | 1))
14+
#endif
15+
916
#define MICROPY_MALLOC_USES_ALLOCATED_SIZE (1)
1017
#define MICROPY_MEM_STATS (1)
1118
#define MICROPY_DEBUG_PRINTERS (0)
@@ -43,8 +50,6 @@
4350

4451
// type definitions for the specific machine
4552

46-
#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void *)((mp_uint_t)(p) | 1))
47-
4853
#define MP_SSIZE_MAX (0x7fffffff)
4954

5055
#define UINT_FMT "%lu"

ports/qemu-arm/startup.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ void Default_Handler(void) {
2828
}
2929
}
3030

31+
#if defined(__ARM_ARCH_ISA_ARM)
32+
33+
// ARM architecture with standard ARM ISA.
34+
35+
__attribute__((naked, section(".isr_vector"))) void isr_vector(void) {
36+
__asm volatile (
37+
"b Reset_Handler\n"
38+
"b Default_Handler\n"
39+
"b Default_Handler\n"
40+
"b Default_Handler\n"
41+
"b Default_Handler\n"
42+
"nop\n"
43+
"b Default_Handler\n"
44+
"b Default_Handler\n"
45+
);
46+
}
47+
48+
#elif defined(__ARM_ARCH_ISA_THUMB)
49+
50+
// ARM architecture with Thumb-only ISA.
51+
3152
const uint32_t isr_vector[] __attribute__((section(".isr_vector"))) = {
3253
(uint32_t)&_estack,
3354
(uint32_t)&Reset_Handler,
@@ -47,6 +68,8 @@ const uint32_t isr_vector[] __attribute__((section(".isr_vector"))) = {
4768
(uint32_t)&Default_Handler, // SysTick_Handler
4869
};
4970

71+
#endif
72+
5073
void _start(void) {
5174
// Enable the UART
5275
uart_init();
@@ -68,7 +91,11 @@ __attribute__((naked)) void exit(int status) {
6891
"ldr r1, =0x20026\n" // ADP_Stopped_ApplicationExit, a clean exit
6992
".notclean:\n"
7093
"movs r0, #0x18\n" // SYS_EXIT
94+
#if defined(__ARM_ARCH_ISA_ARM)
95+
"svc 0x00123456\n"
96+
#elif defined(__ARM_ARCH_ISA_THUMB)
7197
"bkpt 0xab\n"
98+
#endif
7299
);
73100
for (;;) {
74101
}

ports/qemu-arm/uart.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,31 @@ void uart_tx_strn(const char *buf, size_t len) {
7575
}
7676
}
7777

78+
#elif defined(QEMU_SOC_IMX6)
79+
80+
#define UART_UCR1_UARTEN (1 << 0)
81+
#define UART_UCR2_TXEN (1 << 2)
82+
83+
typedef struct _UART_t {
84+
volatile uint32_t URXD; // 0x00
85+
volatile uint32_t r0[15];
86+
volatile uint32_t UTXD; // 0x40
87+
volatile uint32_t r1[15];
88+
volatile uint32_t UCR1; // 0x80
89+
volatile uint32_t UCR2; // 0x84
90+
} UART_t;
91+
92+
#define UART1 ((UART_t *)(0x02020000))
93+
94+
void uart_init(void) {
95+
UART1->UCR1 = UART_UCR1_UARTEN;
96+
UART1->UCR2 = UART_UCR2_TXEN;
97+
}
98+
99+
void uart_tx_strn(const char *buf, size_t len) {
100+
for (size_t i = 0; i < len; ++i) {
101+
UART1->UTXD = buf[i];
102+
}
103+
}
104+
78105
#endif

0 commit comments

Comments
 (0)
0