亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sisusb_con.c

?? 底層驅動開發
?? C
?? 第 1 頁 / 共 3 頁
字號:
	} else if (dy < sy || (dy == sy && dx < sx)) {		src  = SISUSB_VADDR(sx, sy);		dest = SISUSB_VADDR(dx, dy);		for (i = height; i > 0; i--) {			sisusbcon_memmovew(dest, src, width * 2);			src  += cols;			dest += cols;		}	} else {		src  = SISUSB_VADDR(sx, sy + height - 1);		dest = SISUSB_VADDR(dx, dy + height - 1);		for (i = height; i > 0; i--) {			sisusbcon_memmovew(dest, src, width * 2);			src  -= cols;			dest -= cols;		}	}#endif	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return;	}	length = ((height * cols) - dx - (cols - width - dx)) * 2;	sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(dx, dy),				(u32)SISUSB_HADDR(dx, dy), length, &written);	up(&sisusb->lock);}/* interface routine */static intsisusbcon_switch(struct vc_data *c){	struct sisusb_usb_data *sisusb;	ssize_t written;	int length;	/* Returnvalue 0 means we have fully restored screen,	 *	and vt doesn't need to call do_update_region().	 * Returnvalue != 0 naturally means the opposite.	 */	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return 0;	/* sisusb->lock is down */	/* Don't write to screen if in gfx mode */	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return 0;	}	/* That really should not happen. It would mean we are	 * being called while the vc is using its private buffer	 * as origin.	 */	if (c->vc_origin == (unsigned long)c->vc_screenbuf) {		up(&sisusb->lock);		printk(KERN_DEBUG "sisusb: ASSERT ORIGIN != SCREENBUF!\n");		return 0;	}	/* Check that we don't copy too much */	length = min((int)c->vc_screenbuf_size,			(int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin));	/* Restore the screen contents */	sisusbcon_memcpyw((u16 *)c->vc_origin, (u16 *)c->vc_screenbuf,								length);	sisusb_copy_memory(sisusb, (unsigned char *)c->vc_origin,				(u32)SISUSB_HADDR(0, 0),				length, &written);	up(&sisusb->lock);	return 0;}/* interface routine */static voidsisusbcon_save_screen(struct vc_data *c){	struct sisusb_usb_data *sisusb;	int length;	/* Save the current screen contents to vc's private	 * buffer.	 */	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return;	/* sisusb->lock is down */	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return;	}	/* Check that we don't copy too much */	length = min((int)c->vc_screenbuf_size,			(int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin));	/* Save the screen contents to vc's private buffer */	sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin,								length);	up(&sisusb->lock);}/* interface routine */static intsisusbcon_set_palette(struct vc_data *c, unsigned char *table){	struct sisusb_usb_data *sisusb;	int i, j;	/* Return value not used by vt */	if (!CON_IS_VISIBLE(c))		return -EINVAL;	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return -EINVAL;	/* sisusb->lock is down */	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return -EINVAL;	}	for (i = j = 0; i < 16; i++) {		if (sisusb_setreg(sisusb, SISCOLIDX, table[i]))			break;		if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))			break;		if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))			break;		if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))			break;	}	up(&sisusb->lock);	return 0;}/* interface routine */static intsisusbcon_blank(struct vc_data *c, int blank, int mode_switch){	struct sisusb_usb_data *sisusb;	u8 sr1, cr17, pmreg, cr63;	ssize_t written;	int ret = 0;	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return 0;	/* sisusb->lock is down */	if (mode_switch)		sisusb->is_gfx = blank ? 1 : 0;	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return 0;	}	switch (blank) {	case 1:		/* Normal blanking: Clear screen */	case -1:		sisusbcon_memsetw((u16 *)c->vc_origin,				c->vc_video_erase_char,				c->vc_screenbuf_size);		sisusb_copy_memory(sisusb,				(unsigned char *)c->vc_origin,				(u32)(sisusb->vrambase +					(c->vc_origin - sisusb->scrbuf)),				c->vc_screenbuf_size, &written);		sisusb->con_blanked = 1;		ret = 1;		break;	default:	/* VESA blanking */		switch (blank) {		case 0: /* Unblank */			sr1   = 0x00;			cr17  = 0x80;			pmreg = 0x00;			cr63  = 0x00;			ret = 1;			sisusb->con_blanked = 0;			break;		case VESA_VSYNC_SUSPEND + 1:			sr1   = 0x20;			cr17  = 0x80;			pmreg = 0x80;			cr63  = 0x40;			break;		case VESA_HSYNC_SUSPEND + 1:			sr1   = 0x20;			cr17  = 0x80;			pmreg = 0x40;			cr63  = 0x40;			break;		case VESA_POWERDOWN + 1:			sr1   = 0x20;			cr17  = 0x00;			pmreg = 0xc0;			cr63  = 0x40;			break;		default:			up(&sisusb->lock);			return -EINVAL;		}		sisusb_setidxregandor(sisusb, SISSR, 0x01, ~0x20, sr1);		sisusb_setidxregandor(sisusb, SISCR, 0x17, 0x7f, cr17);		sisusb_setidxregandor(sisusb, SISSR, 0x1f, 0x3f, pmreg);		sisusb_setidxregandor(sisusb, SISCR, 0x63, 0xbf, cr63);	}	up(&sisusb->lock);	return ret;}/* interface routine */static intsisusbcon_scrolldelta(struct vc_data *c, int lines){	struct sisusb_usb_data *sisusb;	int margin = c->vc_size_row * 4;	int ul, we, p, st;	/* The return value does not seem to be used */	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return 0;	/* sisusb->lock is down */	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return 0;	}	if (!lines)		/* Turn scrollback off */		c->vc_visible_origin = c->vc_origin;	else {		if (sisusb->con_rolled_over >				(c->vc_scr_end - sisusb->scrbuf) + margin) {			ul = c->vc_scr_end - sisusb->scrbuf;			we = sisusb->con_rolled_over + c->vc_size_row;		} else {			ul = 0;			we = sisusb->scrbuf_size;		}		p = (c->vc_visible_origin - sisusb->scrbuf - ul + we) % we +				lines * c->vc_size_row;		st = (c->vc_origin - sisusb->scrbuf - ul + we) % we;		if (st < 2 * margin)			margin = 0;		if (p < margin)			p = 0;		if (p > st - margin)			p = st;		c->vc_visible_origin = sisusb->scrbuf + (p + ul) % we;	}	sisusbcon_set_start_address(sisusb, c);	up(&sisusb->lock);	return 1;}/* Interface routine */static voidsisusbcon_cursor(struct vc_data *c, int mode){	struct sisusb_usb_data *sisusb;	int from, to, baseline;	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return;	/* sisusb->lock is down */	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return;	}	if (c->vc_origin != c->vc_visible_origin) {		c->vc_visible_origin = c->vc_origin;		sisusbcon_set_start_address(sisusb, c);	}	if (mode == CM_ERASE) {		sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20);		sisusb->sisusb_cursor_size_to = -1;		up(&sisusb->lock);		return;	}	sisusb_set_cursor(sisusb, (c->vc_pos - sisusb->scrbuf) / 2);	baseline = c->vc_font.height - (c->vc_font.height < 10 ? 1 : 2);	switch (c->vc_cursor_type & 0x0f) {		case CUR_BLOCK:		from = 1;					to   = c->vc_font.height;					break;		case CUR_TWO_THIRDS:	from = c->vc_font.height / 3;					to   = baseline;					break;		case CUR_LOWER_HALF:	from = c->vc_font.height / 2;					to   = baseline;					break;		case CUR_LOWER_THIRD:	from = (c->vc_font.height * 2) / 3;					to   = baseline;					break;		case CUR_NONE:		from = 31;					to = 30;					break;		default:		case CUR_UNDERLINE:	from = baseline - 1;					to   = baseline;					break;	}	if (sisusb->sisusb_cursor_size_from != from ||	    sisusb->sisusb_cursor_size_to != to) {		sisusb_setidxreg(sisusb, SISCR, 0x0a, from);		sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0xe0, to);		sisusb->sisusb_cursor_size_from = from;		sisusb->sisusb_cursor_size_to   = to;	}	up(&sisusb->lock);}static intsisusbcon_scroll_area(struct vc_data *c, struct sisusb_usb_data *sisusb,					int t, int b, int dir, int lines){	int cols = sisusb->sisusb_num_columns;	int length = ((b - t) * cols) * 2;	u16 eattr = c->vc_video_erase_char;	ssize_t written;	/* sisusb->lock is down */	/* Scroll an area which does not match the	 * visible screen's dimensions. This needs	 * to be done separately, as it does not	 * use hardware panning.	 */	switch (dir) {		case SM_UP:			sisusbcon_memmovew(SISUSB_VADDR(0, t),					   SISUSB_VADDR(0, t + lines),					   (b - t - lines) * cols * 2);			sisusbcon_memsetw(SISUSB_VADDR(0, b - lines), eattr,					  lines * cols * 2);			break;		case SM_DOWN:			sisusbcon_memmovew(SISUSB_VADDR(0, t + lines),					   SISUSB_VADDR(0, t),					   (b - t - lines) * cols * 2);			sisusbcon_memsetw(SISUSB_VADDR(0, t), eattr,					  lines * cols * 2);			break;	}	sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(0, t),				(u32)SISUSB_HADDR(0, t), length, &written);	up(&sisusb->lock);	return 1;}/* Interface routine */static intsisusbcon_scroll(struct vc_data *c, int t, int b, int dir, int lines){	struct sisusb_usb_data *sisusb;	u16 eattr = c->vc_video_erase_char;	ssize_t written;	int copyall = 0;	unsigned long oldorigin;	unsigned int delta = lines * c->vc_size_row;	u32 originoffset;	/* Returning != 0 means we have done the scrolling successfully.	 * Returning 0 makes vt do the scrolling on its own.	 * Note that con_scroll is only called if the console is	 * visible. In that case, the origin should be our buffer,	 * not the vt's private one.	 */	if (!lines)		return 1;	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return 0;	/* sisusb->lock is down */	if (sisusb_is_inactive(c, sisusb)) {		up(&sisusb->lock);		return 0;	}	/* Special case */	if (t || b != c->vc_rows)		return sisusbcon_scroll_area(c, sisusb, t, b, dir, lines);	if (c->vc_origin != c->vc_visible_origin) {		c->vc_visible_origin = c->vc_origin;		sisusbcon_set_start_address(sisusb, c);	}	/* limit amount to maximum realistic size */	if (lines > c->vc_rows)		lines = c->vc_rows;	oldorigin = c->vc_origin;	switch (dir) {	case SM_UP:		if (c->vc_scr_end + delta >=				sisusb->scrbuf + sisusb->scrbuf_size) {			sisusbcon_memcpyw((u16 *)sisusb->scrbuf,					  (u16 *)(oldorigin + delta),					  c->vc_screenbuf_size - delta);			c->vc_origin = sisusb->scrbuf;			sisusb->con_rolled_over = oldorigin - sisusb->scrbuf;			copyall = 1;		} else			c->vc_origin += delta;		sisusbcon_memsetw(			(u16 *)(c->vc_origin + c->vc_screenbuf_size - delta),					eattr, delta);		break;	case SM_DOWN:		if (oldorigin - delta < sisusb->scrbuf) {			sisusbcon_memmovew((u16 *)(sisusb->scrbuf +							sisusb->scrbuf_size -							c->vc_screenbuf_size +							delta),					   (u16 *)oldorigin,					   c->vc_screenbuf_size - delta);			c->vc_origin = sisusb->scrbuf +					sisusb->scrbuf_size -					c->vc_screenbuf_size;			sisusb->con_rolled_over = 0;			copyall = 1;		} else			c->vc_origin -= delta;		c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;		scr_memsetw((u16 *)(c->vc_origin), eattr, delta);		break;	}	originoffset = (u32)(c->vc_origin - sisusb->scrbuf);	if (copyall)		sisusb_copy_memory(sisusb,			(char *)c->vc_origin,			(u32)(sisusb->vrambase + originoffset),			c->vc_screenbuf_size, &written);	else if (dir == SM_UP)		sisusb_copy_memory(sisusb,			(char *)c->vc_origin + c->vc_screenbuf_size - delta,			(u32)sisusb->vrambase + originoffset +					c->vc_screenbuf_size - delta,			delta, &written);	else		sisusb_copy_memory(sisusb,			(char *)c->vc_origin,			(u32)(sisusb->vrambase + originoffset),			delta, &written);	c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;	c->vc_visible_origin = c->vc_origin;	sisusbcon_set_start_address(sisusb, c);	c->vc_pos = c->vc_pos - oldorigin + c->vc_origin;	up(&sisusb->lock);	return 1;}/* Interface routine */static intsisusbcon_set_origin(struct vc_data *c){	struct sisusb_usb_data *sisusb;	/* Returning != 0 means we were successful.	 * Returning 0 will vt make to use its own	 *	screenbuffer as the origin.	 */	if (!(sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num)))		return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区欧美在线观看| 中文在线免费一区三区高中清不卡| 久久99国产精品尤物| 最新日韩在线视频| 欧美电影免费观看高清完整版在| 9久草视频在线视频精品| 久久99最新地址| 一区二区三区日韩欧美精品 | 精品一区二区三区av| 亚洲欧美中日韩| 久久久久亚洲综合| 日韩一区二区三区电影在线观看 | 国产精品视频九色porn| 日韩一区二区精品| 欧美色男人天堂| 91亚洲精品一区二区乱码| 国产乱人伦偷精品视频免下载| 午夜精品一区在线观看| 亚洲精选一二三| 日本一区二区三区dvd视频在线| 在线成人小视频| 色狠狠一区二区三区香蕉| 国产成人免费在线视频| 精品一区二区三区av| 日韩国产在线观看| 亚洲午夜激情网站| 一区二区三区免费在线观看| 国产精品天美传媒| 久久久久国产精品麻豆| 欧美成人在线直播| 欧美一区二区三区在线| 欧美天堂亚洲电影院在线播放| 99精品桃花视频在线观看| 国产成人av电影在线| 国产麻豆一精品一av一免费| 美日韩黄色大片| 日韩av不卡在线观看| 午夜精品久久久久| 亚洲国产视频一区二区| 亚洲尤物视频在线| 一区二区三区加勒比av| 亚洲一二三四区| 一区二区三区四区不卡视频| 亚洲一线二线三线视频| 亚洲国产欧美另类丝袜| 自拍av一区二区三区| 日韩理论片一区二区| 国产精品久99| 亚洲人成人一区二区在线观看 | 51精品国自产在线| 宅男在线国产精品| 欧美一级免费观看| 精品国产一区二区亚洲人成毛片 | 视频一区二区中文字幕| 日韩精品一级中文字幕精品视频免费观看| 一区二区三区蜜桃| 视频一区欧美精品| 日本中文字幕一区二区有限公司| 美日韩一区二区| 国产精品 欧美精品| 不卡的电影网站| 在线影院国内精品| 91精品国产综合久久精品图片| 欧美一级精品大片| 欧美极品aⅴ影院| 亚洲九九爱视频| 午夜精品久久久久久不卡8050| 捆绑变态av一区二区三区| 丰满白嫩尤物一区二区| 色婷婷亚洲婷婷| 欧美一区二区三区免费大片| 久久亚洲综合色一区二区三区| 中文字幕一区二区三区蜜月| 亚洲综合在线免费观看| 男人的天堂久久精品| 国产99久久久国产精品免费看| 色婷婷亚洲精品| 337p粉嫩大胆色噜噜噜噜亚洲| 中文字幕日韩精品一区| 亚洲成av人片观看| 国产一区二区三区四| 在线看国产一区二区| 日韩欧美激情在线| 亚洲日本青草视频在线怡红院 | 国产精品美女视频| 日本不卡中文字幕| 成人中文字幕合集| 欧美一区二区视频免费观看| 国产精品麻豆网站| 免费看精品久久片| 91在线无精精品入口| 欧美一区二区三区成人| 国产精品美女久久久久av爽李琼 | 17c精品麻豆一区二区免费| 舔着乳尖日韩一区| 成人高清av在线| 欧美老年两性高潮| 中文字幕的久久| 青椒成人免费视频| 在线观看一区二区视频| 国产三区在线成人av| 亚洲国产欧美另类丝袜| 成人av网站大全| 精品免费一区二区三区| 亚洲一区在线观看视频| 国产成人精品aa毛片| 制服丝袜中文字幕亚洲| 综合精品久久久| 国产在线看一区| 欧美高清一级片在线| 最新日韩av在线| 国产大陆亚洲精品国产| 日韩视频在线一区二区| 国产精品盗摄一区二区三区| 麻豆专区一区二区三区四区五区| 色综合天天狠狠| 欧美高清在线精品一区| 国产主播一区二区三区| 日韩一区二区在线看片| 亚洲免费观看视频| 不卡一区中文字幕| 中文无字幕一区二区三区 | 色吊一区二区三区| 18涩涩午夜精品.www| 成人免费看片app下载| 久久女同精品一区二区| 美女视频黄 久久| 欧美一级xxx| 免费在线观看日韩欧美| 日韩欧美一区二区视频| 免费看黄色91| 2020日本不卡一区二区视频| 久久av资源站| 精品久久久久一区二区国产| 久久精品国产秦先生| 欧美一区二区日韩一区二区| 肉色丝袜一区二区| 欧美一区二区三区四区视频| 免费看日韩精品| 精品国精品自拍自在线| 国产麻豆视频一区| 亚洲国产高清aⅴ视频| 成人黄色777网| 樱桃视频在线观看一区| 色8久久精品久久久久久蜜| 亚洲曰韩产成在线| 日韩一区二区三区视频在线| 精品制服美女久久| 国产日韩av一区| av日韩在线网站| 亚洲精品免费在线| 在线观看免费亚洲| 亚洲国产综合在线| 精品久久久久一区二区国产| 精品一区二区三区香蕉蜜桃| 欧美大片免费久久精品三p | 91啪亚洲精品| 亚洲美腿欧美偷拍| 91成人免费网站| 天天综合网天天综合色| 欧美喷潮久久久xxxxx| 日韩精品视频网站| 日韩视频在线观看一区二区| 韩国一区二区视频| 国产日韩亚洲欧美综合| 99re这里只有精品6| 亚洲国产成人高清精品| 精品美女被调教视频大全网站| 国产一区二区三区av电影 | 韩国v欧美v日本v亚洲v| 久久这里只有精品6| 成人午夜av电影| 亚洲1区2区3区视频| 日韩三级av在线播放| 激情综合色播五月| 日本一区二区不卡视频| 欧美日韩精品电影| 麻豆精品在线观看| 国产精品私人自拍| 欧美性xxxxxx少妇| 国产成人综合亚洲91猫咪| 亚洲国产成人私人影院tom| 日本二三区不卡| 亚洲手机成人高清视频| 日韩欧美亚洲国产另类| 高清不卡在线观看| 亚洲一区二区三区四区的| 精品国产凹凸成av人导航| 成人黄动漫网站免费app| 亚洲成a人片在线不卡一二三区| 日韩精品专区在线影院重磅| 色综合久久久久| 麻豆国产欧美一区二区三区| 欧美激情资源网| 欧美日本乱大交xxxxx| 成人免费高清在线| 香蕉久久夜色精品国产使用方法| 亚洲精品一区二区三区精华液| 国产乱码字幕精品高清av | 99精品视频在线播放观看|