Fix inverse video & support 512x342 w/o psram

This commit is contained in:
Jeff Epler 2025-03-24 09:50:47 -05:00
parent 5e5deca4e2
commit cd3bb34482
3 changed files with 21 additions and 16 deletions

View file

@ -11,14 +11,14 @@ DISP_WIDTH=512
DISP_HEIGHT=342 DISP_HEIGHT=342
MEMSIZE=400 MEMSIZE=400
DISK_IMAGE="" DISK_IMAGE=""
CMAKE_ARGS= CMAKE_ARGS=""
while getopts "hvd:m:" o; do while getopts "hvd:m:" o; do
case "$o" in case "$o" in
(v) (v)
DISP_WIDTH=640 DISP_WIDTH=640
DISP_HEIGHT=480 DISP_HEIGHT=480
CMAKE_ARGS="$CMAKE_ARGS -DUSE_VGA_RES=1 -DHSTX_CKP=12 -DHSTX_D0P=14 -DHSTX_D1P=16 -DHSTX_D2P=18" CMAKE_ARGS="-DUSE_VGA_RES=1"
;; ;;
(m) (m)
MEMSIZE=$OPTARG MEMSIZE=$OPTARG
@ -42,12 +42,17 @@ done
shift $((OPTIND-1)) shift $((OPTIND-1))
TAG=fruitjam_${DISP_WIDTH}x${DISP_HEIGHT}_${MEMSIZE}k TAG=fruitjam_${DISP_WIDTH}x${DISP_HEIGHT}_${MEMSIZE}k
PSRAM=$((MEMSIZE > 448 || DISP_WIDTH < 640)) PSRAM=$((MEMSIZE > 400))
if [ $PSRAM -ne 0 ] ; then if [ $PSRAM -ne 0 ] ; then
TAG=${TAG}_psram TAG=${TAG}_psram
CMAKE_ARGS="$CMAKE_ARGS -DUSE_PSRAM=1" CMAKE_ARGS="$CMAKE_ARGS -DUSE_PSRAM=1"
fi fi
MIRROR_FRAMEBUFFER=$((USE_PSRAM || DISP_WIDTH != 640))
if [ "$MIRROR_FRAMEBUFFER" -eq 0 ]; then
CMAKE_ARGS="$CMAKE_ARGS -DHSTX_CKP=12 -DHSTX_D0P=14 -DHSTX_D1P=16 -DHSTX_D2P=18 "
fi
# Append disk name to build directory if disk image is specified # Append disk name to build directory if disk image is specified
if [ -n "$DISK_IMAGE" ] && [ -f "$DISK_IMAGE" ]; then if [ -n "$DISK_IMAGE" ] && [ -f "$DISK_IMAGE" ]; then
# Extract filename without extension # Extract filename without extension
@ -74,5 +79,6 @@ cmake -S . -B build_${TAG} \
-DUSE_HSTX=1 \ -DUSE_HSTX=1 \
-DSD_TX=35 -DSD_RX=36 -DSD_SCK=34 -DSD_CS=39 -DUSE_SD=1 \ -DSD_TX=35 -DSD_RX=36 -DSD_SCK=34 -DSD_CS=39 -DUSE_SD=1 \
-DUART_TX=44 -DUART_RX=45 -DUART=0 \ -DUART_TX=44 -DUART_RX=45 -DUART=0 \
-DBOARD_FILE=boards/adafruit_fruit_jam.c \
${CMAKE_ARGS} "$@" ${CMAKE_ARGS} "$@"
make -C build_${TAG} -j$(nproc) make -C build_${TAG} -j$(nproc)

View file

