summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYi Sun <yi.sun@intel.com>2011-07-31 00:25:14 +0800
committerYi Sun <yi.sun@intel.com>2011-07-31 00:25:14 +0800
commitfef7018b8425306d9c3756476a97fa6cbe3b1092 (patch)
treece9248b57198f002c6ebc1edb795aaf127698a9a
parent4ce1092a61cc1c8bbf44eeb3fc8d9f1cd34be078 (diff)
Try to rewrite it.
-rwxr-xr-xtestedid.c205
1 files changed, 99 insertions, 106 deletions
diff --git a/testedid.c b/testedid.c
index 12c61c8..b4a5578 100755
--- a/testedid.c
+++ b/testedid.c
@@ -1,93 +1,83 @@
#include <stdio.h>
-
-#include <stddef.h> /*dir */
-#include <sys/types.h>
-#include <dirent.h>
-
+#include <stddef.h> /*dir */
+#include <sys/types.h>
+#include <dirent.h>
#include <string.h>
#include <malloc.h>
-
+#include <stdlib.h>
#include <fcntl.h> /*open */
-#include <sys/stat.h>
-#include <unistd.h> /*read */
-#include <stdlib.h>
+#include <unistd.h> /*read */
+#include <sys/stat.h>
+#include "drm_edid.h"
#define EDIDPATH "/sys/class/drm/"
#define MAXCARD 10
#define MAXFILENAME 256
#define MAXEDID 256
+struct mode_line
+{
+ char mode[12];
+ int freq;
+};
-#include "drm_edid.h"
-//int MAXEDID = 128;
-
-int getcardlist(struct dirent *cardlist[])
+int get_card_list(struct dirent *cardlist[])
{
- DIR* dp;
- struct dirent *ep;
- int cardnum=0;
+ DIR* drm_dir_ptr;
+ struct dirent *dirent_ptr;
+ int card_count=0;
+ drm_dir_ptr = opendir(EDIDPATH);
- dp = opendir(EDIDPATH);
- if (dp != NULL)
+ if(drm_dir_ptr != NULL)
{
- while (ep = readdir(dp))
+ while(dirent_ptr = readdir(drm_dir_ptr))
{
- //puts(ep->d_name);
- if( strstr(ep->d_name,"card0-")>0 )
+ if( strstr(dirent_ptr->d_name,"card0-")>0 )
{
- memcpy(cardlist[cardnum],ep,sizeof(struct dirent));
- cardnum++;
+ memcpy(cardlist[card_count],dirent_ptr,sizeof(struct dirent));
+ card_count++;
}
}
- closedir(dp);
+ closedir(drm_dir_ptr);
}
else
puts("Couldn't open the directory.");
- return cardnum;
+ return card_count;
}
-int getedid(char edidfile[],char edid[])
+int get_edid(char edid_file[],char edid[])
{
- int edidfp = open(edidfile,O_RDONLY);
- if(edidfp < 0)
+ int edid_fp = open(edid_file,O_RDONLY);
+ if(edid_fp < 0)
{
- printf("open edid file error:%s\n",edidfile);
+ printf("open edid file error:%s\n",edid_file);
return 1;
}
- int cun = read(edidfp, edid, MAXEDID);
+ int cun = read(edid_fp, edid, MAXEDID);
return cun;
-
}
-int getconcardlist(struct dirent *concardlist[],char *conedid[])
+int get_connected_card_list(struct dirent *connected_card_list[],char *connected_edid[])
{
- int connum=0;
+ int connecter_count=0;
struct dirent *cardlist[MAXCARD];
char edid[MAXEDID];
- char edidfile[MAXFILENAME];
+ char edid_file[MAXFILENAME];
for(int i=0; i<MAXCARD; i++)
{
cardlist[i] = (struct dirent*)malloc(sizeof(struct dirent));
}
+ int card_count =get_card_list(cardlist);
- int cardnum =getcardlist(cardlist);
- //printf("The card number is: %d\n",cardnum);
-
- for (int i=0; i<cardnum;i++)
+ for (int i=0; i<card_count;i++)
{
-// printf(" %s\n", cardlist[i]->d_name);
- memset(edidfile,0,MAXFILENAME);
- memset(edid,0,MAXEDID);
- strcat(edidfile,EDIDPATH);
- strcat(edidfile,cardlist[i]->d_name);
- strcat(edidfile,"/edid");
-// printf("filename:%s\n",edidfile);
- int cun = getedid(edidfile,edid);
-// printf("%d:",cun);
- if(cun !=0)
- {
- memcpy(concardlist[connum],cardlist[i],sizeof(struct dirent));
- memcpy(conedid[connum],edid,MAXEDID);
- connum++;
- }
+ memset(edid,0,MAXEDID);
+ sprintf(edid_file,"%s%s/edid",EDIDPATH,cardlist[i]->d_name);
+ int cun = get_edid(edid_file,edid);
+ if(cun !=0)
+ {
+ memcpy(connected_card_list[connecter_count],cardlist[i],sizeof(struct dirent));
+ memcpy(connected_edid[connecter_count],edid,MAXEDID);
+ connecter_count++;
+ }
}
for(int i=0; i<MAXCARD; i++)
@@ -95,69 +85,75 @@ int getconcardlist(struct dirent *concardlist[],char *conedid[])
if(cardlist[i] != NULL)
free(cardlist[i]);
}
- return connum;
+ return connecter_count;
}
-void printedid(char edid[])
+void print_edid(char edid[])
{
printf("\t%0004hhx: ",0);
for(int j=0;j<MAXEDID;j++)
{
- if(j%8 == 0 && j != 0)
- printf(" ");
- if(j%16 ==0 && j != 0)
- printf("\n\t%0004hhx: ",j);
- printf("%02hhx ",edid[j]);
+ if(j%8 == 0 && j != 0)
+ printf(" ");
+ if(j%16 ==0 && j != 0)
+ printf("\n\t%0004hhx: ",j);
+ printf("%02hhx ",edid[j]);
}
printf("\n");
-
}
char chrmap(char ch)
{
return 'A'+ch-1;
}
-struct modeinfo
+/*
+ Get the whole mode line declared in DRM by mode and frequency.
+*/
+void find_dmt_mode(struct mode_line* m,struct drm_display_mode* rmode)
{
- 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++)
+ for(int i=0;i<sizeof(dmt_modes)/sizeof(struct drm_display_mode);i++)
{
if(strcmp(m->mode,dmt_modes[i].name) == 0 && m->freq==dmt_modes[i].freq)
{
- memcpy(rmode,&dmt_modes[i],sizeof(struct modeline));
+ memcpy(rmode,&dmt_modes[i],sizeof(struct drm_display_mode));
}
}
-}void findestmode(struct modeinfo* m,struct modeline* rmode)
+}
+
+void find_est_mode(struct mode_line* m,struct drm_display_mode* 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));
+ memcpy(rmode,&est_modes[i],sizeof(struct drm_display_mode));
}
}
}
int gethdmiblock(char edid[])
{
- for(int i=0;i<MAXEDID;i++)
- {
- if(edid[i] == 0x03 && edid[i+1] == 0x0c && edid[i+2] == 0)
- {
- return i;
- }
- }
- return -1;
+ for(int i=0;i<MAXEDID;i++)
+ {
+ if(edid[i] == 0x03 && edid[i+1] == 0x0c && edid[i+2] == 0)
+ {
+ return i;
+ }
+ }
+ return -1;
}
-void analizeedid(char edid[])
+
+int check_edid(char edid[])
{
- char head[]={0x0,0xff,0xff,0xff,0xff,0xff,0xff,0x0};
- if( memcmp(edid,head,8) !=0)
- {
- puts("Bad edid file\n");
- exit(1);
- }
+ char edid_head[]={0x0,0xff,0xff,0xff,0xff,0xff,0xff,0x0};
+ if( memcmp(edid, edid_head,8) !=0)
+ {
+ puts("Bad edid file\n");
+ return 1;
+ }
+ return 0;
+}
+int parse_edid(char edid[])
+{
+ if (check_edid(edid))
+ return 1;
union mfdata
{
struct
@@ -225,7 +221,6 @@ 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];
char estiming[16][256];
// memset(estiming,0,512);
// if(edid[0x24] & 1) strcat(estiming,"1280x1024 @ 75 \t");
@@ -246,10 +241,9 @@ void analizeedid(char edid[])
// if(edid[0x23] & 64) strcat(estiming,"720x400 @ 88 \t");
// if(edid[0x23] & 128) strcat(estiming,"720x400 @ 70 \t");
- struct modeinfo estmode[]={
+ struct mode_line 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");
+ struct mode_line curestmode[80];
printf("\tEstablishedTiming: \n");
// int len=strlen(estiming);
// for(int i=0;i<len;i++)
@@ -265,7 +259,7 @@ void analizeedid(char edid[])
{
if(es & 0x01)
{
- memcpy(&curestmode[escount],&estmode[i],sizeof(struct modeinfo));
+ memcpy(&curestmode[escount],&estmode[i],sizeof(struct mode_line));
escount++;
}
es = es >> 1;
@@ -275,15 +269,15 @@ void analizeedid(char edid[])
{
if(es & 0x01)
{
- memcpy(&curestmode[escount],&estmode[i+8],sizeof(struct modeinfo));
+ memcpy(&curestmode[escount],&estmode[i+8],sizeof(struct mode_line));
escount++;
}
es = es >> 1;
}
for(int i=0;i<escount;i++)
{
- struct modeline rmodeline;
- findestmode(&curestmode[i],&rmodeline);
+ struct drm_display_mode rmodeline;
+ find_est_mode(&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);
}
@@ -296,10 +290,10 @@ void analizeedid(char edid[])
}stdtiminginfo;
printf("\r\tStandTiming:\n");
- memset(curestmode,0,80*sizeof(struct modeinfo));
+ memset(curestmode,0,80*sizeof(struct mode_line));
escount = 0;
- struct modeinfo tdmtmode;
- struct modeline rmodeline;
+ struct mode_line tdmtmode;
+ struct drm_display_mode rmodeline;
char tmod[20];
char ratio[2][6];
for(int i=0;i<8;i++)
@@ -322,8 +316,8 @@ void analizeedid(char edid[])
int vratio = atoi(ratio[1]);
if(tem != 1)
{
- memset(&rmodeline,0,sizeof(struct modeline));
- memset(&tdmtmode,0,sizeof(struct modeinfo));
+ memset(&rmodeline,0,sizeof(struct drm_display_mode));
+ memset(&tdmtmode,0,sizeof(struct mode_line));
memset(tmod,0,20);
sprintf(tmod,"%dx%d",tem*8+248, (int)(((tem*8+248)*1.0*vratio+0.5)/hratio),stdtiminginfo.vertfrequency+60);
@@ -331,7 +325,7 @@ void analizeedid(char edid[])
tdmtmode.freq=stdtiminginfo.vertfrequency+60;
// printf("\t\t%s @ %d\n",tdmtmode.mode,tdmtmode.freq);
- finddmtmode(&tdmtmode,&rmodeline);
+ find_dmt_mode(&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);
@@ -466,14 +460,14 @@ int main(void)
edid[i] = (char *)malloc(MAXEDID);
}
- int connum = getconcardlist(cardlist,edid);
- printf("\33[1;;32mThe connected monitor number: %d\n\33[0m",connum);
+ int connecter_count = get_connected_card_list(cardlist,edid);
+ printf("\33[1;;32mThe connected monitor number: %d\n\33[0m",connecter_count);
- for(int i=0;i<connum;i++)
+ for(int i=0;i<connecter_count;i++)
{
printf("\33[1;;32m%d. Connected monitor card: %s\n\33[0m",i+1,cardlist[i]->d_name);
- printedid(edid[i]);
- analizeedid(edid[i]);
+ print_edid(edid[i]);
+ parse_edid(edid[i]);
}
for(int i=0; i<MAXCARD; i++)
@@ -486,4 +480,3 @@ int main(void)
return 0;
}
-