Index: branches/slice/i386/libsaio/pci_root.c =================================================================== --- branches/slice/i386/libsaio/pci_root.c (revision 690) +++ branches/slice/i386/libsaio/pci_root.c (revision 691) @@ -14,7 +14,7 @@ #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 Index: branches/slice/i386/libsaio/fake_efi.c =================================================================== --- branches/slice/i386/libsaio/fake_efi.c (revision 690) +++ branches/slice/i386/libsaio/fake_efi.c (revision 691) @@ -777,6 +777,18 @@ // 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; @@ -791,7 +803,7 @@ 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 } Index: branches/slice/i386/boot2/modules.c =================================================================== --- branches/slice/i386/boot2/modules.c (revision 690) +++ branches/slice/i386/boot2/modules.c (revision 691) @@ -35,7 +35,7 @@ -#if 1 //DEBUG_MODULES +#if DEBUG_MODULES void print_hook_list() { msglog("---Hook Table---\n"); @@ -319,7 +319,7 @@ } } -#if 1 //DEBUG_MODULES +#if DEBUG_MODULES print_hook_list(); //getc(); #endif Index: branches/slice/i386/modules/NVRAM/NVRAM.c =================================================================== --- branches/slice/i386/modules/NVRAM/NVRAM.c (revision 690) +++ branches/slice/i386/modules/NVRAM/NVRAM.c (revision 691) @@ -1,5 +1,5 @@ /* - * 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. */ @@ -13,7 +13,7 @@ #include "smbios_patcher.h" #ifndef DEBUG_NVRAM -#define DEBUG_NVRAM 0 +#define DEBUG_NVRAM 1 #endif #if DEBUG_NVRAM @@ -45,21 +45,37 @@ 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) { char bootName[128]; - + variables* var; char* ffName; uint8_t * FirmwareFeatures; - uint8_t * FirmwareFeaturesMask; + EFI_UINT32* FirmwareFeaturesMask; char* ffmName; char* boName; char* bnName; @@ -69,7 +85,7 @@ // 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 @@ -77,9 +93,10 @@ 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); @@ -140,24 +157,40 @@ */ //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; } @@ -201,17 +234,17 @@ 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; Index: branches/slice/i386/modules/GraphicsEnabler/ati.c =================================================================== --- branches/slice/i386/modules/GraphicsEnabler/ati.c (revision 690) +++ branches/slice/i386/modules/GraphicsEnabler/ati.c (revision 691) @@ -544,14 +544,14 @@ 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)) @@ -620,7 +620,7 @@ 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; @@ -631,7 +631,7 @@ 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)) @@ -678,7 +678,10 @@ } 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(); } Index: branches/slice/i386/modules/USBFix/usb.c =================================================================== --- branches/slice/i386/modules/USBFix/usb.c (revision 690) +++ branches/slice/i386/modules/USBFix/usb.c (revision 691) @@ -90,6 +90,8 @@ if(fix_ehci) retVal &= ehci_acquire(current->pciDev); break; + // OHCI + case 0x10: //same // UHCI case 0x00: @@ -193,7 +195,7 @@ 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; } @@ -214,7 +216,7 @@ 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); @@ -317,7 +319,7 @@ return 0; } - DBG("EHCI Acquire OS Ownership done\n"); + msglog("EHCI Acquire OS Ownership done\n"); return 1; } @@ -328,7 +330,7 @@ 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); Index: branches/slice/i386/modules/Resolution/edid.c =================================================================== --- branches/slice/i386/modules/Resolution/edid.c (revision 690) +++ branches/slice/i386/modules/Resolution/edid.c (revision 691) @@ -4,7 +4,8 @@ * * Created by Evan Lojewski on 12/1/09. * Copyright 2009. All rights reserved. - * + * + * Slice 2010 */ @@ -13,7 +14,219 @@ #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; @@ -40,16 +253,37 @@ 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; } @@ -69,7 +303,7 @@ 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 @@ -79,16 +313,16 @@ 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) @@ -101,7 +335,7 @@ 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) @@ -110,8 +344,8 @@ //|| 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; } @@ -127,9 +361,9 @@ } 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; } } Index: branches/slice/i386/modules/Resolution/edid.h =================================================================== --- branches/slice/i386/modules/Resolution/edid.h (revision 690) +++ branches/slice/i386/modules/Resolution/edid.h (revision 691) @@ -11,9 +11,145 @@ #include "libsaio.h" + #define EDID_BLOCK_SIZE 128 #define EDID_V1_BLOCKS_TO_GO_OFFSET 126 +//Slice - some more info aabout EDID +#define EDID_LENGTH 0x80 +#define EDID_HEADER 0x00 +#define EDID_HEADER_END 0x07 +#define ID_MANUFACTURER_NAME 0x08 +#define ID_MANUFACTURER_NAME_END 0x09 +#define ID_MODEL 0x0a + +#define ID_SERIAL_NUMBER 0x0c + +#define MANUFACTURE_WEEK 0x10 +#define MANUFACTURE_YEAR 0x11 + +#define EDID_STRUCT_VERSION 0x12 +#define EDID_STRUCT_REVISION 0x13 + +#define EDID_STRUCT_DISPLAY 0x14 + +#define DPMS_FLAGS 0x18 +#define ESTABLISHED_TIMING_1 0x23 +#define ESTABLISHED_TIMING_2 0x24 +#define MANUFACTURERS_TIMINGS 0x25 + +/* standard timings supported */ +#define STD_TIMING 8 +#define STD_TIMING_DESCRIPTION_SIZE 2 +#define STD_TIMING_DESCRIPTIONS_START 0x26 + +#define DETAILED_TIMING_DESCRIPTIONS_START 0x36 +#define DETAILED_TIMING_DESCRIPTION_SIZE 18 +#define NO_DETAILED_TIMING_DESCRIPTIONS 4 + +#define DETAILED_TIMING_DESCRIPTION_1 0x36 +#define DETAILED_TIMING_DESCRIPTION_2 0x48 +#define DETAILED_TIMING_DESCRIPTION_3 0x5a +#define DETAILED_TIMING_DESCRIPTION_4 0x6c + +#define DESCRIPTOR_DATA 5 + +#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_SUPPORT block[10] + +#define DPMS_ACTIVE_OFF (1 << 5) +#define DPMS_SUSPEND (1 << 6) +#define DPMS_STANDBY (1 << 7) + +struct EDID +{ + UInt8 header[8]; //0 + UInt8 vendorProduct[4]; //8 + UInt8 serialNumber[4]; //12 + UInt8 weekOfManufacture; //16 + UInt8 yearOfManufacture; //17 + UInt8 version; //18 + UInt8 revision; //19 + UInt8 displayParams[5]; //20 + UInt8 colorCharacteristics[10]; //25 + UInt8 establishedTimings[3]; //35 + UInt16 standardTimings[8]; //38 + UInt8 detailedTimings[72]; //54 + UInt8 extension; //126 + UInt8 checksum; //127 +}; + char* readEDID(); void getResolution(UInt32* x, UInt32* y, UInt32* bp); Index: branches/slice/revision =================================================================== --- branches/slice/revision (revision 690) +++ branches/slice/revision (revision 691) @@ -1 +1 @@ -676:682 \ No newline at end of file +676:689 \ No newline at end of file Index: branches/slice/ChamMek/ChamMek.xcodeproj/slice.pbxuser =================================================================== --- branches/slice/ChamMek/ChamMek.xcodeproj/slice.pbxuser (revision 690) +++ branches/slice/ChamMek/ChamMek.xcodeproj/slice.pbxuser (revision 691) @@ -76,8 +76,8 @@ PBXSymbolsDataSource_ReferenceNameID, ); }; - PBXPerProjectTemplateStateSaveDate = 314796425; - PBXWorkspaceStateSaveDate = 314796425; + PBXPerProjectTemplateStateSaveDate = 314916942; + PBXWorkspaceStateSaveDate = 314916942; }; perUserProjectItems = { 120DFB1712BA3A4D00C7EAC8 /* PBXTextBookmark */ = 120DFB1712BA3A4D00C7EAC8 /* PBXTextBookmark */; @@ -98,10 +98,6 @@ 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 */; @@ -120,7 +116,6 @@ 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 */; @@ -131,7 +126,12 @@ 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 */; @@ -265,7 +265,7 @@ vrLen = 588; vrLoc = 2933; }; - 1236A82C12BD6023003F1DA9 /* gui.c */ = { + 123FA2D012C4E34C000DF4A6 /* gui.c */ = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gui.c; @@ -445,73 +445,6 @@ 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 = ""; - }; - 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 = ""; - }; - 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 = ""; - }; - 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 = ""; - }; 128A97B712C2336000600556 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 1279BD7512BF4D8700612F62 /* ACPIPatcher.c */; @@ -825,16 +758,6 @@ path = /Users/slice/Projects/fakesmc/Chameleon/RC5m/i386/modules/Memory/spd.c; sourceTree = ""; }; - 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; @@ -1048,6 +971,66 @@ 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 = ""; + }; + 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 = ""; + }; + 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 = ""; + }; 12DCD38E12BBA5D600A20635 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 12F7FF0412BB9F3200949DEC /* ntfs_private.h */; @@ -1058,6 +1041,16 @@ 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 */; @@ -1075,6 +1068,13 @@ path = /Users/slice/Projects/fakesmc/Chameleon/RC5m/i386/libsaio/saio_types.h; sourceTree = ""; }; + 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 = ""; + }; 12E6FB4712BB438700C2A021 /* Makefile */ = { isa = PBXFileReference; lastKnownFileType = sourcecode.make; Index: branches/slice/ChamMek/ChamMek.xcodeproj/slice.mode1v3 =================================================================== --- branches/slice/ChamMek/ChamMek.xcodeproj/slice.mode1v3 (revision 690) +++ branches/slice/ChamMek/ChamMek.xcodeproj/slice.mode1v3 (revision 691) @@ -302,7 +302,7 @@ 164 RubberWindowFrame - 243 138 1172 694 0 0 1440 878 + 264 184 1172 694 0 0 1440 878 Module PBXSmartGroupTreeModule @@ -320,7 +320,7 @@ PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel - pci_root.c + edid.c PBXSplitModuleInNavigatorKey Split0 @@ -328,11 +328,11 @@ PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel - pci_root.c + edid.c _historyCapacity 0 bookmark - 1288362912C3699600EA4CB2 + 12DA42E912C54134009281B3 history 12121ED112B261EA00207E55 @@ -384,7 +384,6 @@ 12F7FF0012BB9F3200949DEC 12DCD38E12BBA5D600A20635 1236A82312BD6023003F1DA9 - 12BB721512BE659500B11948 12679BA312BE822E00E3637F 1279BD7112BF4D8700612F62 128A97B712C2336000600556 @@ -392,9 +391,10 @@ 128A9AF412C233CE00600556 1288318212C3608100EA4CB2 128835DC12C366AB00EA4CB2 - 128835F612C3681F00EA4CB2 - 1288360C12C3690C00EA4CB2 - 1288361712C3698700EA4CB2 + 12DF661812C4DD28006DBA03 + 12DA422E12C52DAC009281B3 + 12DA422F12C52DAC009281B3 + 12DA42D612C54017009281B3 SplitCount @@ -406,14 +406,14 @@ GeometryConfiguration Frame - {{0, 0}, {964, 470}} + {{0, 0}, {964, 466}} RubberWindowFrame - 243 138 1172 694 0 0 1440 878 + 264 184 1172 694 0 0 1440 878 Module PBXNavigatorGroup Proportion - 470pt + 466pt ContentConfiguration @@ -426,14 +426,14 @@ GeometryConfiguration Frame - {{0, 475}, {964, 178}} + {{0, 471}, {964, 182}} RubberWindowFrame - 243 138 1172 694 0 0 1440 878 + 264 184 1172 694 0 0 1440 878 Module XCDetailModule Proportion - 178pt + 182pt Proportion @@ -452,9 +452,9 @@ TableOfContents - 1288362B12C3699600EA4CB2 + 12DA42EB12C54134009281B3 1CE0B1FE06471DED0097A5F4 - 1288362C12C3699600EA4CB2 + 12DA42EC12C54134009281B3 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -592,12 +592,11 @@ 5 WindowOrderList - 1CD10A99069EF8BA00B06720 12C26D3512B0DDFC00AF7F4B /Users/slice/Projects/Chameleons/chameleon/branches/slice/ChamMek/ChamMek.xcodeproj WindowString - 243 138 1172 694 0 0 1440 878 + 264 184 1172 694 0 0 1440 878 WindowToolsV3 @@ -674,7 +673,7 @@ TableOfContents 12C26D3512B0DDFC00AF7F4B - 1288362D12C3699600EA4CB2 + 12DA42ED12C54134009281B3 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -796,13 +795,13 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 1288362E12C3699600EA4CB2 + 12DA42DB12C54017009281B3 1C162984064C10D400B95A72 - 1288362F12C3699600EA4CB2 - 1288363012C3699600EA4CB2 - 1288363112C3699600EA4CB2 - 1288363212C3699600EA4CB2 - 1288363312C3699600EA4CB2 + 12DA42DC12C54017009281B3 + 12DA42DD12C54017009281B3 + 12DA42DE12C54017009281B3 + 12DA42DF12C54017009281B3 + 12DA42E012C54017009281B3 ToolbarConfiguration xcode.toolbar.config.debugV3 @@ -829,14 +828,12 @@ Dock - BecomeActive - ContentConfiguration PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel - pci_root.c + <No Editor> StatusBarVisibility @@ -845,7 +842,7 @@ Frame {{0, 0}, {1109, 510}} RubberWindowFrame - 331 62 1109 816 0 0 1440 878 + 80 62 1109 816 0 0 1440 878 Module PBXNavigatorGroup @@ -857,6 +854,8 @@ 510pt + BecomeActive + ContentConfiguration PBXProjectModuleGUID @@ -869,7 +868,7 @@ Frame {{0, 515}, {1109, 260}} RubberWindowFrame - 331 62 1109 816 0 0 1440 878 + 80 62 1109 816 0 0 1440 878 Module PBXProjectFindModule @@ -892,13 +891,13 @@ TableOfContents 1C530D57069F1CE1000CFCEE - 1288360A12C3690800EA4CB2 - 1288360B12C3690800EA4CB2 + 12DA422A12C52D7F009281B3 + 12DA422B12C52D7F009281B3 1CDD528C0622207200134675 1CD0528E0623707200166675 WindowString - 331 62 1109 816 0 0 1440 878 + 80 62 1109 816 0 0 1440 878 WindowToolGUID 1C530D57069F1CE1000CFCEE WindowToolIsVisible