From: trenthuber Date: Mon, 23 Jun 2025 10:57:20 +0000 (-0400) Subject: Initial commit X-Git-Url: https://trenthuber.com/code?a=commitdiff_plain;h=a4dedf85ba8108658d80f9d439f244470a045273;p=rp2350-tga.git Initial commit --- a4dedf85ba8108658d80f9d439f244470a045273 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b9d0312 --- /dev/null +++ b/CMakeLists.txt @@ -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 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 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 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); +} +%}