@ -82,12 +82,16 @@ static const uint8_t umac_rom[] = {
}; };
#if USE_PSRAM #if USE_PSRAM
static uint32_t umac_framebuffer_mirror[640*480/32];
#define umac_ram ((uint8_t*)0x11000000) #define umac_ram ((uint8_t*)0x11000000)
#else #else
static uint8_t umac_ram[RAM_SIZE]; static uint8_t umac_ram[RAM_SIZE];
#endif #endif
#define MIRROR_FRAMEBUFFER (USE_PSRAM || DISP_WIDTH != 640)
#if MIRROR_FRAMEBUFFER
static uint32_t umac_framebuffer_mirror[640*480/32];
#endif
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static void io_init() static void io_init()
@ -115,13 +119,13 @@ static int umac_cursor_y = 0;
static int umac_cursor_button = 0; static int umac_cursor_button = 0;
#define umac_get_audio_offset() (RAM_SIZE - 768) #define umac_get_audio_offset() (RAM_SIZE - 768)
#if USE_PSRAM #if MIRROR_FRAMEBUFFER
static void copy_framebuffer() { static void copy_framebuffer() {
uint32_t *src = (uint32_t*)(umac_ram + umac_get_fb_offset()); uint32_t *src = (uint32_t*)(umac_ram + umac_get_fb_offset());
#if DISP_WIDTH==640 && DISP_HEIGHT==480 #if DISP_WIDTH==640 && DISP_HEIGHT==480
uint32_t *dest = umac_framebuffer_mirror; uint32_t *dest = umac_framebuffer_mirror;
for(int i=0; i<640*480/32; i++) { for(int i=0; i<640*480/32; i++) {
*dest++ = *src++ ^ 0xfffffffful; *dest++ = *src++;
} }
#elif DISP_WIDTH==512 && DISP_HEIGHT==342 #elif DISP_WIDTH==512 && DISP_HEIGHT==342
#define DISP_XOFFSET ((640 - DISP_WIDTH) / 32 / 2) #define DISP_XOFFSET ((640 - DISP_WIDTH) / 32 / 2)
@ -131,7 +135,7 @@ static void copy_framebuffer() {
for(int i=0; i<DISP_HEIGHT; i++) { for(int i=0; i<DISP_HEIGHT; i++) {
uint32_t *dest = umac_framebuffer_mirror + (DISP_YOFFSET * LONGS_PER_OUTPUT_ROW + DISP_XOFFSET) + LONGS_PER_OUTPUT_ROW * i; uint32_t *dest = umac_framebuffer_mirror + (DISP_YOFFSET * LONGS_PER_OUTPUT_ROW + DISP_XOFFSET) + LONGS_PER_OUTPUT_ROW * i;
for(int j=0; j<LONGS_PER_INPUT_ROW; j++) { for(int j=0; j<LONGS_PER_INPUT_ROW; j++) {
*dest++ = *src++ ^ 0xfffffffful; *dest++ = *src++ ^ 0xffffffff;
} }
} }
#else #else
@ -155,7 +159,7 @@ static void poll_umac()
pending_vsync |= audio_poll(); pending_vsync |= audio_poll();
#endif #endif
if (pending_vsync) { if (pending_vsync) {
#if USE_PSRAM #if MIRROR_FRAMEBUFFER
copy_framebuffer(); copy_framebuffer();
#endif #endif
/* FIXME: Trigger this off actual vsync */ /* FIXME: Trigger this off actual vsync */
@ -301,14 +305,13 @@ static void core1_main()
printf("Core 1 started\n"); printf("Core 1 started\n");
disc_setup(discs); disc_setup(discs);
#if USE_PSRAM
umac_init(umac_ram, (void *)umac_rom, discs);
video_init((uint32_t *)(umac_framebuffer_mirror));
#else
umac_init(umac_ram, (void *)umac_rom, discs); umac_init(umac_ram, (void *)umac_rom, discs);
/* Video runs on core 1, i.e. IRQs/DMA are unaffected by /* Video runs on core 1, i.e. IRQs/DMA are unaffected by
* core 0's USB activity. * core 0's USB activity.
*/ */
#if MIRROR_FRAMEBUFFER
video_init((uint32_t *)(umac_framebuffer_mirror));
#else
video_init((uint32_t *)(umac_ram + umac_get_fb_offset())); video_init((uint32_t *)(umac_ram + umac_get_fb_offset()));
#endif #endif

View file

@ -141,10 +141,6 @@ static void __not_in_flash_func(dma_irq_handler)(void) {
ch->al3_read_addr_trig = (uintptr_t)active_picodvi->dma_commands; ch->al3_read_addr_trig = (uintptr_t)active_picodvi->dma_commands;
} }
#if (DISP_WIDTH != 640 || DISP_HEIGHT != 480) && !USE_PSRAM
#error Only VGA resolution is supported without PSRAM
#endif
#define REAL_DISP_WIDTH 640 #define REAL_DISP_WIDTH 640
#define REAL_DISP_HEIGHT 480 #define REAL_DISP_HEIGHT 480