Software support for the new TMU
[mw/milkymist.git] / software / demo / shell.c
index 86fd36b..687c1ce 100644 (file)
@@ -1,21 +1,23 @@
 /*
  * Milkymist VJ SoC (Software)
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
+ *
  * 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, version 3 of the License.
  * 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, version 3 of the License.
- * 
+ *
  * 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.
  * 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 <http://www.gnu.org/licenses/>.
  */
 
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <libc.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <console.h>
 #include <uart.h>
 #include <cffat.h>
 #include <console.h>
 #include <uart.h>
 #include <cffat.h>
 #include <hw/gpio.h>
 #include <hw/interrupts.h>
 
 #include <hw/gpio.h>
 #include <hw/interrupts.h>
 
-#include "vga.h"
-#include "snd.h"
-#include "tmu.h"
+#include <hal/vga.h>
+#include <hal/snd.h>
+#include <hal/tmu.h>
+#include <hal/time.h>
+#include <hal/brd.h>
+
 #include "line.h"
 #include "wave.h"
 #include "line.h"
 #include "wave.h"
-#include "time.h"
-#include "brd.h"
 #include "rpipe.h"
 #include "cpustats.h"
 #include "shell.h"
 #include "rpipe.h"
 #include "cpustats.h"
 #include "shell.h"
@@ -201,6 +204,23 @@ static void help()
        puts("stop       - stop renderer");
        puts("spam       - start/stop advertising");
        puts("stats      - print system stats");
        puts("stop       - stop renderer");
        puts("spam       - start/stop advertising");
        puts("stats      - print system stats");
+       puts("reboot     - system reset");
+}
+
+static void loadpic(const char *filename)
+{
+       int size;
+       
+       if(*filename == 0) {
+               printf("loadpic <filename>\n");
+               return;
+       }
+
+       if(!cffat_init()) return;
+       if(!cffat_load(filename, (void *)vga_backbuffer, vga_hres*vga_vres*2, &size)) return;
+       cffat_done();
+
+       vga_swap_buffers();
 }
 
 /*
 }
 
 /*
@@ -296,32 +316,34 @@ static void tmutest()
 {
        int x, y;
        struct tmu_vertex srcmesh[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
 {
        int x, y;
        struct tmu_vertex srcmesh[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
-       struct tmu_vertex dstmesh[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
        struct tmu_td td;
        volatile int complete;
 
        struct tmu_td td;
        volatile int complete;
 
-       for(y=0;y<=24;y++)
+       for(y=0;y<=32;y++)
                for(x=0;x<=32;x++) {
                for(x=0;x<=32;x++) {
-                       srcmesh[y][x].x = 30*x;
-                       srcmesh[y][x].y = 30*y;
-               
-                       dstmesh[y][x].x = 20*x;
-                       dstmesh[y][x].y = 20*y;
+                       srcmesh[y][x].x = (5*x) << TMU_FIXEDPOINT_SHIFT;
+                       srcmesh[y][x].y = (7*y) << TMU_FIXEDPOINT_SHIFT;
                }
 
                }
 
+       td.flags = 0;
        td.hmeshlast = 32;
        td.hmeshlast = 32;
-       td.vmeshlast = 24;
+       td.vmeshlast = 32;
        td.brightness = TMU_BRIGHTNESS_MAX;
        td.brightness = TMU_BRIGHTNESS_MAX;
-       td.srcmesh = &srcmesh[0][0];
-       td.srcfbuf = vga_frontbuffer;
-       td.srchres = vga_hres;
-       td.srcvres = vga_vres;
-       td.dstmesh = &dstmesh[0][0];
+       td.chromakey = 0;
+       td.vertices = &srcmesh[0][0];
+       td.texfbuf = vga_frontbuffer;
+       td.texhres = vga_hres;
+       td.texvres = vga_vres;
+       td.texhmask = TMU_MASK_FULL;
+       td.texvmask = TMU_MASK_FULL;
        td.dstfbuf = vga_backbuffer;
        td.dsthres = vga_hres;
        td.dstvres = vga_vres;
        td.dstfbuf = vga_backbuffer;
        td.dsthres = vga_hres;
        td.dstvres = vga_vres;
+       td.dsthoffset = 0;
+       td.dstvoffset = 0;
+       td.dstsquarew = vga_hres/32;
+       td.dstsquareh = vga_vres/32;
        
        
-       td.profile = 1;
        td.callback = tmutest_callback;
        td.user = (void *)&complete;
 
        td.callback = tmutest_callback;
        td.user = (void *)&complete;
 
@@ -390,26 +412,31 @@ static char *get_token(char **str)
 
 static void do_command(char *c)
 {
 
 static void do_command(char *c)
 {
-       char *token;
-
-       token = get_token(&c);
-
-       if(strcmp(token, "mr") == 0) mr(get_token(&c), get_token(&c));
-       else if(strcmp(token, "mw") == 0) mw(get_token(&c), get_token(&c), get_token(&c));
-       else if(strcmp(token, "ls") == 0) ls();
-       else if(strcmp(token, "flush") == 0) flush_bridge_cache();
-       else if(strcmp(token, "render") == 0) render(get_token(&c));
-       else if(strcmp(token, "stop") == 0) ui_render_stop();
-       else if(strcmp(token, "spam") == 0) spam();
-       else if(strcmp(token, "stats") == 0) stats();
-       else if(strcmp(token, "help") == 0) help();
+       char *command, *param1, *param2, *param3;
+
+       command = get_token(&c);
+       param1 = get_token(&c);
+       param2 = get_token(&c);
+       param3 = get_token(&c);
+
+       if(strcmp(command, "mr") == 0) mr(param1, param2);
+       else if(strcmp(command, "mw") == 0) mw(param1, param2, param3);
+       else if(strcmp(command, "ls") == 0) ls();
+       else if(strcmp(command, "flush") == 0) flush_bridge_cache();
+       else if(strcmp(command, "render") == 0) render(param1);
+       else if(strcmp(command, "stop") == 0) ui_render_stop();
+       else if(strcmp(command, "spam") == 0) spam();
+       else if(strcmp(command, "stats") == 0) stats();
+       else if(strcmp(command, "reboot") == 0) reboot();
+       else if(strcmp(command, "help") == 0) help();
 
        /* Test functions and hacks */
 
        /* Test functions and hacks */
-       else if(strcmp(token, "pfputest") == 0) pfputest();
-       else if(strcmp(token, "tmutest") == 0) tmutest();
-       else if(strcmp(token, "echo") == 0) echo();
+       else if(strcmp(command, "loadpic") == 0) loadpic(param1);
+       else if(strcmp(command, "pfputest") == 0) pfputest();
+       else if(strcmp(command, "tmutest") == 0) tmutest();
+       else if(strcmp(command, "echo") == 0) echo();
 
 
-       else if(strcmp(token, "") != 0) printf("Command not found: '%s'\n", token);
+       else if(strcmp(command, "") != 0) printf("Command not found: '%s'\n", command);
 }
 
 static char command_buffer[64];
 }
 
 static char command_buffer[64];