/* SPDX-License-Identifier: MIT */
/*
* Copyright 2020 Noralf Tr ø nnes
*/
#ifndef __LINUX_GUD_H
#define __LINUX_GUD_H
#include <linux/types.h>
/*
* struct gud_display_descriptor_req - Display descriptor
* @ magic : Magic value GUD_DISPLAY_MAGIC
* @ version : Protocol version
* @ flags : Flags
* - STATUS_ON_SET : Always do a status request after a SET request .
* This is used by the Linux gadget driver since it has
* no way to control the status stage of a control OUT
* request that has a payload .
* - FULL_UPDATE : Always send the entire framebuffer when flushing changes .
* The GUD_REQ_SET_BUFFER request will not be sent
* before each bulk transfer , it will only be sent if the
* previous bulk transfer had failed . This gives the device
* a chance to reset its state machine if needed .
* This flag can not be used in combination with compression .
* @ compression : Supported compression types
* - GUD_COMPRESSION_LZ4 : LZ4 lossless compression .
* @ max_buffer_size : Maximum buffer size the device can handle ( optional ) .
* This is useful for devices that don ' t have a big enough
* buffer to decompress the entire framebuffer in one go .
* @ min_width : Minimum pixel width the controller can handle
* @ max_width : Maximum width
* @ min_height : Minimum height
* @ max_height : Maximum height
*
* Devices that have only one display mode will have min_width = = max_width
* and min_height = = max_height .
*/
struct gud_display_descriptor_req {
__le32 magic;
#define GUD_DISPLAY_MAGIC 0 x1d50614d
__u8 version;
__le32 flags;
#define GUD_DISPLAY_FLAG_STATUS_ON_SET BIT(0 )
#define GUD_DISPLAY_FLAG_FULL_UPDATE BIT(1 )
__u8 compression;
#define GUD_COMPRESSION_LZ4 BIT(0 )
__le32 max_buffer_size;
__le32 min_width;
__le32 max_width;
__le32 min_height;
__le32 max_height;
} __packed;
/*
* struct gud_property_req - Property
* @ prop : Property
* @ val : Value
*/
struct gud_property_req {
__le16 prop;
__le64 val;
} __packed;
/*
* struct gud_display_mode_req - Display mode
* @ clock : Pixel clock in kHz
* @ hdisplay : Horizontal display size
* @ hsync_start : Horizontal sync start
* @ hsync_end : Horizontal sync end
* @ htotal : Horizontal total size
* @ vdisplay : Vertical display size
* @ vsync_start : Vertical sync start
* @ vsync_end : Vertical sync end
* @ vtotal : Vertical total size
* @ flags : Bits 0 - 13 are the same as in the RandR protocol and also what DRM uses .
* The deprecated bits are reused for internal protocol flags leaving us
* free to follow DRM for the other bits in the future .
* - FLAG_PREFERRED : Set on the preferred display mode .
*/
struct gud_display_mode_req {
__le32 clock;
__le16 hdisplay;
__le16 hsync_start;
__le16 hsync_end;
__le16 htotal;
__le16 vdisplay;
__le16 vsync_start;
__le16 vsync_end;
__le16 vtotal;
__le32 flags;
#define GUD_DISPLAY_MODE_FLAG_PHSYNC BIT(0 )
#define GUD_DISPLAY_MODE_FLAG_NHSYNC BIT(1 )
#define GUD_DISPLAY_MODE_FLAG_PVSYNC BIT(2 )
#define GUD_DISPLAY_MODE_FLAG_NVSYNC BIT(3 )
#define GUD_DISPLAY_MODE_FLAG_INTERLACE BIT(4 )
#define GUD_DISPLAY_MODE_FLAG_DBLSCAN BIT(5 )
#define GUD_DISPLAY_MODE_FLAG_CSYNC BIT(6 )
#define GUD_DISPLAY_MODE_FLAG_PCSYNC BIT(7 )
#define GUD_DISPLAY_MODE_FLAG_NCSYNC BIT(8 )
#define GUD_DISPLAY_MODE_FLAG_HSKEW BIT(9 )
/* BCast and PixelMultiplex are deprecated */
#define GUD_DISPLAY_MODE_FLAG_DBLCLK BIT(12 )
#define GUD_DISPLAY_MODE_FLAG_CLKDIV2 BIT(13 )
#define GUD_DISPLAY_MODE_FLAG_USER_MASK \
(GUD_DISPLAY_MODE_FLAG_PHSYNC | GUD_DISPLAY_MODE_FLAG_NHSYNC | \
GUD_DISPLAY_MODE_FLAG_PVSYNC | GUD_DISPLAY_MODE_FLAG_NVSYNC | \
GUD_DISPLAY_MODE_FLAG_INTERLACE | GUD_DISPLAY_MODE_FLAG_DBLSCAN | \
GUD_DISPLAY_MODE_FLAG_CSYNC | GUD_DISPLAY_MODE_FLAG_PCSYNC | \
GUD_DISPLAY_MODE_FLAG_NCSYNC | GUD_DISPLAY_MODE_FLAG_HSKEW | \
GUD_DISPLAY_MODE_FLAG_DBLCLK | GUD_DISPLAY_MODE_FLAG_CLKDIV2)
/* Internal protocol flags */
#define GUD_DISPLAY_MODE_FLAG_PREFERRED BIT(10 )
} __packed;
/*
* struct gud_connector_descriptor_req - Connector descriptor
* @ connector_type : Connector type ( GUD_CONNECTOR_TYPE_ * ) .
* If the host doesn ' t support the type it should fall back to PANEL .
* @ flags : Flags
* - POLL_STATUS : Connector status can change ( polled every 10 seconds )
* - INTERLACE : Interlaced modes are supported
* - DOUBLESCAN : Doublescan modes are supported
*/
struct gud_connector_descriptor_req {
__u8 connector_type;
#define GUD_CONNECTOR_TYPE_PANEL 0
#define GUD_CONNECTOR_TYPE_VGA 1
#define GUD_CONNECTOR_TYPE_COMPOSITE 2
#define GUD_CONNECTOR_TYPE_SVIDEO 3
#define GUD_CONNECTOR_TYPE_COMPONENT 4
#define GUD_CONNECTOR_TYPE_DVI 5
#define GUD_CONNECTOR_TYPE_DISPLAYPORT 6
#define GUD_CONNECTOR_TYPE_HDMI 7
__le32 flags;
#define GUD_CONNECTOR_FLAGS_POLL_STATUS BIT(0 )
#define GUD_CONNECTOR_FLAGS_INTERLACE BIT(1 )
#define GUD_CONNECTOR_FLAGS_DOUBLESCAN BIT(2 )
} __packed;
/*
* struct gud_set_buffer_req - Set buffer transfer info
* @ x : X position of rectangle
* @ y : Y position
* @ width : Pixel width of rectangle
* @ height : Pixel height
* @ length : Buffer length in bytes
* @ compression : Transfer compression
* @ compressed_length : Compressed buffer length
*
* This request is issued right before the bulk transfer .
* @ x , @ y , @ width and @ height specifies the rectangle where the buffer should be
* placed inside the framebuffer .
*/
struct gud_set_buffer_req {
__le32 x;
__le32 y;
__le32 width;
__le32 height;
__le32 length;
__u8 compression;
__le32 compressed_length;
} __packed;
/*
* struct gud_state_req - Display state
* @ mode : Display mode
* @ format : Pixel format GUD_PIXEL_FORMAT_ *
* @ connector : Connector index
* @ properties : Array of properties
*
* The entire state is transferred each time there ' s a change .
*/
struct gud_state_req {
struct gud_display_mode_req mode;
__u8 format;
__u8 connector;
struct gud_property_req properties[];
} __packed;
/* List of supported connector properties: */
/* Margins in pixels to deal with overscan, range 0-100 */
#define GUD_PROPERTY_TV_LEFT_MARGIN 1
#define GUD_PROPERTY_TV_RIGHT_MARGIN 2
#define GUD_PROPERTY_TV_TOP_MARGIN 3
#define GUD_PROPERTY_TV_BOTTOM_MARGIN 4
#define GUD_PROPERTY_TV_MODE 5
/* Brightness in percent, range 0-100 */
#define GUD_PROPERTY_TV_BRIGHTNESS 6
/* Contrast in percent, range 0-100 */
#define GUD_PROPERTY_TV_CONTRAST 7
/* Flicker reduction in percent, range 0-100 */
#define GUD_PROPERTY_TV_FLICKER_REDUCTION 8
/* Overscan in percent, range 0-100 */
#define GUD_PROPERTY_TV_OVERSCAN 9
/* Saturation in percent, range 0-100 */
#define GUD_PROPERTY_TV_SATURATION 10
/* Hue in percent, range 0-100 */
#define GUD_PROPERTY_TV_HUE 11
/*
* Backlight brightness is in the range 0 - 100 inclusive . The value represents the human perceptual
* brightness and not a linear PWM value . 0 is minimum brightness which should not turn the
* backlight completely off . The DPMS connector property should be used to control power which will
* trigger a GUD_REQ_SET_DISPLAY_ENABLE request .
*
* This does not map to a DRM property , it is used with the backlight device .
*/
#define GUD_PROPERTY_BACKLIGHT_BRIGHTNESS 12
/* List of supported properties that are not connector propeties: */
/*
* Plane rotation . Should return the supported bitmask on
* GUD_REQ_GET_PROPERTIES . GUD_ROTATION_0 is mandatory .
*
* Note : This is not display rotation so 90 / 270 will need scaling to make it fit ( unless squared ) .
*/
#define GUD_PROPERTY_ROTATION 50
#define GUD_ROTATION_0 BIT(0 )
#define GUD_ROTATION_90 BIT(1 )
#define GUD_ROTATION_180 BIT(2 )
#define GUD_ROTATION_270 BIT(3 )
#define GUD_ROTATION_REFLECT_X BIT(4 )
#define GUD_ROTATION_REFLECT_Y BIT(5 )
#define GUD_ROTATION_MASK (GUD_ROTATION_0 | GUD_ROTATION_90 | \
GUD_ROTATION_180 | GUD_ROTATION_270 | \
GUD_ROTATION_REFLECT_X | GUD_ROTATION_REFLECT_Y)
/* USB Control requests: */
/* Get status from the last GET/SET control request. Value is u8. */
#define GUD_REQ_GET_STATUS 0 x00
/* Status values: */
#define GUD_STATUS_OK 0 x00
#define GUD_STATUS_BUSY 0 x01
#define GUD_STATUS_REQUEST_NOT_SUPPORTED 0 x02
#define GUD_STATUS_PROTOCOL_ERROR 0 x03
#define GUD_STATUS_INVALID_PARAMETER 0 x04
#define GUD_STATUS_ERROR 0 x05
/* Get display descriptor as a &gud_display_descriptor_req */
#define GUD_REQ_GET_DESCRIPTOR 0 x01
/* Get supported pixel formats as a byte array of GUD_PIXEL_FORMAT_* */
#define GUD_REQ_GET_FORMATS 0 x40
#define GUD_FORMATS_MAX_NUM 32
#define GUD_PIXEL_FORMAT_R1 0 x01 /* 1-bit monochrome */
#define GUD_PIXEL_FORMAT_R8 0 x08 /* 8-bit greyscale */
#define GUD_PIXEL_FORMAT_XRGB1111 0 x20
#define GUD_PIXEL_FORMAT_RGB332 0 x30
#define GUD_PIXEL_FORMAT_RGB565 0 x40
#define GUD_PIXEL_FORMAT_RGB888 0 x50
#define GUD_PIXEL_FORMAT_XRGB8888 0 x80
#define GUD_PIXEL_FORMAT_ARGB8888 0 x81
/*
* Get supported properties that are not connector propeties as a & gud_property_req array .
* gud_property_req . val often contains the initial value for the property .
*/
#define GUD_REQ_GET_PROPERTIES 0 x41
#define GUD_PROPERTIES_MAX_NUM 32
/* Connector requests have the connector index passed in the wValue field */
/* Get connector descriptors as an array of &gud_connector_descriptor_req */
#define GUD_REQ_GET_CONNECTORS 0 x50
#define GUD_CONNECTORS_MAX_NUM 32
/*
* Get properties supported by the connector as a & gud_property_req array .
* gud_property_req . val often contains the initial value for the property .
*/
#define GUD_REQ_GET_CONNECTOR_PROPERTIES 0 x51
#define GUD_CONNECTOR_PROPERTIES_MAX_NUM 32
/*
* Issued when there ' s a TV_MODE property present .
* Gets an array of the supported TV_MODE names each entry of length
* GUD_CONNECTOR_TV_MODE_NAME_LEN . Names must be NUL - terminated .
*/
#define GUD_REQ_GET_CONNECTOR_TV_MODE_VALUES 0 x52
#define GUD_CONNECTOR_TV_MODE_NAME_LEN 16
#define GUD_CONNECTOR_TV_MODE_MAX_NUM 16
/* When userspace checks connector status, this is issued first, not used for poll requests. */
#define GUD_REQ_SET_CONNECTOR_FORCE_DETECT 0 x53
/*
* Get connector status . Value is u8 .
*
* Userspace will get a HOTPLUG uevent if one of the following is true :
* - Connection status has changed since last
* - CHANGED is set
*/
#define GUD_REQ_GET_CONNECTOR_STATUS 0 x54
#define GUD_CONNECTOR_STATUS_DISCONNECTED 0 x00
#define GUD_CONNECTOR_STATUS_CONNECTED 0 x01
#define GUD_CONNECTOR_STATUS_UNKNOWN 0 x02
#define GUD_CONNECTOR_STATUS_CONNECTED_MASK 0 x03
#define GUD_CONNECTOR_STATUS_CHANGED BIT(7 )
/*
* Display modes can be fetched as either EDID data or an array of & gud_display_mode_req .
*
* If GUD_REQ_GET_CONNECTOR_MODES returns zero , EDID is used to create display modes .
* If both display modes and EDID are returned , EDID is just passed on to userspace
* in the EDID connector property .
*/
/* Get &gud_display_mode_req array of supported display modes */
#define GUD_REQ_GET_CONNECTOR_MODES 0 x55
#define GUD_CONNECTOR_MAX_NUM_MODES 128
/* Get Extended Display Identification Data */
#define GUD_REQ_GET_CONNECTOR_EDID 0 x56
#define GUD_CONNECTOR_MAX_EDID_LEN 2048
/* Set buffer properties before bulk transfer as &gud_set_buffer_req */
#define GUD_REQ_SET_BUFFER 0 x60
/* Check display configuration as &gud_state_req */
#define GUD_REQ_SET_STATE_CHECK 0 x61
/* Apply the previous STATE_CHECK configuration */
#define GUD_REQ_SET_STATE_COMMIT 0 x62
/* Enable/disable the display controller, value is u8: 0/1 */
#define GUD_REQ_SET_CONTROLLER_ENABLE 0 x63
/* Enable/disable display/output (DPMS), value is u8: 0/1 */
#define GUD_REQ_SET_DISPLAY_ENABLE 0 x64
#endif
Messung V0.5 in Prozent C=88 H=100 G=94
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland