Skip to content
This repository was archived by the owner on Apr 25, 2021. It is now read-only.

Commit 4414418

Browse files
committed
oprom 업데이트
1 parent 2dfff08 commit 4414418

25 files changed

Lines changed: 509 additions & 263 deletions

src/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ INC += -I.
1818
INC += -I$(TOP)
1919
INC += -I$(BUILD)
2020

21-
2221
CFLAGS_CORTEX_M = -mthumb -fsingle-precision-constant -Wdouble-promotion
2322
CFLAGS_MCU_m0 = $(CFLAGS_CORTEX_M) -mtune=cortex-m0 -mcpu=cortex-m0 -mfloat-abi=soft
2423

@@ -52,13 +51,16 @@ SRC_C = \
5251
mphalport.c \
5352
modmachine.c \
5453
moducode.c \
54+
moducomponents.c \
5555
moducomputer.c \
5656
moduos.c \
5757
modutime.c \
5858
modumsgpack.c \
59+
moduvalue.c \
5960
gccollect.c \
6061
openpie_vfs.c \
6162
msgpack.c \
63+
syscall.c \
6264

6365
SRC_S = \
6466
gchelper_m0.s \

src/build.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import io
12
import shutil
3+
import sys
24
import traceback
35
from pathlib import Path
46
from subprocess import check_call, DEVNULL, CalledProcessError
@@ -8,9 +10,14 @@
810
from elftools.elf.elffile import ELFFile
911
from elftools.elf.sections import SymbolTableSection, Section, Symbol
1012

13+
import re
14+
1115
FOLDER = Path(__file__).parent
12-
OPMOD_PATH = FOLDER.parent / "opmod"
13-
TARGET_FOLDER = OPMOD_PATH / "src/main/resources/assets/openpie/firmwares/debug" # TODO: place version
16+
BASE_FOLDER = FOLDER.parent
17+
OPMOD_PATH = BASE_FOLDER / "opmod"
18+
SOURCE_SYSCALL_TABLE: Path = OPMOD_PATH / "src/main/java/kr/pe/ecmaxp/openpie/arch/consts/OpenPieSystemCallTable.kt"
19+
TARGET_SYSCALL_TABLE: Path = FOLDER / "syscall_table.h"
20+
TARGET_FOLDER: Path = OPMOD_PATH / "src/main/resources/assets/openpie/firmwares/debug" # TODO: place version
1421

1522

1623
@dataclass
@@ -140,7 +147,31 @@ def build(folder: Path = FOLDER, target_folder: Path = TARGET_FOLDER):
140147
print(target_folder / "firmware.bin")
141148

142149

150+
def parse_syscall_table(path: Path, file=sys.stdout):
151+
print(f"// syscall_table.h : {path.relative_to(BASE_FOLDER).as_posix()}", file=file)
152+
for line in SOURCE_SYSCALL_TABLE.read_text().splitlines():
153+
if line.startswith("package "):
154+
continue
155+
156+
line, sep, comment = line.partition("//")
157+
line = line.strip()
158+
if not line:
159+
print(file=file)
160+
continue
161+
162+
m = re.match("^const val (.*?) = (.*)$", line)
163+
if not m:
164+
continue
165+
166+
print(f"#define {m.group(1)} ({m.group(2).replace('or', '|')})", file=file)
167+
168+
143169
def main():
170+
fp = io.StringIO()
171+
parse_syscall_table(SOURCE_SYSCALL_TABLE, fp)
172+
if not TARGET_SYSCALL_TABLE.exists() or TARGET_SYSCALL_TABLE.read_text() != fp.getvalue():
173+
TARGET_SYSCALL_TABLE.write_text(fp.getvalue())
174+
144175
try:
145176
build()
146177
return 0

src/main.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
#include "syscall.h"
1616
#include <stdarg.h>
1717

18-
#define _debug(s) __syscall2(SYS_DEBUG, (int)s, (int)strlen(s));
19-
2018
void debug_printer(void *self, const char *buf, size_t len) {
2119
__syscall2(SYS_DEBUG, (int) buf, (int) len);
2220
}

src/modmachine.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
#include <string.h>
1414

