mirror of
https://github.com/steve-m/hsdaoh-rp2350.git
synced 2025-12-09 23:34:39 +01:00
97 lines
2.6 KiB
C
97 lines
2.6 KiB
C
#ifndef DATA_PACKET_H
|
|
#define DATA_PACKET_H
|
|
#include "pico.h"
|
|
|
|
#define TMDS_CHANNELS 3
|
|
#define N_LINE_PER_DATA 2
|
|
#define W_GUARDBAND 2
|
|
#define W_PREAMBLE 8
|
|
#define W_DATA_PACKET 32
|
|
|
|
#ifndef DVI_SYMBOLS_PER_WORD
|
|
#define DVI_SYMBOLS_PER_WORD 2
|
|
#endif
|
|
|
|
#if DVI_SYMBOLS_PER_WORD != 1 && DVI_SYMBOLS_PER_WORD !=2
|
|
#error "Unsupported value for DVI_SYMBOLS_PER_WORD"
|
|
#endif
|
|
|
|
|
|
#define W_DATA_ISLAND (W_GUARDBAND * 2 + W_DATA_PACKET)
|
|
#define N_DATA_ISLAND_WORDS (W_DATA_ISLAND / DVI_SYMBOLS_PER_WORD)
|
|
|
|
typedef enum {
|
|
SCAN_INFO_NO_DATA,
|
|
OVERSCAN,
|
|
UNDERSCAN
|
|
} scan_info;
|
|
|
|
typedef enum {
|
|
RGB,
|
|
YCBCR422,
|
|
YCBCR444
|
|
} pixel_format;
|
|
|
|
typedef enum {
|
|
COLORIMETRY_NO_DATA,
|
|
ITU601,
|
|
ITU709,
|
|
EXTENDED
|
|
} colorimetry;
|
|
|
|
typedef enum {
|
|
PIC_ASPECT_RATIO_NO_DATA,
|
|
PIC_ASPECT_RATIO_4_3,
|
|
PIC_ASPECT_RATIO_16_9
|
|
} picture_aspect_ratio;
|
|
|
|
typedef enum {
|
|
ACTIVE_FORMAT_ASPECT_RATIO_NO_DATA = -1,
|
|
SAME_AS_PAR = 8,
|
|
ACTIVE_FORMAT_ASPECT_RATIO_4_3,
|
|
ACTIVE_FORMAT_ASPECT_RATIO_16_9,
|
|
ACTIVE_FORMAT_ASPECT_RATIO_14_9
|
|
} active_format_aspect_ratio;
|
|
|
|
typedef enum {
|
|
DEFAULT,
|
|
LIMITED,
|
|
FULL
|
|
} RGB_quantization_range;
|
|
|
|
typedef enum {
|
|
_640x480P60 = 1,
|
|
_720x480P60 = 2,
|
|
_1280x720P60 = 4,
|
|
_1920x1080I60 = 5,
|
|
_1920x1080P60 = 16,
|
|
} video_code;
|
|
|
|
typedef struct data_packet {
|
|
uint8_t header[4];
|
|
uint8_t subpacket[4][8];
|
|
} data_packet_t;
|
|
|
|
typedef struct data_island_stream {
|
|
uint32_t data[TMDS_CHANNELS][N_DATA_ISLAND_WORDS];
|
|
} data_island_stream_t;
|
|
|
|
// Functions related to the data_packet (requires a data_packet instance)
|
|
void compute_header_parity(data_packet_t *data_packet);
|
|
void compute_subpacket_parity(data_packet_t *data_packet, int i);
|
|
void compute_parity(data_packet_t *data_packet);
|
|
void compute_info_frame_checkSum(data_packet_t *data_packet);
|
|
void encode_header(const data_packet_t *data_packet, uint32_t *dst, int hv, bool firstPacket);
|
|
void encode_subpacket(const data_packet_t *data_packet, uint32_t *dst1, uint32_t *dst2);
|
|
void set_null(data_packet_t *data_packet);
|
|
void set_AVI_info_frame(data_packet_t *data_packet, scan_info s, pixel_format y, colorimetry c, picture_aspect_ratio m,
|
|
active_format_aspect_ratio r, RGB_quantization_range q, video_code vic);
|
|
|
|
// Public Functions
|
|
extern uint32_t defaultDataPacket12_[N_DATA_ISLAND_WORDS];
|
|
inline uint32_t *getDefaultDataPacket12() {
|
|
return defaultDataPacket12_;
|
|
}
|
|
uint32_t *getDefaultDataPacket0(bool vsync, bool hsync);
|
|
void encode_data_island(data_island_stream_t *dst, const data_packet_t *packet, bool vsync, bool hsync);
|
|
#endif
|