/**
* @file main.c
* Entry point for operating system
*
* Copyright (C) 2018 Clyne Sullivan
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern uint8_t __bss_end__;
extern char *itoa(int, char *, int);
void kmain(void);
void task_interpreter(void);
int main(void)
{
asm("cpsid i");
// disable cached writes for precise debug info
//*((uint32_t *)0xE000E008) |= 2;
// prepare flash latency for 80MHz operation
FLASH->ACR &= ~(FLASH_ACR_LATENCY);
FLASH->ACR |= FLASH_ACR_LATENCY_4WS;
clock_init();
heap_init(&__bss_end__);
gpio_init();
serial_init();
random_init();
keypad_init();
flash_init();
gpio_mode(GPIOA, 5, OUTPUT);
// enable FPU
SCB->CPACR |= (0xF << 20);
// enable MPU
//MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk;
task_init(kmain);
while (1);
}
void kmain(void)
{
dsp_init();
dsp_rect(0, 0, LCD_WIDTH, LCD_HEIGHT, dsp_color(0, 0, 0));
dsp_cursoron();
char buf[2] = {0, 0};
buf[0] = 'A';
flash_write(buf, 42, 1);
buf[0] = 0;
flash_read(buf, 42, 1);
dsp_puts(buf);
//keypad_start();
//task_start(task_interpreter, 4096);
while (1) {
gpio_dout(GPIOA, 5, 1);
delay(250);
gpio_dout(GPIOA, 5, 0);
delay(250);
}
}
void task_interpreter(void)
{
instance *it = inewinstance();
script_loadlib(it);
// load '/init' file
char *s = initrd_readfile("init");
if (s == 0) {
dsp_puts("can't find init");
goto end;
}
// read in, parse into script code
char *linebuf = (char *)malloc(120);
uint32_t i = 0, prev = 0, lc;
uint32_t size = initrd_filesize("init");
int ret = 0;
while (i < size) {
for (; s[i] != '\n' && s[i] != '\0'; i++);
lc = i - prev;
if (lc == 0) {
prev = ++i;
continue;
}
strncpy(linebuf, s + prev, lc + 1);
linebuf[lc] = '\0';
ret = iaddline(it, linebuf);
if (ret != 0)
goto fail;
prev = ++i;
}
free(linebuf);
// run the script
ret = irun(it);
if (ret != 0)
goto fail;
idelinstance(it);
end:
while (1)
delay(10);
fail:
if (ret < 0) {
dsp_puts("\nError: ");
dsp_puts(itoa(ret, linebuf, 10));
}
goto end;
}