Commit e9f1e50b authored by Damien's avatar Damien
Browse files

Board running boot.py, working REPL, soft reboot.

parent ec63cce4
...@@ -50,6 +50,7 @@ PY_O = \ ...@@ -50,6 +50,7 @@ PY_O = \
emitinlinethumb.o \ emitinlinethumb.o \
runtime.o \ runtime.o \
vm.o \ vm.o \
repl.o \
SRC_FATFS = \ SRC_FATFS = \
ff.c \ ff.c \
......
#include <string.h>
#include <stm32f4xx_gpio.h> #include <stm32f4xx_gpio.h>
#include "misc.h" #include "misc.h"
...@@ -138,6 +139,10 @@ void lcd_init() { ...@@ -138,6 +139,10 @@ void lcd_init() {
lcd_next_line = 0; lcd_next_line = 0;
} }
void lcd_print_str(const char *str) {
lcd_print_strn(str, strlen(str));
}
void lcd_print_strn(const char *str, unsigned int len) { void lcd_print_strn(const char *str, unsigned int len) {
int redraw_min = lcd_line * LCD_BUF_W + lcd_column; int redraw_min = lcd_line * LCD_BUF_W + lcd_column;
int redraw_max = redraw_min; int redraw_max = redraw_min;
......
void lcd_init(); void lcd_init();
void lcd_print_str(const char *str);
void lcd_print_strn(const char *str, unsigned int len); void lcd_print_strn(const char *str, unsigned int len);
...@@ -77,6 +77,15 @@ void __fatal_error(const char *msg) { ...@@ -77,6 +77,15 @@ void __fatal_error(const char *msg) {
#include "parse.h" #include "parse.h"
#include "compile.h" #include "compile.h"
#include "runtime.h" #include "runtime.h"
#include "repl.h"
py_obj_t pyb_source_dir(py_obj_t source_dir) {
return py_const_none;
}
py_obj_t pyb_main(py_obj_t main) {
return py_const_none;
}
py_obj_t pyb_delay(py_obj_t count) { py_obj_t pyb_delay(py_obj_t count) {
sys_tick_delay_ms(rt_get_int(count)); sys_tick_delay_ms(rt_get_int(count));
...@@ -98,7 +107,6 @@ py_obj_t pyb_sw() { ...@@ -98,7 +107,6 @@ py_obj_t pyb_sw() {
FATFS fatfs0; FATFS fatfs0;
/* /*
void g(uint i) { void g(uint i) {
printf("g:%d\n", i); printf("g:%d\n", i);
...@@ -149,7 +157,7 @@ static const char fresh_boot_py[] = ...@@ -149,7 +157,7 @@ static const char fresh_boot_py[] =
; ;
// get lots of info about the board // get lots of info about the board
static void board_info() { static py_obj_t pyb_info() {
// get and print clock speeds // get and print clock speeds
// SYSCLK=168MHz, HCLK=168MHz, PCLK1=42MHz, PCLK2=84MHz // SYSCLK=168MHz, HCLK=168MHz, PCLK1=42MHz, PCLK2=84MHz
{ {
...@@ -184,75 +192,79 @@ static void board_info() { ...@@ -184,75 +192,79 @@ static void board_info() {
f_getfree("0:", &nclst, &fatfs); f_getfree("0:", &nclst, &fatfs);
printf("free=%u\n", (uint)(nclst * fatfs->csize * 512)); printf("free=%u\n", (uint)(nclst * fatfs->csize * 512));
} }
return py_const_none;
} }
char *readline(const char *prompt) { /*
vstr_t vstr; void gc_print_info() {
vstr_init(&vstr); gc_info_t info;
gc_info(&info);
printf("! %lu total\n", info.total);
printf("! %lu : %lu\n", info.used, info.free);
printf("! 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block);
}
*/
int readline(vstr_t *line, const char *prompt) {
usb_vcp_send_str(prompt); usb_vcp_send_str(prompt);
int len = vstr_len(line);
for (;;) { for (;;) {
//extern int rx_buf_in;
//extern int rx_buf_out;
while (usb_vcp_rx_any() == 0) { while (usb_vcp_rx_any() == 0) {
//printf("nope %x %x\n", rx_buf_in, rx_buf_out);
sys_tick_delay_ms(10); sys_tick_delay_ms(10);
} }
char c = usb_vcp_rx_get(); char c = usb_vcp_rx_get();
if (c == 4 && vstr_len(&vstr) == 0) { if (c == 4 && vstr_len(line) == len) {
return NULL; return 0;
} else if (c == '\r') { } else if (c == '\r') {
usb_vcp_send_str("\r\n"); usb_vcp_send_str("\r\n");
return vstr_str(&vstr); return 1;
} else if (c == 127) { } else if (c == 127) {
if (vstr_len(&vstr) > 0) { if (vstr_len(line) > len) {
vstr_cut_tail(&vstr, 1); vstr_cut_tail(line, 1);
usb_vcp_send_str("\b \b"); usb_vcp_send_str("\b \b");
} }
} else if (32 <= c && c <= 126) { } else if (32 <= c && c <= 126) {
vstr_add_char(&vstr, c); vstr_add_char(line, c);
usb_vcp_send_strn(&c, 1); usb_vcp_send_strn(&c, 1);
} }
sys_tick_delay_ms(100); sys_tick_delay_ms(100);
} }
return NULL;
}
/*
void gc_print_info() {
gc_info_t info;
gc_info(&info);
printf("! %lu total\n", info.total);
printf("! %lu : %lu\n", info.used, info.free);
printf("! 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block);
} }
*/
void do_repl() { void do_repl() {
usb_vcp_send_str("Micro Python\r\n"); usb_vcp_send_str("Micro Python 0.5; STM32F405RG; PYBv2\r\n");
usb_vcp_send_str("Type \"help\" for more information.\r\n");
vstr_t line;
vstr_init(&line);
for (;;) { for (;;) {
char *line = readline(">>> "); vstr_reset(&line);
if (line == NULL) { int ret = readline(&line, ">>> ");
if (ret == 0) {
// EOF // EOF
return; break;
}
if (vstr_len(&line) == 0) {
continue;
} }
/*
if (is_compound_stmt(line)) { if (py_repl_is_compound_stmt(vstr_str(&line))) {
for (;;) { for (;;) {
char *line2 = readline("... "); vstr_add_char(&line, '\n');
if (line2 == NULL || strlen(line2) == 0) { int len = vstr_len(&line);
int ret = readline(&line, "... ");
if (ret == 0 || vstr_len(&line) == len) {
// done entering compound statement
break; break;
} }
char *line3 = str_join(line, '\n', line2);
m_free(line);
m_free(line2);
line = line3;
} }
} }
*/
py_lexer_str_buf_t sb; py_lexer_str_buf_t sb;
py_lexer_t *lex = py_lexer_new_from_str_len("<stdin>", line, strlen(line), false, &sb); py_lexer_t *lex = py_lexer_new_from_str_len("<stdin>", vstr_str(&line), vstr_len(&line), false, &sb);
py_parse_node_t pn = py_parse(lex, PY_PARSE_SINGLE_INPUT); py_parse_node_t pn = py_parse(lex, PY_PARSE_SINGLE_INPUT);
py_lexer_free(lex); py_lexer_free(lex);
...@@ -274,6 +286,8 @@ void do_repl() { ...@@ -274,6 +286,8 @@ void do_repl() {
} }
} }
} }
usb_vcp_send_str("\r\nMicro Python REPL finished\r\n");
} }
#define RAM_START (0x20000000) // fixed for chip #define RAM_START (0x20000000) // fixed for chip
...@@ -299,7 +313,7 @@ void gc_collect() { ...@@ -299,7 +313,7 @@ void gc_collect() {
printf(" 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block); printf(" 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block);
} }
py_obj_t py_gc_collect() { py_obj_t pyb_gc() {
gc_collect(); gc_collect();
return py_const_none; return py_const_none;
} }
...@@ -322,24 +336,35 @@ int main() { ...@@ -322,24 +336,35 @@ int main() {
// more sub-system init // more sub-system init
sw_init(); sw_init();
lcd_init();
storage_init(); storage_init();
soft_reset:
// LCD init
lcd_init();
// GC init // GC init
gc_init(&_heap_start, (void*)HEAP_END); gc_init(&_heap_start, (void*)HEAP_END);
// Python init // Micro Python init
qstr_init(); qstr_init();
rt_init(); rt_init();
// add some functions to the python namespace // add some functions to the python namespace
rt_store_name(qstr_from_str_static("gc"), rt_make_function_0(py_gc_collect)); {
rt_store_name(qstr_from_str_static("pyb_delay"), rt_make_function_1(pyb_delay)); py_obj_t m = py_module_new();
rt_store_name(qstr_from_str_static("pyb_led"), rt_make_function_1(pyb_led)); rt_store_attr(m, qstr_from_str_static("info"), rt_make_function_0(pyb_info));
rt_store_name(qstr_from_str_static("pyb_sw"), rt_make_function_0(pyb_sw)); rt_store_attr(m, qstr_from_str_static("source_dir"), rt_make_function_1(pyb_source_dir));
rt_store_attr(m, qstr_from_str_static("main"), rt_make_function_1(pyb_main));
rt_store_attr(m, qstr_from_str_static("gc"), rt_make_function_0(pyb_gc));
rt_store_attr(m, qstr_from_str_static("delay"), rt_make_function_1(pyb_delay));
rt_store_attr(m, qstr_from_str_static("led"), rt_make_function_1(pyb_led));
rt_store_attr(m, qstr_from_str_static("sw"), rt_make_function_0(pyb_sw));
rt_store_name(qstr_from_str_static("pyb"), m);
}
// print a message // print a message to the LCD
printf(" micro py board\n"); lcd_print_str(" micro py board\n");
// local filesystem init // local filesystem init
{ {
...@@ -391,7 +416,7 @@ int main() { ...@@ -391,7 +416,7 @@ int main() {
FIL fp; FIL fp;
f_open(&fp, "0:/boot.py", FA_WRITE | FA_CREATE_ALWAYS); f_open(&fp, "0:/boot.py", FA_WRITE | FA_CREATE_ALWAYS);
UINT n; UINT n;
f_write(&fp, fresh_boot_py, sizeof(fresh_boot_py), &n); f_write(&fp, fresh_boot_py, sizeof(fresh_boot_py) - 1 /* don't count null terminator */, &n);
// TODO check we could write n bytes // TODO check we could write n bytes
f_close(&fp); f_close(&fp);
...@@ -401,8 +426,11 @@ int main() { ...@@ -401,8 +426,11 @@ int main() {
} }
} }
// USB
usb_init();
// run /boot.py // run /boot.py
if (0) { if (1) {
py_lexer_file_buf_t fb; py_lexer_file_buf_t fb;
py_lexer_t *lex = py_lexer_new_from_file("0:/boot.py", &fb); py_lexer_t *lex = py_lexer_new_from_file("0:/boot.py", &fb);
py_parse_node_t pn = py_parse(lex, PY_PARSE_FILE_INPUT); py_parse_node_t pn = py_parse(lex, PY_PARSE_FILE_INPUT);
...@@ -430,11 +458,6 @@ int main() { ...@@ -430,11 +458,6 @@ int main() {
// turn boot-up LED off // turn boot-up LED off
led_state(PYB_LED_G1, 0); led_state(PYB_LED_G1, 0);
// USB
if (1) {
usb_init();
}
//printf("init;al=%u\n", m_get_total_bytes_allocated()); // 1600, due to qstr_init //printf("init;al=%u\n", m_get_total_bytes_allocated()); // 1600, due to qstr_init
//sys_tick_delay_ms(1000); //sys_tick_delay_ms(1000);
...@@ -653,31 +676,5 @@ int main() { ...@@ -653,31 +676,5 @@ int main() {
//sdio_init(); //sdio_init();
} }
int i = 0; goto soft_reset;
int n = 0;
uint32_t stc = sys_tick_counter;
for (;;) {
sys_tick_delay_ms(10);
if (sw_get()) {
led_state(PYB_LED_G1, 1);
i = 1 - i;
if (i) {
printf(" angel %05x.\n", n);
//usb_vcp_send("hello!\r\n", 8);
} else {
printf(" mishka %4u.\n", n);
//usb_vcp_send("angel!\r\n", 8);
}
n += 1;
} else {
led_state(PYB_LED_G1, 0);
}
if (sys_tick_has_passed(stc, 500)) {
stc += 500;
led_toggle(PYB_LED_G2);
}
}
return 0;
} }
...@@ -20,7 +20,10 @@ static int rx_buf_in; ...@@ -20,7 +20,10 @@ static int rx_buf_in;
static int rx_buf_out; static int rx_buf_out;
void usb_init() { void usb_init() {
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_PYB_cb, &USR_cb); if (!is_enabled) {
// only init USB once in the device's power-lifetime
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_PYB_cb, &USR_cb);
}
rx_buf_in = 0; rx_buf_in = 0;
rx_buf_out = 0; rx_buf_out = 0;
is_enabled = 1; is_enabled = 1;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment