1/*
2cc -g -o /tmp/range range.c -framework ApplicationServices -framework IOKit -Wall
3*/
4
5#include <CoreFoundation/CoreFoundation.h>
6#include <ApplicationServices/ApplicationServices.h>
7#include <IOKit/graphics/IOGraphicsLib.h>
8#include <stdlib.h>
9#include <stdio.h>
10
11
12int main(int argc, char * argv[])
13{
14    io_service_t        service;
15    CGError             err;
16    int                 i;
17    CGDisplayCount      max;
18    CGDirectDisplayID   displayIDs[8];
19    uint32_t            mask;
20    CFDataRef           fbRange;
21
22    err = CGGetOnlineDisplayList(8, displayIDs, &max);
23    if(err != kCGErrorSuccess)
24        exit(1);
25    if(max > 8)
26        max = 8;
27
28    if( argc < 2)
29        mask = 0xffffffff;
30    else
31        mask = strtol( argv[1], 0, 0 );
32
33    for(i = 0; i < max; i++ )
34    {
35        if (!(mask & (1 << i)))
36            continue;
37
38        service = CGDisplayIOServicePort(displayIDs[i]);
39
40
41        printf("Display %p:\n", displayIDs[i]);
42
43        fbRange = (CFDataRef) IORegistryEntryCreateCFProperty( service,
44                                                                CFSTR(kIOFBTimingRangeKey),
45                                                                kCFAllocatorDefault, kNilOptions);
46        if (fbRange && CFDataGetLength(fbRange) >= sizeof(IODisplayTimingRange))
47        {
48            IODisplayTimingRange * range = (IODisplayTimingRange *) CFDataGetBytePtr(fbRange);
49
50            printf("  minPixelClock                 %qd\n", range->minPixelClock);
51            printf("  maxPixelClock                 %qd\n", range->maxPixelClock);
52
53            printf("  maxPixelError                 %ld\n", range->maxPixelError);
54            printf("  supportedSyncFlags            %ld\n", range->supportedSyncFlags);
55            printf("  supportedSignalLevels         %ld\n", range->supportedSignalLevels);
56            printf("  supportedSignalConfigs        %ld\n", range->supportedSignalConfigs);
57            printf("  minFrameRate                  %ld\n", range->minFrameRate);
58            printf("  maxFrameRate                  %ld\n", range->maxFrameRate);
59            printf("  minLineRate                   %ld\n", range->minLineRate);
60            printf("  maxLineRate                   %ld\n", range->maxLineRate);
61
62            printf("  maxHorizontalTotal            %ld\n", range->maxHorizontalTotal);
63            printf("  maxVerticalTotal              %ld\n", range->maxVerticalTotal);
64            printf("  charSizeHorizontalActive      %d\n", range->charSizeHorizontalActive);
65            printf("  charSizeHorizontalBlanking    %d\n", range->charSizeHorizontalBlanking);
66            printf("  charSizeHorizontalSyncOffset  %d\n", range->charSizeHorizontalSyncOffset);
67            printf("  charSizeHorizontalSyncPulse   %d\n", range->charSizeHorizontalSyncPulse);
68            printf("  charSizeVerticalActive        %d\n", range->charSizeVerticalActive);
69            printf("  charSizeVerticalBlanking      %d\n", range->charSizeVerticalBlanking);
70            printf("  charSizeVerticalSyncOffset    %d\n", range->charSizeVerticalSyncOffset);
71            printf("  charSizeVerticalSyncPulse     %d\n", range->charSizeVerticalSyncPulse);
72            printf("  charSizeHorizontalBorderLeft  %d\n", range->charSizeHorizontalBorderLeft);
73            printf("  charSizeHorizontalBorderRight %d\n", range->charSizeHorizontalBorderRight);
74            printf("  charSizeVerticalBorderTop     %d\n", range->charSizeVerticalBorderTop);
75            printf("  charSizeVerticalBorderBottom  %d\n", range->charSizeVerticalBorderBottom);
76            printf("  charSizeHorizontalTotal       %d\n", range->charSizeHorizontalTotal);
77            printf("  charSizeVerticalTotal         %d\n", range->charSizeVerticalTotal);
78
79            printf("  minHorizontalActiveClocks     %ld\n", range->minHorizontalActiveClocks);
80            printf("  maxHorizontalActiveClocks     %ld\n", range->maxHorizontalActiveClocks);
81            printf("  minHorizontalBlankingClocks   %ld\n", range->minHorizontalBlankingClocks);
82            printf("  maxHorizontalBlankingClocks   %ld\n", range->maxHorizontalBlankingClocks);
83            printf("  minHorizontalSyncOffsetClocks %ld\n", range->minHorizontalSyncOffsetClocks);
84            printf("  maxHorizontalSyncOffsetClocks %ld\n", range->maxHorizontalSyncOffsetClocks);
85            printf("  minHorizontalPulseWidthClocks %ld\n", range->minHorizontalPulseWidthClocks);
86            printf("  maxHorizontalPulseWidthClocks %ld\n", range->maxHorizontalPulseWidthClocks);
87
88            printf("  minVerticalActiveClocks       %ld\n", range->minVerticalActiveClocks);
89            printf("  maxVerticalActiveClocks       %ld\n", range->maxVerticalActiveClocks);
90            printf("  minVerticalBlankingClocks     %ld\n", range->minVerticalBlankingClocks);
91            printf("  maxVerticalBlankingClocks     %ld\n", range->maxVerticalBlankingClocks);
92
93            printf("  minVerticalSyncOffsetClocks   %ld\n", range->minVerticalSyncOffsetClocks);
94            printf("  maxVerticalSyncOffsetClocks   %ld\n", range->maxVerticalSyncOffsetClocks);
95            printf("  minVerticalPulseWidthClocks   %ld\n", range->minVerticalPulseWidthClocks);
96            printf("  maxVerticalPulseWidthClocks   %ld\n", range->maxVerticalPulseWidthClocks);
97
98            printf("  minHorizontalBorderLeft       %ld\n", range->minHorizontalBorderLeft);
99            printf("  maxHorizontalBorderLeft       %ld\n", range->maxHorizontalBorderLeft);
100            printf("  minHorizontalBorderRight      %ld\n", range->minHorizontalBorderRight);
101            printf("  maxHorizontalBorderRight      %ld\n", range->maxHorizontalBorderRight);
102
103            printf("  minVerticalBorderTop          %ld\n", range->minVerticalBorderTop);
104            printf("  maxVerticalBorderTop          %ld\n", range->maxVerticalBorderTop);
105            printf("  minVerticalBorderBottom       %ld\n", range->minVerticalBorderBottom);
106            printf("  maxVerticalBorderBottom       %ld\n", range->maxVerticalBorderBottom);
107
108            printf("  maxNumLinks                   %ld\n", range->maxNumLinks);
109            printf("  minLink0PixelClock            %ld\n", range->minLink0PixelClock);
110            printf("  maxLink0PixelClock            %ld\n", range->maxLink0PixelClock);
111            printf("  minLink1PixelClock            %ld\n", range->minLink1PixelClock);
112            printf("  maxLink1PixelClock            %ld\n", range->maxLink1PixelClock);
113
114        }
115
116        fbRange = (CFDataRef) IORegistryEntryCreateCFProperty( service,
117                                                                CFSTR(kIOFBScalerInfoKey),
118                                                                kCFAllocatorDefault, kNilOptions);
119        if (fbRange && CFDataGetLength(fbRange) >= sizeof(IODisplayScalerInformation))
120        {
121            IODisplayScalerInformation * range = (IODisplayScalerInformation *) CFDataGetBytePtr(fbRange);
122            printf("IODisplayScalerInformation:\n");
123            printf("  scalerFeatures                %lx\n", range->scalerFeatures);
124            printf("  maxHorizontalPixels           %ld\n", range->maxHorizontalPixels);
125            printf("  maxVerticalPixels             %ld\n", range->maxVerticalPixels);
126        }
127
128
129    }
130
131    exit(0);
132    return(0);
133}
134
135