diff options
author | root <root@sunyi-pc.(none)> | 2011-05-25 10:24:45 +0800 |
---|---|---|
committer | root <root@sunyi-pc.(none)> | 2011-05-25 10:24:45 +0800 |
commit | 5e401a0b8260c0a536c70dba4f7b0b7f6b156ae0 (patch) | |
tree | 6ddc57791dc1fa44dd7cb10f42ded3bdf9f7ece8 | |
parent | cf17bce1034ad2508a53f3f5a099384343581fae (diff) |
More information: pixclock, Htot and Vtot.
-rw-r--r-- | testedid.c | 135 |
1 files changed, 107 insertions, 28 deletions
@@ -17,6 +17,7 @@ #define MAXFILENAME 256 #define MAXEDID 128 +#include "drm_edid.h" int getcardlist(struct dirent *cardlist[]) { DIR* dp; @@ -112,6 +113,30 @@ char chrmap(char ch) { return 'A'+ch-1; } +struct modeinfo +{ + char mode[12]; + int freq; +}; +void finddmtmode(struct modeinfo* m,struct modeline* rmode) +{ + for(int i=0;i<sizeof(dmt_modes)/sizeof(struct modeline);i++) + { + if(strcmp(m->mode,dmt_modes[i].name) == 0 && m->freq==dmt_modes[i].freq) + { + memcpy(rmode,&dmt_modes[i],sizeof(struct modeline)); + } + } +}void findestmode(struct modeinfo* m,struct modeline* rmode) +{ + for(int i=0;i<16;i++) + { + if(strcmp(m->mode,est_modes[i].name) == 0 && m->freq==est_modes[i].freq) + { + memcpy(rmode,&est_modes[i],sizeof(struct modeline)); + } + } +} void analizeedid(char edid[]) { char head[]={0x0,0xff,0xff,0xff,0xff,0xff,0xff,0x0}; @@ -187,42 +212,82 @@ void analizeedid(char edid[]) printf("\tChromaInfo: %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx \n",edid[0x19],edid[0x1a],edid[0x1b],edid[0x1c],edid[0x1d],edid[0x1e],edid[0x1f],edid[0x20],edid[0x21],edid[0x22]); - char estiming[512]; - memset(estiming,0,512); - if(edid[0x24] & 1) strcat(estiming,"1280x1024 @ 75 \t"); - if(edid[0x24] & 2) strcat(estiming,"1024x768 @ 75 \t"); - if(edid[0x24] & 4) strcat(estiming,"1024x768 @ 70 \t"); - if(edid[0x24] & 8) strcat(estiming,"1024x768 @ 60 \t"); - if(edid[0x24] & 16) strcat(estiming,"1024x768 @ 87 \t"); - if(edid[0x24] & 32) strcat(estiming,"832x624 @ 75 \t"); - if(edid[0x24] & 64) strcat(estiming,"800x600 @ 75 \t"); - if(edid[0x24] & 128) strcat(estiming,"800x600 @ 72 \t"); - - if(edid[0x23] & 1) strcat(estiming,"800x600 @ 60 \t"); - if(edid[0x23] & 2) strcat(estiming,"800x600 @ 56 \t"); - if(edid[0x23] & 4) strcat(estiming,"640x480 @ 75 \t"); - if(edid[0x23] & 8) strcat(estiming,"640x480 @ 72 \t"); - if(edid[0x23] & 16) strcat(estiming,"640x480 @ 67 \t"); - if(edid[0x23] & 32) strcat(estiming,"640x480 @ 60 \t"); - if(edid[0x23] & 64) strcat(estiming,"720x400 @ 88 \t"); - if(edid[0x23] & 128) strcat(estiming,"720x400 @ 70 \t"); + //char estiming[512]; + char estiming[16][256]; +// memset(estiming,0,512); +// if(edid[0x24] & 1) strcat(estiming,"1280x1024 @ 75 \t"); +// if(edid[0x24] & 2) strcat(estiming,"1024x768 @ 75 \t"); +// if(edid[0x24] & 4) strcat(estiming,"1024x768 @ 70 \t"); +// if(edid[0x24] & 8) strcat(estiming,"1024x768 @ 60 \t"); +// if(edid[0x24] & 16) strcat(estiming,"1024x768 @ 87 \t"); +// if(edid[0x24] & 32) strcat(estiming,"832x624 @ 75 \t"); +// if(edid[0x24] & 64) strcat(estiming,"800x600 @ 75 \t"); +// if(edid[0x24] & 128) strcat(estiming,"800x600 @ 72 \t"); +// +// if(edid[0x23] & 1) strcat(estiming,"800x600 @ 60 \t"); +// if(edid[0x23] & 2) strcat(estiming,"800x600 @ 56 \t"); +// if(edid[0x23] & 4) strcat(estiming,"640x480 @ 75 \t"); +// if(edid[0x23] & 8) strcat(estiming,"640x480 @ 72 \t"); +// if(edid[0x23] & 16) strcat(estiming,"640x480 @ 67 \t"); +// if(edid[0x23] & 32) strcat(estiming,"640x480 @ 60 \t"); +// if(edid[0x23] & 64) strcat(estiming,"720x400 @ 88 \t"); +// if(edid[0x23] & 128) strcat(estiming,"720x400 @ 70 \t"); - printf("\tEstablishedTiming: \n\t\t"); - int len=strlen(estiming); - for(int i=0;i<len;i++) + struct modeinfo estmode[]={ + {"1280x1024",75} , {"1024x768",75} , {"1024x768",70} , {"1024x768",60} , {"1024x768",87} , {"832x624",75} , {"800x600",75} , {"800x600",72} , {"800x600",60} , {"800x600",56} , {"640x480",75} , {"640x480",72} , {"640x480",67} , {"640x480",60} , {"720x400",88} , {"720x400",70}}; + struct modeinfo curestmode[80]; +// printf("\tEstablishedTiming: \n\t\t"); + printf("\tEstablishedTiming: \n"); +// int len=strlen(estiming); +// for(int i=0;i<len;i++) +// { +// if(estiming[i] == '\t') +// printf("\n\t\t"); +// else +// printf("%c",estiming[i]); +// } + char es = edid[0x24]; + int escount=0; + for(int i=0;i<8;i++) { - if(estiming[i] == '\t') - printf("\n\t\t"); - else - printf("%c",estiming[i]); + if(es & 0x01) + { + memcpy(&curestmode[escount],&estmode[i],sizeof(struct modeinfo)); + escount++; + } + es = es >> 1; } + es = edid[0x23]; + for(int i=0;i<8;i++) + { + if(es & 0x01) + { + memcpy(&curestmode[escount],&estmode[i],sizeof(struct modeinfo)); + escount++; + } + es = es >> 1; + } + for(int i=0;i<escount;i++) + { + struct modeline rmodeline; + findestmode(&curestmode[i],&rmodeline); + // printf("\t\t%s @ %d\n",curestmode[i].mode,curestmode[i].freq); + printf("\t\t%s @ %d %d %d %d\n",rmodeline.name,rmodeline.freq,rmodeline.pclock, rmodeline.htot,rmodeline.vtot); + } + char stdtiming[8][256]; struct { int vertfrequency:6; int aspectratio:2; }stdtiminginfo; + printf("\r\tStandTiming:\n"); + memset(curestmode,0,80*sizeof(struct modeinfo)); + escount = 0; + struct modeinfo tdmtmode; + struct modeline rmodeline; + char tmod[20]; for(int i=0;i<8;i++) { int tem=0; @@ -242,7 +307,21 @@ void analizeedid(char edid[]) int hratio = atoi(ratio[0]); int vratio = atoi(ratio[1]); if(tem != 1) - printf("\t\t%dx%d @ %d (%s)\n",tem*8+248,(tem*8+248)*vratio/hratio,stdtiminginfo.vertfrequency+60,msg); + { + memset(&rmodeline,0,sizeof(struct modeline)); + memset(&tdmtmode,0,sizeof(struct modeinfo)); + memset(tmod,0,20); + sprintf(tmod,"%dx%d",tem*8+248,(tem*8+248)*vratio/hratio,stdtiminginfo.vertfrequency+60); + + strcat(tdmtmode.mode,tmod); + tdmtmode.freq=stdtiminginfo.vertfrequency+60; + + //printf("\t\t%s @ %d\n",tdmtmode.mode,tdmtmode.freq); + finddmtmode(&tdmtmode,&rmodeline); + + printf("\t\t%s @ %d %d %d %d (%s)\n",rmodeline.name, rmodeline.freq, rmodeline.pclock, rmodeline.htot, rmodeline.vtot, msg); + //printf("\t\t%dx%d @ %d (%s)\n",tem*8+248,(tem*8+248)*vratio/hratio,stdtiminginfo.vertfrequency+60,msg); + } } union { @@ -326,7 +405,7 @@ void analizeedid(char edid[]) Vblank = vdisp.value; freq = pixclk.clk*10000.0/(Hdisp+Hblank)/(Vdisp+Vblank); //printf("Vblank: %d\n",vdisp.value); - printf("\tDetailTiming:\n\t\t%dx%d @ %.2f %d\n",Hdisp,Vdisp,freq,pixclk.clk*10000); + printf("\tDetailTiming:\n\t\t%dx%d @ %.2f %d %d %d\n",Hdisp,Vdisp,freq,pixclk.clk*10000,Hdisp+Hblank,Vdisp+Vblank); union { struct |