diff options
author | Yi Sun <yi.sun@intel.com> | 2011-08-04 00:50:06 +0800 |
---|---|---|
committer | Yi Sun <yi.sun@intel.com> | 2011-08-04 00:50:06 +0800 |
commit | 2af02c8a2895ea1caca6dc44830fdddf1b678995 (patch) | |
tree | 42f43bbbe881908ae6d03f495fbdca2e921ada8f | |
parent | 38b003efdb505da87a882f5c96807bbe2e9101ec (diff) |
Fix segmengfault.
-rw-r--r-- | testedid.c | 44 |
1 files changed, 25 insertions, 19 deletions
@@ -264,13 +264,13 @@ get_connected_edid_list (char ***edid_list) { char **connected_card_list; int connected_count; - connected_count = get_connected_card_list( & connected_card_list ); + (*edid_list) = malloc (connected_count * sizeof(char)); + for (int i = 0; i < connected_count; i++) { //sprintf(edid_file, "%s%s/edid", EDIDPATH, dirent_ptr->d_name); - (*edid_list)[i] = get_edid(connected_card_list[i]); } return connected_count; @@ -281,6 +281,7 @@ static char chrmap(char ch) { return 'A'+ch-1; } + /* Get the whole mode line declared in DRM by mode and frequency. */ @@ -295,7 +296,7 @@ static void find_dmt_mode(struct mode_line* m, struct drm_display_mode* rmode) static void find_est_mode(struct mode_line* m, struct drm_display_mode* rmode) { - for (int i=0; i < 16; i++) { + 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 drm_display_mode)); } @@ -303,7 +304,7 @@ static void find_est_mode(struct mode_line* m, struct drm_display_mode* rmode) } static int gethdmiblock(char edid[]) { - for (int i=0; i < MAXEDID; i++) { + for (int i = 0; i < MAXEDID; i++) { if (edid[i] == 0x03 && edid[i+1] == 0x0c && edid[i+2] == 0) { return i; } @@ -457,7 +458,7 @@ static int parse_edid_power_support(char edid[]) static int parse_edid_established_timing(char edid[]) { /* - * 23h 1 Established Timing I + * 23h 1 Established Timing I * 7 720 x 400 @ 70Hz IBM, VGA * 6 720 x 400 @ 88Hz IBM, XGA2 * 5 640 x 480 @ 60Hz IBM, VGA @@ -466,7 +467,7 @@ static int parse_edid_established_timing(char edid[]) * 2 640 x 480 @ 75Hz VESA * 1 800 x 600 @ 56Hz VESA * 0 800 x 600 @ 60Hz VESA - * 24h 1 Established Timing II + * 24h 1 Established Timing II * 7 800 x 600 @ 72Hz VESA * 6 800 x 600 @ 75Hz VESA * 5 832 x 624 @ 75Hz Apple, Mac II @@ -475,7 +476,7 @@ static int parse_edid_established_timing(char edid[]) * 2 1024 x 768 @ 70Hz VESA * 1 1024 x 768 @ 75Hz VESA * 0 1280 x 1024 @ 75Hz VESA - * 25h 1 Manufacturer's Timings + * 25h 1 Manufacturer's Timings * 7 1152 x 870 @ 75Hz Apple, Mac II */ struct mode_line curestmode[80]; @@ -509,7 +510,7 @@ static int parse_edid_established_timing(char edid[]) static int parse_edid_standar_timing(char edid[]) { /* - * 26h 1 256 pixels → 2288 pixels, in increments of 8 pixels + * 26h 1 256 pixels → 2288 pixels, in increments of 8 pixels * 00h Reserved: Do not use. * Bit Definitions Description * 7 6 _ _ _ _ _ _ Image Aspect Ratio: bits 7 & 6 @@ -519,27 +520,27 @@ static int parse_edid_standar_timing(char edid[]) * 1 1 _ _ _ _ _ _ 16 : 9 AR * 5 4 3 2 1 0 Field Refresh Rate: bits 5 → 0 * Value Stored (in binary) = Field Refresh Rate (in Hz) – 60 - * 27h 1 + * 27h 1 * n n n n n n * Range: 60 Hz → 123Hz */ struct StdTiming stdtiminginfo; - struct mode_line curestmode[80]; - printf("\r\tStandarTiming:\n"); - memset(curestmode, 0, 80 * sizeof(struct mode_line)); -// int escount = 0; struct mode_line tdmtmode; struct drm_display_mode rmodeline; char tmod[20]; char msg[512]; char ratio[2][6]; + + printf("\r\tStandarTiming:\n"); + memset(curestmode, 0, 80 * sizeof(struct mode_line)); for (int i = 0; i < 8; i++) { int tem = 0; memcpy(&tem, &edid[38 + 2 * i], 1); memcpy(&stdtiminginfo, &edid[39 + 2 * i], 1); memset(msg, 0, 256); memset(ratio, 0, sizeof(ratio)); + if(!(stdtiminginfo.aspectratio & 3)) strcat(msg, "16:10"); else if(stdtiminginfo.aspectratio & 1) strcat(msg, "4:3"); else if(stdtiminginfo.aspectratio & 2) strcat(msg, "5:4"); @@ -579,7 +580,6 @@ static int parse_edid_detail_timing(char edid[]) pixclk.clkchr.clkl = edid[0x36 + i*18]; pixclk.clkchr.clkh = edid[0x37 + i*18]; if (pixclk.clk == 0) continue; - //printf("pixel clock: %d\n",pixclk.clk*10); union H4bit h4bit; vdisp.vdispchr.vdispl = edid[0x36 + i*18 + 2]; @@ -587,7 +587,6 @@ static int parse_edid_detail_timing(char edid[]) vdisp.vdispchr.vdispl = edid[0x36+ i*18 + 2]; vdisp.vdispchr.vdisph = h4bit.h4bitchr.disp; Hdisp = vdisp.value; - // printf("Hdisplay: %d\n",vdisp.value); memset(&h4bit, 0, 1); memset(&vdisp, 0, 4); @@ -596,7 +595,6 @@ static int parse_edid_detail_timing(char edid[]) vdisp.vdispchr.vdispl = edid[0x36+ i*18 + 5]; vdisp.vdispchr.vdisph = h4bit.h4bitchr.disp; Vdisp = vdisp.value; - //printf("Vdisplay: %d\n",vdisp.value); memset(&h4bit,0,1); memset(&vdisp,0,4); @@ -605,7 +603,6 @@ static int parse_edid_detail_timing(char edid[]) vdisp.vdispchr.vdispl = edid[0x36+ i*18 + 3]; vdisp.vdispchr.vdisph = h4bit.h4bitchr.blank; Hblank = vdisp.value; - //printf("Hblank:: %d\n",vdisp.value); memset(&h4bit,0,1); memset(&vdisp,0,4); @@ -615,7 +612,7 @@ static int parse_edid_detail_timing(char edid[]) vdisp.vdispchr.vdisph = h4bit.h4bitchr.blank; 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 %d %d\n", Hdisp, Vdisp, freq, pixclk.clk * 10, Hdisp + Hblank, Vdisp + Vblank); union H2bit h2bit; @@ -623,7 +620,6 @@ static int parse_edid_detail_timing(char edid[]) memset(&sync, 0, 4); sync.syncchr.syncl = edid[0x36 + i*18 + 8]; sync.syncchr.synch = h2bit.chr.vsync; - // printf("VSync: %d\n",sync.value); } return 0; } @@ -652,13 +648,21 @@ static int parse_edid(char edid[]) { if (check_edid(edid)) return 1; + parse_edid_vendor_product(edid); + parse_edid_video_input(edid); + parse_edid_power_support(edid); + parse_edid_established_timing(edid); + parse_edid_standar_timing(edid); + parse_edid_detail_timing(edid); + parse_edid_hdmi_bpp(edid); + return 0; } @@ -667,6 +671,7 @@ static int parse_edid(char edid[]) int main(void) { + printf("9999999999999999999asdf"); int connected_count; char **edid_list; char **connected_card_list; @@ -680,6 +685,7 @@ int main(void) printf("\33[1;;32m%d. Connected monitor card: %s\n\33[0m", 1, connected_card_list[0]); print_edid(edid_list[i]); + parse_edid(edid_list[i]); } |