Chameleon

Chameleon Commit Details

Date:2010-12-24 22:07:19 (13 years 3 months ago)
Author:Sergey Slice
Commit:691
Parents: 690
Message:EDID
Changes:
M/branches/slice/ChamMek/ChamMek.xcodeproj/slice.pbxuser
M/branches/slice/revision
M/branches/slice/i386/modules/Resolution/edid.h
M/branches/slice/ChamMek/ChamMek.xcodeproj/slice.mode1v3
M/branches/slice/i386/libsaio/fake_efi.c
M/branches/slice/i386/boot2/modules.c
M/branches/slice/i386/modules/GraphicsEnabler/ati.c
M/branches/slice/i386/modules/NVRAM/NVRAM.c
M/branches/slice/i386/libsaio/pci_root.c
M/branches/slice/i386/modules/Resolution/edid.c
M/branches/slice/i386/modules/USBFix/usb.c

File differences

branches/slice/i386/libsaio/pci_root.c
1414
1515
1616
17
17
1818
1919
2020
#if DEBUG_PCIROOT
#define DBG(x...) verbose(x)
#else
#define DBG(x...)msglog(x)
#define DBG(x...) msglog(x)
#endif
static int rootuid = 10; //value means function wasnt ran yet
branches/slice/i386/libsaio/fake_efi.c
777777
778778
779779
780
781
782
783
784
785
786
787
788
789
790
791
780792
781793
782794
......
791803
792804
793805
794
806
795807
796808
797809
// Add configuration table entries to both the services table and the device tree
setupEfiConfigurationTable();
addConfigurationTable(&gEfiSmbiosTableGuid, &smbios_p, NULL);
if (archCpuType == CPU_TYPE_I386)
{
gST32->Hdr.CRC32 = 0;
gST32->Hdr.CRC32 = crc32(0L, gST32, gST32->Hdr.HeaderSize);
}
else
{
gST64->Hdr.CRC32 = 0;
gST64->Hdr.CRC32 = crc32(0L, gST64, gST64->Hdr.HeaderSize);
}
#if 1 //DEBUG
struct DMIProcessorInformation* cpuInfo;
struct DMIHeader * dmihdr;
msglog("Patched platform CPU Info:\n FSB=%d\n MaxSpeed=%d\n CurrentSpeed=%d\n", Platform->CPU.FSBFrequency/MEGA, Platform->CPU.TSCFrequency/MEGA, Platform->CPU.CPUFrequency/MEGA);
msglog("Patched SMBIOS CPU Info:\n FSB=%d\n MaxSpeed=%d\n CurrentSpeed=%d\n", cpuInfo->externalClock, cpuInfo->maximumClock, cpuInfo->currentClock);
msglog("\n Family=%x\n Socket=%x\n Cores=%d Enabled=%d Threads=%d\n", cpuInfo->processorFamily, cpuInfo->processorUpgrade, cpuInfo->coreCount, cpuInfo->coreEnabled, cpuInfo->Threads);
msglog(" Family=%x\n Socket=%x\n Cores=%d Enabled=%d Threads=%d\n", cpuInfo->processorFamily, cpuInfo->processorUpgrade, cpuInfo->coreCount, cpuInfo->coreEnabled, cpuInfo->Threads);
}
#endif
}
branches/slice/i386/boot2/modules.c
3535
3636
3737
38
38
3939
4040
4141
......
319319
320320
321321
322
322
323323
324324
325325
#if 1 //DEBUG_MODULES
#if DEBUG_MODULES
void print_hook_list()
{
msglog("---Hook Table---\n");
}
}
#if 1 //DEBUG_MODULES
#if DEBUG_MODULES
print_hook_list();
//getc();
#endif
branches/slice/i386/modules/NVRAM/NVRAM.c
11
2
2
33
44
55
......
1313
1414
1515
16
16
1717
1818
1919
......
4545
4646
4747
48
4948
5049
5150
5251
5352
54
53
5554
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
5672
5773
5874
59
75
6076
6177
62
78
6379
6480
6581
......
6985
7086
7187
72
88
7389
7490
7591
......
7793
7894
7995
96
8097
81
82
98
99
83100
84101
85102
......
140157
141158
142159
143
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
144177
145
146
147
148
178
149179
150180
151181
152
182
153183
154184
155185
186
156187
188
157189
158190
159191
160192
193
161194
162195
163196
......
201234
202235
203236
204
237
205238
206239
207
240
208241
209242
210243
211
244
212245
213246
214
247
215248
216249
217250
/*
* Idea and template by (c) 2009 Evan Lojewski. All rights reserved.
* Template by (c) 2009 Evan Lojewski. All rights reserved.
*
* NVRAM module by Slice 2010.
*/
#include "smbios_patcher.h"
#ifndef DEBUG_NVRAM
#define DEBUG_NVRAM 0
#define DEBUG_NVRAM 1
#endif
#if DEBUG_NVRAM
extern EFI_GUID* getSystemID();
void NVRAM_hook(void* arg1, void* arg2, void* arg3, void* arg4);
void NVRAM_start(void);
int readNVRAM(void);
typedef struct {
char Name[32];
char Value[512];
} variables;
variables* var;
int readNVRAM(variables* v);
void NVRAM_hook(void* arg1, void* arg2, void* arg3, void* arg4);
/*
void NVRAM_start_hook(void* arg1, void* arg2, void* arg3, void* arg4)
{
msglog("NVRAM started with ExecKernel\n");
}
*/
void NVRAM_start()
{
//register_hook_callback("ExecKernel", &NVRAM_start_hook);
//register_hook_callback("Kernel Start", &NVRAM_hook);
register_hook_callback("ModulesLoaded", &NVRAM_hook);
}
void NVRAM_hook(void* arg1, void* arg2, void* arg3, void* arg4)
{
charbootName[128];
variables*var;
char*ffName;
uint8_t *FirmwareFeatures;
uint8_t *FirmwareFeaturesMask;
EFI_UINT32*FirmwareFeaturesMask;
char*ffmName;
char*boName;
char*bnName;
//return;
msglog("NVRAM started\n");
msglog("NVRAM started with ModulesLoaded\n");
//Slice create /options node -> /fakenvram
// I need to use fakenvram until I know what is happen
bool ClearNVRAM = FALSE;
const char* buff;
int cnt;
var = malloc(sizeof(variables)+1);
ClearNVRAM = getValueForKey(kClearNVRAM, &buff, &cnt, &bootInfo->bootConfig);
if (!ClearNVRAM) {
readNVRAM();
if (!ClearNVRAM) {
readNVRAM(var);
}
Node* optionsNode = DT__FindNode("/options", true);
*/
//end Slice
}
int i,j;
for (i=0; i<32; i++) {
if (var[i].Name[0]) {
msglog("NVRAM get a name %s\n", var[i].Name);
if (isdigit(var[i].Name[0])) {
msglog(" ...it is digit...\n");
continue;
}
j=0;
while (var[i].Value[j++]);
DT__AddProperty(optionsNode, var[i].Name, j,&var[i].Value);
#if DEBUG_NVRAM
msglog("NVRAM add name=%s value=%s length=%d\n", var[i].Name, var[i].Value, j);
#endif
} else {
return;
}
void NVRAM_start()
{
register_hook_callback("ExecKernel", &NVRAM_hook);
register_hook_callback("Kernel Start", &NVRAM_hook);
}
}
const char NVRAM_INF[] = "nvram.inf";
int readNVRAM()
int readNVRAM(variables* var)
{
int fd, fsize;
char* nvr = 0;
msglog("Start NVRAM reading\n");
if ((fd = open(NVRAM_INF, 0)) < 0) {
msglog("[ERROR] open NVRAM failed\n");
return -1;
}
fsize = file_size(fd);
if (!fsize) {
msglog(" zero NVRAM file\n");
close (fd);
return -1;
}
c = *nvr++;
if (c == 0x25) { //TODO this is hex
int k1=*nvr++;
if ((k1 > 0x30) && (k1 < 0x39)) {
if ((k1 >= 0x30) && (k1 <= 0x39)) {
k1 = k1 - 0x30;
}
if ((k1 > 0x60) && (k1 < 0x69)) {
if ((k1 > 0x60) && (k1 <= 0x66)) {
k1 = k1 - 0x60 + 10;
}
int k2=*nvr++;
if ((k2 > 0x30) && (k2 < 0x39)) {
if ((k2 >= 0x30) && (k2 <= 0x39)) {
k2 = k2 - 0x30;
}
if ((k2 > 0x60) && (k2 < 0x69)) {
if ((k2 > 0x60) && (k2 <= 0x66)) {
k2 = k2 - 0x60 + 10;
}
c = (k1 << 4) + k2;
branches/slice/i386/modules/GraphicsEnabler/ati.c
544544
545545
546546
547
548
547
548
549549
550550
551551
552552
553
554
553
554
555555
556556
557557
......
620620
621621
622622
623
623
624624
625625
626626
......
631631
632632
633633
634
634
635635
636636
637637
......
678678
679679
680680
681
681
682
683
684
682685
683686
684687
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_mclk))
return 0;
//if(!DP_ADD_TEMP_VAL_DATA(device, ati_mclk))
//return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_rev_id))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_vend_id))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_sclk))
return 0;
//if(!DP_ADD_TEMP_VAL_DATA(device, ati_sclk))
//return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_vendor_id))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_platform_info))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_fb_offset_n4))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_hwgpio_n4))
/*if(!DP_ADD_TEMP_VAL_DATA(device, ati_hwgpio_n4))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_iospace_offset_n4))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_refclk_n4))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_regspace_offset_n4))
return 0;
return 0; */
if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation_n4))
return 0;
if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl_blackscr_prefs_0_n4))
}
model = get_ati_model((ati_dev->vendor_id << 16) | ati_dev->device_id);
framebuffer = get_ati_fb((ati_dev->vendor_id << 16) | ati_dev->device_id);
framebuffer = getStringForKey(kAtiConfig, &bootInfo->bootConfig);
if (!framebuffer) {
framebuffer = get_ati_fb((ati_dev->vendor_id << 16) | ati_dev->device_id);
}
if (!string) {
string = devprop_create_string();
}
branches/slice/i386/modules/USBFix/usb.c
9090
9191
9292
93
94
9395
9496
9597
......
193195
194196
195197
196
198
197199
198200
199201
......
214216
215217
216218
217
219
218220
219221
220222
......
317319
318320
319321
320
322
321323
322324
323325
......
328330
329331
330332
331
333
332334
333335
334336
if(fix_ehci) retVal &= ehci_acquire(current->pciDev);
break;
// OHCI
case 0x10: //same
// UHCI
case 0x00:
DBG("usblegsup=%08x isOSowned=%d isBIOSowned=%d usblegctlsts=%08x\n", usblegsup, isOSowned, isBIOSowned, usblegctlsts);
verbose("Legacy USB Off Done\n");
msglog("Legacy USB Off Done\n");
return 1;
}
pci_config_write16(pci_dev->dev.addr, 0x04, 0x0002);
base = pci_config_read32(pci_dev->dev.addr, 0x10);
verbose("EHCI controller [%04x:%04x] at %02x:%2x.%x DMA @%x\n",
msglog("EHCI controller [%04x:%04x] at %02x:%2x.%x DMA @%x\n",
pci_dev->vendor_id, pci_dev->device_id,
pci_dev->dev.bits.bus, pci_dev->dev.bits.dev, pci_dev->dev.bits.func,
base);
return 0;
}
DBG("EHCI Acquire OS Ownership done\n");
msglog("EHCI Acquire OS Ownership done\n");
return 1;
}
base = pci_config_read32(pci_dev->dev.addr, 0x20);
port_base = (base >> 5) & 0x07ff;
verbose("UHCI controller [%04x:%04x] at %02x:%2x.%x base %x(%x)\n",
msglog("UHCI controller [%04x:%04x] at %02x:%2x.%x base %x(%x)\n",
pci_dev->vendor_id, pci_dev->device_id,
pci_dev->dev.bits.bus, pci_dev->dev.bits.dev, pci_dev->dev.bits.func,
port_base, base);
branches/slice/i386/modules/Resolution/edid.c
44
55
66
7
7
8
89
910
1011
......
1314
1415
1516
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
17230
18231
19232
......
40253
41254
42255
43
44
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
45279
46
47
280
281
48282
49283
50284
51
52
285
286
53287
54288
55289
......
69303
70304
71305
72
306
73307
74308
75309
......
79313
80314
81315
82
83
316
317
84318
85319
86
87
320
321
88322
89
90
91323
324
325
92326
93327
94328
......
101335
102336
103337
104
338
105339
106340
107341
......
110344
111345
112346
113
114
347
348
115349
116350
117351
......
127361
128362
129363
130
131
132
364
365
366
133367
134368
135369
*
* Created by Evan Lojewski on 12/1/09.
* Copyright 2009. All rights reserved.
*
*
*Slice 2010
*/
#include "vbe.h"
#include "graphics.h"
#include "boot.h"
//----------------------------------------------------------------------------------
#define FBMON_FIX_HEADER 1
#define FBMON_FIX_INPUT 2
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
//----------------------------------------------------------------------------------
/*
struct broken_edid {
const char manufacturer[4];
UInt32 model;
UInt32 fix;
};
//----------------------------------------------------------------------------------
broken_edid brokendb[] = {
// DEC FR-PCXAV-YZ *
{ "DEC", 0x073a, FBMON_FIX_HEADER,},
// ViewSonic PF775a *
{ "VSC", 0x5a44, FBMON_FIX_INPUT,}
};
//----------------------------------------------------------------------------------
*/
const unsigned char edid_v1_header[] = { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00};
//----------------------------------------------------------------------------------
int edid_compare(unsigned char *edid1, unsigned char *edid2)
{
int result = 0;
unsigned char *block = edid1 + ID_MANUFACTURER_NAME, manufacturer1[4], manufacturer2[4];;
manufacturer1[0] = ((block[0] & 0x7c) >> 2) + '@';
manufacturer1[1] = ((block[0] & 0x03) << 3) + ((block[1] & 0xe0) >> 5) + '@';
manufacturer1[2] = (block[1] & 0x1f) + '@';
manufacturer1[3] = 0;
block = edid2 + ID_MANUFACTURER_NAME;
manufacturer2[0] = ((block[0] & 0x7c) >> 2) + '@';
manufacturer2[1] = ((block[0] & 0x03) << 3) + ((block[1] & 0xe0) >> 5) + '@';
manufacturer2[2] = (block[1] & 0x1f) + '@';
manufacturer2[3] = 0;
int x;
for(x = 0; x < 4; x++)
{
if(manufacturer1[x] == manufacturer2[x])
result++;
}
return result;
}
int check_edid(unsigned char *edid)
{
unsigned char *block = edid + ID_MANUFACTURER_NAME, manufacturer[4];
//unsigned char *b;
UInt32 model;
//int i, fix = 0, ret = 0;
manufacturer[0] = ((block[0] & 0x7c) >> 2) + '@';
manufacturer[1] = ((block[0] & 0x03) << 3) +
((block[1] & 0xe0) >> 5) + '@';
manufacturer[2] = (block[1] & 0x1f) + '@';
manufacturer[3] = 0;
model = block[2] + (block[3] << 8);
/*
for (i = 0; i < (int)ARRAY_SIZE(brokendb); i++) {
if (!strncmp((const char *)manufacturer, brokendb[i].manufacturer, 4) &&
brokendb[i].model == model) {
DEBG("ATIFB: The EDID Block of "
"Manufacturer: %s Model: 0x%08lx is known to "
"be broken,\n", manufacturer, model);
fix = brokendb[i].fix;
break;
}
}
switch (fix) {
case FBMON_FIX_HEADER:
for (i = 0; i < 8; i++) {
if (edid[i] != edid_v1_header[i])
ret = fix;
}
break;
case FBMON_FIX_INPUT:
b = edid + EDID_STRUCT_DISPLAY;
/// Only if display is GTF capable will
//the input type be reset to analog *
if (b[4] & 0x01 && b[0] & 0x80)
ret = fix;
break;
}
*/
return 0; //ret;
}
//----------------------------------------------------------------------------------
static void fix_edid(unsigned char *edid, int fix)
{
unsigned char *b;
switch (fix) {
case FBMON_FIX_HEADER:
msglog("EDID: trying a header reconstruct\n");
memcpy(edid, edid_v1_header, 8);
break;
case FBMON_FIX_INPUT:
msglog("EDID: trying to fix input type\n");
b = edid + EDID_STRUCT_DISPLAY;
b[0] &= ~0x80;
edid[127] += 0x80;
}
}
//----------------------------------------------------------------------------------
int edid_checksum(unsigned char *edid)
{
unsigned char i, csum = 0, all_null = 0;
int err = 0, fix = check_edid(edid);
if (fix)
fix_edid(edid, fix);
for (i = 0; i < EDID_LENGTH; i++) {
csum += edid[i];
all_null |= edid[i];
}
if (csum == 0x00 && all_null) {
/* checksum passed, everything's good */
err = 1;
}
return err;
}
//----------------------------------------------------------------------------------
static int edid_check_header(unsigned char *edid)
{
int i, err = 1, fix = check_edid(edid);
if (fix)
fix_edid(edid, fix);
for (i = 0; i < 8; i++) {
if (edid[i] != edid_v1_header[i])
err = 0;
}
return err;
}
//------------------------------------------------------------------------
bool verifyEDID(unsigned char *edid)
{
if (edid == NULL || !edid_checksum(edid) ||!edid_check_header(edid))
{
return false;
}
return true;
}
int edid_is_timing_block(unsigned char *block)
{
if ((block[0] != 0x00) || (block[1] != 0x00) ||
(block[2] != 0x00) || (block[4] != 0x00))
return 1;
else
return 0;
}
//----------------------------------------------------------------------------------
int fb_parse_edid(struct EDID *edid, UInt32* x, UInt32* y)
{
int i;
unsigned char *block;
if(!verifyEDID((unsigned char *)edid)) return 1;
block = (unsigned char *)edid + DETAILED_TIMING_DESCRIPTIONS_START; //54
for (i = 0; i < 4; i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) {
if (edid_is_timing_block(block)) {
*x = H_ACTIVE;
*y = V_ACTIVE;
/*
var->xres = var->xres_virtual = H_ACTIVE;
var->yres = var->yres_virtual = V_ACTIVE;
var->height = var->width = -1;
var->right_margin = H_SYNC_OFFSET;
var->left_margin = (H_ACTIVE + H_BLANKING) -
(H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH);
var->upper_margin = V_BLANKING - V_SYNC_OFFSET -
V_SYNC_WIDTH;
var->lower_margin = V_SYNC_OFFSET;
var->hsync_len = H_SYNC_WIDTH;
var->vsync_len = V_SYNC_WIDTH;
var->pixclock = PIXEL_CLOCK;
var->pixclock /= 1000;
var->pixclock = KHZ2PICOS(var->pixclock);
if (HSYNC_POSITIVE)
var->sync |= FB_SYNC_HOR_HIGH_ACT;
if (VSYNC_POSITIVE)
var->sync |= FB_SYNC_VERT_HIGH_ACT;
*/
return 0;
}
}
return 1;
}
void getResolution(UInt32* x, UInt32* y, UInt32* bp)
{
int val;
if(!edidInfo) return;
// TODO: check *all* resolutions reported and either use the highest, or the native resolution (if there is a flag for that)
xResolution = edidInfo[56] | ((edidInfo[58] & 0xF0) << 4);
yResolution = edidInfo[59] | ((edidInfo[61] & 0xF0) << 4);
//xResolution = edidInfo[56] | ((edidInfo[58] & 0xF0) << 4);
//yResolution = edidInfo[59] | ((edidInfo[61] & 0xF0) << 4);
if(fb_parse_edid(edidInfo, &xResolution, &yResolution))
{
xResolution = DEFAULT_SCREEN_WIDTH;
yResolution = DEFAULT_SCREEN_HEIGHT;
}
/*
0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x32 0x0C
0x00 0xDF 0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0x00
0x0C 0xDF 0x00 0x00 0x12 0x03 0x21 0x78 0xE9 0x99
0x53 0x28 0xFF 0xFF 0x32 0xDF 0x00 0x12 0x80 0x78
0xD5 0x53 0x26 0x00 0x01 0x01 0x01 0x01 0xFF 0x00
0xDF 0x00 0x03 0x78 0x99 0x28 0x00 0x01 0x01 0x01
0x01 0x21 0x84 0x20 0xFF 0x0C 0x00 0x03 0x0A 0x53
0x54 0x01 0x01 0x01 0xDE 0x84 0x56 0x00 0xA0 0x30
0xFF 0xDF 0x12 0x78 0x53 0x00 0x01 0x01 0x01 0x84
0x00 0x18 0x84 0x00 0x00 0x57 0xFF 0x00 0x80 0x99
0x54 0x01 0x01 0x21 0x20 0x00 0x50 0x00 0x00 0x35
0x57 0xFE 0x00 0x00 0x78 0x28 0x01 0x01 0x21 0x20
0x18 0x30 0x00 0x57 0x34 0xFE 0xAA 0x9A
*/
//printf("H Active = %d", edidInfo[56] | ((edidInfo[58] & 0xF0) << 4) );
//printf("V Active = %d", edidInfo[59] | ((edidInfo[61] & 0xF0) << 4) );
//msglog("H Active = %d ", edidInfo[56] | ((edidInfo[58] & 0xF0) << 4) );
//msglog("V Active = %d \n", edidInfo[59] | ((edidInfo[61] & 0xF0) << 4) );
free( edidInfo );
if(!xResolution) xResolution = DEFAULT_SCREEN_WIDTH;
if(!yResolution) yResolution = DEFAULT_SCREEN_HEIGHT;
//if(!xResolution) xResolution = DEFAULT_SCREEN_WIDTH;
//if(!yResolution) yResolution = DEFAULT_SCREEN_HEIGHT;
}
SInt16 status;
UInt16 blocks_left = 1;
msglog("readEDID\n");
do
{
// TODO: This currently only retrieves the *last* block, make the block buffer expand as needed / calculated from the first block
status = getEDID(edidInfo, blocks_left);
//printf("Buffer location: 0x%X\n", SEG(buffer) << 16 | OFF(buffer));
/*
msglog("Buffer location: 0x%X status: %d\n", SEG(edidInfo) << 16 | OFF(edidInfo), status);
int j, i;
for (j = 0; j < 8; j++) {
for(i = 0; i < 16; i++) printf("0x%X ", ebiosInfo[((i+1) * (j + 1)) - 1]);
for(i = 0; i < 16; i++) msglog("0x%02X ", edidInfo[((i+1) * (j + 1)) - 1]);
msglog("\n");
}
printf("\n");
*/
if(status == 0)
{
//if( edidInfo[0] == 0x00 || edidInfo[0] == 0xFF)
if ( reported > blocks_left )
{
verbose("EDID claims %d more blocks left\n", reported);
msglog("EDID claims %d more blocks left\n", reported);
}
if ( (last_reported <= reported && last_reported != -1)
//|| reported == MAGIC
)
{
verbose("Last reported %d\n", last_reported);
verbose( "EDID blocks left is wrong.\n"
msglog("Last reported %d\n", last_reported);
msglog( "EDID blocks left is wrong.\n"
"Your EDID is probably invalid.\n");
return 0;
}
}
else
{
verbose("Invalid block %d\n", blocks_left);
verbose("Header1 = %d", memcmp(edidInfo, header1, sizeof(header1)) );
verbose("Header2 = %d", memcmp(edidInfo, header2, sizeof(header2)) );
msglog("Invalid block %d\n", blocks_left);
msglog("Header1 = %d", memcmp(edidInfo, header1, sizeof(header1)) );
msglog("Header2 = %d", memcmp(edidInfo, header2, sizeof(header2)) );
return 0;
}
}
branches/slice/i386/modules/Resolution/edid.h
1111
1212
1313
14
1415
1516
17
18
19
20
1621
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
17153
18154
19155
#include "libsaio.h"
#define EDID_BLOCK_SIZE128
#define EDID_V1_BLOCKS_TO_GO_OFFSET 126
//Slice - some more info aabout EDID
#define EDID_LENGTH0x80
#define EDID_HEADER0x00
#define EDID_HEADER_END0x07
#define ID_MANUFACTURER_NAME0x08
#define ID_MANUFACTURER_NAME_END0x09
#define ID_MODEL0x0a
#define ID_SERIAL_NUMBER0x0c
#define MANUFACTURE_WEEK0x10
#define MANUFACTURE_YEAR0x11
#define EDID_STRUCT_VERSION0x12
#define EDID_STRUCT_REVISION0x13
#define EDID_STRUCT_DISPLAY 0x14
#define DPMS_FLAGS0x18
#define ESTABLISHED_TIMING_10x23
#define ESTABLISHED_TIMING_20x24
#define MANUFACTURERS_TIMINGS0x25
/* standard timings supported */
#define STD_TIMING 8
#define STD_TIMING_DESCRIPTION_SIZE 2
#define STD_TIMING_DESCRIPTIONS_START 0x26
#define DETAILED_TIMING_DESCRIPTIONS_START0x36
#define DETAILED_TIMING_DESCRIPTION_SIZE18
#define NO_DETAILED_TIMING_DESCRIPTIONS4
#define DETAILED_TIMING_DESCRIPTION_10x36
#define DETAILED_TIMING_DESCRIPTION_20x48
#define DETAILED_TIMING_DESCRIPTION_30x5a
#define DETAILED_TIMING_DESCRIPTION_40x6c
#define DESCRIPTOR_DATA5
#define UPPER_NIBBLE( x ) \
(((128|64|32|16) & (x)) >> 4)
#define LOWER_NIBBLE( x ) \
((1|2|4|8) & (x))
#define COMBINE_HI_8LO( hi, lo ) \
( (((unsigned)hi) << 8) | (unsigned)lo )
#define COMBINE_HI_4LO( hi, lo ) \
( (((unsigned)hi) << 4) | (unsigned)lo )
#define PIXEL_CLOCK_LO (unsigned)block[ 0 ]
#define PIXEL_CLOCK_HI (unsigned)block[ 1 ]
#define PIXEL_CLOCK (COMBINE_HI_8LO( PIXEL_CLOCK_HI,PIXEL_CLOCK_LO )*10000)
#define H_ACTIVE_LO (unsigned)block[ 2 ]
#define H_BLANKING_LO (unsigned)block[ 3 ]
#define H_ACTIVE_HI UPPER_NIBBLE( (unsigned)block[ 4 ] )
#define H_ACTIVE COMBINE_HI_8LO( H_ACTIVE_HI, H_ACTIVE_LO )
#define H_BLANKING_HI LOWER_NIBBLE( (unsigned)block[ 4 ] )
#define H_BLANKING COMBINE_HI_8LO( H_BLANKING_HI, H_BLANKING_LO )
#define V_ACTIVE_LO (unsigned)block[ 5 ]
#define V_BLANKING_LO (unsigned)block[ 6 ]
#define V_ACTIVE_HI UPPER_NIBBLE( (unsigned)block[ 7 ] )
#define V_ACTIVE COMBINE_HI_8LO( V_ACTIVE_HI, V_ACTIVE_LO )
#define V_BLANKING_HI LOWER_NIBBLE( (unsigned)block[ 7 ] )
#define V_BLANKING COMBINE_HI_8LO( V_BLANKING_HI, V_BLANKING_LO )
#define H_SYNC_OFFSET_LO (unsigned)block[ 8 ]
#define H_SYNC_WIDTH_LO (unsigned)block[ 9 ]
#define V_SYNC_OFFSET_LO UPPER_NIBBLE( (unsigned)block[ 10 ] )
#define V_SYNC_WIDTH_LO LOWER_NIBBLE( (unsigned)block[ 10 ] )
#define V_SYNC_WIDTH_HI ((unsigned)block[ 11 ] & (1|2))
#define V_SYNC_OFFSET_HI (((unsigned)block[ 11 ] & (4|8)) >> 2)
#define H_SYNC_WIDTH_HI (((unsigned)block[ 11 ] & (16|32)) >> 4)
#define H_SYNC_OFFSET_HI (((unsigned)block[ 11 ] & (64|128)) >> 6)
#define V_SYNC_WIDTH COMBINE_HI_4LO( V_SYNC_WIDTH_HI, V_SYNC_WIDTH_LO )
#define V_SYNC_OFFSET COMBINE_HI_4LO( V_SYNC_OFFSET_HI, V_SYNC_OFFSET_LO )
#define H_SYNC_WIDTH COMBINE_HI_4LO( H_SYNC_WIDTH_HI, H_SYNC_WIDTH_LO )
#define H_SYNC_OFFSET COMBINE_HI_4LO( H_SYNC_OFFSET_HI, H_SYNC_OFFSET_LO )
#define H_SIZE_LO (unsigned)block[ 12 ]
#define V_SIZE_LO (unsigned)block[ 13 ]
#define H_SIZE_HI UPPER_NIBBLE( (unsigned)block[ 14 ] )
#define V_SIZE_HI LOWER_NIBBLE( (unsigned)block[ 14 ] )
#define H_SIZE COMBINE_HI_8LO( H_SIZE_HI, H_SIZE_LO )
#define V_SIZE COMBINE_HI_8LO( V_SIZE_HI, V_SIZE_LO )
#define H_BORDER (unsigned)block[ 15 ]
#define V_BORDER (unsigned)block[ 16 ]
#define FLAGS (unsigned)block[ 17 ]
#define INTERLACED (FLAGS&128)
#define SYNC_TYPE (FLAGS&3<<3)/* bits 4,3 */
#define SYNC_SEPARATE (3<<3)
#define HSYNC_POSITIVE (FLAGS & 4)
#define VSYNC_POSITIVE (FLAGS & 2)
#define V_MIN_RATE block[ 5 ]
#define V_MAX_RATE block[ 6 ]
#define H_MIN_RATE block[ 7 ]
#define H_MAX_RATE block[ 8 ]
#define MAX_PIXEL_CLOCK (((int)block[ 9 ]) * 10)
#define GTF_SUPPORTblock[10]
#define DPMS_ACTIVE_OFF(1 << 5)
#define DPMS_SUSPEND(1 << 6)
#define DPMS_STANDBY(1 << 7)
struct EDID
{
UInt8header[8];//0
UInt8vendorProduct[4];//8
UInt8serialNumber[4];//12
UInt8weekOfManufacture;//16
UInt8yearOfManufacture;//17
UInt8version;//18
UInt8revision;//19
UInt8displayParams[5];//20
UInt8colorCharacteristics[10];//25
UInt8establishedTimings[3];//35
UInt16standardTimings[8];//38
UInt8detailedTimings[72];//54
UInt8extension;//126
UInt8checksum;//127
};
char* readEDID();
void getResolution(UInt32* x, UInt32* y, UInt32* bp);
branches/slice/revision
1
1
676:682
676:689
branches/slice/ChamMek/ChamMek.xcodeproj/slice.pbxuser
7676
7777
7878
79
80
79
80
8181
8282
8383
......
9898
9999
100100
101
102
103
104
105101
106102
107103
......
120116
121117
122118
123
124119
125120
126121
......
131126
132127
133128
129
130
131
132
134133
134
135135
136136
137137
......
265265
266266
267267
268
268
269269
270270
271271
......
445445
446446
447447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515448
516449
517450
......
825758
826759
827760
828
829
830
831
832
833
834
835
836
837
838761
839762
840763
......
1048971
1049972
1050973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
10511034
10521035
10531036
......
10581041
10591042
10601043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
10611054
10621055
10631056
......
10751068
10761069
10771070
1071
1072
1073
1074
1075
1076
1077
10781078
10791079
10801080
PBXSymbolsDataSource_ReferenceNameID,
);
};
PBXPerProjectTemplateStateSaveDate = 314796425;
PBXWorkspaceStateSaveDate = 314796425;
PBXPerProjectTemplateStateSaveDate = 314916942;
PBXWorkspaceStateSaveDate = 314916942;
};
perUserProjectItems = {
120DFB1712BA3A4D00C7EAC8 /* PBXTextBookmark */ = 120DFB1712BA3A4D00C7EAC8 /* PBXTextBookmark */;
1279BD7112BF4D8700612F62 /* PBXTextBookmark */ = 1279BD7112BF4D8700612F62 /* PBXTextBookmark */;
1288318212C3608100EA4CB2 /* PBXTextBookmark */ = 1288318212C3608100EA4CB2 /* PBXTextBookmark */;
128835DC12C366AB00EA4CB2 /* PBXTextBookmark */ = 128835DC12C366AB00EA4CB2 /* PBXTextBookmark */;
128835F612C3681F00EA4CB2 /* PBXTextBookmark */ = 128835F612C3681F00EA4CB2 /* PBXTextBookmark */;
1288360C12C3690C00EA4CB2 /* PBXTextBookmark */ = 1288360C12C3690C00EA4CB2 /* PBXTextBookmark */;
1288361712C3698700EA4CB2 /* PBXTextBookmark */ = 1288361712C3698700EA4CB2 /* PBXTextBookmark */;
1288362912C3699600EA4CB2 /* PBXTextBookmark */ = 1288362912C3699600EA4CB2 /* PBXTextBookmark */;
128A97B712C2336000600556 /* PBXTextBookmark */ = 128A97B712C2336000600556 /* PBXTextBookmark */;
128A97B812C2336000600556 /* PBXTextBookmark */ = 128A97B812C2336000600556 /* PBXTextBookmark */;
128A9AF412C233CE00600556 /* PBXTextBookmark */ = 128A9AF412C233CE00600556 /* PBXTextBookmark */;
12B90A4F12B2AE1300FE287A /* PBXTextBookmark */ = 12B90A4F12B2AE1300FE287A /* PBXTextBookmark */;
12B90A5212B2AE1300FE287A /* PBXTextBookmark */ = 12B90A5212B2AE1300FE287A /* PBXTextBookmark */;
12B9F42612B29A4A00FE287A /* PBXTextBookmark */ = 12B9F42612B29A4A00FE287A /* PBXTextBookmark */;
12BB721512BE659500B11948 /* PBXTextBookmark */ = 12BB721512BE659500B11948 /* PBXTextBookmark */;
12BF14DA12B3CF8E00D798FE /* PBXTextBookmark */ = 12BF14DA12B3CF8E00D798FE /* PBXTextBookmark */;
12C7009812B7BCE7006BD382 /* PBXTextBookmark */ = 12C7009812B7BCE7006BD382 /* PBXTextBookmark */;
12C7009912B7BCE7006BD382 /* PBXTextBookmark */ = 12C7009912B7BCE7006BD382 /* PBXTextBookmark */;
12CC44C812B3947B007E0C76 /* PBXTextBookmark */ = 12CC44C812B3947B007E0C76 /* PBXTextBookmark */;
12D6232512BA5F380032F367 /* PBXTextBookmark */ = 12D6232512BA5F380032F367 /* PBXTextBookmark */;
12D6232612BA5F380032F367 /* PBXTextBookmark */ = 12D6232612BA5F380032F367 /* PBXTextBookmark */;
12DA422E12C52DAC009281B3 /* PBXTextBookmark */ = 12DA422E12C52DAC009281B3 /* PBXTextBookmark */;
12DA422F12C52DAC009281B3 /* PBXTextBookmark */ = 12DA422F12C52DAC009281B3 /* PBXTextBookmark */;
12DA42D612C54017009281B3 /* PBXTextBookmark */ = 12DA42D612C54017009281B3 /* PBXTextBookmark */;
12DA42E912C54134009281B3 /* PBXTextBookmark */ = 12DA42E912C54134009281B3 /* PBXTextBookmark */;
12DCD38E12BBA5D600A20635 /* PBXTextBookmark */ = 12DCD38E12BBA5D600A20635 /* PBXTextBookmark */;
12DF661812C4DD28006DBA03 /* PBXTextBookmark */ = 12DF661812C4DD28006DBA03 /* PBXTextBookmark */;
12E17AE612B2BA9B00607D8E /* PBXTextBookmark */ = 12E17AE612B2BA9B00607D8E /* PBXTextBookmark */;
12E6FB5712BB458400C2A021 /* PBXTextBookmark */ = 12E6FB5712BB458400C2A021 /* PBXTextBookmark */;
12EFD98A12B510D9002A1712 /* PBXTextBookmark */ = 12EFD98A12B510D9002A1712 /* PBXTextBookmark */;
vrLen = 588;
vrLoc = 2933;
};
1236A82C12BD6023003F1DA9 /* gui.c */ = {
123FA2D012C4E34C000DF4A6 /* gui.c */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.c;
name = gui.c;
vrLen = 1032;
vrLoc = 0;
};
128835DE12C366AB00EA4CB2 /* modules.c */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.c;
name = modules.c;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/boot2/modules.c;
sourceTree = "<absolute>";
};
128835F612C3681F00EA4CB2 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 128835DE12C366AB00EA4CB2 /* modules.c */;
name = "modules.c: 231";
rLen = 17;
rLoc = 5492;
rType = 0;
vrLen = 833;
vrLoc = 4457;
};
128835FD12C368BF00EA4CB2 /* boot.c */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.c;
name = boot.c;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/boot2/boot.c;
sourceTree = "<absolute>";
};
1288360C12C3690C00EA4CB2 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 128835FD12C368BF00EA4CB2 /* boot.c */;
name = "boot.c: 488";
rLen = 0;
rLoc = 14514;
rType = 0;
vrLen = 1506;
vrLoc = 16104;
};
1288360E12C3690C00EA4CB2 /* pci_root.c */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.c;
name = pci_root.c;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/libsaio/pci_root.c;
sourceTree = "<absolute>";
};
1288361712C3698700EA4CB2 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 1288360E12C3690C00EA4CB2 /* pci_root.c */;
name = "pci_root.c: 22";
rLen = 11;
rLoc = 431;
rType = 0;
vrLen = 735;
vrLoc = 0;
};
1288362912C3699600EA4CB2 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 1288362A12C3699600EA4CB2 /* pci_root.c */;
name = "pci_root.c: 25";
rLen = 11;
rLoc = 470;
rType = 0;
vrLen = 733;
vrLoc = 0;
};
1288362A12C3699600EA4CB2 /* pci_root.c */ = {
isa = PBXFileReference;
name = pci_root.c;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/libsaio/pci_root.c;
sourceTree = "<absolute>";
};
128A97B712C2336000600556 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 1279BD7512BF4D8700612F62 /* ACPIPatcher.c */;
path = /Users/slice/Projects/fakesmc/Chameleon/RC5m/i386/modules/Memory/spd.c;
sourceTree = "<absolute>";
};
12BB721512BE659500B11948 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 1236A82C12BD6023003F1DA9 /* gui.c */;
name = "gui.c: 728";
rLen = 16;
rLoc = 22079;
rType = 0;
vrLen = 909;
vrLoc = 21674;
};
12BB721912BE659500B11948 /* nvidia.c */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.c;
vrLen = 419;
vrLoc = 398;
};
12DA422E12C52DAC009281B3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 123FA2D012C4E34C000DF4A6 /* gui.c */;
name = "gui.c: 715";
rLen = 13;
rLoc = 21602;
rType = 0;
vrLen = 717;
vrLoc = 21319;
};
12DA422F12C52DAC009281B3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 12DA423012C52DAC009281B3 /* libsaio.h */;
name = "libsaio.h: 1";
rLen = 0;
rLoc = 0;
rType = 0;
vrLen = 801;
vrLoc = 468;
};
12DA423012C52DAC009281B3 /* libsaio.h */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.h;
name = libsaio.h;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/libsaio/libsaio.h;
sourceTree = "<absolute>";
};
12DA42D612C54017009281B3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 12DA42D712C54017009281B3 /* edid.c */;
name = "edid.c: 258";
rLen = 0;
rLoc = 12049;
rType = 0;
vrLen = 904;
vrLoc = 5801;
};
12DA42D712C54017009281B3 /* edid.c */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.c;
name = edid.c;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/modules/Resolution/edid.c;
sourceTree = "<absolute>";
};
12DA42E912C54134009281B3 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 12DA42EA12C54134009281B3 /* edid.c */;
name = "edid.c: 258";
rLen = 0;
rLoc = 6449;
rType = 0;
vrLen = 1256;
vrLoc = 5986;
};
12DA42EA12C54134009281B3 /* edid.c */ = {
isa = PBXFileReference;
name = edid.c;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/modules/Resolution/edid.c;
sourceTree = "<absolute>";
};
12DCD38E12BBA5D600A20635 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 12F7FF0412BB9F3200949DEC /* ntfs_private.h */;
vrLen = 1189;
vrLoc = 0;
};
12DF661812C4DD28006DBA03 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 12E415F412C4D87A005D21AE /* boot.c */;
name = "boot.c: 488";
rLen = 0;
rLoc = 14514;
rType = 0;
vrLen = 1168;
vrLoc = 16104;
};
12E17AE612B2BA9B00607D8E /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 12B90A5712B2AE1300FE287A /* 915resolution.h */;
path = /Users/slice/Projects/fakesmc/Chameleon/RC5m/i386/libsaio/saio_types.h;
sourceTree = "<absolute>";
};
12E415F412C4D87A005D21AE /* boot.c */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.c;
name = boot.c;
path = /Users/slice/Projects/Chameleons/chameleon/branches/slice/i386/boot2/boot.c;
sourceTree = "<absolute>";
};
12E6FB4712BB438700C2A021 /* Makefile */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.make;
branches/slice/ChamMek/ChamMek.xcodeproj/slice.mode1v3
302302
303303
304304
305
305
306306
307307
308308
......
320320
321321
322322
323
323
324324
325325
326326
......
328328
329329
330330
331
331
332332
333333
334334
335
335
336336
337337
338338
......
384384
385385
386386
387
388387
389388
390389
......
392391
393392
394393
395
396
397
394
395
396
397
398398
399399
400400
......
406406
407407
408408
409
409
410410
411
411
412412
413413
414414
415415
416
416
417417
418418
419419
......
426426
427427
428428
429
429
430430
431
431
432432
433433
434434
435435
436
436
437437
438438
439439
......
452452
453453
454454
455
455
456456
457
457
458458
459459
460460
......
592592
593593
594594
595
596595
597596
598597
599598
600
599
601600
602601
603602
......
674673
675674
676675
677
676
678677
679678
680679
......
796795
797796
798797
799
798
800799
801
802
803
804
805
800
801
802
803
804
806805
807806
808807
......
829828
830829
831830
832
833
834831
835832
836833
837834
838835
839
836
840837
841838
842839
......
845842
846843
847844
848
845
849846
850847
851848
......
857854
858855
859856
857
858
860859
861860
862861
......
869868
870869
871870
872
871
873872
874873
875874
......
892891
893892
894893
895
896
894
895
897896
898897
899898
900899
901
900
902901
903902
904903
<real>164</real>
</array>
<key>RubberWindowFrame</key>
<string>243 138 1172 694 0 0 1440 878 </string>
<string>264 184 1172 694 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20306471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>pci_root.c</string>
<string>edid.c</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20406471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>pci_root.c</string>
<string>edid.c</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>1288362912C3699600EA4CB2</string>
<string>12DA42E912C54134009281B3</string>
<key>history</key>
<array>
<string>12121ED112B261EA00207E55</string>
<string>12F7FF0012BB9F3200949DEC</string>
<string>12DCD38E12BBA5D600A20635</string>
<string>1236A82312BD6023003F1DA9</string>
<string>12BB721512BE659500B11948</string>
<string>12679BA312BE822E00E3637F</string>
<string>1279BD7112BF4D8700612F62</string>
<string>128A97B712C2336000600556</string>
<string>128A9AF412C233CE00600556</string>
<string>1288318212C3608100EA4CB2</string>
<string>128835DC12C366AB00EA4CB2</string>
<string>128835F612C3681F00EA4CB2</string>
<string>1288360C12C3690C00EA4CB2</string>
<string>1288361712C3698700EA4CB2</string>
<string>12DF661812C4DD28006DBA03</string>
<string>12DA422E12C52DAC009281B3</string>
<string>12DA422F12C52DAC009281B3</string>
<string>12DA42D612C54017009281B3</string>
</array>
</dict>
<key>SplitCount</key>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {964, 470}}</string>
<string>{{0, 0}, {964, 466}}</string>
<key>RubberWindowFrame</key>
<string>243 138 1172 694 0 0 1440 878 </string>
<string>264 184 1172 694 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>470pt</string>
<string>466pt</string>
</dict>
<dict>
<key>ContentConfiguration</key>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 475}, {964, 178}}</string>
<string>{{0, 471}, {964, 182}}</string>
<key>RubberWindowFrame</key>
<string>243 138 1172 694 0 0 1440 878 </string>
<string>264 184 1172 694 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
<key>Proportion</key>
<string>178pt</string>
<string>182pt</string>
</dict>
</array>
<key>Proportion</key>
</array>
<key>TableOfContents</key>
<array>
<string>1288362B12C3699600EA4CB2</string>
<string>12DA42EB12C54134009281B3</string>
<string>1CE0B1FE06471DED0097A5F4</string>
<string>1288362C12C3699600EA4CB2</string>
<string>12DA42EC12C54134009281B3</string>
<string>1CE0B20306471E060097A5F4</string>
<string>1CE0B20506471E060097A5F4</string>
</array>
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
<string>12C26D3512B0DDFC00AF7F4B</string>
<string>/Users/slice/Projects/Chameleons/chameleon/branches/slice/ChamMek/ChamMek.xcodeproj</string>
</array>
<key>WindowString</key>
<string>243 138 1172 694 0 0 1440 878 </string>
<string>264 184 1172 694 0 0 1440 878 </string>
<key>WindowToolsV3</key>
<array>
<dict>
<key>TableOfContents</key>
<array>
<string>12C26D3512B0DDFC00AF7F4B</string>
<string>1288362D12C3699600EA4CB2</string>
<string>12DA42ED12C54134009281B3</string>
<string>1CD0528F0623707200166675</string>
<string>XCMainBuildResultsModuleGUID</string>
</array>
<key>TableOfContents</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
<string>1288362E12C3699600EA4CB2</string>
<string>12DA42DB12C54017009281B3</string>
<string>1C162984064C10D400B95A72</string>
<string>1288362F12C3699600EA4CB2</string>
<string>1288363012C3699600EA4CB2</string>
<string>1288363112C3699600EA4CB2</string>
<string>1288363212C3699600EA4CB2</string>
<string>1288363312C3699600EA4CB2</string>
<string>12DA42DC12C54017009281B3</string>
<string>12DA42DD12C54017009281B3</string>
<string>12DA42DE12C54017009281B3</string>
<string>12DA42DF12C54017009281B3</string>
<string>12DA42E012C54017009281B3</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.debugV3</string>
<key>Dock</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CDD528C0622207200134675</string>
<key>PBXProjectModuleLabel</key>
<string>pci_root.c</string>
<string>&lt;No Editor&gt;</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>Frame</key>
<string>{{0, 0}, {1109, 510}}</string>
<key>RubberWindowFrame</key>
<string>331 62 1109 816 0 0 1440 878 </string>
<string>80 62 1109 816 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<string>510pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<key>Frame</key>
<string>{{0, 515}, {1109, 260}}</string>
<key>RubberWindowFrame</key>
<string>331 62 1109 816 0 0 1440 878 </string>
<string>80 62 1109 816 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXProjectFindModule</string>
<key>TableOfContents</key>
<array>
<string>1C530D57069F1CE1000CFCEE</string>
<string>1288360A12C3690800EA4CB2</string>
<string>1288360B12C3690800EA4CB2</string>
<string>12DA422A12C52D7F009281B3</string>
<string>12DA422B12C52D7F009281B3</string>
<string>1CDD528C0622207200134675</string>
<string>1CD0528E0623707200166675</string>
</array>
<key>WindowString</key>
<string>331 62 1109 816 0 0 1440 878 </string>
<string>80 62 1109 816 0 0 1440 878 </string>
<key>WindowToolGUID</key>
<string>1C530D57069F1CE1000CFCEE</string>
<key>WindowToolIsVisible</key>

Archive Download the corresponding diff file

Revision: 691