Initial WIP

This commit is contained in:
Phillip Burgess 2023-01-11 10:52:46 -08:00 committed by ladyada
parent 62c07fb640
commit 692510b391
8 changed files with 189 additions and 0 deletions

2
examples/Readme.md Normal file
View file

@ -0,0 +1,2 @@
Arduino Examples for PicoDVI Library
====================================

10
examples/hello/hello.ino Normal file
View file

@ -0,0 +1,10 @@
#include <PicoDVI.h>
PicoDVI dvi(320, 240, VREG_VOLTAGE_1_20, dvi_timing_640x480p_60hz);
void setup() {
dvi.begin();
}
void loop() {
}

10
library.properties Normal file
View file

@ -0,0 +1,10 @@
name=PicoDVI
version=1.0.0
author=Wren6991
maintainer=Luke Wren
sentence=Arduino library for RP2040 DVI output
paragraph=Arduino library for RP2040 DVI output
category=Display
url=https://github.com/Wren6991/PicoDVI
architectures=rp2040
depends=

View file

@ -0,0 +1,101 @@
// -------------------------------------------------- //
// This file is autogenerated by pioasm; do not edit! //
// -------------------------------------------------- //
#pragma once
#if !PICO_NO_HARDWARE
#include "hardware/pio.h"
#endif
// -------------- //
// dvi_serialiser //
// -------------- //
#define dvi_serialiser_wrap_target 0
#define dvi_serialiser_wrap 1
static const uint16_t dvi_serialiser_program_instructions[] = {
// .wrap_target
0x70a1, // 0: out pc, 1 side 2
0x68a1, // 1: out pc, 1 side 1
// .wrap
};
#if !PICO_NO_HARDWARE
static const struct pio_program dvi_serialiser_program = {
.instructions = dvi_serialiser_program_instructions,
.length = 2,
.origin = 0,
};
static inline pio_sm_config dvi_serialiser_program_get_default_config(uint offset) {
pio_sm_config c = pio_get_default_sm_config();
sm_config_set_wrap(&c, offset + dvi_serialiser_wrap_target, offset + dvi_serialiser_wrap);
sm_config_set_sideset(&c, 2, false, false);
return c;
}
#endif
// -------------------- //
// dvi_serialiser_debug //
// -------------------- //
#define dvi_serialiser_debug_wrap_target 0
#define dvi_serialiser_debug_wrap 11
static const uint16_t dvi_serialiser_debug_program_instructions[] = {
// .wrap_target
0x98e0, // 0: pull ifempty block side 1
0xb042, // 1: nop side 0
0x6001, // 2: out pins, 1
0x6001, // 3: out pins, 1
0x6001, // 4: out pins, 1
0x6001, // 5: out pins, 1
0x6001, // 6: out pins, 1
0x6001, // 7: out pins, 1
0x6001, // 8: out pins, 1
0x6001, // 9: out pins, 1
0x6001, // 10: out pins, 1
0x6001, // 11: out pins, 1
// .wrap
};
#if !PICO_NO_HARDWARE
static const struct pio_program dvi_serialiser_debug_program = {
.instructions = dvi_serialiser_debug_program_instructions,
.length = 12,
.origin = -1,
};
static inline pio_sm_config dvi_serialiser_debug_program_get_default_config(uint offset) {
pio_sm_config c = pio_get_default_sm_config();
sm_config_set_wrap(&c, offset + dvi_serialiser_debug_wrap_target, offset + dvi_serialiser_debug_wrap);
sm_config_set_sideset(&c, 2, true, false);
return c;
}
#include "dvi_config_defs.h"
static inline void dvi_serialiser_program_init(PIO pio, uint sm, uint offset, uint data_pins, bool debug) {
pio_sm_set_pins_with_mask(pio, sm, 2u << data_pins, 3u << data_pins);
pio_sm_set_pindirs_with_mask(pio, sm, ~0u, 3u << data_pins);
pio_gpio_init(pio, data_pins);
pio_gpio_init(pio, data_pins + 1);
pio_sm_config c;
if (debug) {
c = dvi_serialiser_debug_program_get_default_config(offset);
}
else {
c = dvi_serialiser_program_get_default_config(offset);
}
sm_config_set_sideset_pins(&c, data_pins);
if (debug)
sm_config_set_out_pins(&c, data_pins, 1);
sm_config_set_out_shift(&c, true, !debug, 10 * DVI_SYMBOLS_PER_WORD);
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, false);
}
#endif

41
src/PicoDVI.cpp Normal file
View file

@ -0,0 +1,41 @@
#include "PicoDVI.h"
#include <stdlib.h>
PicoDVI::PicoDVI(uint16_t w, uint16_t h, vreg_voltage v, const struct dvi_timing &t) {
framebuf_width = w;
framebuf_height = h;
timing = &t;
voltage = v;
}
PicoDVI::~PicoDVI(void) {
if (framebuf) free(framebuf);
}
bool PicoDVI::begin(void) {
if ((framebuf = (uint16_t *)malloc(framebuf_width * framebuf_height * sizeof(uint16_t)))) {
return true;
}
return false;
}
#if 0
void core1_main() {
dvi_register_irqs_this_core(&dvi0, DMA_IRQ_0);
dvi_start(&dvi0);
dvi_scanbuf_main_16bpp(&dvi0);
__builtin_unreachable();
}
void core1_scanline_callback() {
// Discard any scanline pointers passed back
uint16_t *bufptr;
while (queue_try_remove_u32(&dvi0.q_colour_free, &bufptr))
;
// // Note first two scanlines are pushed before DVI start
static uint scanline = 2;
bufptr = &framebuf[FRAME_WIDTH * scanline];
queue_add_blocking_u32(&dvi0.q_colour_valid, &bufptr);
scanline = (scanline + 1) % FRAME_HEIGHT;
}
#endif

22
src/PicoDVI.h Normal file
View file

@ -0,0 +1,22 @@
#pragma once
#include "hardware/vreg.h" // In Pico SDK
#include "libdvi/dvi.h" // Requires soft link in src to ../software/libdvi
#include "libdvi/dvi_timing.h"
// Also, one must build PicoDVI via the usual route (mkdir build & cmake, etc.)
// and copy dvi_serialiser.pio.h to libdvi. 'build' is in .gitignore and
// doesn't get included w/push.
class PicoDVI {
public:
PicoDVI(uint16_t w, uint16_t h, vreg_voltage v, const struct dvi_timing &t);
~PicoDVI(void);
bool begin(void);
private:
uint16_t *framebuf = NULL;
uint16_t framebuf_width;
uint16_t framebuf_height;
struct dvi_inst dvi0;
const struct dvi_timing *timing;
vreg_voltage voltage;
};

2
src/Readme.md Normal file
View file

@ -0,0 +1,2 @@
Arduino wrapper for PicoDVI Library
===================================

1
src/libdvi Symbolic link
View file

@ -0,0 +1 @@
../software/libdvi