More WIP, trying different approach (soft links rather than include .c's)
This commit is contained in:
parent
86a383d4d6
commit
e77c6fedad
20 changed files with 87 additions and 42 deletions
|
|
@ -3,8 +3,13 @@
|
||||||
PicoDVI dvi(320, 240, VREG_VOLTAGE_1_20, dvi_timing_640x480p_60hz, pimoroni_demo_hdmi_cfg);
|
PicoDVI dvi(320, 240, VREG_VOLTAGE_1_20, dvi_timing_640x480p_60hz, pimoroni_demo_hdmi_cfg);
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
while(!Serial);
|
||||||
|
Serial.println("A");
|
||||||
dvi.begin();
|
dvi.begin();
|
||||||
|
Serial.println("B");
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
Serial.println("C");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,11 @@ struct dvi_inst {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
// Set up data structures and hardware for DVI.
|
// Set up data structures and hardware for DVI.
|
||||||
void dvi_init(struct dvi_inst *inst, uint spinlock_tmds_queue, uint spinlock_colour_queue);
|
void dvi_init(struct dvi_inst *inst, uint spinlock_tmds_queue, uint spinlock_colour_queue);
|
||||||
|
|
||||||
|
|
@ -73,7 +78,7 @@ void dvi_scanbuf_main_16bpp(struct dvi_inst *inst);
|
||||||
void dvi_framebuf_main_8bpp(struct dvi_inst *inst);
|
void dvi_framebuf_main_8bpp(struct dvi_inst *inst);
|
||||||
void dvi_framebuf_main_16bpp(struct dvi_inst *inst);
|
void dvi_framebuf_main_16bpp(struct dvi_inst *inst);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -244,11 +244,7 @@ void __dvi_func(dvi_timing_state_advance)(const struct dvi_timing *t, struct dvi
|
||||||
(s->v_state == DVI_STATE_BACK_PORCH && s->v_ctr == t->v_back_porch) ||
|
(s->v_state == DVI_STATE_BACK_PORCH && s->v_ctr == t->v_back_porch) ||
|
||||||
(s->v_state == DVI_STATE_ACTIVE && s->v_ctr == t->v_active_lines)) {
|
(s->v_state == DVI_STATE_ACTIVE && s->v_ctr == t->v_active_lines)) {
|
||||||
|
|
||||||
#if defined(ARDUINO)
|
|
||||||
s->v_state = (dvi_line_state)(((int)s->v_state + 1) % (int)DVI_STATE_COUNT);
|
|
||||||
#else
|
|
||||||
s->v_state = (s->v_state + 1) % DVI_STATE_COUNT;
|
s->v_state = (s->v_state + 1) % DVI_STATE_COUNT;
|
||||||
#endif
|
|
||||||
s->v_ctr = 0;
|
s->v_ctr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,11 @@
|
||||||
#include "hardware/interp.h"
|
#include "hardware/interp.h"
|
||||||
#include "dvi_config_defs.h"
|
#include "dvi_config_defs.h"
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
// Functions from tmds_encode.c
|
// Functions from tmds_encode.c
|
||||||
void tmds_encode_data_channel_16bpp(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix, uint channel_msb, uint channel_lsb);
|
void tmds_encode_data_channel_16bpp(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix, uint channel_msb, uint channel_lsb);
|
||||||
void tmds_encode_data_channel_8bpp(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix, uint channel_msb, uint channel_lsb);
|
void tmds_encode_data_channel_8bpp(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix, uint channel_msb, uint channel_lsb);
|
||||||
|
|
@ -12,6 +17,10 @@ void tmds_setup_palette_symbols(const uint16_t *palette, uint32_t *symbuf, size_
|
||||||
void tmds_setup_palette24_symbols(const uint32_t *palette, uint32_t *symbuf, size_t n_palette);
|
void tmds_setup_palette24_symbols(const uint32_t *palette, uint32_t *symbuf, size_t n_palette);
|
||||||
void tmds_encode_palette_data(const uint32_t *pixbuf, const uint32_t *tmds_palette, uint32_t *symbuf, size_t n_pix, uint32_t palette_bits);
|
void tmds_encode_palette_data(const uint32_t *pixbuf, const uint32_t *tmds_palette, uint32_t *symbuf, size_t n_pix, uint32_t palette_bits);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Functions from tmds_encode.S
|
// Functions from tmds_encode.S
|
||||||
|
|
||||||
void tmds_encode_1bpp(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
void tmds_encode_1bpp(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
||||||
|
|
@ -51,6 +60,9 @@ void tmds_encode_sio_loop_peekpop_ratio8(const uint32_t *pixbuf, uint32_t *symbu
|
||||||
void tmds_encode_sio_loop_peekpop_ratio16(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
void tmds_encode_sio_loop_peekpop_ratio16(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
||||||
void tmds_encode_sio_loop_peekpop_ratio32(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
void tmds_encode_sio_loop_peekpop_ratio32(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
||||||
void tmds_encode_sio_loop_peekpop_ratio64(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
void tmds_encode_sio_loop_peekpop_ratio64(const uint32_t *pixbuf, uint32_t *symbuf, size_t n_pix);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "PicoDVI.h"
|
#include "PicoDVI.h"
|
||||||
|
#include "pico/multicore.h"
|
||||||
#define PICO_COPY_TO_RAM 1
|
|
||||||
#include "../software/libdvi/dvi.c"
|
|
||||||
#undef __dvi_func // Avoid redefine warning
|
|
||||||
#include "../software/libdvi/dvi_timing.c"
|
|
||||||
#include "../software/libdvi/dvi_serialiser.c"
|
|
||||||
|
|
||||||
PicoDVI::PicoDVI(uint16_t w, uint16_t h, vreg_voltage v, const struct dvi_timing &t, const struct dvi_serialiser_cfg &c) {
|
PicoDVI::PicoDVI(uint16_t w, uint16_t h, vreg_voltage v, const struct dvi_timing &t, const struct dvi_serialiser_cfg &c) {
|
||||||
framebuf_width = w;
|
framebuf_width = w;
|
||||||
|
|
@ -20,8 +15,36 @@ PicoDVI::~PicoDVI(void) {
|
||||||
if (framebuf) free(framebuf);
|
if (framebuf) free(framebuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct dvi_inst *dviptr = NULL;
|
||||||
|
static uint16_t *fb = NULL;
|
||||||
|
static uint16_t fbw = 0, fbh = 0;
|
||||||
|
|
||||||
|
static volatile bool foo = true;
|
||||||
|
|
||||||
|
//void core1_main() {
|
||||||
|
void setup1() {
|
||||||
|
while(foo); // Wait for begin() to do its thing
|
||||||
|
|
||||||
|
dvi_register_irqs_this_core(dviptr, DMA_IRQ_0);
|
||||||
|
dvi_start(dviptr);
|
||||||
|
dvi_scanbuf_main_16bpp(dviptr);
|
||||||
|
__builtin_unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void core1_scanline_callback() {
|
||||||
|
// Discard any scanline pointers passed back
|
||||||
|
uint16_t *bufptr;
|
||||||
|
while (queue_try_remove_u32(&dviptr->q_colour_free, &bufptr));
|
||||||
|
// Note first two scanlines are pushed before DVI start
|
||||||
|
static uint scanline = 2;
|
||||||
|
bufptr = &fb[fbw * scanline];
|
||||||
|
queue_add_blocking_u32(&dviptr->q_colour_valid, &bufptr);
|
||||||
|
scanline = (scanline + 1) % fbh;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PicoDVI::begin(void) {
|
bool PicoDVI::begin(void) {
|
||||||
if ((framebuf = (uint16_t *)malloc(framebuf_width * framebuf_height * sizeof(uint16_t)))) {
|
if ((framebuf = (uint16_t *)calloc(framebuf_width * framebuf_height, sizeof(uint16_t)))) {
|
||||||
vreg_set_voltage(voltage);
|
vreg_set_voltage(voltage);
|
||||||
sleep_ms(10);
|
sleep_ms(10);
|
||||||
#ifdef RUN_FROM_CRYSTAL
|
#ifdef RUN_FROM_CRYSTAL
|
||||||
|
|
@ -32,35 +55,31 @@ bool PicoDVI::begin(void) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dvi0.timing = timing;
|
dvi0.timing = timing;
|
||||||
//dvi0.ser_cfg = DVI_DEFAULT_SERIAL_CONFIG;
|
|
||||||
memcpy(&dvi0.ser_cfg, cfg, sizeof dvi0.ser_cfg);
|
memcpy(&dvi0.ser_cfg, cfg, sizeof dvi0.ser_cfg);
|
||||||
#if 0
|
|
||||||
dvi0.scanline_callback = core1_scanline_callback;
|
dvi0.scanline_callback = core1_scanline_callback;
|
||||||
#endif
|
|
||||||
dvi_init(&dvi0, next_striped_spin_lock_num(), next_striped_spin_lock_num());
|
dvi_init(&dvi0, next_striped_spin_lock_num(), next_striped_spin_lock_num());
|
||||||
|
|
||||||
|
uint16_t *bufptr = framebuf;
|
||||||
|
queue_add_blocking_u32(&dvi0.q_colour_valid, &bufptr);
|
||||||
|
bufptr += framebuf_width;
|
||||||
|
queue_add_blocking_u32(&dvi0.q_colour_valid, &bufptr);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// This first line is where things go south
|
||||||
|
*dviptr = dvi0;
|
||||||
|
fb = framebuf;
|
||||||
|
fbw = framebuf_width;
|
||||||
|
fbh = framebuf_height;
|
||||||
|
// multicore_launch_core1(core1_main);
|
||||||
|
foo = false; // Set core 1 free
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int i=10; i<20; i++) {
|
||||||
|
framebuf[i * framebuf_width + i] = 0xF800;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
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
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include "pico/stdlib.h" // In Pico SDK
|
#include "pico/stdlib.h" // In Pico SDK
|
||||||
#include "hardware/vreg.h" // In Pico SDK
|
#include "hardware/vreg.h" // In Pico SDK
|
||||||
#include "../software/libdvi/dvi.h"
|
#include "dvi.h"
|
||||||
#include "../software/include/common_dvi_pin_configs.h"
|
#include "../software/include/common_dvi_pin_configs.h"
|
||||||
|
|
||||||
class PicoDVI {
|
class PicoDVI {
|
||||||
|
|
|
||||||
1
src/dvi.c
Symbolic link
1
src/dvi.c
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/dvi.c
|
||||||
1
src/dvi.h
Symbolic link
1
src/dvi.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/dvi.h
|
||||||
1
src/dvi_config_defs.h
Symbolic link
1
src/dvi_config_defs.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/dvi_config_defs.h
|
||||||
1
src/dvi_serialiser.c
Symbolic link
1
src/dvi_serialiser.c
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/dvi_serialiser.c
|
||||||
1
src/dvi_serialiser.h
Symbolic link
1
src/dvi_serialiser.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/dvi_serialiser.h
|
||||||
|
|
@ -1,8 +1,3 @@
|
||||||
// This is a special instance of dvi_serialiser.pio.h - created by first
|
|
||||||
// doing the normal PicoDVI build via cmake, then moving the this one file
|
|
||||||
// here (alongside Arduino lib header) and changing path for the
|
|
||||||
// dvi_config_defs.h include line.
|
|
||||||
|
|
||||||
// -------------------------------------------------- //
|
// -------------------------------------------------- //
|
||||||
// This file is autogenerated by pioasm; do not edit! //
|
// This file is autogenerated by pioasm; do not edit! //
|
||||||
// -------------------------------------------------- //
|
// -------------------------------------------------- //
|
||||||
|
|
@ -80,7 +75,7 @@ static inline pio_sm_config dvi_serialiser_debug_program_get_default_config(uint
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "../software/libdvi/dvi_config_defs.h"
|
#include "dvi_config_defs.h"
|
||||||
static inline void dvi_serialiser_program_init(PIO pio, uint sm, uint offset, uint data_pins, bool debug) {
|
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_pins_with_mask(pio, sm, 2u << data_pins, 3u << data_pins);
|
||||||
pio_sm_set_pindirs_with_mask(pio, sm, ~0u, 3u << data_pins);
|
pio_sm_set_pindirs_with_mask(pio, sm, ~0u, 3u << data_pins);
|
||||||
|
|
|
||||||
1
src/dvi_timing.c
Symbolic link
1
src/dvi_timing.c
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/dvi_timing.c
|
||||||
1
src/dvi_timing.h
Symbolic link
1
src/dvi_timing.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/dvi_timing.h
|
||||||
1
src/tmds_encode.S
Symbolic link
1
src/tmds_encode.S
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/tmds_encode.S
|
||||||
1
src/tmds_encode.c
Symbolic link
1
src/tmds_encode.c
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/tmds_encode.c
|
||||||
1
src/tmds_encode.h
Symbolic link
1
src/tmds_encode.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/tmds_encode.h
|
||||||
1
src/tmds_table.h
Symbolic link
1
src/tmds_table.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/tmds_table.h
|
||||||
1
src/tmds_table_fullres.h
Symbolic link
1
src/tmds_table_fullres.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/tmds_table_fullres.h
|
||||||
1
src/util_queue_u32_inline.h
Symbolic link
1
src/util_queue_u32_inline.h
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../software/libdvi/util_queue_u32_inline.h
|
||||||
Loading…
Reference in a new issue