main: draw images on framebuffer
This commit is contained in:
parent
6825999536
commit
9ae9620c8d
4
.gitignore
vendored
4
.gitignore
vendored
@ -12,4 +12,6 @@ __pycache__
|
|||||||
*.cmd
|
*.cmd
|
||||||
*.order
|
*.order
|
||||||
*.mod.c
|
*.mod.c
|
||||||
*.out
|
*.out
|
||||||
|
*.rgb565.inc
|
||||||
|
main
|
6
Makefile
6
Makefile
@ -1,2 +1,8 @@
|
|||||||
%.csv: %.ods
|
%.csv: %.ods
|
||||||
libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)":44,34,76,,,,true --outdir $(dir $@) $<
|
libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)":44,34,76,,,,true --outdir $(dir $@) $<
|
||||||
|
|
||||||
|
%.rgb565.inc: %.rgb565
|
||||||
|
python gen/rgb_txt.py $< > $@
|
||||||
|
|
||||||
|
main: main.c bear.rgb565.inc panda.rgb565.inc
|
||||||
|
gcc -g -Og -std=c23 $< -o $@
|
||||||
|
2201
bear.rgb565
Normal file
2201
bear.rgb565
Normal file
File diff suppressed because one or more lines are too long
9
gen/rgb_txt.py
Normal file
9
gen/rgb_txt.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import struct
|
||||||
|
import sys
|
||||||
|
|
||||||
|
with open(sys.argv[1], 'rb') as f:
|
||||||
|
buf = f.read()
|
||||||
|
|
||||||
|
for i in range(len(buf) // 2):
|
||||||
|
value, = struct.unpack('<H', buf[i*2:i*2+2])
|
||||||
|
print(f"{value},")
|
150
main.c
150
main.c
@ -17,7 +17,7 @@ static inline bool _wait_graphics_busy(voodoo2_reg * voodoo2)
|
|||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
for (int i = 0; i < 4096; i++) {
|
for (int i = 0; i < 4096; i++) {
|
||||||
if (voodoo2->status & STATUS__GRAPHICS_BUSY) {
|
if (voodoo2->status & STATUS__CHUCK_BUSY) {
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
} else {
|
} else {
|
||||||
cnt += 1;
|
cnt += 1;
|
||||||
@ -183,11 +183,10 @@ int main()
|
|||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// reset
|
// reset
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
init_enable
|
init_enable
|
||||||
= INIT_ENABLE__ENABLE_WRITES_TO_HARDWARE_REGISTERS;
|
= INIT_ENABLE__ENABLE_WRITES_TO_HARDWARE_REGISTERS;
|
||||||
write_fd_u32(config_fd, PCI__CONFIG__INIT_ENABLE, init_enable);
|
write_fd_u32(config_fd, PCI__CONFIG__INIT_ENABLE, init_enable);
|
||||||
//wait_graphics_busy(voodoo2);
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
voodoo2->fbiInit0
|
voodoo2->fbiInit0
|
||||||
= FBIINIT0__CHUCK_GRAPHICS_RESET
|
= FBIINIT0__CHUCK_GRAPHICS_RESET
|
||||||
@ -208,6 +207,7 @@ int main()
|
|||||||
// DAC initialization
|
// DAC initialization
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// enable fbiInit2/dacRead remap
|
||||||
init_enable
|
init_enable
|
||||||
= INIT_ENABLE__ENABLE_WRITES_TO_HARDWARE_REGISTERS
|
= INIT_ENABLE__ENABLE_WRITES_TO_HARDWARE_REGISTERS
|
||||||
| INIT_ENABLE__REMAP_FBIINIT2_FBIINIT3_TO_DACREAD_VIDEOCHECKSUM;
|
| INIT_ENABLE__REMAP_FBIINIT2_FBIINIT3_TO_DACREAD_VIDEOCHECKSUM;
|
||||||
@ -243,6 +243,150 @@ int main()
|
|||||||
printf("dac read: DAC__PLL_PARAMETER__PLL_CONTROL: m: %02x\n",
|
printf("dac read: DAC__PLL_PARAMETER__PLL_CONTROL: m: %02x\n",
|
||||||
pll_control_res.m);
|
pll_control_res.m);
|
||||||
|
|
||||||
|
// disable fbiInit2/dacRead remap
|
||||||
|
init_enable
|
||||||
|
= INIT_ENABLE__ENABLE_WRITES_TO_HARDWARE_REGISTERS;
|
||||||
|
write_fd_u32(config_fd, PCI__CONFIG__INIT_ENABLE, init_enable);
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// framebuffer initialization
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
voodoo2->fbiInit0
|
||||||
|
= FBIINIT0__VGA_PASSTHROUGH // disable VGA passthrough
|
||||||
|
| FBIINIT0__STALL_PCI_ENABLE_FOR_HIGH_WATER_MARK
|
||||||
|
| FBIINIT0__PCI_FIFO_EMPTY_ENTRIES_LOW_WATER_MARK(0x10)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
int x_tiles = 832 / 32;
|
||||||
|
int x_tiles_0 = (x_tiles >> 0) & 0b1;
|
||||||
|
int x_tiles_4_1 = (x_tiles >> 1) & 0b1111;
|
||||||
|
int x_tiles_5 = (x_tiles >> 5) & 0b1;
|
||||||
|
|
||||||
|
voodoo2->fbiInit1
|
||||||
|
= FBIINIT1__ENABLE_LINEAR_FRAME_BUFFER_READS
|
||||||
|
| FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_4_1(x_tiles_4_1)
|
||||||
|
| FBIINIT1__DRIVE_VIDEO_TIMING_DATA_OUTPUTS
|
||||||
|
| FBIINIT1__DRIVE_VIDEO_TIMING_BLANK_OUTPUTS
|
||||||
|
| FBIINIT1__DRIVE_VIDEO_TIMING_HSYNC_VSYNC_OUTPUTS
|
||||||
|
| FBIINIT1__DRIVE_VIDEO_TIMING_DCLK_OUTPUT
|
||||||
|
| FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT(0)
|
||||||
|
| FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_2X_SEL
|
||||||
|
| FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_5(x_tiles_5)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->fbiInit2
|
||||||
|
= FBIINIT2__DRAM_BANKING_CONFIGURATION
|
||||||
|
| FBIINIT2__ENABLE_FAST_RAS_READ_CYCLES
|
||||||
|
| FBIINIT2__ENABLE_GENERATED_DRAM_OE_SIGNAL
|
||||||
|
| FBIINIT2__VIDEO_BUFFER_OFFSET(247)
|
||||||
|
| FBIINIT2__ENABLE_DRAM_READ_AHEAD_FIFO
|
||||||
|
| FBIINIT2__REFRESH_ENABLE
|
||||||
|
| FBIINIT2__REFRESH_LOAD_VALUE(0x30)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->fbiInit3
|
||||||
|
= FBIINIT3__DISABLE_TEXTURE_MAPPING
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->fbiInit4
|
||||||
|
= FBIINIT4__ENABLE_READ_AHEAD_LOGIC_FOR_LINEAR_FRAME_BUFFER_READS
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->fbiInit5
|
||||||
|
= FBIINIT5__INVERT_DAC_HSYNC_OUTPUT_TO_DAC
|
||||||
|
| FBIINIT5__INVERT_DAC_VSYNC_OUTPUT_TO_DAC
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->fbiInit6
|
||||||
|
= FBIINIT6__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_0(x_tiles_0)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// video timing initialization
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
int y_height = 600;
|
||||||
|
int x_width = 800;
|
||||||
|
|
||||||
|
int v_back_porch = 628 - 605;
|
||||||
|
int h_back_porch = 1056 - 968;
|
||||||
|
|
||||||
|
int v_sync_on = 605 - 601;
|
||||||
|
int h_sync_on = 968 - 840;
|
||||||
|
|
||||||
|
int v_sync_off = 628 - v_sync_on;
|
||||||
|
int h_sync_off = 1056 - h_sync_on;
|
||||||
|
|
||||||
|
voodoo2->hSync
|
||||||
|
= HSYNC__H_SYNC_ON(h_sync_on - 1)
|
||||||
|
| HSYNC__H_SYNC_OFF(h_sync_off)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->vSync
|
||||||
|
= VSYNC__V_SYNC_ON(v_sync_on)
|
||||||
|
| VSYNC__V_SYNC_OFF(v_sync_off)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->backPorch
|
||||||
|
= BACKPORCH__H_BACK_PORCH(h_back_porch - 2)
|
||||||
|
| BACKPORCH__V_BACK_PORCH(v_back_porch)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
voodoo2->videoDimensions
|
||||||
|
= VIDEODIMENSIONS__X_WIDTH(x_width - 1)
|
||||||
|
| VIDEODIMENSIONS__Y_HEIGHT(y_height)
|
||||||
|
;
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// panda
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
init_enable
|
||||||
|
= INIT_ENABLE__ENABLE_WRITES_TO_PCI_FIFO;
|
||||||
|
write_fd_u32(config_fd, PCI__CONFIG__INIT_ENABLE, init_enable);
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
|
||||||
|
static const uint16_t panda[] __attribute__((aligned(4))) = {
|
||||||
|
#include "panda.rgb565.inc"
|
||||||
|
};
|
||||||
|
static const uint16_t bear[] __attribute__((aligned(4))) = {
|
||||||
|
#include "bear.rgb565.inc"
|
||||||
|
};
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
volatile uint16_t * framebuffer
|
||||||
|
= (volatile uint16_t * )(((ptrdiff_t)resource0_base) + 0x0400000);
|
||||||
|
|
||||||
|
printf("panda\n");
|
||||||
|
for (int y = 0; y < 600; y++) {
|
||||||
|
for (int x = 0; x < 800; x++) {
|
||||||
|
framebuffer[y * 1024 + x] = panda[y * 800 + x];
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
printf("bear\n");
|
||||||
|
for (int y = 0; y < 600; y++) {
|
||||||
|
for (int x = 0; x < 800; x++) {
|
||||||
|
framebuffer[y * 1024 + x] = bear[y * 800 + x];
|
||||||
|
wait_graphics_busy(voodoo2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// cleanup
|
// cleanup
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
BIN
panda.rgb565
Normal file
BIN
panda.rgb565
Normal file
Binary file not shown.
@ -233,6 +233,9 @@
|
|||||||
#define VIDEODIMENSIONS__X_WIDTH(n) (((n) & 0x7ff) << 0)
|
#define VIDEODIMENSIONS__X_WIDTH(n) (((n) & 0x7ff) << 0)
|
||||||
#define VIDEODIMENSIONS__Y_HEIGHT(n) (((n) & 0x7ff) << 16)
|
#define VIDEODIMENSIONS__Y_HEIGHT(n) (((n) & 0x7ff) << 16)
|
||||||
|
|
||||||
|
#define BACKPORCH__H_BACK_PORCH(n) (((n) & 0x1ff) << 0)
|
||||||
|
#define BACKPORCH__V_BACK_PORCH(n) (((n) & 0x1ff) << 16)
|
||||||
|
|
||||||
#define MAXRGBDELTA__BLUE(n) (((n) & 0xff) << 0)
|
#define MAXRGBDELTA__BLUE(n) (((n) & 0xff) << 0)
|
||||||
#define MAXRGBDELTA__GREEN(n) (((n) & 0xff) << 8)
|
#define MAXRGBDELTA__GREEN(n) (((n) & 0xff) << 8)
|
||||||
#define MAXRGBDELTA__RED(n) (((n) & 0xff) << 16)
|
#define MAXRGBDELTA__RED(n) (((n) & 0xff) << 16)
|
||||||
@ -262,7 +265,7 @@
|
|||||||
#define FBIINIT1__PCI_DEVICE_FUNCTION_NUMBER (1 << 0)
|
#define FBIINIT1__PCI_DEVICE_FUNCTION_NUMBER (1 << 0)
|
||||||
#define FBIINIT1__WAIT_STATE_CYCLES_FOR_PCI_WRITE_ACCESSES (1 << 1)
|
#define FBIINIT1__WAIT_STATE_CYCLES_FOR_PCI_WRITE_ACCESSES (1 << 1)
|
||||||
#define FBIINIT1__ENABLE_LINEAR_FRAME_BUFFER_READS (1 << 3)
|
#define FBIINIT1__ENABLE_LINEAR_FRAME_BUFFER_READS (1 << 3)
|
||||||
#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION(n) (((n) & 0xf) << 4)
|
#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_4_1(n) (((n) & 0xf) << 4)
|
||||||
#define FBIINIT1__VIDEO_TIMING_RESET (1 << 8)
|
#define FBIINIT1__VIDEO_TIMING_RESET (1 << 8)
|
||||||
#define FBIINIT1__SOFTWARE_OVERRIDE_OF_HSYNC_VSYNC (1 << 9)
|
#define FBIINIT1__SOFTWARE_OVERRIDE_OF_HSYNC_VSYNC (1 << 9)
|
||||||
#define FBIINIT1__SOFTWARE_OVERRIDE_HSYNC_VALUE (1 << 10)
|
#define FBIINIT1__SOFTWARE_OVERRIDE_HSYNC_VALUE (1 << 10)
|
||||||
@ -272,7 +275,7 @@
|
|||||||
#define FBIINIT1__DRIVE_VIDEO_TIMING_BLANK_OUTPUTS (1 << 14)
|
#define FBIINIT1__DRIVE_VIDEO_TIMING_BLANK_OUTPUTS (1 << 14)
|
||||||
#define FBIINIT1__DRIVE_VIDEO_TIMING_HSYNC_VSYNC_OUTPUTS (1 << 15)
|
#define FBIINIT1__DRIVE_VIDEO_TIMING_HSYNC_VSYNC_OUTPUTS (1 << 15)
|
||||||
#define FBIINIT1__DRIVE_VIDEO_TIMING_DCLK_OUTPUT (1 << 16)
|
#define FBIINIT1__DRIVE_VIDEO_TIMING_DCLK_OUTPUT (1 << 16)
|
||||||
#define FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT (1 << 17)
|
#define FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT(n) (((n) & 1) << 17)
|
||||||
#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__NO_DELAY (0 << 18)
|
#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__NO_DELAY (0 << 18)
|
||||||
#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__4NS (1 << 18)
|
#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__4NS (1 << 18)
|
||||||
#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__6NS (2 << 18)
|
#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__6NS (2 << 18)
|
||||||
@ -282,7 +285,7 @@
|
|||||||
#define FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_2X_SEL (2 << 20)
|
#define FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_2X_SEL (2 << 20)
|
||||||
#define FBIINIT1__ENABLE_24_BITS_PER_PIXEL_VIDEO_OUTPUT (1 << 22)
|
#define FBIINIT1__ENABLE_24_BITS_PER_PIXEL_VIDEO_OUTPUT (1 << 22)
|
||||||
#define FBIINIT1__ENABLE_SCAN_LINE_INTERLEAVING (1 << 23)
|
#define FBIINIT1__ENABLE_SCAN_LINE_INTERLEAVING (1 << 23)
|
||||||
#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_5 (1 << 24)
|
#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_5(n) (((n) & 1) << 24)
|
||||||
#define FBIINIT1__ENABLE_VIDEO_EDGE_DETECTION_FILTERING (1 << 25)
|
#define FBIINIT1__ENABLE_VIDEO_EDGE_DETECTION_FILTERING (1 << 25)
|
||||||
#define FBIINIT1__INVERT_VID_CLK_2X (1 << 26)
|
#define FBIINIT1__INVERT_VID_CLK_2X (1 << 26)
|
||||||
#define FBIINIT1__VID_CLK_2X_SEL_DELAY_SELECT__NO_DELAY (0 << 27)
|
#define FBIINIT1__VID_CLK_2X_SEL_DELAY_SELECT__NO_DELAY (0 << 27)
|
||||||
@ -368,7 +371,7 @@
|
|||||||
#define FBIINIT6__DAC_WR_OUTPUT_VALUE(n) (((n) & 0x3) << 19)
|
#define FBIINIT6__DAC_WR_OUTPUT_VALUE(n) (((n) & 0x3) << 19)
|
||||||
#define FBIINIT6__PCI_FIFO_EMPTY_ENTRIES_LOW_WATER_MARK(n) (((n) & 0x7f) << 21)
|
#define FBIINIT6__PCI_FIFO_EMPTY_ENTRIES_LOW_WATER_MARK(n) (((n) & 0x7f) << 21)
|
||||||
#define FBIINIT6__VGA_PASS_N_OUTPUT_VALUE(n) (((n) & 0x3) << 28)
|
#define FBIINIT6__VGA_PASS_N_OUTPUT_VALUE(n) (((n) & 0x3) << 28)
|
||||||
#define FBIINIT6__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION (1 << 30)
|
#define FBIINIT6__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_0(n) (((n) & 1) << 30)
|
||||||
|
|
||||||
#define FBIINIT7__CMDFIFO_ENABLE (1 << 8)
|
#define FBIINIT7__CMDFIFO_ENABLE (1 << 8)
|
||||||
#define FBIINIT7__CMDFIFO_OFFSCREEN_MEMORY_STORE (1 << 9)
|
#define FBIINIT7__CMDFIFO_OFFSCREEN_MEMORY_STORE (1 << 9)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user