kopia lustrzana https://github.com/hoglet67/RGBtoHDMI
617 wiersze
24 KiB
C
617 wiersze
24 KiB
C
// defs.h
|
|
|
|
#ifndef DEFS_H
|
|
#define DEFS_H
|
|
|
|
#define _RPI 1
|
|
#define _RPI2 2
|
|
#define _RPI3 3
|
|
#define _RPI4 4
|
|
|
|
#ifdef USE_ARM_CAPTURE
|
|
#ifdef RPI4 // if using ARM CAPTURE then enable mode7 options only on RPI4 build
|
|
#define USE_ALT_M7DEINTERLACE_CODE // uses re-ordered code for mode7 deinterlace
|
|
#define USE_CACHED_SCREEN // caches the upper half of the screen area and uses it for mode7 deinterlace
|
|
#define CACHED_SCREEN_OFFSET 0x00B00000 // offset to cached screen area
|
|
#define CACHED_SCREEN_SIZE 0x00100000 // size of cached screen area
|
|
#endif
|
|
#else // if not using ARM CAPTURE (i.e. using GPU CAPTURE) then enable mode7 options
|
|
#define USE_ALT_M7DEINTERLACE_CODE // uses re-ordered code for mode7 deinterlace
|
|
#define USE_CACHED_SCREEN // caches the upper half of the screen area and uses it for mode7 deinterlace
|
|
#define CACHED_SCREEN_OFFSET 0x00B00000 // offset to cached screen area
|
|
#define CACHED_SCREEN_SIZE 0x00100000 // size of cached screen area
|
|
#endif
|
|
|
|
#define USE_MULTICORE
|
|
|
|
#define DONT_USE_MULTICORE_ON_PI2
|
|
|
|
// Define how the Pi Framebuffer is initialized
|
|
// - if defined, use the property interface (Channel 8)
|
|
// - if not defined, use to the the framebuffer interface (Channel 1)
|
|
//
|
|
// Note: there seem to be some weird caching issues with the property interface
|
|
// so using the dedicated framebuffer interface is preferred.
|
|
// but that doesn't work on the Pi3
|
|
#define USE_PROPERTY_INTERFACE_FOR_FB
|
|
|
|
#define HIDE_INTERFACE_SETTING
|
|
|
|
// Define the legal range of HDMI pixel clocks
|
|
#define MIN_PIXEL_CLOCK 24.5 // 24.5MHz
|
|
#ifdef RPI4
|
|
#define MAX_PIXEL_CLOCK 600.0 // 600MHz
|
|
#else
|
|
#define MAX_PIXEL_CLOCK 340.0 // 340MHz
|
|
#endif
|
|
|
|
// Enable multiple buffering and vsync based page flipping
|
|
#define MULTI_BUFFER
|
|
|
|
// The maximum number of buffers used by multi-buffering
|
|
// (it can be set to less that this on the OSD)
|
|
#define NBUFFERS 4
|
|
|
|
#define VSYNCINT 16
|
|
|
|
// Control bits (maintained in r3)
|
|
|
|
//the BITDUP bits reuse some bits in the inner capture loops
|
|
|
|
#define BIT_ELK 0x01 // bit 0, indicates we are an Electron
|
|
#define BITDUP_LINE_CONDITION_DETECTED 0x01 // bit 0, indicates grey screen detected
|
|
#define BIT_PROBE 0x02 // bit 1, indicates the mode is being determined
|
|
#define BITDUP_FFOSD_DETECTED 0x02 // bit 1, indicates ffosd detected
|
|
#define BIT_CALIBRATE 0x04 // bit 2, indicates calibration is happening
|
|
#define BIT_OSD 0x08 // bit 3, indicates the OSD is visible
|
|
#define BIT_FIELD_TYPE1_VALID 0x10 // bit 4, indicates FIELD_TYPE1 is valid
|
|
#define BITDUP_ENABLE_GREY_DETECT 0x10 // bit 4, enable grey screen detection
|
|
#define BIT_NO_LINE_DOUBLE 0x20 // bit 5, if set then lines aren't duplicated in capture
|
|
#define BIT_NO_SCANLINES 0x40 // bit 6, indicates scan lines should be made visible
|
|
#define BIT_INTERLACED_VIDEO 0x80 // bit 7, if set then interlaced video detected or teletext enabled
|
|
#define BIT_CLEAR 0x100 // bit 8, indicates the frame buffer should be cleared
|
|
#define BITDUP_ENABLE_FFOSD 0x100 // bit 8, indicates FFOSD is enabled
|
|
#define BIT_VSYNC 0x200 // bit 9, indicates the red v sync indicator should be displayed
|
|
#define BIT_VSYNC_MARKER 0x400 // bit 10, indicates current line should be replaced by the red vsync indicator
|
|
#define BIT_DEBUG 0x800 // bit 11, indicates the debug grid should be displayed
|
|
|
|
#define OFFSET_LAST_BUFFER 12 // bit 12-13 LAST_BUFFER
|
|
#define MASK_LAST_BUFFER (3 << OFFSET_LAST_BUFFER)
|
|
|
|
#define BITDUP_RGB_INVERT 0x1000 //bit 12, indicates 9/12 bit RGB should be inverted
|
|
#define BITDUP_Y_INVERT 0x2000 //bit 13, indicates 9/12 bit G should be inverted
|
|
|
|
#define OFFSET_CURR_BUFFER 14 // bit 14-15 CURR_BUFFER
|
|
#define MASK_CURR_BUFFER (3 << OFFSET_CURR_BUFFER)
|
|
|
|
#define OFFSETDUP_PALETTE_HIGH_NIBBLE 12 // bit 12-15
|
|
#define MASKDUP_PALETTE_HIGH_NIBBLE (15 << OFFSETDUP_PALETTE_HIGH_NIBBLE)
|
|
|
|
#define BIT_INHIBIT_MODE_DETECT 0x10000 // bit 16 inhibit mode detection if sideways scrolling
|
|
#define BIT_PSYNC_POL 0x20000 // bit 17, indicates psync inversion (NEEDS TO MATCH PSYNC_PIN below)
|
|
|
|
#define OFFSET_NBUFFERS 18 // bit 18-19 NBUFFERS
|
|
#define MASK_NBUFFERS (3 << OFFSET_NBUFFERS)
|
|
|
|
#define OFFSET_INTERLACE 20 // bit 20-22 INTERLACE
|
|
#define MASK_INTERLACE (7 << OFFSET_INTERLACE)
|
|
|
|
#define BIT_FIELD_TYPE1 0x00800000 // bit 23, indicates the field type of the previous field
|
|
#define BITDUP_IIGS_DETECT 0x00800000 // bit 23, if set then apple IIGS mode detection enabled
|
|
|
|
#define BIT_FIELD_TYPE 0x01000000 // bit 24, indicates the field type (0 = odd, 1 = even) of the last field
|
|
#define BITDUP_MODE2_16COLOUR 0x01000000 // bit 24, if set then 16 colour mode 2 is emulated by decoding mode 0
|
|
|
|
#define BIT_OLD_FIRMWARE_SUPPORT 0x02000000 // bit 25, indicates old CPLD v1 or v2
|
|
// then a second time to capture stable data. The v3 CPLD delays PSYNC a
|
|
// couple of cycles, so the read that sees the edge will always capture
|
|
// stable data. The second read is skipped in this case.
|
|
#define BIT_NO_H_SCROLL 0x04000000 // bit 26, if set then smooth H scrolling disabled
|
|
#define BIT_NO_SKIP_HSYNC 0x08000000 // bit 27, clear if hsync is ignored (used by cache preload)
|
|
#define BIT_HSYNC_EDGE 0x10000000 // bit 28, clear if trailing edge
|
|
#define BIT_RPI234 0x20000000 // bit 29, set if Pi 2, 3 or 4 detected
|
|
#define BIT_SKIP_ALT_FRAME 0x40000000 // bit 30, set to skip capture of alternate frames used in 4K@25/30Hz
|
|
//#define BIT_ 0x80000000 // bit 31, may get corrupted - check
|
|
|
|
// R0 return value bits
|
|
#define RET_MODESET 0x01
|
|
#define RET_SW1 0x02
|
|
#define RET_SW2 0x04
|
|
#define RET_SW3 0x08
|
|
#define RET_EXPIRED 0x10
|
|
#define RET_INTERLACE_CHANGED 0x20
|
|
#define RET_SYNC_TIMING_CHANGED 0x40
|
|
#define RET_SYNC_POLARITY_CHANGED 0x80
|
|
#define RET_SYNC_STATE_CHANGED 0x100
|
|
|
|
//paletteFlags
|
|
#define BIT_IN_BAND_ENABLE 0x01 // bit 0, if set in band data detection is enabled
|
|
#define BIT_IN_BAND_DETECTED 0x02 // bit 1, if set if in band data is detected
|
|
#define BIT_MODE2_PALETTE 0x04 // bit 2, if set mode 2 palette is customised
|
|
#define BIT_MODE7_PALETTE 0x08 // bit 3, if set mode 7 palette is customised
|
|
#define BIT_SET_MODE2_16COLOUR 0x10 // bit 4, if set mode 2 16 colour is enabled
|
|
#define BIT_MULTI_PALETTE 0x020 // bit 5 if set then multiple 16 colour palettes
|
|
|
|
#define VERTICAL_OFFSET 6 // start of actual bbc screen from start of buffer
|
|
|
|
// Offset definitions
|
|
#define NUM_OFFSETS 6
|
|
|
|
#define BIT_BOTH_BUFFERS (BIT_DRAW_BUFFER | BIT_DISP_BUFFER)
|
|
|
|
#ifdef __ASSEMBLER__
|
|
#define GPU_COMMAND_BASE_OFFSET 0x000000a0
|
|
|
|
//#define GPU_DATA_0 (PERIPHERAL_BASE + 0x000000a4)
|
|
//#define GPU_DATA_1 (PERIPHERAL_BASE + 0x000000a8)
|
|
//#define GPU_DATA_2 (PERIPHERAL_BASE + 0x000000ac)
|
|
//#define GPU_SYNC (PERIPHERAL_BASE + 0x000000b0) //gap in data block to allow fast 3 register read on ARM side
|
|
//#define GPU_DATA_3 (PERIPHERAL_BASE + 0x000000b4) //using a single ldr and a two register ldmia
|
|
//#define GPU_DATA_4 (PERIPHERAL_BASE + 0x000000b8) //can't use more than a single unaligned two register ldmia on the peripherals
|
|
//#define GPU_DATA_5 (PERIPHERAL_BASE + 0x000000bc)
|
|
|
|
#define GPU_COMMAND_offset 0x00
|
|
#define GPU_DATA_0_offset 0x04
|
|
#define GPU_DATA_1_offset 0x08
|
|
#define GPU_DATA_2_offset 0x0c
|
|
#define GPU_SYNC_offset 0x10
|
|
#define GPU_DATA_3_offset 0x14
|
|
#define GPU_DATA_4_offset 0x18
|
|
#define GPU_DATA_5_offset 0x1c
|
|
|
|
#define GPIO_BASE_OFFSET 0x200000
|
|
#define GPSET0_OFFSET 0x00001C
|
|
#define GPCLR0_OFFSET 0x000028
|
|
#define GPLEV0_OFFSET 0x000034
|
|
|
|
#if defined(RPI4)
|
|
#define INTPEND2_OFFSET 0x00B204 //SMI interrupt (GPU # 48 used for vsync) is actually in IRQ0_PENDING1 on pi 4 (0xfe00b204)
|
|
#else
|
|
#define INTPEND2_OFFSET 0x00B208
|
|
#endif
|
|
|
|
#define SMICTRL_OFFSET 0x600000
|
|
|
|
//#define GPFSEL0 (PERIPHERAL_BASE + 0x200000) // controls GPIOs 0..9
|
|
//#define GPFSEL1 (PERIPHERAL_BASE + 0x200004) // controls GPIOs 10..19
|
|
//#define GPFSEL2 (PERIPHERAL_BASE + 0x200008) // controls GPIOs 20..29
|
|
//#define GPEDS0 (PERIPHERAL_BASE + 0x200040)
|
|
//#define GPREN0 (PERIPHERAL_BASE + 0x20004C)
|
|
//#define GPFEN0 (PERIPHERAL_BASE + 0x200058)
|
|
//#define GPAREN0 (PERIPHERAL_BASE + 0x20007C)
|
|
//#define GPAFEN0 (PERIPHERAL_BASE + 0x200088)
|
|
//#define FIQCTRL (PERIPHERAL_BASE + 0x00B20C)
|
|
|
|
|
|
// Offsets into capture_info_t structure below
|
|
#define O_FB_BASE 0
|
|
#define O_FB_PITCH 4
|
|
#define O_FB_WIDTH 8
|
|
#define O_FB_HEIGHT 12
|
|
#define O_FB_SIZEX2 16
|
|
#define O_FB_BPP 20
|
|
#define O_CHARS_PER_LINE 24
|
|
#define O_NLINES 28
|
|
#define O_H_OFFSET 32
|
|
#define O_V_OFFSET 36
|
|
#define O_NCAPTURE 40
|
|
#define O_PALETTE_CONTROL 44
|
|
#define O_SAMPLE_WIDTH 48
|
|
#define O_H_ADJUST 52
|
|
#define O_V_ADJUST 56
|
|
#define O_SYNCTYPE 60
|
|
#define O_DETSYNCTYPE 64
|
|
#define O_VSYNCTYPE 68
|
|
#define O_VIDEOTYPE 72
|
|
#define O_NTSCPHASE 76
|
|
#define O_BORDER 80
|
|
#define O_DELAY 84
|
|
#define O_INTENSITY 88
|
|
#define O_AUTOSWITCH 92
|
|
#define O_TIMINGSET 96
|
|
#define O_SYNCEDGE 100
|
|
#define O_MODE7 104
|
|
#define O_CAPTURE_LINE 108
|
|
|
|
#else
|
|
|
|
typedef struct {
|
|
unsigned char *fb; // framebuffer base address
|
|
int pitch; // framebuffer pitch (in bytes per line)
|
|
int width; // framebuffer width (in pixels)
|
|
int height; // framebuffer height (in pixels, after any doubling is applied)
|
|
int sizex2; // if 1 then double frame buffer height if 2 then double width 3=both
|
|
int bpp; // framebuffer bits per pixel (4 or 8)
|
|
int chars_per_line; // active 8-pixel characters per line (83 in Modes 0..6, but 63 in Mode 7)
|
|
int nlines; // number of active lines to capture each field
|
|
int h_offset; // horizontal offset (in psync clocks)
|
|
int v_offset; // vertical offset (in lines)
|
|
int ncapture; // number of fields to capture, or -1 to capture forever
|
|
int palette_control;// normal / in band data / ntsc artifacting etc
|
|
int sample_width; // 0(=3 bits) or 1(=6 bits)
|
|
int h_adjust; // h offset into large frame buffer
|
|
int v_adjust; // v offset into large frame buffer
|
|
int sync_type; // expected sync type and polarity
|
|
int detected_sync_type; // detected sync type and polarity
|
|
int vsync_type; // expected vertical sync type
|
|
int video_type; // expected video type / progressive / interlaced (teletext)
|
|
int ntscphase; // NTSC artifact colour phase
|
|
int border; // border logical colour
|
|
int delay; // delay value from sampling menu & 3
|
|
int intensity; // scanline intensity
|
|
int autoswitch; // autoswitch detect mode
|
|
int timingset; // 0 = set1, 1 = set 2
|
|
int sync_edge; // sync edge setting
|
|
int mode7; // mode7 flag
|
|
int (*capture_line)(); // the capture line function to use
|
|
int px_sampling; // whether to sample normally, sub-sample or pixel double
|
|
} capture_info_t;
|
|
|
|
typedef struct {
|
|
int clock; // sample clock frequency (Hz)
|
|
double line_len; // length of a line (in sample clocks)
|
|
int clock_ppm; // sample clock frequency (Hz)
|
|
int lines_per_frame;
|
|
} clk_info_t;
|
|
|
|
#endif // __ASSEMBLER__
|
|
|
|
// Quad Pixel input on GPIOs 2..13
|
|
#define PIXEL_BASE (2)
|
|
|
|
#define SW1_PIN (16) // active low
|
|
#define SW2_PIN (26) // active low
|
|
#define SW3_PIN (19) // active low
|
|
#define PSYNC_PIN (17)
|
|
#define CSYNC_PIN (23)
|
|
#define MODE7_PIN (25)
|
|
#define GPCLK_PIN (21)
|
|
#define SP_CLK_PIN (20)
|
|
#define SP_CLKEN_PIN (1)
|
|
#define SP_DATA_PIN (0)
|
|
#define MUX_PIN (24)
|
|
#define STROBE_PIN (22)
|
|
#define VERSION_PIN (18) // active low, connects to GSR
|
|
|
|
// These pins are overloaded
|
|
#define TCK_PIN (SP_CLK_PIN)
|
|
#define TMS_PIN (SP_CLKEN_PIN)
|
|
#define TDI_PIN (SP_DATA_PIN)
|
|
#define TDO_PIN (MUX_PIN)
|
|
|
|
// LED1 is left LED, driven by the Pi
|
|
// LED2 is the right LED, driven by the CPLD, as a copy of mode 7
|
|
// both LEDs are active high
|
|
#define LED1_PIN (27)
|
|
|
|
#define SW1_MASK (1U << SW1_PIN)
|
|
#define SW2_MASK (1U << SW2_PIN)
|
|
#define SW3_MASK (1U << SW3_PIN)
|
|
#define PSYNC_MASK (1U << PSYNC_PIN)
|
|
#define CSYNC_MASK (1U << CSYNC_PIN)
|
|
#define LED1_MASK (1U << LED1_PIN)
|
|
#define MODE7_MASK (1U << MODE7_PIN)
|
|
#define VERSION_MASK (1U << VERSION_PIN)
|
|
#define STROBE_MASK (1U << STROBE_PIN)
|
|
#define SP_CLK_MASK (1U << SP_CLK_PIN)
|
|
#define SP_DATA_MASK (1U << SP_DATA_PIN)
|
|
#define MUX_MASK (1U << MUX_PIN)
|
|
|
|
#define GPIO_FLOAT 0x00
|
|
#define GPIO_PULLDOWN 0x01
|
|
#define GPIO_PULLUP 0x02
|
|
|
|
#define SYNC_BIT_HSYNC_INVERTED 0x01 // bit 0, indicates hsync/composite sync is inverted
|
|
#define SYNC_BIT_VSYNC_INVERTED 0x02 // bit 1, indicates vsync is inverted
|
|
#define SYNC_BIT_COMPOSITE_SYNC 0x04 // bit 2, indicates composite sync
|
|
#define SYNC_BIT_MIXED_SYNC 0x08 // bit 3, indicates H and V syncs eored in CPLD
|
|
#define SYNC_BIT_INTERLACED 0x10 // bit 4, indicates interlaced sync detected
|
|
#define SYNC_BIT_MASK 0x07 // masks out bits 3 + 4
|
|
|
|
#define VSYNC_RETRY_MAX 10
|
|
|
|
#define MAX_STRING_SIZE 255
|
|
#define MIN_STRING_SIZE 127
|
|
#define MAX_STRING_LIMIT 253
|
|
#define MIN_STRING_LIMIT 125
|
|
|
|
#define MAX_CPLD_FILENAMES 24
|
|
#define MAX_FILENAME_WIDTH 40
|
|
#define MAX_PROFILES 512
|
|
#define MAX_SUB_PROFILES 64
|
|
#define MAX_FAVOURITES 10
|
|
#define MAX_PROFILE_WIDTH 256
|
|
#define MAX_BUFFER_SIZE 2048
|
|
#define MAX_CONFIG_BUFFER_SIZE 8192
|
|
#define DEFAULT_STRING "Default"
|
|
#define ROOT_DEFAULT_STRING "../Default"
|
|
#define DEFAULTTXT_STRING "Default.txt"
|
|
#define FAVOURITES_PATH "/favourites.txt"
|
|
#define FAVOURITES_MENU "Recently used"
|
|
#define FAVOURITES_MENU_CLEAR "Clear recently used"
|
|
#define NOT_FOUND_STRING "Not Found"
|
|
#define NONE_STRING "None"
|
|
#define MAX_NAMES 64
|
|
#define MAX_NAMES_WIDTH 32
|
|
#define MAX_JITTER_LINES 8
|
|
|
|
#define CUSTOM_PROFILE_FOLDER "_Custom_"
|
|
#define CUSTOM_PROFILE_NAME "Custom_Profile_"
|
|
|
|
#define CAPTURE_FILE_BASE "capture"
|
|
#define CAPTURE_BASE "/Captures"
|
|
#define PROFILE_BASE "/Profiles"
|
|
#define SAVED_PROFILE_BASE "/Saved_Profiles"
|
|
#define PALETTES_BASE "/Palettes"
|
|
#define PALETTES_TYPE ".bin"
|
|
|
|
#define ONE_BUTTON_FILE "/Button_Mode.txt"
|
|
#define FORCE_BLANK_FILE "/cpld_firmware/Delete_This_File_To_Erase_CPLD.txt"
|
|
#define FORCE_UPDATE_FILE "/cpld_firmware/Delete_This_File_To_Check_CPLD.txt"
|
|
#define FORCE_BLANK_FILE_MESSAGE "Deleting this file will force the CPLD to be erased on the next reset\r\n"
|
|
#define FORCE_UPDATE_FILE_MESSAGE "Deleting this file will force a CPLD update check on the next reset\r\n"
|
|
#define BLANK_FILE "/cpld_firmware/recovery/blank/BLANK.xsvf"
|
|
|
|
#define PAXHEADER "PaxHeader"
|
|
|
|
#define NTSC_SOFT 0x04
|
|
#define NTSC_MEDIUM 0x08
|
|
#define NTSC_ARTIFACT 0x10
|
|
#define NTSC_ARTIFACT_SHIFT 4
|
|
#define NTSC_Y_INVERT 0x20
|
|
#define NTSC_LAST_ARTIFACT 0x40
|
|
#define NTSC_LAST_ARTIFACT_SHIFT 6
|
|
#define NTSC_HDMI_BLANK_ENABLE 0x80 //not actually ntsc but uses a spare bit
|
|
#define NTSC_LAST_IIGS 0x100 //not actually ntsc but uses a spare bit
|
|
#define NTSC_LAST_IIGS_SHIFT 8
|
|
#define NTSC_FFOSD_ENABLE 0x200 //not actually ntsc but uses a spare bit
|
|
#define NTSC_DONE_FIRST 0x400
|
|
#define NTSC_RGB_INVERT 0x800
|
|
|
|
|
|
#define BBC_VERSION 0x79
|
|
#define RGB_VERSION 0x94
|
|
#define YUV_VERSION 0x91
|
|
|
|
//these defines are adjusted for different clock speeds
|
|
#define FIELD_TYPE_THRESHOLD_BBC 39000 // post frame sync times are ~22uS & ~54uS on beeb and ~34uS and ~66uS on Amiga so threshold of 45uS covers both
|
|
#define FIELD_TYPE_THRESHOLD_AMIGA 45000 // post frame sync times are ~22uS & ~54uS on beeb and ~34uS and ~66uS on Amiga so threshold of 45uS covers both
|
|
#define ELK_LO_FIELD_SYNC_THRESHOLD 150000 // 150uS
|
|
#define ELK_HI_FIELD_SYNC_THRESHOLD 170000 // 170uS
|
|
#define ODD_THRESHOLD 22500
|
|
#define EVEN_THRESHOLD 54500
|
|
#define BBC_HSYNC_THRESHOLD 6144
|
|
#define NORMAL_HSYNC_THRESHOLD 9000
|
|
#define BLANKING_HSYNC_THRESHOLD 14000
|
|
#define EQUALISING_THRESHOLD 3400 // equalising pulses are half sync pulse length and must be filtered out
|
|
#define FRAME_MINIMUM 10000000 // 10ms
|
|
#define FRAME_TIMEOUT 30000000 // 30ms which is over a frame / field @ 50Hz (20ms)
|
|
#define LINE_MINIMUM 10000 // 10uS
|
|
#define HSYNC_SCROLL_LO (4000 - 224)
|
|
#define HSYNC_SCROLL_HI (4000 + 224)
|
|
|
|
#define FILTERING_NEAREST_NEIGHBOUR 8
|
|
#define FILTERING_SOFT 2
|
|
#define FILTERING_VERY_SOFT 6
|
|
#define DEFAULT_RESOLUTION "Auto"
|
|
#define DEFAULT_REFRESH 1
|
|
#define AUTO_REFRESH 2
|
|
#define DEFAULT_SCALING 0
|
|
#define DEFAULT_FILTERING 8
|
|
#define DEFAULT_HDMI_AUTO 1
|
|
|
|
#define DISABLE_PI1_PI2_OVERCLOCK 1
|
|
#define DISABLE_SETTINGS_OVERCLOCK 2
|
|
|
|
#define POWERUP_MESSAGE_TIME 200
|
|
|
|
#if defined(RPI4)
|
|
#define LINE_TIMEOUT (100 * 1000/1000 * 1024)
|
|
#else
|
|
#define LINE_TIMEOUT (100 * 1024)
|
|
#endif
|
|
|
|
#if defined(RPI4)
|
|
#define CRYSTAL 54
|
|
#else
|
|
#define CRYSTAL 19.2
|
|
#endif
|
|
|
|
#define MAX_CPLD_FREQUENCY 196000000
|
|
|
|
#define GENLOCK_NLINES_THRESHOLD 350
|
|
#define GENLOCK_FORCE 1
|
|
|
|
#define GENLOCK_PPM_STEP 334
|
|
#define GENLOCK_MAX_STEPS 6
|
|
#define GENLOCK_THRESHOLDS {0, 5, 10, 16, 25, 35}
|
|
#define GENLOCK_LOCKED_THRESHOLD 2
|
|
#define GENLOCK_FRAME_DELAY 12
|
|
#define GENLOCK_SLEW_RATE_THRESHOLD 10000
|
|
|
|
#define MEASURE_NLINES 100
|
|
#define PLL_PPM_LO 1
|
|
#define PLL_PPM_LO_LIMIT 6
|
|
#define PLL_RESYNC_THRESHOLD_LO 3
|
|
#define PLL_RESYNC_THRESHOLD_HI 9
|
|
#define AVERAGE_VSYNC_TOTAL 125
|
|
|
|
#define BIT_NORMAL_FIRMWARE_V1 0x01
|
|
#define BIT_NORMAL_FIRMWARE_V2 0x02
|
|
|
|
// PLL registers, from:
|
|
// https://github.com/F5OEO/librpitx/blob/master/src/gpio.h
|
|
#define PLLA_ANA1 (0x1014/4)
|
|
#define PLLA_CTRL (0x1100/4)
|
|
#define PLLA_FRAC (0x1200/4)
|
|
#define PLLA_DSI0 (0x1300/4)
|
|
#define PLLA_CORE (0x1400/4)
|
|
#define PLLA_PER (0x1500/4)
|
|
#define PLLA_CCP2 (0x1600/4)
|
|
|
|
#define PLLB_ANA1 (0x10f4/4)
|
|
#define PLLB_CTRL (0x11e0/4)
|
|
#define PLLB_FRAC (0x12e0/4)
|
|
#define PLLB_ARM (0x13e0/4)
|
|
#define PLLB_SP0 (0x14e0/4)
|
|
#define PLLB_SP1 (0x15e0/4)
|
|
#define PLLB_SP2 (0x16e0/4)
|
|
|
|
#define PLLC_ANA1 (0x1034/4)
|
|
#define PLLC_CTRL (0x1120/4)
|
|
#define PLLC_FRAC (0x1220/4)
|
|
#define PLLC_CORE2 (0x1320/4)
|
|
#define PLLC_CORE1 (0x1420/4)
|
|
#define PLLC_PER (0x1520/4)
|
|
#define PLLC_CORE0 (0x1620/4)
|
|
|
|
#define PLLD_ANA1 (0x1054/4)
|
|
#define PLLD_CTRL (0x1140/4)
|
|
#define PLLD_FRAC (0x1240/4)
|
|
#define PLLD_DSI0 (0x1340/4)
|
|
#define PLLD_CORE (0x1440/4)
|
|
#define PLLD_PER (0x1540/4)
|
|
#define PLLD_DSI1 (0x1640/4)
|
|
|
|
#define PLLH_ANA1 (0x1074/4)
|
|
#define PLLH_CTRL (0x1160/4)
|
|
#define PLLH_FRAC (0x1260/4)
|
|
#define PLLH_AUX (0x1360/4)
|
|
#define PLLH_RCAL (0x1460/4)
|
|
#define PLLH_PIX (0x1560/4)
|
|
#define PLLH_STS (0x1660/4)
|
|
|
|
#define XOSC_CTRL (0x1190/4)
|
|
#define XOSC_FREQUENCY 19200000
|
|
|
|
#define PI4_HDMI0_PLL (volatile uint32_t *)(_get_peripheral_base() + 0xf00f00)
|
|
#define PI4_HDMI0_DIVIDER (0x28/4)
|
|
#define PI4_HDMI0_RM_OFFSET (0x98/4) //actually offset 0x18 from the 0xf00f80 block
|
|
|
|
#if defined(RPI4)
|
|
#define PIXELVALVE2_HORZA (volatile uint32_t *)(_get_peripheral_base() + 0x20a00c)
|
|
#define PIXELVALVE2_HORZB (volatile uint32_t *)(_get_peripheral_base() + 0x20a010)
|
|
#define PIXELVALVE2_VERTA (volatile uint32_t *)(_get_peripheral_base() + 0x20a014)
|
|
#define PIXELVALVE2_VERTB (volatile uint32_t *)(_get_peripheral_base() + 0x20a018)
|
|
#define EMMC_LEGACY (volatile uint32_t *)(_get_peripheral_base() + 0x2000d0)
|
|
#else
|
|
#define PIXELVALVE2_HORZA (volatile uint32_t *)(_get_peripheral_base() + 0x80700c)
|
|
#define PIXELVALVE2_HORZB (volatile uint32_t *)(_get_peripheral_base() + 0x807010)
|
|
#define PIXELVALVE2_VERTA (volatile uint32_t *)(_get_peripheral_base() + 0x807014)
|
|
#define PIXELVALVE2_VERTB (volatile uint32_t *)(_get_peripheral_base() + 0x807018)
|
|
#endif
|
|
|
|
#define PM_RSTC (volatile uint32_t *)(_get_peripheral_base() + 0x10001c)
|
|
#define PM_WDOG (volatile uint32_t *)(_get_peripheral_base() + 0x100024)
|
|
#define PM_PASSWORD 0x5a000000
|
|
#define PM_RSTC_WRCFG_FULL_RESET 0x00000020
|
|
|
|
#define CM_PASSWORD 0x5a000000
|
|
#define CM_PLL_LOADCORE (1 << 4)
|
|
#define CM_PLL_HOLDCORE (1 << 5)
|
|
#define CM_PLL_LOADPER (1 << 6)
|
|
#define CM_PLL_HOLDPER (1 << 7)
|
|
#define A2W_PLL_CHANNEL_DISABLE (1 << 8)
|
|
#define GZ_CLK_BUSY (1 << 7)
|
|
#define GZ_CLK_ENA (1 << 4)
|
|
#define GP_CLK1_CTL (volatile uint32_t *)(_get_peripheral_base() + 0x101078)
|
|
#define GP_CLK1_DIV (volatile uint32_t *)(_get_peripheral_base() + 0x10107C)
|
|
#define CM_PLLA (volatile uint32_t *)(_get_peripheral_base() + 0x101104)
|
|
#define CM_PLLC (volatile uint32_t *)(_get_peripheral_base() + 0x101124)
|
|
#define CM_PLLD (volatile uint32_t *)(_get_peripheral_base() + 0x101144)
|
|
#define CM_BASE (volatile uint32_t *)(_get_peripheral_base() + 0x101000)
|
|
|
|
#define SCALER_DISPLIST1 (volatile uint32_t *)(_get_peripheral_base() + 0x400024)
|
|
#if defined(RPI4)
|
|
#define SCALER_DISPLAY_LIST (volatile uint32_t *)(_get_peripheral_base() + 0x404000)
|
|
#else
|
|
#define SCALER_DISPLAY_LIST (volatile uint32_t *)(_get_peripheral_base() + 0x402000)
|
|
#endif
|
|
|
|
#define PIXEL_FORMAT 1 // RGBA4444
|
|
#ifdef RPI4
|
|
#define PIXEL_ORDER 2 // ABGR in BCM2711
|
|
#else
|
|
#define PIXEL_ORDER 3 // ABGR
|
|
#endif
|
|
|
|
#define GREY_PIXELS 0xaaa
|
|
#define GREY_DETECTED_LINE_COUNT 200
|
|
#define ARTIFACT_DETECTED_LINE_COUNT 100
|
|
#define DPMS_FRAME_COUNT 200
|
|
#define IIGS_DETECTED_LINE_COUNT 128
|
|
|
|
#define SIZEX2_DOUBLE_HEIGHT 1
|
|
#define SIZEX2_DOUBLE_WIDTH 2
|
|
#define SIZEX2_BASIC_SCANLINES 4
|
|
|
|
// can't use enums in assembler
|
|
#define PALETTECONTROL_OFF 0
|
|
#define PALETTECONTROL_INBAND 1
|
|
#define PALETTECONTROL_NTSCARTIFACT_CGA 2
|
|
#define PALETTECONTROL_NTSCARTIFACT_BW 3
|
|
#define PALETTECONTROL_NTSCARTIFACT_BW_AUTO 4
|
|
#define PALETTECONTROL_C64_YUV 5
|
|
#define PALETTECONTROL_ATARI_GTIA 6
|
|
#define PALETTECONTROL_C64_LUMACODE 7
|
|
#define PALETTECONTROL_ATARI_LUMACODE 8
|
|
#define PALETTECONTROL_ATARI2600_LUMACODE 9
|
|
#define NUM_CONTROLS 10
|
|
|
|
#define INHIBIT_PALETTE_DIMMING_16_BIT 0x80000000
|
|
|
|
#define AUTOSWITCH_OFF 0
|
|
#define AUTOSWITCH_PC 1
|
|
#define AUTOSWITCH_MODE7 2
|
|
#define AUTOSWITCH_VSYNC 3
|
|
#define AUTOSWITCH_IIGS 4
|
|
#define AUTOSWITCH_IIGS_MANUAL 5
|
|
#define AUTOSWITCH_MANUAL 6
|
|
|
|
#define NUM_AUTOSWITCHES 7
|
|
|
|
#define VSYNC_AUTO 0
|
|
#define VSYNC_INTERLACED 1
|
|
#define VSYNC_INTERLACED_160 2
|
|
#define VSYNC_NONINTERLACED 3
|
|
#define VSYNC_NONINTERLACED_DEJITTER 4
|
|
#define VSYNC_BLANKING 5
|
|
#define VSYNC_POLARITY 6
|
|
#define VSYNC_FORCE_INTERLACE 7
|
|
#define NUM_VSYNC 8
|
|
|
|
#define VIDEO_PROGRESSIVE 0
|
|
#define VIDEO_INTERLACED 1
|
|
#define VIDEO_TELETEXT 2
|
|
#define VIDEO_LINE_DOUBLED 3
|
|
#define NUM_VIDEO 4
|
|
|
|
#define SAMPLE_WIDTH_1 0
|
|
#define SAMPLE_WIDTH_3 1
|
|
#define SAMPLE_WIDTH_6 2
|
|
#define SAMPLE_WIDTH_9LO 3
|
|
#define SAMPLE_WIDTH_9HI 4
|
|
#define SAMPLE_WIDTH_12 5
|
|
|
|
#define MODE_SET1 0
|
|
#define MODE_SET2 1
|
|
|
|
#define SYNC_ABORT_FLAG 0x80000000
|
|
#define LEADING_SYNC_FLAG 0x00010000
|
|
#define SIMPLE_SYNC_FLAG 0x00008000
|
|
#define HIGH_LATENCY_FLAG 0x00004000
|
|
#define OLD_FIRMWARE_FLAG 0x00002000
|
|
|
|
#define CPLD_NORMAL 0
|
|
#define CPLD_BLANK 1
|
|
#define CPLD_UNKNOWN 2
|
|
#define CPLD_WRONG 3
|
|
#define CPLD_MANUAL 4
|
|
#define CPLD_UPDATE 5
|
|
#define CPLD_NOT_FITTED 6
|
|
|
|
#endif
|
|
|
|
#define Bit32u uint32_t
|
|
#define Bit8u uint8_t
|
|
#define Bitu uint32_t |