1515
mp_obj_t signal_hook_obj = mp_const_none;
16-
mp_obj_t print_hook_obj = mp_const_none;
17-
mp_obj_t input_hook_obj = mp_const_none;
16+
mp_obj_t stdout_hook_obj = mp_const_none;
17+
mp_obj_t stdin_hook_obj = mp_const_none;
1818

1919

2020
mp_obj_t machine_debug(mp_obj_t obj) {
@@ -36,20 +36,20 @@ STATIC mp_obj_t machine_hook_signal(mp_obj_t hook_obj) {
3636
MP_DEFINE_CONST_FUN_OBJ_1(machine_hook_signal_obj, machine_hook_signal);
3737

3838

39-
STATIC mp_obj_t machine_hook_print(mp_obj_t hook_obj) {
40-
print_hook_obj = hook_obj;
39+
STATIC mp_obj_t machine_hook_stdout(mp_obj_t hook_obj) {
40+
stdout_hook_obj = hook_obj;
4141
return hook_obj;
4242
}
4343

44-
MP_DEFINE_CONST_FUN_OBJ_1(machine_hook_print_obj, machine_hook_print);
44+
MP_DEFINE_CONST_FUN_OBJ_1(machine_hook_stdout_obj, machine_hook_stdout);
4545

46-
STATIC mp_obj_t machine_hook_input(mp_obj_t hook_obj) {
47-
input_hook_obj = hook_obj;
46+
47+
STATIC mp_obj_t machine_hook_stdin(mp_obj_t hook_obj) {
48+
stdin_hook_obj = hook_obj;
4849
return hook_obj;
4950
}
5051

51-
MP_DEFINE_CONST_FUN_OBJ_1(machine_hook_input_obj, machine_hook_input);
52-
52+
MP_DEFINE_CONST_FUN_OBJ_1(machine_hook_stdin_obj, machine_hook_stdin);
5353

5454

5555
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
@@ -59,9 +59,9 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
5959
{MP_ROM_QSTR(MP_QSTR_debug), MP_ROM_PTR(&machine_debug_obj)},
6060

6161
// hook
62-
{MP_ROM_QSTR(MP_QSTR_hook_input), MP_ROM_PTR(&machine_hook_input_obj)},
63-
{MP_ROM_QSTR(MP_QSTR_hook_print), MP_ROM_PTR(&machine_hook_print_obj)},
6462
{MP_ROM_QSTR(MP_QSTR_hook_signal), MP_ROM_PTR(&machine_hook_signal_obj)},
63+
{MP_ROM_QSTR(MP_QSTR_hook_stdout), MP_ROM_PTR(&machine_hook_stdout_obj)},
64+
{MP_ROM_QSTR(MP_QSTR_hook_stdin), MP_ROM_PTR(&machine_hook_stdin_obj)},
6565
};
6666

6767
STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);

src/moducomponents.c

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
#include <stdio.h>
2+
3+
#include "py/obj.h"
4+
#include "py/objstr.h"
5+
#include "py/runtime.h"
6+
#include "py/mphal.h"
7+
#include "syscall.h"
8+
#include "msgpack.h"
9+
#include "machine.h"
10+
#include "lib/mpack/mpack.h"
11+
12+
#include <stdio.h>
13+
#include <string.h>
14+
15+
16+
mp_obj_t wrap_result(int retcode);
17+
18+
19+
STATIC mp_obj_t ucomponents_components(size_t n_args, const mp_obj_t *args) {
20+
if (n_args == 0) {
21+
return wrap_result(__syscall2(SYS_COMPONENTS_LIST, 0, 0));
22+
} else {
23+
size_t len = 0;
24+
const char *buf = mp_obj_str_get_data(args[0], &len);
25+
return wrap_result(__syscall2(SYS_COMPONENTS_LIST, (int) buf, (int) len));
26+
}
27+
}
28+
29+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucomponents_components_obj, 0, 1, ucomponents_components);
30+
31+
32+
STATIC mp_obj_t ucomponents_component_count() {
33+
return wrap_result(__syscall0(SYS_COMPONENTS_COUNT));
34+
}
35+
36+
MP_DEFINE_CONST_FUN_OBJ_0(ucomponents_component_count_obj, ucomponents_component_count);
37+
38+
39+
STATIC mp_obj_t ucomponents_max_components() {
40+
return wrap_result(__syscall0(SYS_COMPONENTS_MAX));
41+
}
42+
43+
MP_DEFINE_CONST_FUN_OBJ_0(ucomponents_max_components_obj, ucomponents_max_components);
44+
45+
46+
STATIC mp_obj_t ucomponents_methods(mp_obj_t address_obj) {
47+
byte *data = NULL;
48+
size_t size = 0;
49+
50+
mpack_writer_t *writer = msgpack_dump_new(&data, &size);
51+
mpack_start_array(writer, 1);
52+
msgpack_dump(writer, address_obj);
53+
mpack_finish_array(writer);
54+
msgpack_dump_close(writer);
55+
56+
return wrap_result(__syscall2(SYS_COMPONENTS_METHODS, (int) data, (int) size));
57+
}
58+
59+
MP_DEFINE_CONST_FUN_OBJ_1(ucomponents_methods_obj, ucomponents_methods);
60+
61+
62+
STATIC mp_obj_t ucomponents_annotations(mp_obj_t address_obj, mp_obj_t method_obj) {
63+
byte *data = NULL;
64+
size_t size = 0;
65+
66+
mpack_writer_t *writer = msgpack_dump_new(&data, &size);
67+
mpack_start_array(writer, 2);
68+
msgpack_dump(writer, address_obj);
69+
msgpack_dump(writer, method_obj);
70+
mpack_finish_array(writer);
71+
msgpack_dump_close(writer);
72+
73+
return wrap_result(__syscall2(SYS_COMPONENTS_ANNOTATIONS, (int) data, (int) size));
74+
}
75+
76+
MP_DEFINE_CONST_FUN_OBJ_2(ucomponents_annotations_obj, ucomponents_annotations);
77+
78+
79+
STATIC mp_obj_t ucomponents_invoke(size_t n_args, const mp_obj_t *args) {
80+
byte *data = NULL;
81+
size_t size = 0;
82+
83+
mpack_writer_t *writer = msgpack_dump_new(&data, &size);
84+
mpack_start_array(writer, n_args);
85+
for (int i = 0; i < n_args; i++)
86+
msgpack_dump(writer, args[i]);
87+
mpack_finish_array(writer);
88+
msgpack_dump_close(writer);
89+
90+
mp_obj_t values = wrap_result(__syscall2(SYS_COMPONENTS_INVOKE, (int) data, (int) size));
91+
if (values == mp_const_none)
92+
return mp_const_none;
93+
94+
size_t count = 0;
95+
mp_obj_t *items = NULL;
96+
mp_obj_get_array(values, &count, &items);
97+
if (count == 0)
98+
return mp_const_none;
99+
else if (count == 1)
100+
return items[0];
101+
else
102+
return values;
103+
}
104+
105+
MP_DEFINE_CONST_FUN_OBJ_VAR(ucomponents_invoke_obj, 2, ucomponents_invoke);
106+
107+
108+
STATIC const mp_rom_map_elem_t ucomponents_module_globals_table[] = {
109+
{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ucomponents)},
110+
111+
// components
112+
{MP_ROM_QSTR(MP_QSTR_components), MP_ROM_PTR(&ucomponents_components_obj)},
113+
{MP_ROM_QSTR(MP_QSTR_component_count), MP_ROM_PTR(&ucomponents_component_count_obj)},
114+
{MP_ROM_QSTR(MP_QSTR_max_components), MP_ROM_PTR(&ucomponents_max_components_obj)},
115+
{MP_ROM_QSTR(MP_QSTR_methods), MP_ROM_PTR(&ucomponents_methods_obj)},
116+
{MP_ROM_QSTR(MP_QSTR_annotations), MP_ROM_PTR(&ucomponents_annotations_obj)},
117+
118+
// invoke
119+
{MP_ROM_QSTR(MP_QSTR_invoke), MP_ROM_PTR(&ucomponents_invoke_obj)},
120+
};
121+
122+
STATIC MP_DEFINE_CONST_DICT(ucomponents_module_globals, ucomponents_module_globals_table);
123+
124+
const mp_obj_module_t mp_module_ucomponents = {
125+
.base = {&mp_type_module},
126+
.globals = (mp_obj_dict_t *) &ucomponents_module_globals,
127+
};

0 commit comments

Comments
 (0)