⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 em9010.c

📁 linux TV 源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -