summaryrefslogtreecommitdiff
path: root/src/stm-vga
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-20 01:42:22 -0800
committerKeith Packard <keithp@keithp.com>2016-11-20 01:42:22 -0800
commitfd05d495b463685d81e75115a93fdda2764c7113 (patch)
tree3bf8f2391c7c865f261baffcaca0738fe8013421 /src/stm-vga
parent34e68a77dcd458f9cf9d839a55e4e84a6d95a48d (diff)
altos/stm-vga: Fix DMA reset to load scanline each time
If we load the scanline register while DMA is running, it doesn't actually get reloaded until after the first transfer from the next line, leaving a weird jog in the middle of the screen. Also flip to SPI1, as Bdale is using that on the 1802 board. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/stm-vga')
-rw-r--r--src/stm-vga/ao_demo.c71
-rw-r--r--src/stm-vga/ao_pins.h2
2 files changed, 72 insertions, 1 deletions
diff --git a/src/stm-vga/ao_demo.c b/src/stm-vga/ao_demo.c
index 582e4156..3b582cc2 100644
--- a/src/stm-vga/ao_demo.c
+++ b/src/stm-vga/ao_demo.c
@@ -24,6 +24,67 @@
#include <ao_boot.h>
#include <ao_vga.h>
+struct ao_task ball_task;
+
+#define BALL_WIDTH 5
+#define BALL_HEIGHT 5
+
+static int ball_x;
+static int ball_y;
+static int ball_dx, ball_dy;
+
+uint8_t ball_enable;
+
+void
+ao_ball(void)
+{
+ ball_dx = 1;
+ ball_dy = 1;
+ ball_x = 0;
+ ball_y = 0;
+ for (;;) {
+ while (!ball_enable)
+ ao_sleep(&ball_enable);
+ for (;;) {
+ ao_solid(AO_ALLONES,
+ AO_ALLONES,
+ ao_vga_fb + ball_y * AO_VGA_STRIDE,
+ AO_VGA_STRIDE,
+ ball_x,
+ BALL_WIDTH,
+ BALL_HEIGHT);
+ ao_delay(AO_MS_TO_TICKS(10));
+ ao_solid(AO_ALLONES,
+ AO_ALLONES,
+ ao_vga_fb + ball_y * AO_VGA_STRIDE,
+ AO_VGA_STRIDE,
+ ball_x,
+ BALL_WIDTH,
+ BALL_HEIGHT);
+ if (!ball_enable)
+ break;
+ ball_x += ball_dx;
+ ball_y += ball_dy;
+ if (ball_x + BALL_WIDTH > AO_VGA_WIDTH) {
+ ball_x = AO_VGA_WIDTH - BALL_WIDTH;
+ ball_dx = -ball_dx;
+ }
+ if (ball_x < 0) {
+ ball_x = -ball_x;
+ ball_dx = -ball_dx;
+ }
+ if (ball_y + BALL_HEIGHT > AO_VGA_HEIGHT) {
+ ball_y = AO_VGA_HEIGHT - BALL_HEIGHT;
+ ball_dy = -ball_dy;
+ }
+ if (ball_y < 0) {
+ ball_y = -ball_y;
+ ball_dy = -ball_dy;
+ }
+ }
+ }
+}
+
static void
ao_video_toggle(void)
{
@@ -31,8 +92,17 @@ ao_video_toggle(void)
ao_vga_enable(ao_cmd_lex_i);
}
+static void
+ao_ball_toggle(void)
+{
+ ao_cmd_decimal();
+ ball_enable = ao_cmd_lex_i;
+ ao_wakeup(&ball_enable);
+}
+
__code struct ao_cmds ao_demo_cmds[] = {
{ ao_video_toggle, "V\0Toggle video" },
+ { ao_ball_toggle, "B\0Toggle ball" },
{ 0, NULL }
};
@@ -52,6 +122,7 @@ main(void)
ao_vga_init();
ao_usb_init();
+ ao_add_task(&ball_task, ao_ball, "ball");
ao_cmd_register(&ao_demo_cmds[0]);
ao_start_scheduler();
diff --git a/src/stm-vga/ao_pins.h b/src/stm-vga/ao_pins.h
index 3526cb6c..0e5a1903 100644
--- a/src/stm-vga/ao_pins.h
+++ b/src/stm-vga/ao_pins.h
@@ -69,7 +69,7 @@
#define HAS_BEEP 0
#define PACKET_HAS_SLAVE 0
-#define STM_DMA1_5_STOLEN 1
+#define STM_DMA1_3_STOLEN 1
#define AO_BOOT_CHAIN 1