mirror of
https://github.com/supleed2/EIE4-FYP.git
synced 2024-11-10 04:15:49 +00:00
211 lines
3.9 KiB
C
211 lines
3.9 KiB
C
// This file is Copyright (c) 2020 Florent Kermarrec <florent@enjoy-digital.fr>
|
|
// License: BSD
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <irq.h>
|
|
#include <libbase/uart.h>
|
|
#include <libbase/console.h>
|
|
#include <generated/csr.h>
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Uart */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
static char *readstr(void)
|
|
{
|
|
char c[2];
|
|
static char s[64];
|
|
static int ptr = 0;
|
|
|
|
if(readchar_nonblock()) {
|
|
c[0] = getchar();
|
|
c[1] = 0;
|
|
switch(c[0]) {
|
|
case 0x7f:
|
|
case 0x08:
|
|
if(ptr > 0) {
|
|
ptr--;
|
|
fputs("\x08 \x08", stdout);
|
|
}
|
|
break;
|
|
case 0x07:
|
|
break;
|
|
case '\r':
|
|
case '\n':
|
|
s[ptr] = 0x00;
|
|
fputs("\n", stdout);
|
|
ptr = 0;
|
|
return s;
|
|
default:
|
|
if(ptr >= (sizeof(s) - 1))
|
|
break;
|
|
fputs(c, stdout);
|
|
s[ptr] = c[0];
|
|
ptr++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static char *get_token(char **str)
|
|
{
|
|
char *c, *d;
|
|
|
|
c = (char *)strchr(*str, ' ');
|
|
if(c == NULL) {
|
|
d = *str;
|
|
*str = *str+strlen(*str);
|
|
return d;
|
|
}
|
|
*c = 0;
|
|
d = *str;
|
|
*str = c+1;
|
|
return d;
|
|
}
|
|
|
|
static void prompt(void)
|
|
{
|
|
printf("\e[92;1mlitex-demo-app\e[0m> ");
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Help */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
static void help(void)
|
|
{
|
|
puts("\nLiteX minimal demo app built "__DATE__" "__TIME__"\n");
|
|
puts("Available commands:");
|
|
puts("help - Show this command");
|
|
puts("reboot - Reboot CPU");
|
|
#ifdef CSR_LEDS_BASE
|
|
puts("led - Led demo");
|
|
#endif
|
|
puts("donut - Spinning Donut demo");
|
|
puts("helloc - Hello C");
|
|
#ifdef WITH_CXX
|
|
puts("hellocpp - Hello C++");
|
|
#endif
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Commands */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
static void reboot_cmd(void)
|
|
{
|
|
ctrl_reset_write(1);
|
|
}
|
|
|
|
#ifdef CSR_LEDS_BASE
|
|
static void led_cmd(void)
|
|
{
|
|
int i;
|
|
printf("Led demo...\n");
|
|
|
|
printf("Counter mode...\n");
|
|
for(i=0; i<32; i++) {
|
|
leds_out_write(i);
|
|
busy_wait(100);
|
|
}
|
|
|
|
printf("Shift mode...\n");
|
|
for(i=0; i<4; i++) {
|
|
leds_out_write(1<<i);
|
|
busy_wait(200);
|
|
}
|
|
for(i=0; i<4; i++) {
|
|
leds_out_write(1<<(3-i));
|
|
busy_wait(200);
|
|
}
|
|
|
|
printf("Dance mode...\n");
|
|
for(i=0; i<4; i++) {
|
|
leds_out_write(0x55);
|
|
busy_wait(200);
|
|
leds_out_write(0xaa);
|
|
busy_wait(200);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
extern void donut(void);
|
|
|
|
static void donut_cmd(void)
|
|
{
|
|
printf("Donut demo...\n");
|
|
donut();
|
|
}
|
|
|
|
extern void helloc(void);
|
|
|
|
static void helloc_cmd(void)
|
|
{
|
|
printf("Hello C demo...\n");
|
|
helloc();
|
|
}
|
|
|
|
#ifdef WITH_CXX
|
|
extern void hellocpp(void);
|
|
|
|
static void hellocpp_cmd(void)
|
|
{
|
|
printf("Hello C++ demo...\n");
|
|
hellocpp();
|
|
}
|
|
#endif
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
/* Console service / Main */
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
static void console_service(void)
|
|
{
|
|
char *str;
|
|
char *token;
|
|
|
|
str = readstr();
|
|
if(str == NULL) return;
|
|
token = get_token(&str);
|
|
if(strcmp(token, "help") == 0)
|
|
help();
|
|
else if(strcmp(token, "reboot") == 0)
|
|
reboot_cmd();
|
|
#ifdef CSR_LEDS_BASE
|
|
else if(strcmp(token, "led") == 0)
|
|
led_cmd();
|
|
#endif
|
|
else if(strcmp(token, "donut") == 0)
|
|
donut_cmd();
|
|
else if(strcmp(token, "helloc") == 0)
|
|
helloc_cmd();
|
|
#ifdef WITH_CXX
|
|
else if(strcmp(token, "hellocpp") == 0)
|
|
hellocpp_cmd();
|
|
#endif
|
|
prompt();
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
#ifdef CONFIG_CPU_HAS_INTERRUPT
|
|
irq_setmask(0);
|
|
irq_setie(1);
|
|
#endif
|
|
uart_init();
|
|
|
|
help();
|
|
prompt();
|
|
|
|
while(1) {
|
|
console_service();
|
|
}
|
|
|
|
return 0;
|
|
}
|