More WIP, trying different approach (soft links rather than include .c's)

This commit is contained in:
Phillip Burgess 2023-01-11 13:26:38 -08:00 committed by ladyada
parent 86a383d4d6
commit e77c6fedad
20 changed files with 87 additions and 42 deletions

View file

@ -3,8 +3,13 @@
PicoDVI dvi(320, 240, VREG_VOLTAGE_1_20, dvi_timing_640x480p_60hz, pimoroni_demo_hdmi_cfg);
void setup() {
Serial.begin(115200);
while(!Serial);
Serial.println("A");
dvi.begin();
Serial.println("B");
}
void loop() {
Serial.println("C");
}

View file

@ -52,6 +52,11 @@ struct dvi_inst {
};
#if defined(__cplusplus)
extern "C"
{
#endif
// Set up data structures and hardware for DVI.
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_16bpp(struct dvi_inst *inst);
#ifdef __cplusplus
#if defined(__cplusplus)
}
#endif

View file

@ -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_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;
#endif
s->v_ctr = 0;
}
}

View file

@ -4,6 +4,11 @@
#include "hardware/interp.h"
#include "dvi_config_defs.h"
#if defined(__cplusplus)
extern "C"
{
#endif
// 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_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_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
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_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);
#if defined(__cplusplus)
}
#endif
#endif

View file

@ -1,12 +1,7 @@
#include <stdlib.h>
#include <string.h>
#include "PicoDVI.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"
#include "pico/multicore.h"
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;
@ -20,8 +15,36 @@ PicoDVI::~PicoDVI(void) {
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) {
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);
sleep_ms(10);
#ifdef RUN_FROM_CRYSTAL
@ -32,35 +55,31 @@ bool PicoDVI::begin(void) {
#endif
dvi0.timing = timing;
//dvi0.ser_cfg = DVI_DEFAULT_SERIAL_CONFIG;
memcpy(&dvi0.ser_cfg, cfg, sizeof dvi0.ser_cfg);
#if 0
dvi0.scanline_callback = core1_scanline_callback;
#endif
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 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

View file

@ -2,7 +2,7 @@
#include "pico/stdlib.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"
class PicoDVI {

1
src/dvi.c Symbolic link
View file

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

1
src/dvi.h Symbolic link
View file

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

1
src/dvi_config_defs.h Symbolic link
View file

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

1
src/dvi_serialiser.c Symbolic link
View file

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

1
src/dvi_serialiser.h Symbolic link
View file

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

View file

@ -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! //
// -------------------------------------------------- //
@ -80,7 +75,7 @@ static inline pio_sm_config dvi_serialiser_debug_program_get_default_config(uint
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) {
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);

1
src/dvi_timing.c Symbolic link
View file

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

1
src/dvi_timing.h Symbolic link
View file

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

1
src/tmds_encode.S Symbolic link
View file

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

1
src/tmds_encode.c Symbolic link
View file

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

1
src/tmds_encode.h Symbolic link
View file

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

1
src/tmds_table.h Symbolic link
View file

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

1
src/tmds_table_fullres.h Symbolic link
View file

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

1
src/util_queue_u32_inline.h Symbolic link
View file

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