]> Trent Huber's Code - rp2350-tga.git/commitdiff
Initial commit
authortrenthuber <trenthuber@Trents-HP-Laptop.mynetworksettings.com>
Mon, 23 Jun 2025 10:57:20 +0000 (06:57 -0400)
committertrenthuber <trenthuber@Trents-HP-Laptop.mynetworksettings.com>
Mon, 23 Jun 2025 10:57:20 +0000 (06:57 -0400)
.gitignore [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
reference/cm5.pdf [new file with mode: 0644]
tga.c [new file with mode: 0644]
tga.pio [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..378eac2
--- /dev/null
@@ -0,0 +1 @@
+build
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b9d0312
--- /dev/null
@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 3.28)
+include(${PICO_SDK_PATH}/external/pico_sdk_import.cmake)
+project(rp2350-tga C CXX ASM)
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_CXX_STANDARD 17)
+pico_sdk_init()
+
+add_executable(tga tga.c)
+
+pico_generate_pio_header(tga ../tga.pio)
+
+target_link_libraries(tga pico_stdlib hardware_pio)
+
+pico_add_extra_outputs(tga)
diff --git a/reference/cm5.pdf b/reference/cm5.pdf
new file mode 100644 (file)
index 0000000..f968bea
Binary files /dev/null and b/reference/cm5.pdf differ
diff --git a/tga.c b/tga.c
new file mode 100644 (file)
index 0000000..a2a6125
--- /dev/null
+++ b/tga.c
@@ -0,0 +1,26 @@
+#include "pico/stdlib.h"
+#include "hardware/pio.h"
+#include "hardware/clocks.h"
+
+#include "tga.pio.h"
+
+int main() {
+   PIO pio;
+   int hsync_offset, vsync_offset;
+
+   pio = pio0;
+   hsync_offset = pio_add_program(pio, &hsync_rgb_program);
+   vsync_offset = pio_add_program(pio, &vsync_i_program);
+
+   vsync_i_program_init(pio, 3, vsync_offset);
+   hsync_rgb_program_init(pio, 0, hsync_offset, RED);
+   hsync_rgb_program_init(pio, 1, hsync_offset, GREEN);
+   hsync_rgb_program_init(pio, 2, hsync_offset, BLUE);
+
+   while (true) {
+       pio_sm_put(pio, 0, -1);
+       pio_sm_put(pio, 1, 0);
+       pio_sm_put(pio, 2, 0);
+       pio_sm_put(pio, 3, -1);
+   }
+}
diff --git a/tga.pio b/tga.pio
new file mode 100644 (file)
index 0000000..6c3f787
--- /dev/null
+++ b/tga.pio
@@ -0,0 +1,96 @@
+.program hsync_rgb
+.side_set 1
+
+   wait 1 gpio 5 side 0 ; INTENSITY pin
+
+   set x 20 side 0 [13]
+wait_outer:
+   set y 18 side 0
+wait_inner:
+   jmp y-- wait_inner side 0
+   jmp x-- wait_outer side 0
+
+   nop side 0 [15]
+   nop side 0 [15]
+   nop side 0 [15]
+   nop side 1 [15]
+   nop side 1 [15]
+   nop side 0 [15]
+   nop side 0 [15]
+   nop side 0 [15]
+
+   set x 9 side 0 [7]
+outer:
+   out pins 1 side 0
+   set y 13 side 0
+inner:
+   out pins 1 side 0
+   jmp y-- inner side 0
+   out pins 1 side 0
+   jmp x-- outer side 0
+
+% c-sdk {
+enum {
+   HSYNC,
+   VSYNC,
+   RED,
+   GREEN,
+   BLUE,
+   INTENSITY,
+};
+
+static inline void hsync_rgb_program_init(PIO pio, uint sm, uint offset, uint out_pin) {
+   pio_sm_config c;
+   float div;
+
+   pio_gpio_init(pio, out_pin);
+   if (out_pin == RED) pio_gpio_init(pio, HSYNC);
+
+   c = hsync_rgb_program_get_default_config(offset);
+   sm_config_set_out_pins(&c, out_pin, 1);
+   sm_config_set_out_shift(&c, false, true, 32);
+   if (out_pin == RED) sm_config_set_sideset_pins(&c, HSYNC);
+
+   div = clock_get_hz(clk_sys) / 7159157.0f;
+   sm_config_set_clkdiv(&c, div);
+
+   pio_sm_init(pio, sm, offset, &c);
+   pio_sm_set_enabled(pio, sm, true);
+}
+%}
+
+.program vsync_i
+.side_set 1
+
+   set pins 0 side 0 [8]
+   nop side 1 [2]
+   nop side 0 [15]
+   nop side 0 [6]
+
+   set pins 1 side 0
+   set x 14 side 0
+outer:
+   set y 12 side 0
+inner:
+   jmp y-- inner side 0
+   jmp x-- outer side 0
+
+% c-sdk {
+static inline void vsync_i_program_init(PIO pio, uint sm, uint offset) {
+   pio_sm_config c;
+   float div;
+
+   pio_gpio_init(pio, INTENSITY);
+   pio_gpio_init(pio, VSYNC);
+
+   c = hsync_rgb_program_get_default_config(offset);
+   sm_config_set_out_pins(&c, INTENSITY, 1);
+   sm_config_set_sideset_pins(&c, VSYNC);
+
+   div = clock_get_hz(clk_sys) / 15701.0f;
+   sm_config_set_clkdiv(&c, div);
+
+   pio_sm_init(pio, sm, offset, &c);
+   pio_sm_set_enabled(pio, sm, true);
+}
+%}