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

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

?? zs.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 5 頁
字號:
		ZSLOG(REGDATA, ch, 0);		ch &= info->parity_mask;		ZSDELAY();		/* If this is the console keyboard, we need to handle		 * L1-A's here.		 */		if (info->cons_keyb) {			if (ch == SUNKBD_RESET) {				l1a_state.kbd_id = 1;				l1a_state.l1_down = 0;			} else if (l1a_state.kbd_id) {				l1a_state.kbd_id = 0;			} else if (ch == SUNKBD_L1) {				l1a_state.l1_down = 1;			} else if (ch == (SUNKBD_L1|SUNKBD_UP)) {				l1a_state.l1_down = 0;			} else if (ch == SUNKBD_A && l1a_state.l1_down) {				/* whee... */				batten_down_hatches();				/* Continue execution... */				l1a_state.l1_down = 0;				l1a_state.kbd_id = 0;				return;			}			sunkbd_inchar(ch, regs);			goto next_char;		}		if (info->cons_mouse) {			sun_mouse_inbyte(ch, 0);			goto next_char;		}		if (info->is_cons) {			if (ch == 0) {				/* whee, break received */				batten_down_hatches();				/* Continue execution... */				return;			}			/* It is a 'keyboard interrupt' ;-) */			wake_up(&keypress_wait);		}#ifndef __sparc_v9__		/* Look for kgdb 'stop' character, consult the gdb		 * documentation for remote target debugging and		 * arch/sparc/kernel/sparc-stub.c to see how all this works.		 */		if (info->kgdb_channel && (ch =='\003')) {			breakpoint();			return;		}#endif		if (!tty)			return;		do_queue_task++;		if (tty->flip.count >= TTY_FLIPBUF_SIZE)			break;		tty->flip.count++;		if (r1 & PAR_ERR)			*tty->flip.flag_buf_ptr++ = TTY_PARITY;		else if (r1 & Rx_OVR)			*tty->flip.flag_buf_ptr++ = TTY_OVERRUN;		else if (r1 & CRC_ERR)			*tty->flip.flag_buf_ptr++ = TTY_FRAME;		else			*tty->flip.flag_buf_ptr++ = 0;		*tty->flip.char_buf_ptr++ = ch;	next_char:		{			unsigned char stat;			/* Check if we have another character... */			stat = sbus_readb(&info->zs_channel->control);			ZSDELAY();			ZSLOG(REGCTRL, stat, 0);			if (!(stat & Rx_CH_AV))				break;		}	}	if (do_queue_task != 0)		queue_task(&tty->flip.tqueue, &tq_timer);}static void transmit_chars(struct sun_serial *info){	struct tty_struct *tty = info->tty;	if (info->x_char) {		/* Send next char */		zs_put_char(info->zs_channel, info->x_char);		info->x_char = 0;		return;	}	if ((info->xmit_cnt <= 0) || (tty != 0 && tty->stopped)) {		/* That's peculiar... */		sbus_writeb(RES_Tx_P, &info->zs_channel->control);		ZSDELAY();		ZS_WSYNC(info->zs_channel);		ZSLOG(REGCTRL, RES_Tx_P, 1);		return;	}	/* Send char */	zs_put_char(info->zs_channel, info->xmit_buf[info->xmit_tail++]);	info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);	info->xmit_cnt--;	if (info->xmit_cnt < WAKEUP_CHARS)		zs_sched_event(info, RS_EVENT_WRITE_WAKEUP);	if (info->xmit_cnt <= 0) {		sbus_writeb(RES_Tx_P, &info->zs_channel->control);		ZSDELAY();		ZS_WSYNC(info->zs_channel);		ZSLOG(REGCTRL, RES_Tx_P, 1);	}}static void status_handle(struct sun_serial *info){	unsigned char status;	/* Get status from Read Register 0 */	status = sbus_readb(&info->zs_channel->control);	ZSDELAY();	ZSLOG(REGCTRL, status, 0);	/* Clear status condition... */	sbus_writeb(RES_EXT_INT, &info->zs_channel->control);	ZSDELAY();	ZS_WSYNC(info->zs_channel);	ZSLOG(REGCTRL, RES_EXT_INT, 1);#if 0	if (status & DCD) {		if ((info->tty->termios->c_cflag & CRTSCTS) &&		    ((info->curregs[3] & AUTO_ENAB)==0)) {			info->curregs[3] |= AUTO_ENAB;			write_zsreg(info->zs_channel, 3, info->curregs[3]);		}	} else {		if ((info->curregs[3] & AUTO_ENAB)) {			info->curregs[3] &= ~AUTO_ENAB;			write_zsreg(info->zs_channel, 3, info->curregs[3]);		}	}#endif	/* Whee, if this is console input and this is a	 * 'break asserted' status change interrupt, call	 * the boot prom.	 */	if (status & BRK_ABRT) {		if (info->break_abort)			batten_down_hatches();		if (info->cons_mouse)			sun_mouse_inbyte(0, 1);	}	/* XXX Whee, put in a buffer somewhere, the status information	 * XXX whee whee whee... Where does the information go...	 */	return;}/* * This is the serial driver's generic interrupt routine */void zs_interrupt(int irq, void *dev_id, struct pt_regs * regs){	struct sun_serial *info;	int i;	info = (struct sun_serial *)dev_id;	ZSLOG(REGIRQ, 0, 0);	for (i = 0; i < NUM_SERIAL; i++) {		unsigned char r3 = read_zsreg(info->zs_channel, 3);		/* Channel A -- /dev/ttya or /dev/kbd, could be the console */		if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {			sbus_writeb(RES_H_IUS, &info->zs_channel->control);			ZSDELAY();			ZS_WSYNC(info->zs_channel);			ZSLOG(REGCTRL, RES_H_IUS, 1);			if (r3 & CHARxIP)				receive_chars(info, regs);			if (r3 & CHAEXT)				status_handle(info);			if (r3 & CHATxIP)				transmit_chars(info);		}		/* Channel B -- /dev/ttyb or /dev/mouse, could be the console */		info = info->zs_next;		if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {			sbus_writeb(RES_H_IUS, &info->zs_channel->control);			ZSDELAY();			ZS_WSYNC(info->zs_channel);			ZSLOG(REGCTRL, RES_H_IUS, 1);			if (r3 & CHBRxIP)				receive_chars(info, regs);			if (r3 & CHBEXT)				status_handle(info);			if (r3 & CHBTxIP)				transmit_chars(info);		}		info = info->zs_next;	}}/* * ------------------------------------------------------------------- * Here ends the serial interrupt routines. * ------------------------------------------------------------------- *//* * This routine is used to handle the "bottom half" processing for the * serial driver, known also the "software interrupt" processing. * This processing is done at the kernel interrupt level, after the * zs_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This * is where time-consuming activities which can not be done in the * interrupt driver proper are done; the interrupt driver schedules * them using zs_sched_event(), and they get done here. */static void do_serial_bh(void){	run_task_queue(&tq_serial);}static void do_softint(void *private_){	struct sun_serial	*info = (struct sun_serial *) private_;	struct tty_struct	*tty;		tty = info->tty;	if (!tty)		return;	if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {		if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&		    tty->ldisc.write_wakeup)			(tty->ldisc.write_wakeup)(tty);		wake_up_interruptible(&tty->write_wait);	}}/* * This routine is called from the scheduler tqueue when the interrupt * routine has signalled that a hangup has occurred.  The path of * hangup processing is: * * 	serial interrupt routine -> (scheduler tqueue) -> * 	do_serial_hangup() -> tty->hangup() -> zs_hangup() *  */static void do_serial_hangup(void *private_){	struct sun_serial	*info = (struct sun_serial *) private_;	struct tty_struct	*tty;		tty = info->tty;	if (!tty)		return;#ifdef SERIAL_DEBUG_OPEN	printk("do_serial_hangup<%p: tty-%d\n",		__builtin_return_address(0), info->line);#endif	tty_hangup(tty);}static int startup(struct sun_serial * info){	unsigned long flags;	if (info->flags & ZILOG_INITIALIZED)		return 0;	if (!info->xmit_buf) {		info->xmit_buf = (unsigned char *) get_free_page(GFP_KERNEL);		if (!info->xmit_buf)			return -ENOMEM;	}	save_flags(flags); cli();#ifdef SERIAL_DEBUG_OPEN	printk("Starting up tty-%d (irq %d)...\n", info->line, info->irq);#endif	/*	 * Clear the FIFO buffers and disable them	 * (they will be reenabled in change_speed())	 */	ZS_CLEARFIFO(info->zs_channel);	info->xmit_fifo_size = 1;	/*	 * Clear the interrupt registers.	 */	sbus_writeb(ERR_RES, &info->zs_channel->control);	ZSDELAY();	ZS_WSYNC(info->zs_channel);	ZSLOG(REGCTRL, ERR_RES, 1);	sbus_writeb(RES_H_IUS, &info->zs_channel->control);	ZSDELAY();	ZS_WSYNC(info->zs_channel);	ZSLOG(REGCTRL, RES_H_IUS, 1);	/*	 * Now, initialize the Zilog	 */	zs_rtsdtr(info, 1);	/*	 * Finally, enable sequencing and interrupts	 */	info->curregs[1] |= (info->curregs[1] & ~(RxINT_MASK)) |				(EXT_INT_ENAB | INT_ALL_Rx);	info->curregs[3] |= (RxENAB | Rx8);	/* We enable Tx interrupts as needed. */	info->curregs[5] |= (TxENAB | Tx8);	info->curregs[9] |= (NV | MIE);	write_zsreg(info->zs_channel, 3, info->curregs[3]);	write_zsreg(info->zs_channel, 5, info->curregs[5]);	write_zsreg(info->zs_channel, 9, info->curregs[9]);		/*	 * And clear the interrupt registers again for luck.	 */	sbus_writeb(ERR_RES, &info->zs_channel->control);	ZSDELAY();	ZS_WSYNC(info->zs_channel);	ZSLOG(REGCTRL, ERR_RES, 1);	sbus_writeb(RES_H_IUS, &info->zs_channel->control);	ZSDELAY();	ZS_WSYNC(info->zs_channel);	ZSLOG(REGCTRL, RES_H_IUS, 1);	if (info->tty)		clear_bit(TTY_IO_ERROR, &info->tty->flags);	info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;	/*	 * and set the speed of the serial port	 */	change_speed(info);	info->flags |= ZILOG_INITIALIZED;	restore_flags(flags);	return 0;}/* * This routine will shutdown a serial port; interrupts are disabled, and * DTR is dropped if the hangup on close termio flag is on. */static void shutdown(struct sun_serial * info){	unsigned long	flags;	if (!(info->flags & ZILOG_INITIALIZED))		return;#ifdef SERIAL_DEBUG_OPEN	printk("Shutting down serial port %d (irq %d)....", info->line,	       info->irq);#endif		save_flags(flags); cli(); /* Disable interrupts */		if (info->xmit_buf) {		free_page((unsigned long) info->xmit_buf);		info->xmit_buf = 0;	}	if (info->tty)		set_bit(TTY_IO_ERROR, &info->tty->flags);		info->flags &= ~ZILOG_INITIALIZED;	restore_flags(flags);}/* * This routine is called to set the UART divisor registers to match * the specified baud rate for a serial port. */static void change_speed(struct sun_serial *info){	unsigned cflag;	int	baud, quot = 0;	int	brg;	if (!info->tty || !info->tty->termios)		return;	cflag = info->tty->termios->c_cflag;	if (!info->port)		return;	baud = tty_get_baud_rate(info->tty);		if ((baud == 38400) && 	    ((info->flags & ZILOG_SPD_MASK) == ZILOG_SPD_CUST))		quot = info->custom_divisor;	if (quot) {		info->zs_baud = info->baud_base / quot;		info->clk_divisor = 16;		info->curregs[4] = X16CLK;		info->curregs[11] = TCBR | RCBR;		brg = BPS_TO_BRG(info->zs_baud, ZS_CLOCK/info->clk_divisor);		info->curregs[12] = (brg & 255);		info->curregs[13] = ((brg >> 8) & 255);		info->curregs[14] = BRSRC | BRENAB;		zs_rtsdtr(info, 1);	} else if (baud) {		info->zs_baud = baud;		info->clk_divisor = 16;		info->curregs[4] = X16CLK;		info->curregs[11] = TCBR | RCBR;		brg = BPS_TO_BRG(info->zs_baud, ZS_CLOCK/info->clk_divisor);		info->curregs[12] = (brg & 255);		info->curregs[13] = ((brg >> 8) & 255);		info->curregs[14] = BRSRC | BRENAB;		zs_rtsdtr(info, 1);	} else {		zs_rtsdtr(info, 0);		return;	}	/* byte size and parity */	switch (cflag & CSIZE) {	case CS5:		info->curregs[3] &= ~(RxN_MASK);		info->curregs[3] |= Rx5;		info->curregs[5] &= ~(TxN_MASK);		info->curregs[5] |= Tx5;		info->parity_mask = 0x1f;		break;	case CS6:		info->curregs[3] &= ~(RxN_MASK);		info->curregs[3] |= Rx6;		info->curregs[5] &= ~(TxN_MASK);		info->curregs[5] |= Tx6;		info->parity_mask = 0x3f;		break;	case CS7:		info->curregs[3] &= ~(RxN_MASK);		info->curregs[3] |= Rx7;		info->curregs[5] &= ~(TxN_MASK);		info->curregs[5] |= Tx7;		info->parity_mask = 0x7f;		break;	case CS8:	default: /* defaults to 8 bits */		info->curregs[3] &= ~(RxN_MASK);		info->curregs[3] |= Rx8;		info->curregs[5] &= ~(TxN_MASK);		info->curregs[5] |= Tx8;		info->parity_mask = 0xff;		break;	}	info->curregs[4] &= ~(0x0c);	if (cflag & CSTOPB) {		info->curregs[4] |= SB2;	} else {		info->curregs[4] |= SB1;	}	if (cflag & PARENB) {		info->curregs[4] |= PAR_ENAB;	} else {		info->curregs[4] &= ~PAR_ENAB;	}	if (!(cflag & PARODD)) {		info->curregs[4] |= PAR_EVEN;	} else {		info->curregs[4] &= ~PAR_EVEN;	}	/* Load up the new values */	load_zsregs(info, info->curregs);	return;}/* This is for mouse/keyboard output. * XXX mouse output??? can we send it commands??? XXX */static void kbd_put_char(unsigned char ch){	struct sun_zschannel *chan = zs_kbdchan;	unsigned long flags;	if(!chan)		return;	save_flags(flags); cli();	zs_put_char(chan, ch);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青青草国产精品亚洲专区无| 成人免费视频免费观看| 韩国成人在线视频| 97se亚洲国产综合在线| 欧美日韩精品系列| 国产精品三级在线观看| 天天综合色天天综合| 成人性生交大片免费看中文 | 日韩美女啊v在线免费观看| 午夜视频一区二区| 成人av电影在线观看| 欧美一区二区啪啪| 洋洋av久久久久久久一区| 国产suv精品一区二区883| 欧美疯狂做受xxxx富婆| 亚洲精品久久嫩草网站秘色| 国产久卡久卡久卡久卡视频精品| 欧美理论在线播放| 亚洲欧美日韩综合aⅴ视频| 国产成人综合在线观看| 日韩一区二区免费电影| 亚洲国产另类av| 欧美日韩在线免费视频| 亚洲免费av观看| 成人污污视频在线观看| 久久久亚洲精品石原莉奈| 美国十次了思思久久精品导航| 欧美在线free| 亚洲免费观看视频| 91在线视频免费91| 日韩一区中文字幕| a美女胸又www黄视频久久| 久久精品一区二区| 国产剧情一区在线| 国产亚洲成年网址在线观看| 国产一区二区精品久久| 欧美岛国在线观看| 麻豆freexxxx性91精品| 日韩久久久久久| 麻豆精品一二三| 精品91自产拍在线观看一区| 久久se精品一区二区| 精品精品国产高清一毛片一天堂| 蜜臀久久久99精品久久久久久| 欧美一级免费大片| 蜜桃精品在线观看| 精品国产一区二区三区久久久蜜月 | 精品国产免费人成电影在线观看四季 | 91在线无精精品入口| 亚洲欧美国产毛片在线| 欧美视频完全免费看| 秋霞影院一区二区| 精品91自产拍在线观看一区| 国产91清纯白嫩初高中在线观看| 国产欧美一区二区三区网站| 99久久婷婷国产综合精品| 亚洲欧美日本韩国| 欧美日本国产视频| 久久草av在线| 国产精品乱码一区二区三区软件 | 亚洲不卡在线观看| 日韩亚洲欧美高清| 国产精品一区二区三区网站| 中文字幕av不卡| 欧美唯美清纯偷拍| 九九精品一区二区| 亚洲视频一区二区在线观看| 欧美日韩一二三| 国产伦精一区二区三区| 亚洲人成网站色在线观看| 欧美另类videos死尸| 国产精品456露脸| 亚洲人123区| 精品美女在线播放| 91伊人久久大香线蕉| 日韩高清国产一区在线| 久久精品亚洲麻豆av一区二区 | 在线观看视频欧美| 久久精品国产99| 亚洲视频在线一区二区| 日韩欧美在线影院| 91女厕偷拍女厕偷拍高清| 日韩主播视频在线| 亚洲欧洲国产专区| 日韩视频一区二区在线观看| 99久久久久久| 国产在线精品一区二区不卡了| 亚洲精品免费视频| 久久久久久久久久久久电影| 欧美日本乱大交xxxxx| 成人午夜视频网站| 美女视频免费一区| 亚洲一区二区三区四区在线观看| 国产三级欧美三级| 欧美一区二区三区精品| 色婷婷av一区| 丁香婷婷综合五月| 精品一区二区三区日韩| 亚洲一级二级三级在线免费观看| 国产午夜精品久久久久久免费视 | 亚洲精品免费视频| 国产精品久久久久久亚洲毛片| 日韩欧美一二区| 6080午夜不卡| 欧美亚洲动漫精品| 91亚洲永久精品| 国产91清纯白嫩初高中在线观看 | 亚洲黄色小视频| 亚洲欧洲日韩一区二区三区| 国产亚洲一区二区三区| 精品伦理精品一区| 日韩欧美亚洲一区二区| 欧美精品 国产精品| 欧美日韩亚洲综合一区| 欧美在线你懂的| 欧美亚洲日本国产| 欧美怡红院视频| 欧美三级在线看| 欧美性受xxxx| 欧美日韩一区 二区 三区 久久精品| 色婷婷狠狠综合| 色哟哟一区二区| 欧洲精品在线观看| 欧美日韩一二三区| 91精品视频网| 精品久久久久久久久久久久久久久| 欧美一区二区三区四区五区| 日韩一级精品视频在线观看| 日韩精品在线一区| 久久久青草青青国产亚洲免观| 精品国产人成亚洲区| 久久久久综合网| 国产精品久久久久影院色老大| 国产精品视频麻豆| 亚洲三级免费观看| 亚洲综合自拍偷拍| 日韩影院免费视频| 国产在线视频精品一区| 国产成人8x视频一区二区| 91美女片黄在线观看91美女| 在线观看免费一区| 91精品福利在线一区二区三区| 亚洲精品一区二区三区福利| 国产区在线观看成人精品| 亚洲色图在线播放| 视频一区视频二区中文字幕| 韩国av一区二区三区四区| 粉嫩在线一区二区三区视频| 色婷婷综合五月| 日韩一区二区三区电影在线观看 | 亚洲精品国产一区二区三区四区在线| 亚洲精品欧美二区三区中文字幕| 婷婷国产在线综合| 国产乱对白刺激视频不卡| 成人av动漫在线| 欧美日韩国产大片| 国产丝袜在线精品| 亚洲第一久久影院| 国产激情偷乱视频一区二区三区| 91网站黄www| 欧美不卡一区二区三区四区| 中文字幕一区二区三| 日韩av一二三| 成人一级视频在线观看| 欧美肥妇bbw| 国产精品三级av| 蜜臀av性久久久久蜜臀aⅴ| 99久久综合国产精品| 日韩视频在线永久播放| 亚洲少妇屁股交4| 国产一区二区三区在线看麻豆| 色婷婷亚洲婷婷| 国产亚洲欧美中文| 日韩不卡手机在线v区| 99re热这里只有精品视频| 欧美r级在线观看| 亚洲国产另类精品专区| 成人av网在线| 久久日韩精品一区二区五区| 午夜视频在线观看一区二区 | 亚洲国产精品久久不卡毛片 | 国产精品456露脸| 制服丝袜亚洲网站| 一区二区三区免费看视频| 国产黄色精品网站| 精品国产免费人成在线观看| 无码av免费一区二区三区试看 | 国产精品三级av在线播放| 国产一区二区三区四区在线观看| 3d成人h动漫网站入口| 亚洲一级不卡视频| 久久久噜噜噜久久人人看 | 国产日韩欧美在线一区| 日韩不卡手机在线v区| 欧美日韩国产综合一区二区三区 | 亚洲国产精品ⅴa在线观看| 精品亚洲成av人在线观看| 日韩欧美亚洲一区二区| 日本中文字幕一区二区视频| 欧美日韩国产一二三|