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

📄 process_key.c

📁 SigmDesign SMP8634 media decode chip development SDK
💻 C
📖 第 1 页 / 共 5 页
字号:
			"  x: toggle video output enable/disable\n"			"  9: increase size, 3: decrease size, 2,4,6,8: move scaler window\n"			"  1: half size, 7: full size (use numerical key block)\n"			"  5: switch from VIDEO to OSD control (valid only if OSD is present)\n"			"  w: change non-linear width\n"			"  W: change non-linear level\n"			"  d: Dump OSD Info\n"			"  r: rotate picture\n");	if (keyflags & SET_KEY_SPI) 		fprintf(stderr, 			"  k - SPI channel change\n"			"  i - SPI PAT info\n"			"  m - SPI PMT change\n"			"  A - SPI audio stream change\n"			"  X - SPI video stream change\n"			"  a - Cycle through audio streams\n"			"  l - Choose audio stream\n"			"  K - switch between spi and file playback\n");		if (keyflags & SET_KEY_AUDIO) 		fprintf(stderr,			"  v: decrease volume - V: increase volume - _: mute\n"			"  E: toggle between dual modes (Stereo->LeftMono->RightMono->Mono)\n"			"  <, >: decrease/increase playback speed by 1 ppm\n");		if (keyflags & SET_KEY_DEBUG) 		fprintf(stderr, 			"  gr<A>: read 32 bits from gbus address A (hex)\n"			"  gw<A> <D>: write D (hex) to gbus address A (hex)\n"			"  gf<A>: measure frequency of the 32 bit register at gbus address A (hex)\n"			"  I: enter I2C debug access mode (HDMI only)\n"			"  M: enter video mode modificator\n"			"  |: print STC drift information\n"			"  !: show debug informations\n"			"  Y: show display debug informations\n"			"  Z: show vsync debug information\n"			"  *: force filter settings on main video scaler\n"			"  #: Turn HDCP on/off (HDMI only)\n");	}static void print_hz(RMuint32 f) {	if (f >= 1000000) fprintf(stderr, "%3lu,%03lu,%03lu", f / 1000000, (f / 1000) % 1000, f % 1000);	else if (f >= 1000) fprintf(stderr, "%7lu,%03lu", f / 1000, f % 1000);	else fprintf(stderr, "%11lu", f);}static RMuint32 get_freqency(	struct gbus *pGBus, 	RMuint32 addr, 	RMuint32 uSecDelay){	RMuint32 ref0, ref1, refd, ctr0, ctr1, ctrd;		/* avoid integer overflow */	if (uSecDelay > 159) uSecDelay = 159;		/* initial counter values */	ref0 = gbus_read_uint32(pGBus, 0x10048);  // REG_BASE_system_block + SYS_xtal_in_cnt	ctr0 = gbus_read_uint32(pGBus, addr);		/* loop for specified time, at least once */	do {		/* final counter values */		ref1 = gbus_read_uint32(pGBus, 0x10048);  // REG_BASE_system_block + SYS_xtal_in_cnt		ctr1 = gbus_read_uint32(pGBus, addr);				/* delta values */		refd = (ref1 > ref0) ? ref1 - ref0 : 0xFFFFFFFF - ref0 + ref1 + 1;		ctrd = (ctr1 > ctr0) ? ctr1 - ctr0 : 0xFFFFFFFF - ctr0 + ctr1 + 1;				/* check if xtal_in_ctr is stagnant */		if (! refd) return 0;	} while (refd < XTAL_HZ * uSecDelay / 1000);		/* return ctrd, normalized to Hz */	return (RMuint32)RM64mult32div32(ctrd, XTAL_HZ, refd);}RMstatus process_key(struct dcc_context *dcc_info, RMuint32 *cmd, RMuint32 keyflags){	RMascii key;	RMstatus err; in_key:			key = 0;	if (((dcc_info->state == RM_STOPPED) || (dcc_info->state == RM_PAUSED)) || (RMKeyAvailable())) 		key = RMGetKey();		err = handle_key(dcc_info, cmd, keyflags, key);	if (err == RM_PENDING) err = RM_OK;		if (RMSUCCEEDED(err) && (*cmd == RM_UNKNOWN) && ((dcc_info->state == RM_STOPPED) || (dcc_info->state == RM_PAUSED))) {		goto in_key;	}		return err;}RMstatus handle_debug_key(struct dcc_context *dcc_info, RMascii key, RMbool *processed);void send_hilight_button(struct dcc_context *dcc_info);RMstatus handle_debug_key(struct dcc_context *dcc_info, RMascii key, RMbool *processed){	static RMuint32 last_gr = 0;	RMstatus err;		*processed = TRUE;		// Debug access to HDMI I2C busses	if (dcc_info->dh_info && dcc_info->dh_info->pDH) {		err = DHDebugI2C(dcc_info->dh_info->pDH, KEY_CMD_I2C, key);		if (RMSUCCEEDED(err)) return RM_OK; //we processed the key	}		switch (key) {	case KEY_CMD_GBUS: {		RMascii k;		fprintf(stderr, "%c", key);		k = RMGetKey(); fprintf(stderr, "%c", k);		if ((k == 'r') || (k == 'w') || (k == 'f')) {			RMascii command = k;			RMbool error = FALSE;			RMuint32 a = 0, d = 0;			RMascii device[40];			struct llad *pLLAD;			struct gbus *pGBus;			RMPrintAscii(device, "%lu", dcc_info->chip_num);			pLLAD = llad_open(device);			pGBus = gbus_open(pLLAD);			do {				k = RMGetKey(); fprintf(stderr, "%c", k);				if ((k >= '0') && (k <= '9')) a = (a << 4) + (k - '0'); 				else if ((k >= 'A') && (k <= 'F')) a = (a << 4) + (k - 'A' + 10); 				else if ((k >= 'a') && (k <= 'f')) a = (a << 4) + (k - 'a' + 10); 				else if ((k == '\b') || (k == '\177')) a >>= 4; 				else {					if ((k != ' ') && (k != '\n')) error = TRUE; 					break;				}			} while (!(a & 0xF0000000));			if ((! error) && ((command == 'r') || (command == 'f'))) {				if (! a) {					a = last_gr;					fprintf(stderr, "%08lX", a);				} else last_gr = a;				if (command == 'r') {					fprintf(stderr, " = %08lX\n", gbus_read_uint32(pGBus, a));				} else {					fprintf(stderr, " @ ");					print_hz(get_freqency(pGBus, a, 100));					fprintf(stderr, " Hz\n");				}				k = '\n';			} else if (! error) {				do {					k = RMGetKey(); fprintf(stderr, "%c", k);					if ((k >= '0') && (k <= '9')) d = (d << 4) + (k - '0'); 					else if ((k >= 'A') && (k <= 'F')) d = (d << 4) + (k - 'A' + 10); 					else if ((k >= 'a') && (k <= 'f')) d = (d << 4) + (k - 'a' + 10); 					else if ((k == '\b') || (k == '\177')) d >>= 4; 					else {						if ((k != ' ') && (k != '\n')) error = TRUE; 						break;					}				} while (!(d & 0xF0000000));				if (! error) gbus_write_uint32(pGBus, a, d);			}			if (error) fprintf(stderr, " input error!\n");			gbus_close(pGBus);			llad_close(pLLAD);		}		if (k != '\n') fprintf(stderr, "\n");		break;	}	case KEY_CMD_VIDEOMODE: {		struct VideoMode VM;		RMascii k;		RMuint32 *mod;		err = get_current_video_mode(dcc_info, &VM);		if (RMFAILED(err)) break;		do {			mod = NULL;			fprintf(stderr, "Current video mode: (press corresponding key to modify value)\n");			fprintf(stderr, "  [a] PixelClock:     %lu\n", VM.PixelClock);			fprintf(stderr, "  [b] HActive:        %lu\n", VM.HActive);			fprintf(stderr, "  [c] HFrontPorch:    %lu\n", VM.HFrontPorch);			fprintf(stderr, "  [d] HSyncWidth:     %lu\n", VM.HSyncWidth);			fprintf(stderr, "  [e] HBackPorch:     %lu\n", VM.HBackPorch);			fprintf(stderr, "  [f] HSyncPolarity:  %s\n", VM.HSyncPolarity ? "positive" : "negative");			fprintf(stderr, "  [g] VActive:        %lu\n", VM.VActive);			fprintf(stderr, "  [h] VFrontPorch:    %lu\n", VM.VFrontPorch);			fprintf(stderr, "  [i] VSyncWidth:     %lu\n", VM.VSyncWidth);			fprintf(stderr, "  [j] VBackPorch:     %lu\n", VM.VBackPorch);			fprintf(stderr, "  [k] VSyncPolarity:  %s\n", VM.VSyncPolarity ? "positive" : "negative");			fprintf(stderr, "  [l] Interlaced:     %s\n", VM.Interlaced ? "yes" : "no");			fprintf(stderr, "  <enter> to quit\n");			k = RMGetKey();			if (k == '\n') {				RMuint32 HTotal, VTotal;				HTotal = VM.HActive + VM.HFrontPorch + VM.HSyncWidth + VM.HBackPorch;				VTotal = VM.VActive + VM.VFrontPorch + VM.VSyncWidth + VM.VBackPorch;				if (VM.Interlaced) VTotal = VTotal * 2 + 1;				fprintf(stderr, "New mode line for vesa.tbl:\n"					"%9lu, %4lu, %4lu, %4lu, %3lu, %3lu, %3lu, %d, %4lu, %2lu, %2lu, %2lu, %d, NewMode_%lux%lux%lu%s\n", 					VM.PixelClock, VM.HActive, VM.VActive, 					HTotal, VM.HFrontPorch, VM.HSyncWidth, VM.HBackPorch, VM.HSyncPolarity, 					VTotal, VM.VFrontPorch, VM.VSyncWidth, VM.VBackPorch, VM.VSyncPolarity, 					VM.HActive, VM.VActive, 					VM.PixelClock / (VTotal * HTotal), 					VM.Interlaced ? "i" : "");				break;			}			fprintf(stderr, "%c\n", k);			switch (k) {			case 'a': mod = &VM.PixelClock; break;			case 'b': mod = &VM.HActive; break;			case 'c': mod = &VM.HFrontPorch; break;			case 'd': mod = &VM.HSyncWidth; break;			case 'e': mod = &VM.HBackPorch; break;			case 'f': VM.HSyncPolarity = ! VM.HSyncPolarity; break;			case 'g': mod = &VM.VActive; break;			case 'h': mod = &VM.VFrontPorch; break;			case 'i': mod = &VM.VSyncWidth; break;			case 'j': mod = &VM.VBackPorch; break;			case 'k': VM.VSyncPolarity = ! VM.VSyncPolarity; break;			case 'l': {				VM.Interlaced = ! VM.Interlaced; 				if (VM.Interlaced) {					VM.VActive /= 2;					VM.VFrontPorch /= 2;					VM.VSyncWidth /= 2;					VM.VBackPorch /= 2;				} else {					VM.VActive *= 2;					VM.VFrontPorch *= 2;					VM.VSyncWidth *= 2;					VM.VBackPorch *= 2;				}				break;			}			}			if (mod) {				RMuint32 new = 0;				RMbool parse = FALSE;				fprintf(stderr, "press '+' or '-', or enter new value, <enter> to end\n");				do {					if (! parse) fprintf(stderr, "(%lu) ", *mod);					k = RMGetKey();												switch (k) {					case '+': parse = FALSE; (*mod)++; break;					case '-': parse = FALSE; if (*mod) (*mod)--; break;					case '0': case '1': case '2': case '3': case '4': 					case '5': case '6': case '7': case '8': case '9': 						if (! parse) {							new = 0;							parse = TRUE;						}						fprintf(stderr, "%c", k);						new = (new * 10) + (k - '0');						break;					case '\b': case '\177':						if (parse) {							fprintf(stderr, "%c", k);							new /= 10;						}						break;					case '\n': 						if (parse) {							*mod = new; 							parse = FALSE; 							k = ' ';						}						break;					default: parse = FALSE; break;					}					if (!parse) {						fprintf(stderr, "\n");						err = set_modifyed_video_mode(dcc_info, &VM);					}				} while (k != '\n');			} else {				err = set_modifyed_video_mode(dcc_info, &VM);			}			if (RMFAILED(err)) {				fprintf(stderr, "Error setting new mode!\n");			}		} while (TRUE);		break;	}	case KEY_CMD_HIGHLIGHT:		send_hilight_button(dcc_info);			break;	case KEY_CMD_STCDRIFT: {		RMuint32 STCModuleID = EMHWLIB_MODULE(STC, 0);		RMuint32 stc_freq, xtal_freq, rounds;		RMuint64 stc_curr;		RMuint32 xtal_curr;		RMint32 dist;		static RMint32 initialdist = 0;		enum ClockCounter ctr = ClockCounter_xtal_in;		enum PLLSource xtal = PLLSource_xtal;				err = RUAExchangeProperty(dcc_info->pRUA, PLL, RMPLLPropertyID_QuerySourceFrequency, 			&xtal, sizeof(xtal), &xtal_freq, sizeof(xtal_freq));		if (RMFAILED(err)) {			fprintf(stderr, "Can not get XTAL speed, %s\n", RMstatusToString(err));		}		err = RUAGetProperty(dcc_info->pRUA, STCModuleID, RMSTCPropertyID_StcTimeResolution, &stc_freq, sizeof(stc_freq));		if (RMFAILED(err)) {			fprintf(stderr, "Can not get STC speed, %s\n", RMstatusToString(err));		}		fprintf(stderr, "STC running at %lu Hz, Xtal running at %lu Hz\n", stc_freq, xtal_freq);		err = RUAExchangeProperty(dcc_info->pRUA, STCModuleID, RMSTCPropertyID_TimeInfo,			&xtal_freq, sizeof(xtal_freq), &stc_curr, sizeof(stc_curr));		if (RMFAILED(err)) {			fprintf(stderr, "Can not get STC, %s\n", RMstatusToString(err));		}		err = RUAExchangeProperty(dcc_info->pRUA, PLL, RMPLLPropertyID_QueryCounter,			&ctr, sizeof(ctr), &xtal_curr, sizeof(xtal_curr));		if (RMFAILED(err)) {			fprintf(stderr, "Can not get XTAL, %s\n", RMstatusToString(err));		}		if (! initialdist) initialdist = xtal_curr - (RMuint32)stc_curr;		xtal_curr -= initialdist;		rounds = (xtal_curr + xtal_freq) / xtal_freq;		dist = xtal_curr - (RMuint32)stc_curr;		if ((RMuint32)(RMabs(dist)) > (RMuint32)(xtal_freq * 10)) initialdist = 0;		fprintf(stderr, "stc:%lu - xtal:%lu = %ld, avrg: %ld ppm\n", 			(RMuint32)stc_curr, xtal_curr, dist, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -