Initial WIP
This commit is contained in:
parent
62c07fb640
commit
692510b391
8 changed files with 189 additions and 0 deletions
2
examples/Readme.md
Normal file
2
examples/Readme.md
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Arduino Examples for PicoDVI Library
|
||||
====================================
|
||||
10
examples/hello/hello.ino
Normal file
10
examples/hello/hello.ino
Normal 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
10
library.properties
Normal 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=
|
||||
101
software/libdvi/dvi_serialiser.pio.h
Normal file
101
software/libdvi/dvi_serialiser.pio.h
Normal 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
41
src/PicoDVI.cpp
Normal 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
22
src/PicoDVI.h
Normal 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
2
src/Readme.md
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Arduino wrapper for PicoDVI Library
|
||||
===================================
|
||||
1
src/libdvi
Symbolic link
1
src/libdvi
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
../software/libdvi
|
||||
Loading…
Reference in a new issue