diff options
author | Yi Sun <yi.sun@intel.com> | 2011-07-31 00:25:14 +0800 |
---|---|---|
committer | Yi Sun <yi.sun@intel.com> | 2011-07-31 00:25:14 +0800 |
commit | fef7018b8425306d9c3756476a97fa6cbe3b1092 (patch) | |
tree | ce9248b57198f002c6ebc1edb795aaf127698a9a | |
parent | 4ce1092a61cc1c8bbf44eeb3fc8d9f1cd34be078 (diff) |
Try to rewrite it.
-rwxr-xr-x | testedid.c | 205 |
1 files changed, 99 insertions, 106 deletions
@@ -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; } - |