📄 em9010.c
字号:
em9010_write(em, 0xa, 0x6); em8300_dicom_fill_dispbuffers(em, 2, 0, 2, em->dbuf_info.ysize, 0, 0x80808080 ); em8300_dicom_fill_dispbuffers(em, 356, 0, 2, em->dbuf_info.ysize, 0xffffffff, 0x80808080 ); em->overlay_a[EM9010_ATTRIBUTE_XCORR] = em->overlay_xcorr_default; sub_4288c(em, 0, 0, em->dbuf_info.xsize, em->dbuf_info.ysize, em->overlay_a[EM9010_ATTRIBUTE_XOFFSET], em->overlay_a[EM9010_ATTRIBUTE_YOFFSET], em->overlay_a[EM9010_ATTRIBUTE_XCORR], em->overlay_double_y); pr_debug("em9010: Done drawing xcorr testpattern\n"); mdelay(20); if (!sub_2AC2D(em)) { return 0; } em9010_write(em, 0, 0x14); em9010_write(em, 0, 0x10); j=1; if (em->overlay_xcorr_default > 1200) { j=2; } for (i=-100; i < 150; i++) { if (!sub_2AC2D(em)) { return 0; } if (! (em9010_read(em, 0) & 4)) { em->overlay_a[EM9010_ATTRIBUTE_XCORR] = i*j+em->overlay_xcorr_default; sub_4288c(em, 0, 0, em->dbuf_info.xsize, em->dbuf_info.ysize, em->overlay_a[EM9010_ATTRIBUTE_XOFFSET], em->overlay_a[EM9010_ATTRIBUTE_YOFFSET], em->overlay_a[EM9010_ATTRIBUTE_XCORR], em->overlay_double_y); if (!sub_2AC2D(em)) { return 0; } } else { break; } } if (em->overlay_xcorr_default > 1500) { em->overlay_a[EM9010_ATTRIBUTE_XCORR]+=2; } else { em->overlay_a[EM9010_ATTRIBUTE_XCORR]-=2; } sub_4288c(em, 0, 0, em->dbuf_info.xsize, em->dbuf_info.ysize, em->overlay_a[EM9010_ATTRIBUTE_XOFFSET], em->overlay_a[EM9010_ATTRIBUTE_YOFFSET], em->overlay_a[EM9010_ATTRIBUTE_XCORR], em->overlay_double_y); pr_debug("em9010: Sucessfully calibrated x correction (%d)\n", em->overlay_a[EM9010_ATTRIBUTE_XCORR]); return 1;}/* l7 = [ebp-0x18] l6 = [ebp-0xc] l5 = [ebp-0x1d] l4 = [ebp-0x14] l2 = [ebp-8] l3 = [ebp-4] l1 = [ebp-0x10] */int loc_2bcfe(struct em8300_s *em){ int l1 = 10,l2,l3,l4,l5,l6,l7; em9010_write(em, 4, 0); em9010_write(em, 3, 0x80); l2 = em9010_read(em, 2); l3 = em9010_read(em, 1); while (--l1 != 0) { l4 = em9010_read(em,1); if ((l4 & 0xff) == (l3 & 0xff)) { continue; } if ((l3 & 0xff) > (l4 & 0xff)) { l5 = l3; } else { l5 = l4; } l3 = l5; l2 = 0; break; } l6 = (l3 << 8) + l2; l7 = 165000/(l6+2); if ((l7 > em->overlay_dword_24bb8+1) || (l7 < em->overlay_dword_24bb8-1)) { em->overlay_dword_24bb8 = l7; } else { l7 = em->overlay_dword_24bb8; } if ((l7 < 100) || (l7 > 1000)) { if (em->overlay_yres) { l7 = em->overlay_yres * 62 / 100; } } pr_debug("em9010: loc_2bcfe -> %d\n",l7); return l7;}/* loc_2a66e l13 [ebp-38] l12 [ebp-8] l11 [ebp-20] l10 [ebp-34] l9 [ebp-28] l8 [ebp-4] l7 [ebp-18] l6 [ebp-0c] l5 [ebp-30] l4 [ebp-10] l1 [ebp-14] l2 [ebp-1c] l3燵ebp-24] */int loc_2A66E(struct em8300_s *em){ int l1,l2,l3,l4,l5,l6=0,l7,l8,l9,l10,l11,l12,l13; l1 = 70000; l2 = 0; l3 = 0; l7 = em->overlay_70 / 10; l4 = 1000; l5 = em->overlay_xres; if (l5 <= 720) { if (l5 == 720) { l6 = 0x398; } else if (l5 == 640) { l6 = 0x370; } } else if (l5 <= 1024) { if (l5 == 1024) { l6 = 0x500; } else if (l5 == 800) { l6 = 0x400; } } else if (l5 <= 1280) { if (l5 == 1280) { l6 = 0x60e; } else if (l5 == 1152) { l6 = 0x5a0; } } else if (l5 == 1600) { l6 = 0x7d0; } else if (l5 == 2048) { l6 = 0xa00; } else { l6 = 0x500; } pr_debug("l6 * l7 * (1 << l2)=%d, l1=%d\n", l6 * l7 * (1 << l2), l1); if (l6 * l7 * (1 << l2) >= l1) { l4 = l6*l7 * (1 << l2) * 1000 / l1; l8 = l1 / (l7*(1 << l2)) ; l9 = l1 / (1<<l2); } else { l4=1000; l8=l6; l9=l8*l7; } em->overlay_xcorr_default = l4; if ((em->overlay_xcorr_default < 0x352) || (em->overlay_xcorr_default > 0xdac)) { em->overlay_xcorr_default = 0x5dc; } if (l9 * (1<<l2) > 0x7530) { l3 = l8*(1<<l2)-2; if (l3 > 0xfff) { l10 = 0xfff; } else { l10 = l3; } l3 = l10; l11 = ((l3 >> 8) & 0xf) | (l2 << 4); l12 = l3; } else { l2++; l3 = l8*(1<<l2)-2; if (l3 > 0xfff) { l13 = 0xfff; } else { l13 = l3; } l3 = l13; l11 = ((l3 >> 8) & 0xf) | (l2 << 4); l12 = l3; } pr_debug("em9010: Writing %x to 16-bit register 1.\n", l12 | (l11 << 8)); em9010_write16(em, 1, l12 | (l11 << 8)); return 1;}int em9010_overlay_set_res(struct em8300_s *em, int xres, int yres){ pr_debug("em9010: Setting resolution %d x %d\n", xres, yres); em->overlay_xres = xres; em->overlay_yres = yres; em->overlay_70 = loc_2bcfe(em); loc_2A66E(em); em->overlay_a[EM9010_ATTRIBUTE_XCORR] = em->overlay_xcorr_default; pr_debug("em9010: Xcorrector: %d\n", em->overlay_a[EM9010_ATTRIBUTE_XCORR]); em9010_overlay_update(em); return 1;}static int set_keycolor(struct em8300_s *em, unsigned upper, unsigned lower){ int ru = (upper >> 16) & 0xff; int gu = (upper >> 8) & 0xff; int bu = (upper) & 0xff; int rl = (lower >> 16) & 0xff; int gl = (lower >> 8) & 0xff; int bl = (lower) & 0xff; em9010_write16(em, 0x8, (ru << 8) | (rl & 0xff)); em9010_write16(em, 0x10, (gu << 8) | (gl & 0xff)); em9010_write16(em, 0x20, (bu << 8) | (bl & 0xff)); return 1;}int em9010_overlay_set_signalmode(struct em8300_s *em, int val){ switch (val) { case EM8300_OVERLAY_SIGNAL_ONLY: em9010_write(em, 7, em->overlay_a[EM9010_ATTRIBUTE_JITTER]); break; case EM8300_OVERLAY_SIGNAL_WITH_VGA: em9010_write(em, 7, em->overlay_a[EM9010_ATTRIBUTE_JITTER] | 0x40); break; case EM8300_OVERLAY_VGA_ONLY: em9010_write(em, 7, em->overlay_a[EM9010_ATTRIBUTE_JITTER] | 0x80); break; default: return 0; } pr_debug("em9010: overlay reg 7 = %x \n", em9010_read(em, 7)); return 1;}int em9010_overlay_update(struct em8300_s *em){ pr_debug("em9010: Update overlay: enabled=%d, gamma_enabled=%d\n", em->overlay_enabled, em->overlay_gamma_enable); em9010_write(em, 5, 0); em9010_write(em, 4, 0); em9010_write(em, 6, em->overlay_a[EM9010_ATTRIBUTE_STABILITY]); if (em->overlay_enabled) { em->overlay_gamma_enable=4; em9010_write(em, 9, em->overlay_gamma_enable); em9010_overlay_set_signalmode(em, EM8300_OVERLAY_SIGNAL_WITH_VGA); } else { em->overlay_gamma_enable=0; em9010_write(em, 9, em->overlay_gamma_enable); em9010_overlay_set_signalmode(em, EM8300_OVERLAY_VGA_ONLY); } em9010_write(em, 8, 0x80); if (em->overlay_gamma_enable) { em9010_write(em, 0xc, 0x8e); } else { em9010_write(em, 0xc, 0xe); } //wait on the display of one frame at least mdelay(20); //the setting of the overlay mode shall be done before calling loc_2BE50! em->overlay_double_y = loc_2BE50(em); pr_debug("em9010: ydouble: %d\n", em->overlay_double_y); switch(em->overlay_mode) { case EM8300_OVERLAY_MODE_RECTANGLE: em9010_write(em, 0xa, 0x77); break; case EM8300_OVERLAY_MODE_OVERLAY: em9010_write(em, 0xb, 0xc8); em9010_write(em, 0xa, 0x0); set_keycolor(em, em->overlay_a[EM9010_ATTRIBUTE_KEYCOLOR_UPPER], em->overlay_a[EM9010_ATTRIBUTE_KEYCOLOR_LOWER]); break; } return 0;}int em9010_init(struct em8300_s *em){ em->overlay_dword_24bb8 = 2000; em9010_overlay_set_res(em, 1280, 1024); em->overlay_frame_xpos=0; em->overlay_frame_ypos=0; em->overlay_frame_width=720; em->overlay_frame_height=480; em->overlay_a[EM9010_ATTRIBUTE_YOFFSET]=43; em->overlay_a[EM9010_ATTRIBUTE_XOFFSET]=225; em->overlay_gamma_enable=4; return 1;}int em9010_set_attribute(struct em8300_s *em, int attribute, int value){ if (attribute <= EM9010_ATTRIBUTE_MAX) { em->overlay_a[attribute] = value; switch(attribute) { case EM9010_ATTRIBUTE_JITTER: em9010_write(em, 7, (em9010_read(em, 7) & 0xf0) | value); break; case EM9010_ATTRIBUTE_STABILITY: em9010_write(em, 6, value); break; } return 0; } else { return -1; }}int em9010_get_attribute(struct em8300_s *em, int attribute){ if (attribute <= EM9010_ATTRIBUTE_MAX) { return em->overlay_a[attribute]; } else { return -1; }}int em8300_ioctl_overlay_calibrate(struct em8300_s *em, em8300_overlay_calibrate_t *c){ int r1; em9010_write(em, 0xc, 0xe); switch (c->cal_mode) { case EM8300_OVERLAY_CALMODE_XOFFSET: if (em9010_calibrate_xoffset(em)) { c->result = em->overlay_a[EM9010_ATTRIBUTE_XOFFSET]; } else { return 0; } break; case EM8300_OVERLAY_CALMODE_YOFFSET: if (em9010_calibrate_yoffset(em)) { c->result = em->overlay_a[EM9010_ATTRIBUTE_YOFFSET]; } else { return 0; } break; case EM8300_OVERLAY_CALMODE_XCORRECTION: if (em9010_calibrate_xcorrection(em)) { c->result = em->overlay_a[EM9010_ATTRIBUTE_XCORR]; em8300_dicom_fill_dispbuffers(em, 0x164, 0, 2, em->dbuf_info.ysize, 0x0, 0x80808080 ); } else { return 0; } break; case EM8300_OVERLAY_CALMODE_COLOR: r1=1; em9010_write(em, 0xb, 0xc8); mdelay(1); if (color_cal(em, c->arg2, 8, 0x37, 0x73, c->arg, &r1)) { c->result = r1 << 16; } else { return 0; } if (color_cal(em, c->arg2, 0x10, 0x57, 0x75, c->arg, &r1)) { c->result |= r1 << 8; } else { return 0; } if (color_cal(em, c->arg2, 0x20, 0x67, 0x76, c->arg, &r1)) { c->result |= r1; } else { return 0; } break; } if (1) { em9010_write (em, 0xc, 0xe); } return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -