summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <root@sunyi-pc.(none)>2011-05-25 10:24:45 +0800
committerroot <root@sunyi-pc.(none)>2011-05-25 10:24:45 +0800
commit5e401a0b8260c0a536c70dba4f7b0b7f6b156ae0 (patch)
tree6ddc57791dc1fa44dd7cb10f42ded3bdf9f7ece8
parentcf17bce1034ad2508a53f3f5a099384343581fae (diff)
More information: pixclock, Htot and Vtot.
-rw-r--r--testedid.c135
1 files changed, 107 insertions, 28 deletions
diff --git a/testedid.c b/testedid.c
index a197f86..b04080e 100644
--- a/testedid.c
+++ b/testedid.c
@@ -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