Fix uart_mini initialization and emulation
This commit is contained in:
parent
417106b967
commit
6c4dba0929
5
Makefile
5
Makefile
|
@ -1,7 +1,7 @@
|
||||||
include Makevars.mk
|
include Makevars.mk
|
||||||
|
|
||||||
# Rules
|
# Rules
|
||||||
|
#
|
||||||
all: kernel
|
all: kernel
|
||||||
|
|
||||||
$(BUILD_DIR)kernel:
|
$(BUILD_DIR)kernel:
|
||||||
|
@ -24,3 +24,6 @@ debug: kernel
|
||||||
-ex 'file $(BUILD_DIR)kernel/kernel.elf' \
|
-ex 'file $(BUILD_DIR)kernel/kernel.elf' \
|
||||||
-ex 'target remote localhost:1234'
|
-ex 'target remote localhost:1234'
|
||||||
kill %1
|
kill %1
|
||||||
|
|
||||||
|
console:
|
||||||
|
sudo picocom -b 115200 -r -l /dev/ttyUSB0
|
||||||
|
|
17
Makevars.mk
17
Makevars.mk
|
@ -21,12 +21,15 @@ AARCH64_QEMU = \
|
||||||
-serial stdio \
|
-serial stdio \
|
||||||
-monitor none \
|
-monitor none \
|
||||||
|
|
||||||
# AARCH64_QEMU = \
|
AARCH64_QEMU = \
|
||||||
# qemu-system-aarch64 \
|
qemu-system-aarch64 \
|
||||||
# -M raspi3 \
|
-M raspi3 \
|
||||||
# -nographic \
|
-nographic \
|
||||||
# -kernel build/kernel/kernel.elf \
|
-kernel build/kernel/kernel.elf \
|
||||||
# -serial stdio \
|
-serial /dev/null \
|
||||||
# -monitor none \
|
-serial stdio \
|
||||||
|
-monitor none \
|
||||||
|
|
||||||
|
# -kernel /home/elias/git/rpi/boards/pi3/aarch64/uart02/kernel8.img \
|
||||||
# vim:ft=make
|
# vim:ft=make
|
||||||
#
|
#
|
||||||
|
|
|
@ -42,15 +42,19 @@ all: kernel
|
||||||
|
|
||||||
default: kernel
|
default: kernel
|
||||||
|
|
||||||
kernel: $(BUILD_DIR)kernel.elf
|
kernel: $(BUILD_DIR)kernel.elf $(BUILD_DIR)kernel.list $(BUILD_DIR)kernel.bin
|
||||||
|
|
||||||
$(BUILD_DIR)kernel.elf: $(OBJECT_FILES)
|
$(BUILD_DIR)kernel.elf: $(OBJECT_FILES)
|
||||||
$(info linking target: $@)
|
$(info linking target: $@)
|
||||||
$(AARCH64_LD) -T$(LD_SCRIPT) -nostdlib $^ -o $@
|
$(AARCH64_LD) -T$(LD_SCRIPT) -nostdlib $^ -o $@
|
||||||
$(info done: $@)
|
$(info done: $@)
|
||||||
|
|
||||||
|
$(BUILD_DIR)kernel.list: $(BUILD_DIR)kernel.elf
|
||||||
|
$(AARCH64_OBJCOPY) -D $(BUILD_DIR)kernel.elf > $@
|
||||||
|
|
||||||
$(BUILD_DIR)kernel.bin: $(BUILD_DIR)/kernel.elf
|
$(BUILD_DIR)kernel.bin: $(BUILD_DIR)/kernel.elf
|
||||||
$(AARCH64_OBJCOPY) -O binary $< $@
|
$(AARCH64_OBJCOPY) -O binary $< $@
|
||||||
|
cp $@ $(BUILD_DIR)kernel8.img
|
||||||
|
|
||||||
$(BUILD_DIR)kernel.sym: $(BUILD_DIR)/kernel.elf
|
$(BUILD_DIR)kernel.sym: $(BUILD_DIR)/kernel.elf
|
||||||
$(AARCH64_OBJCOPY) --only-keep-debug $< $@
|
$(AARCH64_OBJCOPY) --only-keep-debug $< $@
|
||||||
|
|
|
@ -26,7 +26,7 @@ aarch64_set32r:
|
||||||
|
|
||||||
.globl aarch64_delay
|
.globl aarch64_delay
|
||||||
aarch64_delay:
|
aarch64_delay:
|
||||||
subs x0, x0, 0x01
|
subs x0, x0, 1
|
||||||
bne aarch64_delay
|
bne aarch64_delay
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,15 @@
|
||||||
ENTRY(_start)
|
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
/* For some reason qemu UART doesn't work with smaller address */
|
.text.boot : { *(.text.boot) }
|
||||||
. = 0x40000000;
|
|
||||||
|
|
||||||
.boot . : { boot.o(.text) }
|
|
||||||
.text : { *(.text) }
|
.text : { *(.text) }
|
||||||
|
.rodata : { *(.rodata) }
|
||||||
.data : { *(.data) }
|
.data : { *(.data) }
|
||||||
.bss : { *(.bss COMMON) }
|
. = ALIGN(0x8);
|
||||||
|
bss_begin = .;
|
||||||
|
.bss : { *(.bss*) }
|
||||||
|
bss_end = .;
|
||||||
|
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
. = . + 0x1000;
|
. = . + 0x8000;
|
||||||
stack_ptr = . ;
|
stack_ptr = . ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
|
||||||
#include "aarch64_reg.h"
|
#include "aarch64_reg.h"
|
||||||
|
|
||||||
.globl _start
|
.section ".text.boot"
|
||||||
|
.globl _start
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
mrs x0, mpidr_el1 /* Check CPU ID */
|
mrs x0, mpidr_el1 /* Check CPU ID */
|
||||||
|
@ -12,10 +13,6 @@ idle:
|
||||||
b idle
|
b idle
|
||||||
|
|
||||||
set_el:
|
set_el:
|
||||||
/* check current exception level */
|
|
||||||
bl aarch64_get_el
|
|
||||||
cmp x0, 0x03
|
|
||||||
bne set_stack
|
|
||||||
/* set SCTRL_EL1 */
|
/* set SCTRL_EL1 */
|
||||||
ldr x0, =SCTLR_VALUE_MMU_DISABLED
|
ldr x0, =SCTLR_VALUE_MMU_DISABLED
|
||||||
msr sctlr_el1, x0
|
msr sctlr_el1, x0
|
||||||
|
@ -36,6 +33,9 @@ set_el:
|
||||||
set_stack:
|
set_stack:
|
||||||
ldr x30, =stack_ptr /* defined in aarch64.ld */
|
ldr x30, =stack_ptr /* defined in aarch64.ld */
|
||||||
mov sp, x30
|
mov sp, x30
|
||||||
|
bl skip
|
||||||
|
skip:
|
||||||
bl k_main
|
bl k_main
|
||||||
|
hang: b hang
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -67,5 +67,5 @@ k_irq_fallback(int type, unsigned long esr, unsigned long address)
|
||||||
k_logu(esr, 16);
|
k_logu(esr, 16);
|
||||||
k_logs(", address: ");
|
k_logs(", address: ");
|
||||||
k_logu(address, 16);
|
k_logu(address, 16);
|
||||||
k_logs("\n");
|
k_logs("\r\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ k_main(void)
|
||||||
|
|
||||||
k_logs("Starting Lowe OS (EL");
|
k_logs("Starting Lowe OS (EL");
|
||||||
k_logi(aarch64_get_el(), 10);
|
k_logi(aarch64_get_el(), 10);
|
||||||
k_logs(")\n");
|
k_logs(")\r\n");
|
||||||
|
|
||||||
if (k_arch_init())
|
if (k_arch_init())
|
||||||
goto panic;
|
goto panic;
|
||||||
|
|
|
@ -35,5 +35,7 @@ k_timer_irq_handler(void)
|
||||||
m_current += m_interval;
|
m_current += m_interval;
|
||||||
aarch64_set32r(TIMER_C1, m_current);
|
aarch64_set32r(TIMER_C1, m_current);
|
||||||
aarch64_set32r(TIMER_CS, TIMER_CS_M1);
|
aarch64_set32r(TIMER_CS, TIMER_CS_M1);
|
||||||
k_logs("Timer interrupt\n");
|
k_logs("Timer: ");
|
||||||
|
k_logu(m_current, 10);
|
||||||
|
k_logs("\r\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#define UART_QEMU 1
|
#define UART_QEMU 1
|
||||||
|
|
||||||
#ifndef UART_DEFAULT
|
#ifndef UART_DEFAULT
|
||||||
#define UART_DEFAULT UART_QEMU
|
#define UART_DEFAULT UART_MINI
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UART_DEFAULT == UART_MINI
|
#if UART_DEFAULT == UART_MINI
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#warning "Unsopported default UART"
|
#warning "Unsupported default UART"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -26,16 +26,18 @@ uart_mini_init(void)
|
||||||
|
|
||||||
/* Enable UART Mini and its registers*/
|
/* Enable UART Mini and its registers*/
|
||||||
aarch64_set32r(AUX_ENABLES, 1);
|
aarch64_set32r(AUX_ENABLES, 1);
|
||||||
/* Disable auto flow control, TX and RX */
|
|
||||||
aarch64_set32r(AUX_MU_CNTL_REG, 0);
|
|
||||||
/* Disable TX and RX interrupts */
|
/* Disable TX and RX interrupts */
|
||||||
aarch64_set32r(AUX_MU_IER_REG, 0);
|
aarch64_set32r(AUX_MU_IER_REG, 0);
|
||||||
|
/* Disable auto flow control, TX and RX */
|
||||||
|
aarch64_set32r(AUX_MU_CNTL_REG, 0);
|
||||||
/* Set 8bit mode */
|
/* Set 8bit mode */
|
||||||
aarch64_set32r(AUX_MU_LCR_REG, 0);
|
aarch64_set32r(AUX_MU_LCR_REG, 3);
|
||||||
/* Set RTS line HIGH */
|
/* Set RTS line HIGH */
|
||||||
aarch64_set32r(AUX_MU_MCR_REG, 0);
|
aarch64_set32r(AUX_MU_MCR_REG, 0);
|
||||||
/* Set baud rate 115200 */
|
/* Set baud rate 115200 */
|
||||||
aarch64_set32r(AUX_MU_BAUD_REG, 0x10E);
|
aarch64_set32r(AUX_MU_IER_REG, 0);
|
||||||
|
aarch64_set32r(AUX_MU_IIR_REG, 0xC6);
|
||||||
|
aarch64_set32r(AUX_MU_BAUD_REG, 270);
|
||||||
|
|
||||||
sel = aarch64_get32r(GPFSEL1);
|
sel = aarch64_get32r(GPFSEL1);
|
||||||
/* clean and set ALT5 for GPIO14 */
|
/* clean and set ALT5 for GPIO14 */
|
||||||
|
@ -53,7 +55,7 @@ uart_mini_init(void)
|
||||||
aarch64_set32r(GPPUDCLK0, 0);
|
aarch64_set32r(GPPUDCLK0, 0);
|
||||||
|
|
||||||
/* Enable TX and RX */
|
/* Enable TX and RX */
|
||||||
aarch64_set32r(AUX_MU_CNTL_REG, 0x03);
|
aarch64_set32r(AUX_MU_CNTL_REG, 3);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue