Jump to content

Intel HD Graphics / GMA 5700


sockerkid
 Share

1,324 posts in this topic

Recommended Posts

Huh? I'm confused. You mean your Intel HD Graphics (GMA5700) already works, except for QE/CI?

 

Hello,

 

It works with Chameleon RC5 and Graphics Mode = 1920x1080. AppleIntelHDGraphicsFB is removed.

 

if i put it, i only have display with sharing display.

 

I can't upload file :)

 

Asap it will be possible for me attach_error.png Upload failed. You are not permitted to upload this type of file

 

i'll post my Dsdt

 

Fred

 

Update

 

dsdt.zip

Link to comment
Share on other sites

Hello,

 

It works with Chameleon RC5 and Graphics Mode = 1920x1080. AppleIntelHDGraphicsFB is removed.

 

if i put it, i only have display with sharing display.

 

I can't upload file ;)

 

Asap it will be possible for me attach_error.png Upload failed. You are not permitted to upload this type of file

 

i'll post my Dsdt

 

Fred

 

make a zip of your dsdt.aml

this will work

Link to comment
Share on other sites

Hello,

 

It works with Chameleon RC5 and Graphics Mode = 1920x1080. AppleIntelHDGraphicsFB is removed.

 

if i put it, i only have display with sharing display....

 

Fred

Oh yeah. Loading the framebuffer is killing us. It does something we (read our LCD panel) don't want. At least I do see something on my LCD panel :)

 

And I haven't really checked your DSDT (not yet) but you may need to add the "AAPL, os-info" property to get output since that helped me to get my LCD panel work (activated) though I still don't get it. I mean what is it? I have no idea (:

 

I do know that changing one single values (0x01) to zero (0x00) disables my LCD panel again. I think to have also seen different icons in Finder (under SHARED). I now have a notebook icon BTW, but I have seen at least the iMac icon a few times. Maybe one of these values – presumably the first one – tells the OS what kind of machine it is? The 0x10 may be the GPU sensor ID but hey... I haven't even checked it myself since AppleHWSensor.kext isn't loading here.

 

Also. Can people here please add their model identifier in replies / signature, because it is important as to whether or not the LCD panel will receive a signal or not. Thank you.

 

Time for my breakfast now...

 

Update:

Remember me finding the following info in AppleIntelHDGraphicsFB.kext:

30 49 01 11 01 10 08 00 00 01 00 00 00 00 00 00 FF FF FF FF 
30 49 00 14 14 14 08 04 00 00 00 00 00 00 00 00 FF FF FF FF
30 49 01 01 01 00 08 00 00 00 00 00 00 00 00 00 FF FF FF FF

Well. It turns out that this is used to switch displays!!! And it actually works, though the screen view is still mangled.

 

Line-1: Internal LCD

Line-2: External Monitor

Line-3: HDMI (on the NVIDIA/ATI GPU)

Link to comment
Share on other sites

Oh yeah. Loading the framebuffer is killing us. It does something we (read our LCD panel) don't want. At least I do see something on my LCD panel :thumbsup_anim:

 

And I haven't really checked your DSDT (not yet) but you may need to add the "AAPL, os-info" property to get output since that helped me to get my LCD panel work (activated) though I still don't get it. I mean what is it? I have no idea (:

 

I do know that changing one single values (0x01) to zero (0x00) disables my LCD panel again. I think to have also seen different icons in Finder (under SHARED). I now have a notebook icon BTW, but I have seen at least the iMac icon a few times. Maybe one of these values – presumably the first one – tells the OS what kind of machine it is? The 0x10 may be the GPU sensor ID but hey... I haven't even checked it myself since AppleHWSensor.kext isn't loading here.

 

Also. Can people here please add their model identifier in replies / signature, because it is important as to whether or not the LCD panel will receive a signal or not. Thank you.

 

Time for my breakfast now...

 

Update:

Remember me finding the following info in AppleIntelHDGraphicsFB.kext:

30 49 01 11 01 10 08 00 00 01 00 00 00 00 00 00 FF FF FF FF 
30 49 00 14 14 14 08 04 00 00 00 00 00 00 00 00 FF FF FF FF
30 49 01 01 01 00 08 00 00 00 00 00 00 00 00 00 FF FF FF FF

Well. It turns out that this is used to switch displays!!! And it actually works, though the screen view is still mangled.

 

Line-1: Internal LCD

Line-2: External Monitor

Line-3: HDMI (on the NVIDIA/ATI GPU)

 

Hello

 

I'm working on Dsdt E6510, i've post one but gave me some trouble on reboot.

One thing, on seven with intel drv you can make new resolution.

I get 800x600 1024x768 1280x1024 1920x1080 out of the box

And with intel software you can add for exemple 1600x900.

Dynamic system to create the resoltion you want.

maybe can help to understand

 

I saw in kext whitch do the selection between nvidia and intel that you can change the default card and the order.

In Dsdt there is Gmux whitch write in GPIO to select the good hardware.

 

 

Fred

 

 

 

Fred

Link to comment
Share on other sites

Good work

 

but not on my core i5

 

the output of fbdump is "-bash: ./fbdump: Bad CPU type in executable"

on my other Hackmac it is working

 

whats wrong

Sorry to be this late with my reply, but there's so much new stuff to learn. Anyway. I think that this is an arch mismatch. Please compile with:

cc -g -o /tmp/fbdump fbdump.c -framework ApplicationServices -framework IOKit -Wall -arch i386

That should cure it.

Link to comment
Share on other sites

Time to fix things. Time to add a new Legacy kexts. Enter LegacyIOGraphicsFamily.kext with only Info.plist in it. Time for you people to step in. This is what we need under AppleBacklightDisplay:

			<key>IODisplayParameters</key>
		<dict>
			<key>brightness</key>
			<dict>
				<key>max</key>
				<integer>255</integer>
				<key>min</key>
				<integer>10</integer>
				<key>value</key>
				<integer>25</integer>
			</dict>
			<key>commit</key>
			<dict>
				<key>reg</key>
				<integer>0</integer>
			</dict>
		</dict>

I'll explain the next step when this work is done. And no this alone won't magically fix your Intel HD GMA 5700 yet you want it.

 

Ok. I'll add another step now. We need a perl coder to write us a simple little script to check/fix the checksum of the EDID table data. I'll even add the C++ variant for you, to make it easy:

SInt32 EDIDSum( const UInt8 * bytes, IOByteCount len )
{
   int i, j;
   UInt8 sum;

   for (j = 0; j < len; j += 128)
   {
       sum = 0;
       for (i=0; i < 128; i++)
           sum += bytes[j+i];
       if (sum) {
           printf("sum: %d\n", sum);
           return (j/128);
       }
   }
   printf ("sum: %d\n", sum);
   return (-1);
}

Why? Because some of us will have to change their EDID data, and the checksum needs to be repaired afterwards. Easy huh?

 

So come on folks. Let's make this a (more) collaborate effort. Don't wait on me to fix it for you!!!

Link to comment
Share on other sites

Hello,

 

i'm not a perl programmer, but the code should be a thing like this

 

#!/usr/bin/perl

@bytes=( 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0xE4,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x13,0x01,0x04,0x95,0x22,0x13,0x78,0x02,0x15,0xD5,0x9E,0x59,0x50,0x98,0x26,
0x0E,0x50,0x54,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0xCA,0x35,0x80,0x92,0x70,0x38,0x1F,0x40,0x30,0x20,
0x35,0x00,0x58,0xC2,0x10,0x00,0x00,0x18,0x22,0x24,0x80,0xA0,0x70,0x38,0x1F,0x40,
0x30,0x20,0x35,0x00,0x58,0xC2,0x10,0x00,0x00,0x18,0x00,0x00,0x00,0xFE,0x00,0x44,
0x48,0x30,0x39,0x31,0x80,0x31,0x35,0x36,0x57,0x46,0x31,0x0A,0x00,0x00,0x00,0x00,
0x00,0x00,0x41,0x31,0x1E,0x00,0x00,0x00,0x00,0x09,0x01,0x0A,0x20,0x20,0x00,0xD6
);

sub EDIDSum()
{
    my($len,@data) = @_;

    for ($j = 0; $j < $len; $j+=128) {
         $sum = 0;

         for ($i = 0; $i < 128; $i++) {
              $sum += $data[$j+$i];
              $sum = ( $sum % 256 );
         }
         if ($sum) {
              printf("sum: %d\n", $sum);
              return ($j/128);
         }
    }
    printf ("sum: %d\n", $sum);
    return (-1);
}

&EDIDSum(0x80,@bytes);

 

EDIDcrc.zip

 

Fred

Link to comment
Share on other sites

Hello,

 

i'm not a perl programmer, but the code should be a thing like this

 

#!/usr/bin/perl

@bytes=( 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0xE4,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x13,0x01,0x04,0x95,0x22,0x13,0x78,0x02,0x15,0xD5,0x9E,0x59,0x50,0x98,0x26,
0x0E,0x50,0x54,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0xCA,0x35,0x80,0x92,0x70,0x38,0x1F,0x40,0x30,0x20,
0x35,0x00,0x58,0xC2,0x10,0x00,0x00,0x18,0x22,0x24,0x80,0xA0,0x70,0x38,0x1F,0x40,
0x30,0x20,0x35,0x00,0x58,0xC2,0x10,0x00,0x00,0x18,0x00,0x00,0x00,0xFE,0x00,0x44,
0x48,0x30,0x39,0x31,0x80,0x31,0x35,0x36,0x57,0x46,0x31,0x0A,0x00,0x00,0x00,0x00,
0x00,0x00,0x41,0x31,0x1E,0x00,0x00,0x00,0x00,0x09,0x01,0x0A,0x20,0x20,0x00,0xD6
);

sub EDIDSum()
{
    my($len,@data) = @_;

    for ($j = 0; $j < $len; $j+=128) {
         $sum = 0;

         for ($i = 0; $i < 128; $i++) {
              $sum += $data[$j+$i];
              $sum = ( $sum % 256 );
         }
         if ($sum) {
              printf("sum: %d\n", $sum);
              return ($j/128);
         }
    }
    printf ("sum: %d\n", $sum);
    return (-1);
}

&EDIDSum(0x80,@bytes);

 

EDIDcrc.zip

 

Fred

 

Sorry for the stupid question

but

" how to run it "

Link to comment
Share on other sites

Sorry for the stupid question

but

" how to run it "

 

Hello,

 

There is no stupid question.

 

Unzip attach file, open a terminal, change to the folder where you unzip file, and query :

./EDIDcrc

 

Remember it do nothing except to calculate a checksum.

 

Fred

Link to comment
Share on other sites

Thanks, but don't we want it to read a file instead? Presumably the EDID data saved by SwitchResX. Won't that be easier for people? What do you think?

 

@FredWst: What about fixing the checksum automatically?

 

Hi,

 

I've just make c to perl.

 

would you like this ?

 

./EDIDcrc file.bin

 

Fred

Link to comment
Share on other sites

Thanks, but don't we want it to read a file instead? Presumably the EDID data saved by SwitchResX. Won't that be easier for people? What do you think?

 

@FredWst: What about fixing the checksum automatically?

 

4.8 Extension Flag and Checksum: 2 bytes – offset 7Eh-7Fh

4.8.1 Extensionflag

␣ Any non-zero value of the extension flag indicates that the display has additional EDID data beyond the first 128-bytes. The extension flag indicates the number of 128-byte extensions present. The method to access this additional data is defined in the E-DDC standard.

␣ This byte is programmed such that a one-byte checksum of the entire 128-byte EDID equals 00h. If the recorded checksum does not equal the calculated checksum then the checksum is invalid.

 

Here's information about how is made EDID

http://www.stellae.fr/wiki/_media/efika_da..._guide_vesa.pdf

 

Here a test soft.

 

./EDIDcrc your edid file

or

./EDIDcrc without param take buffer test in file

 

It will tell you if checksum is Ok, if not it will patch in memory.

 

EDIDcrc_1.zip

 

dutchhockeypro can you explain to me what you want, i'll do it.

Fred

Link to comment
Share on other sites

Hi Fred,

 

First of all. Thank you for the link to the VESA EDID specifications. I personally had to use Wikipedia due to lack of having it. And there are quite a few things I have learned from your Perl script.

 

1) I didn't know that you could use it without the .pl file extension.

2) That we can execute Perl script by setting the execute bit, and run it without using: perl my_perls_script.pl

3) I only used my $filesize = -s $ARGV[0]; recently, so your code snippet was another eye opener:

use File::stat;
my $filesize = stat("$ARGV[0]")->size;
print "File : $ARGV[0] -> Size: $filesize\n";

4) I didn't knew how to call / define sub routines.

 

Thanks for that. But what I do know is this:

 

1) You should add checks to trap human errors (when people forget arguments and the file is too short).

2) Use clear self descriptive var names. Not vars like $c because that tells people nothing. This way you can also eliminate (most of) the need of in source comments.

3) Don't do extra work when it's not required.

- I get "Checksum is OK" three times. Should use the file length to set $len (tables are 128 bytes long after all).

4) Use predefined variables when possible: Example: $c = $data[$j+$i-1]:) Do this instead of recalculating stuff like $data[$j+$i-1]=($data[$j+$i-1]

5) When using returns, use 0 on success a -1 on error. Not reversed.

- The given example was taken from Apple's i2cexample.c

6) Use spacing to make your code readable.

 

And we should at least give people the option to fix their EDID's checksum. Either by showing a perl command line, or to patch their table. Other neat options could be:

 

1) Dump/save a copy that can be used in the DSDT

2) Dump/save the EDID in base64 encoding.

 

Also. Why not keep it simple and use something like: while (($num = read(FILE, $data, 1)) != 0) and do the checksum calculation at once (while keeping track of $sum) and do the modulo on each last byte with: $crc = ($byte + (0x100 - $sum)) % 256;

 

All in all a good start, and a big 'thank you very much' for taking some of the load off my shoulders!

Link to comment
Share on other sites

Hi Fred,

 

First of all. Thank you for the link to the VESA EDID specifications. I personally had to use Wikipedia due to lack of having it. And there are quite a few things I have learned from your Perl script.

 

1) I didn't know that you could use it without the .pl file extension.

2) That we can execute Perl script by setting the execute bit, and run it without using: perl my_perls_script.pl

3) I only used my $filesize = -s $ARGV[0]; recently, so your code snippet was another eye opener:

use File::stat;
my $filesize = stat("$ARGV[0]")->size;
print "File : $ARGV[0] -> Size: $filesize\n";

4) I didn't knew how to call / define sub routines.

 

Thanks for that. But what I do know is this:

 

1) You should add checks to trap human errors (when people forget arguments and the file is too short).

2) Use clear self descriptive var names. Not vars like $c because that tells people nothing. This way you can also eliminate (most of) the need of in source comments.

3) Don't do extra work when it's not required.

- I get "Checksum is OK" three times. Should use the file length to set $len (tables are 128 bytes long after all).

4) Use predefined variables when possible: Example: $c = $data[$j+$i-1] ;) Do this instead of recalculating stuff like $data[$j+$i-1]=($data[$j+$i-1]

5) When using returns, use 0 on success a -1 on error. Not reversed.

- The given example was taken from Apple's i2cexample.c

6) Use spacing to make your code readable.

 

And we should at least give people the option to fix their EDID's checksum. Either by showing a perl command line, or to patch their table. Other neat options could be:

 

1) Dump/save a copy that can be used in the DSDT

2) Dump/save the EDID in base64 encoding.

 

Also. Why not keep it simple and use something like: while (($num = read(FILE, $data, 1)) != 0) and do the checksum calculation at once (while keeping track of $sum) and do the modulo on each last byte with: $crc = ($byte + (0x100 - $sum)) % 256;

 

All in all a good start, and a big 'thank you very much' for taking some of the load off my shoulders!

 

Hi,

 

Don't worry it's just a fast simple code that i wrote.

But i need to know what do you need exactly and to do what ?

is it only to patch bad sum of edid and save result on disk ?

is it only to return the good sum and use it on the fly ?

 

so,

 

what do you want as input ? a file or stream ?

what do you want as ouput ? a file or stream ?

 

Regards

 

Fred

Link to comment
Share on other sites

Hi,

 

Don't worry it's just a fast simple code that i wrote. But i need to know what do you need exactly and to do what ?

is it only to patch bad sum of edid and save result on disk ? is it only to return the good sum and use it on the fly ?

 

so, what do you want as input ? a file or stream ? what do you want as ouput ? a file or stream ?

 

Regards

 

Fred

Hi Fred,

 

Well. I think that patching it on the fly is the best solution.

 

Thank you.

 

p.s. Any takers for the legacy kext we need?

 

Attached is a LED Cinema Display's EDID with two tables in it (can be used for testing).

EDID_LED_Cinema_Display.hex.zip

Link to comment
Share on other sites

LegacyIOGraphicsFamily.kext.zip is what you are searching for ?

 

iMac_de_fred.zip

 

Fred

Yes. A legacy kexts is what we need to set brightness control et all. just look at the following source code:

IOService * IOBacklightDisplay::probe( IOService * provider, SInt32 * score )
{
   IOFramebuffer *     framebuffer;
   IOService *         ret = 0;
   UInt32              displayType;
   uintptr_t           connectFlags;

   do
   {
       if (!gIOFBHaveBacklight) // Check in IOFramebuffer.cpp
           continue;

       if (!super::probe(provider, score))
           continue;

       framebuffer = (IOFramebuffer *) getConnection()->getFramebuffer();

       for (IOItemCount idx = 0; idx < framebuffer->getConnectionCount(); idx++)
       {
           if (kIOReturnSuccess != framebuffer->getAttributeForConnection(idx,
                   kConnectionFlags, &connectFlags)) /* flgs */
               continue;
           if (0 == (kIOConnectionBuiltIn /* 00 08 00 */ & connectFlags))
               continue;
           if (kIOReturnSuccess != framebuffer->getAppleSense(idx, NULL, NULL, NULL, &displayType)) /* asns */
               continue;
           if ((kPanelTFTConnect /* 2 */ != displayType)
                   && (kGenericLCD /* 20 */ != displayType)
                   && (kPanelFSTNConnect /* 14 */ != displayType))
               continue;

           ret = this;         // yes, we will control the panel
           break;
       }
   }
   while (false);

   return (ret);
}

Seems like we can make it work.

 

LOL I just woke up (fell in sleep on our couch while watching some movie) @2:20AM A great time for a Saturday morning to do some hacking...

 

Update: In case anyone is wondering about the used properties under IOGraphicsIgnoreParameters in LegacyIOGraphicsFamily.kext:

 

kUpstreamProtocolConfig = 'aupc'

kUpstreamProtocolHDCPStatus = 'auph'

kUpstreamProtocolHDCPConfigStatus = 'aupp'

kUpstreamProtocolMsgStatus = 'aums'

 

Note: bpc is still unknown to me.

 

And for IOGraphicsPrefsParameters:

 

kConnectionColorMode = 'cyuv'

 

Possible values:

kIODisplayColorModeReserved   = 0x00000000,
kIODisplayColorModeRGB		= 0x00000001,
kIODisplayColorModeYCbCr422   = 0x00000010,
kIODisplayColorModeYCbCr444   = 0x00000100,
kIODisplayColorModeRGBLimited = 0x00001000,
kIODisplayColorModeAuto	   = 0x10000000 (used in the legacy kext)

kConnectionOverscan = 'oscn'

kConnectionVideoBest = 'vbst'

 

Note: I don't know what: pscn (positive scan?), tbri (true brightness?), thue (hue) and tsat (saturation?) are used for. Well not exactly that is, but they are related to color stuff.

 

 

Update-2: LegacyIOGraphicsFamily.kext doesn't seem to work for me. Does it work for you Fred? Anyone else maybe?

Link to comment
Share on other sites

 Hi! Please tell me where to find the startup method IntelHD processor P6100. The methods do not work there nVidia optimus. Notetbook Asus K42JC .The system is installed only through a complete removal IntelHD kexts Thanks in advance 

Link to comment
Share on other sites

Hi,

 

I follow Wiki to do this one injection workings for me.

Look in second file i join,you will see EDID under display0

 

Fred

I also have a EDID property under AppleDisplay (I'm testing my external monitor now) but that's the one injected by IOGraphicsFamily.kext and not the one from the legacy kext.

 

Try to inject a random property, say 'IOTestProperty' with the text "Hello World". That simply doesn't work here. I just think that it isn't matching anything currently. Need some work.

Link to comment
Share on other sites

I also have a EDID property under AppleDisplay (I'm testing my external monitor now) but that's the one injected by IOGraphicsFamily.kext and not the one from the legacy kext.

 

Try to inject a random property, say 'IOTestProperty' with the text "Hello World". That simply doesn't work here. I just think that it isn't matching anything currently. Need some work.

 

Hello,

 

May be i put bad kext on upload, so this one works.

 

LegacyIOGraphicsFamily.kext.zip

 

Search AppleDisplay -> IOTest = fred test

iMac_de_fred.zip

 

 

Fred

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...