1*d83cc019SAndroid Build Coastguard Worker /* 2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat Inc. 3*d83cc019SAndroid Build Coastguard Worker * 4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*d83cc019SAndroid Build Coastguard Worker * 11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*d83cc019SAndroid Build Coastguard Worker * Software. 14*d83cc019SAndroid Build Coastguard Worker * 15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*d83cc019SAndroid Build Coastguard Worker * IN THE SOFTWARE. 22*d83cc019SAndroid Build Coastguard Worker * 23*d83cc019SAndroid Build Coastguard Worker * Authors: Lyude Paul <[email protected]> 24*d83cc019SAndroid Build Coastguard Worker */ 25*d83cc019SAndroid Build Coastguard Worker 26*d83cc019SAndroid Build Coastguard Worker #ifndef IGT_CHAMELIUM_H 27*d83cc019SAndroid Build Coastguard Worker #define IGT_CHAMELIUM_H 28*d83cc019SAndroid Build Coastguard Worker 29*d83cc019SAndroid Build Coastguard Worker #include "config.h" 30*d83cc019SAndroid Build Coastguard Worker 31*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h> 32*d83cc019SAndroid Build Coastguard Worker #include <xf86drmMode.h> 33*d83cc019SAndroid Build Coastguard Worker 34*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h" 35*d83cc019SAndroid Build Coastguard Worker 36*d83cc019SAndroid Build Coastguard Worker struct igt_fb; 37*d83cc019SAndroid Build Coastguard Worker struct edid; 38*d83cc019SAndroid Build Coastguard Worker 39*d83cc019SAndroid Build Coastguard Worker struct chamelium; 40*d83cc019SAndroid Build Coastguard Worker struct chamelium_port; 41*d83cc019SAndroid Build Coastguard Worker struct chamelium_frame_dump; 42*d83cc019SAndroid Build Coastguard Worker struct chamelium_fb_crc_async_data; 43*d83cc019SAndroid Build Coastguard Worker 44*d83cc019SAndroid Build Coastguard Worker /** 45*d83cc019SAndroid Build Coastguard Worker * chamelium_check: 46*d83cc019SAndroid Build Coastguard Worker * @CHAMELIUM_CHECK_ANALOG: Fuzzy checking method for analog interfaces 47*d83cc019SAndroid Build Coastguard Worker * @CHAMELIUM_CHECK_CRC: CRC-based checking method for pixel-perfect interfaces 48*d83cc019SAndroid Build Coastguard Worker * 49*d83cc019SAndroid Build Coastguard Worker * Checking method for comparing between reference and captured frames. 50*d83cc019SAndroid Build Coastguard Worker */ 51*d83cc019SAndroid Build Coastguard Worker enum chamelium_check { 52*d83cc019SAndroid Build Coastguard Worker CHAMELIUM_CHECK_ANALOG, 53*d83cc019SAndroid Build Coastguard Worker CHAMELIUM_CHECK_CHECKERBOARD, 54*d83cc019SAndroid Build Coastguard Worker CHAMELIUM_CHECK_CRC, 55*d83cc019SAndroid Build Coastguard Worker }; 56*d83cc019SAndroid Build Coastguard Worker 57*d83cc019SAndroid Build Coastguard Worker struct chamelium_video_params { 58*d83cc019SAndroid Build Coastguard Worker double clock; 59*d83cc019SAndroid Build Coastguard Worker int htotal, hactive, hsync_offset, hsync_width, hsync_polarity; 60*d83cc019SAndroid Build Coastguard Worker int vtotal, vactive, vsync_offset, vsync_width, vsync_polarity; 61*d83cc019SAndroid Build Coastguard Worker }; 62*d83cc019SAndroid Build Coastguard Worker 63*d83cc019SAndroid Build Coastguard Worker struct chamelium_audio_file { 64*d83cc019SAndroid Build Coastguard Worker char *path; 65*d83cc019SAndroid Build Coastguard Worker int rate; /* Hz */ 66*d83cc019SAndroid Build Coastguard Worker int channels; 67*d83cc019SAndroid Build Coastguard Worker }; 68*d83cc019SAndroid Build Coastguard Worker 69*d83cc019SAndroid Build Coastguard Worker enum chamelium_infoframe_type { 70*d83cc019SAndroid Build Coastguard Worker CHAMELIUM_INFOFRAME_AVI, 71*d83cc019SAndroid Build Coastguard Worker CHAMELIUM_INFOFRAME_AUDIO, 72*d83cc019SAndroid Build Coastguard Worker CHAMELIUM_INFOFRAME_MPEG, 73*d83cc019SAndroid Build Coastguard Worker CHAMELIUM_INFOFRAME_VENDOR, 74*d83cc019SAndroid Build Coastguard Worker }; 75*d83cc019SAndroid Build Coastguard Worker 76*d83cc019SAndroid Build Coastguard Worker struct chamelium_infoframe { 77*d83cc019SAndroid Build Coastguard Worker int version; 78*d83cc019SAndroid Build Coastguard Worker size_t payload_size; 79*d83cc019SAndroid Build Coastguard Worker uint8_t *payload; 80*d83cc019SAndroid Build Coastguard Worker }; 81*d83cc019SAndroid Build Coastguard Worker 82*d83cc019SAndroid Build Coastguard Worker struct chamelium_edid; 83*d83cc019SAndroid Build Coastguard Worker 84*d83cc019SAndroid Build Coastguard Worker /** 85*d83cc019SAndroid Build Coastguard Worker * CHAMELIUM_MAX_PORTS: the maximum number of ports supported by igt_chamelium. 86*d83cc019SAndroid Build Coastguard Worker * 87*d83cc019SAndroid Build Coastguard Worker * For now, we have 1 VGA, 1 HDMI and 2 DisplayPort ports. 88*d83cc019SAndroid Build Coastguard Worker */ 89*d83cc019SAndroid Build Coastguard Worker #define CHAMELIUM_MAX_PORTS 4 90*d83cc019SAndroid Build Coastguard Worker 91*d83cc019SAndroid Build Coastguard Worker /** 92*d83cc019SAndroid Build Coastguard Worker * CHAMELIUM_DEFAULT_EDID: provide this ID to #chamelium_port_set_edid to use 93*d83cc019SAndroid Build Coastguard Worker * the default EDID. 94*d83cc019SAndroid Build Coastguard Worker */ 95*d83cc019SAndroid Build Coastguard Worker #define CHAMELIUM_DEFAULT_EDID 0 96*d83cc019SAndroid Build Coastguard Worker 97*d83cc019SAndroid Build Coastguard Worker /** 98*d83cc019SAndroid Build Coastguard Worker * CHAMELIUM_MAX_AUDIO_CHANNELS: the maximum number of audio capture channels 99*d83cc019SAndroid Build Coastguard Worker * supported by Chamelium. 100*d83cc019SAndroid Build Coastguard Worker */ 101*d83cc019SAndroid Build Coastguard Worker #define CHAMELIUM_MAX_AUDIO_CHANNELS 8 102*d83cc019SAndroid Build Coastguard Worker 103*d83cc019SAndroid Build Coastguard Worker struct chamelium *chamelium_init(int drm_fd); 104*d83cc019SAndroid Build Coastguard Worker void chamelium_deinit(struct chamelium *chamelium); 105*d83cc019SAndroid Build Coastguard Worker void chamelium_reset(struct chamelium *chamelium); 106*d83cc019SAndroid Build Coastguard Worker 107*d83cc019SAndroid Build Coastguard Worker struct chamelium_port **chamelium_get_ports(struct chamelium *chamelium, 108*d83cc019SAndroid Build Coastguard Worker int *count); 109*d83cc019SAndroid Build Coastguard Worker unsigned int chamelium_port_get_type(const struct chamelium_port *port); 110*d83cc019SAndroid Build Coastguard Worker drmModeConnector *chamelium_port_get_connector(struct chamelium *chamelium, 111*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 112*d83cc019SAndroid Build Coastguard Worker bool reprobe); 113*d83cc019SAndroid Build Coastguard Worker const char *chamelium_port_get_name(struct chamelium_port *port); 114*d83cc019SAndroid Build Coastguard Worker 115*d83cc019SAndroid Build Coastguard Worker void chamelium_wait_reachable(struct chamelium *chamelium, int timeout); 116*d83cc019SAndroid Build Coastguard Worker void chamelium_plug(struct chamelium *chamelium, struct chamelium_port *port); 117*d83cc019SAndroid Build Coastguard Worker void chamelium_unplug(struct chamelium *chamelium, struct chamelium_port *port); 118*d83cc019SAndroid Build Coastguard Worker bool chamelium_is_plugged(struct chamelium *chamelium, 119*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port); 120*d83cc019SAndroid Build Coastguard Worker bool chamelium_port_wait_video_input_stable(struct chamelium *chamelium, 121*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 122*d83cc019SAndroid Build Coastguard Worker int timeout_secs); 123*d83cc019SAndroid Build Coastguard Worker void chamelium_fire_mixed_hpd_pulses(struct chamelium *chamelium, 124*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, ...); 125*d83cc019SAndroid Build Coastguard Worker void chamelium_fire_hpd_pulses(struct chamelium *chamelium, 126*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 127*d83cc019SAndroid Build Coastguard Worker int width_msec, int count); 128*d83cc019SAndroid Build Coastguard Worker void chamelium_schedule_hpd_toggle(struct chamelium *chamelium, 129*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, int delay_ms, 130*d83cc019SAndroid Build Coastguard Worker bool rising_edge); 131*d83cc019SAndroid Build Coastguard Worker struct chamelium_edid *chamelium_new_edid(struct chamelium *chamelium, 132*d83cc019SAndroid Build Coastguard Worker const struct edid *edid); 133*d83cc019SAndroid Build Coastguard Worker const struct edid *chamelium_edid_get_raw(struct chamelium_edid *edid, 134*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port); 135*d83cc019SAndroid Build Coastguard Worker void chamelium_port_set_edid(struct chamelium *chamelium, 136*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 137*d83cc019SAndroid Build Coastguard Worker struct chamelium_edid *edid); 138*d83cc019SAndroid Build Coastguard Worker bool chamelium_port_get_ddc_state(struct chamelium *chamelium, 139*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port); 140*d83cc019SAndroid Build Coastguard Worker void chamelium_port_set_ddc_state(struct chamelium *chamelium, 141*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 142*d83cc019SAndroid Build Coastguard Worker bool enabled); 143*d83cc019SAndroid Build Coastguard Worker void chamelium_port_get_resolution(struct chamelium *chamelium, 144*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 145*d83cc019SAndroid Build Coastguard Worker int *x, int *y); 146*d83cc019SAndroid Build Coastguard Worker bool chamelium_supports_get_video_params(struct chamelium *chamelium); 147*d83cc019SAndroid Build Coastguard Worker void chamelium_port_get_video_params(struct chamelium *chamelium, 148*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 149*d83cc019SAndroid Build Coastguard Worker struct chamelium_video_params *params); 150*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_get_crc_for_area(struct chamelium *chamelium, 151*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 152*d83cc019SAndroid Build Coastguard Worker int x, int y, int w, int h); 153*d83cc019SAndroid Build Coastguard Worker void chamelium_start_capture(struct chamelium *chamelium, 154*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 155*d83cc019SAndroid Build Coastguard Worker int x, int y, int w, int h); 156*d83cc019SAndroid Build Coastguard Worker void chamelium_stop_capture(struct chamelium *chamelium, int frame_count); 157*d83cc019SAndroid Build Coastguard Worker void chamelium_capture(struct chamelium *chamelium, struct chamelium_port *port, 158*d83cc019SAndroid Build Coastguard Worker int x, int y, int w, int h, int frame_count); 159*d83cc019SAndroid Build Coastguard Worker bool chamelium_supports_get_last_infoframe(struct chamelium *chamelium); 160*d83cc019SAndroid Build Coastguard Worker struct chamelium_infoframe * 161*d83cc019SAndroid Build Coastguard Worker chamelium_get_last_infoframe(struct chamelium *chamelium, 162*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 163*d83cc019SAndroid Build Coastguard Worker enum chamelium_infoframe_type type); 164*d83cc019SAndroid Build Coastguard Worker bool chamelium_supports_trigger_link_failure(struct chamelium *chamelium); 165*d83cc019SAndroid Build Coastguard Worker void chamelium_trigger_link_failure(struct chamelium *chamelium, 166*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port); 167*d83cc019SAndroid Build Coastguard Worker bool chamelium_has_audio_support(struct chamelium *chamelium, 168*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port); 169*d83cc019SAndroid Build Coastguard Worker void chamelium_get_audio_channel_mapping(struct chamelium *chamelium, 170*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 171*d83cc019SAndroid Build Coastguard Worker int mapping[static CHAMELIUM_MAX_AUDIO_CHANNELS]); 172*d83cc019SAndroid Build Coastguard Worker void chamelium_get_audio_format(struct chamelium *chamelium, 173*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 174*d83cc019SAndroid Build Coastguard Worker int *rate, int *channels); 175*d83cc019SAndroid Build Coastguard Worker void chamelium_start_capturing_audio(struct chamelium *chamelium, 176*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, bool save_to_file); 177*d83cc019SAndroid Build Coastguard Worker struct chamelium_audio_file *chamelium_stop_capturing_audio(struct chamelium *chamelium, 178*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port); 179*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_read_captured_crcs(struct chamelium *chamelium, 180*d83cc019SAndroid Build Coastguard Worker int *frame_count); 181*d83cc019SAndroid Build Coastguard Worker struct chamelium_frame_dump *chamelium_read_captured_frame(struct chamelium *chamelium, 182*d83cc019SAndroid Build Coastguard Worker unsigned int index); 183*d83cc019SAndroid Build Coastguard Worker struct chamelium_frame_dump *chamelium_port_dump_pixels(struct chamelium *chamelium, 184*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 185*d83cc019SAndroid Build Coastguard Worker int x, int y, 186*d83cc019SAndroid Build Coastguard Worker int w, int h); 187*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_calculate_fb_crc(int fd, struct igt_fb *fb); 188*d83cc019SAndroid Build Coastguard Worker struct chamelium_fb_crc_async_data *chamelium_calculate_fb_crc_async_start(int fd, 189*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb); 190*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_calculate_fb_crc_async_finish(struct chamelium_fb_crc_async_data *fb_crc); 191*d83cc019SAndroid Build Coastguard Worker int chamelium_get_captured_frame_count(struct chamelium *chamelium); 192*d83cc019SAndroid Build Coastguard Worker int chamelium_get_frame_limit(struct chamelium *chamelium, 193*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 194*d83cc019SAndroid Build Coastguard Worker int w, int h); 195*d83cc019SAndroid Build Coastguard Worker void chamelium_assert_frame_eq(const struct chamelium *chamelium, 196*d83cc019SAndroid Build Coastguard Worker const struct chamelium_frame_dump *dump, 197*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb); 198*d83cc019SAndroid Build Coastguard Worker void chamelium_assert_crc_eq_or_dump(struct chamelium *chamelium, 199*d83cc019SAndroid Build Coastguard Worker igt_crc_t *reference_crc, 200*d83cc019SAndroid Build Coastguard Worker igt_crc_t *capture_crc, struct igt_fb *fb, 201*d83cc019SAndroid Build Coastguard Worker int index); 202*d83cc019SAndroid Build Coastguard Worker void chamelium_assert_frame_match_or_dump(struct chamelium *chamelium, 203*d83cc019SAndroid Build Coastguard Worker struct chamelium_port *port, 204*d83cc019SAndroid Build Coastguard Worker const struct chamelium_frame_dump *frame, 205*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb, 206*d83cc019SAndroid Build Coastguard Worker enum chamelium_check check); 207*d83cc019SAndroid Build Coastguard Worker void chamelium_crop_analog_frame(struct chamelium_frame_dump *dump, int width, 208*d83cc019SAndroid Build Coastguard Worker int height); 209*d83cc019SAndroid Build Coastguard Worker void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump); 210*d83cc019SAndroid Build Coastguard Worker void chamelium_destroy_audio_file(struct chamelium_audio_file *audio_file); 211*d83cc019SAndroid Build Coastguard Worker void chamelium_infoframe_destroy(struct chamelium_infoframe *infoframe); 212*d83cc019SAndroid Build Coastguard Worker 213*d83cc019SAndroid Build Coastguard Worker #endif /* IGT_CHAMELIUM_H */ 214