/* * Copyright (C) 2010, 2015 Apple Inc. All rights reserved. * * This document is the property of Apple Inc. * It is considered confidential and proprietary. * * This document may not be reproduced or transmitted in any form, * in whole or in part, without the express written permission of * Apple Inc. */ #include #include #include #include #include #include #include #include #include #if defined(WITH_MENU) && WITH_MENU static struct video_link_data dp_video_data; int do_dp(int argc, struct cmd_arg *args) { if (argc < 2) { puts("not enough arguments.\n"); goto usage; } if (strcmp("start", args[1].str) == 0) { static struct display_timing timing_list[] = { #if SUB_TARGET_J1 || SUB_TARGET_J2 || SUB_TARGET_J2A { "ipad3", 0, 252200000, 264, 2048, 5, 150, 5, 1536, 9, 3, 1, 0, 0, 0, 0, 24, DISPLAY_TYPE_EDP, NULL }, #endif #if WITH_HW_DISPLAY_DISPLAYPORT { "720p", 0, 00000000, 243, 1280, 220, 110, 40, 720, 20, 5, 5, 0, 0, 0, 0, 24, DISPLAY_TYPE_DP, NULL }, #endif }; #if SUB_TARGET_J1 || SUB_TARGET_J2 || SUB_TARGET_J2A dp_t dp = { .mode = 0x1, .type = 0x1, .min_link_rate = 0x6, .max_link_rate = 0x6, .lanes = 0x4, .ssc = 0x0, .alpm = 0x0, .vrr_enable = 0x0, .vrr_on = 0x0, }; #elif WITH_HW_DISPLAY_DISPLAYPORT dp_t dp = { .mode = 0x1, .type = 0x1, .min_link_rate = 0x6, .max_link_rate = 0x6, .lanes = 0x2, .ssc = 0x0, .alpm = 0x0, .vrr_enable = 0x0, }; #else dp_t dp; #endif timing_list[0].display_config = (void *)&dp; displayport_init(&dp); bzero(&dp_video_data, sizeof(struct video_link_data)); dp_video_data.mirror_mode = false; dp_video_data.test_mode = 0; dp_video_data.color.depth = 8; dp_video_data.color.space = kDisplayColorSpacesRGB; dp_video_data.color.range = kDisplayColorDynamicRangeVESA; dp_video_data.color.coefficient = kDisplayColorCoefficientITU601; dp_video_data.timing.axis[0].total = timing_list[0].h_active + timing_list[0].h_back_porch + timing_list[0].h_front_porch + timing_list[0].h_pulse_width; dp_video_data.timing.axis[0].active = timing_list[0].h_active; dp_video_data.timing.axis[0].sync_width = timing_list[0].h_pulse_width; dp_video_data.timing.axis[0].back_porch = timing_list[0].h_back_porch; dp_video_data.timing.axis[0].front_porch = timing_list[0].h_front_porch; dp_video_data.timing.axis[0].sync_rate = 0; dp_video_data.timing.axis[0].sync_polarity = 0; dp_video_data.timing.axis[1].total = timing_list[0].v_active + timing_list[0].v_back_porch + timing_list[0].v_front_porch + timing_list[0].v_pulse_width; dp_video_data.timing.axis[1].active = timing_list[0].v_active; dp_video_data.timing.axis[1].sync_width = timing_list[0].v_pulse_width; dp_video_data.timing.axis[1].back_porch = timing_list[0].v_back_porch; dp_video_data.timing.axis[1].front_porch = timing_list[0].v_front_porch; dp_video_data.timing.axis[1].sync_rate = 60 << 16; dp_video_data.timing.axis[1].sync_polarity = 0; } else if (strcmp("stop", args[1].str) == 0) { displayport_quiesce(); } else if (strcmp("video", args[1].str) == 0) { if (strcmp("logo", args[2].str) == 0) { dp_video_data.mirror_mode = false; dp_video_data.test_mode = 0; dp_controller_start_video(&dp_video_data); } if (strcmp("bist", args[2].str) == 0) { dp_video_data.mirror_mode = false; dp_video_data.test_mode = 1; dp_controller_start_video(&dp_video_data); } if (strcmp("mirror", args[2].str) == 0) { dp_video_data.mirror_mode = true; dp_video_data.test_mode = 0; dp_controller_start_video(&dp_video_data); } } else if (strcmp("dpcd", args[1].str) == 0) { uint8_t data[16]; int len = args[3].n; uint32_t intr = 0; if (len > 16) len = 16; printf("dpcd read %d bytes from 0x%x\n", len, args[2].n); #if WITH_HW_DISPLAY_DISPLAYPORT intr = INT_DPORT0; #elif WITH_HW_DISPLAY_EDP intr = INT_EDP0; #endif //cuz AppleTV only defines display in iBoot but declares drivers in iBEC if (intr) mask_int(intr); dp_controller_read_bytes_dpcd(args[2].n, data, len); if (intr) unmask_int(intr); for (int i=0; i < len; i++) { printf("0x%02x ", data[i]); } printf("\n"); } else { puts("unrecognized command.\n"); goto usage; } return 0; usage: printf("%s start\n", args[0].str); printf("%s video logo\n", args[0].str); printf("%s video bist\n", args[0].str); printf("%s video mirror\n", args[0].str); printf("%s stop\n", args[0].str); printf("%s dpcd . Len is max 16 bytes\n", args[0].str); return -1; } MENU_COMMAND_DEVELOPMENT(dp, do_dp, "displayport stuff", NULL); #endif