Update environment
This commit is contained in:
+38
@@ -0,0 +1,38 @@
|
||||
# file: core.s
|
||||
# project: Löwe OS
|
||||
# authors: Elias Löwe <elias@lowenware.com>
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.global _core_init
|
||||
.extern _uart_puts
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
_core_init:
|
||||
# set up stack pointer using x30 register
|
||||
LDR x30, =0x40001000
|
||||
MOV sp, x30
|
||||
bl 1f
|
||||
|
||||
1:
|
||||
LDR x0, =some_int
|
||||
BL _uart_putx
|
||||
LDR x0, =greeting
|
||||
BL _uart_puts
|
||||
2:
|
||||
B 2b
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
.data
|
||||
|
||||
greeting:
|
||||
.asciz "\nStarting Lowe OS\n"
|
||||
|
||||
|
||||
.equ some_int, 0x1234567890ABCDEF
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2017-2019 by Löwenware Ltd
|
||||
* Please, refer LICENSE file for legal information
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* @file main.c
|
||||
* @author Ilja Kartašov <ik@lowenware.com>
|
||||
* @brief
|
||||
*
|
||||
* @see https://lowenware.com/
|
||||
*/
|
||||
|
||||
#include "uart.h"
|
||||
|
||||
|
||||
void
|
||||
k_main(void);
|
||||
|
||||
|
||||
void
|
||||
k_main(void)
|
||||
{
|
||||
uart_init();
|
||||
|
||||
uart_putc('L');
|
||||
uart_putc('o');
|
||||
uart_putc('w');
|
||||
uart_putc('e');
|
||||
uart_putc('\n');
|
||||
|
||||
for (;;) {
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
ENTRY(_start)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x40000000;
|
||||
.text : { *(.text) }
|
||||
.data : { *(.data) }
|
||||
.bss : { *(.bss COMMON) }
|
||||
. = ALIGN(8);
|
||||
. = . + 0x1000;
|
||||
stack_ptr = . ;
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2017-2019 by Löwenware Ltd
|
||||
* Please, refer LICENSE file for legal information
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* @file uart.c
|
||||
* @author Ilja Kartašov <ik@lowenware.com>
|
||||
* @brief
|
||||
*
|
||||
* @see https://lowenware.com/
|
||||
*/
|
||||
|
||||
#include "uart.h"
|
||||
|
||||
unsigned int *uart_base = (unsigned int *)UART_BASE;
|
||||
|
||||
|
||||
void
|
||||
uart_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
uart_putc(unsigned char c)
|
||||
{
|
||||
*uart_base = c;
|
||||
if(c == '\n')
|
||||
*uart_base = '\r';
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2017-2019 by Löwenware Ltd
|
||||
* Please, refer LICENSE file for legal information
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* @file uart.h
|
||||
* @author Ilja Kartašov <ik@lowenware.com>
|
||||
* @brief
|
||||
*
|
||||
* @see https://lowenware.com/
|
||||
*/
|
||||
|
||||
#ifndef UART_H_8AFC47F9_2953_42C1_A5C1_1AE5A1F52CD0
|
||||
#define UART_H_8AFC47F9_2953_42C1_A5C1_1AE5A1F52CD0
|
||||
|
||||
|
||||
#define UART_BASE 0x09000000
|
||||
|
||||
void
|
||||
uart_init(void);
|
||||
|
||||
void
|
||||
uart_putc(unsigned char c);
|
||||
|
||||
|
||||
|
||||
#endif /* !UART_H */
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
// file : uart.s
|
||||
// project : Löwe OS
|
||||
// authors : Elias Löwe <elias@lowenware.com>
|
||||
|
||||
// address of UART for virt device in qemu
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
.global _uart_putc // print single character uart
|
||||
.global _uart_putx // print integer in HEX format to uart
|
||||
.global _uart_puts // print null-terminated string to uart
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
// helper to avoid extra data moving
|
||||
// @x1 character print
|
||||
uart_putc:
|
||||
STP x2, lr, [sp, -16]!
|
||||
|
||||
MOV x2, 0x09000000 // set UART address
|
||||
STRB w1, [x2] // put character out
|
||||
|
||||
LDP x2, lr, [sp], 16
|
||||
RET
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// print character to uart
|
||||
// @x0 character print
|
||||
_uart_putc:
|
||||
STR lr, [sp, -16]!
|
||||
|
||||
MOV x1, x0 // set arguments
|
||||
BL uart_putc // put character out
|
||||
|
||||
LDR lr, [sp], 16
|
||||
RET
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// @x0 integer to print
|
||||
_uart_putx:
|
||||
STP lr, x3, [sp, -32]!
|
||||
STP x0, x1, [sp, 16]
|
||||
|
||||
LDR x3, =60 // init bits counter 64-4
|
||||
|
||||
1:
|
||||
LSR x1, x0, x3 // shift to digit
|
||||
AND x1, x1, 0xF // keep only digit
|
||||
CMP x1, 9 // compare it to 9
|
||||
BLS 2f // less or equal
|
||||
ADD x1, x1, 0x37 // turn into ASCII HEX char
|
||||
B 3f // continue to output
|
||||
|
||||
2:
|
||||
ADD x1, x1, 0x30 // turn into ASCII num char
|
||||
|
||||
3:
|
||||
BL uart_putc // output carachter
|
||||
CBZ x3, 0f // if counter == 0 return
|
||||
SUB x3, x3, 4 // otherwise subtract counter by 4
|
||||
B 1b // repeat
|
||||
|
||||
0:
|
||||
LDP lr, x3, [sp], 16
|
||||
LDP x0, x1, [sp], 16
|
||||
RET
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// @x0 pointer to string
|
||||
|
||||
_uart_puts:
|
||||
STR lr, [sp, -16]!
|
||||
STP x0, x1, [sp, -16]!
|
||||
|
||||
1:
|
||||
LDRB w1, [x0], 1 // load byte of string from address in x0
|
||||
CBZ w1, 0f // return if zero
|
||||
BL uart_putc // put charcter out
|
||||
B 1b // loop
|
||||
|
||||
0:
|
||||
LDP x0, x1, [sp], 16
|
||||
LDR lr, [sp], 16
|
||||
RET
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user