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

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

?? serial.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
			if (recheck_count > 16)				printk("recheck_count = %d\n", recheck_count);#endif		}#ifdef ISR_HACK		serial_outp(info, UART_IER, 0);		serial_out(info, UART_IER, info->IER);#endif				info = info->next_port;		if (!info && !done) {			info = IRQ_ports[irq];			done = 1;			if (pass_number++ > 64)				break; 		/* Prevent infinite loops */		}	}	if ((info = IRQ_ports[irq]) != NULL) {#ifdef 0		do {			serial_outp(info, UART_IER, 0);			serial_out(info, UART_IER, info->IER);			info = info->next_port;		} while (info);#endif					if (irq && !done_work)			IRQ_timer[irq] = jiffies + 1500;		else			IRQ_timer[irq] = jiffies + IRQ_timeout[irq];		IRQ_active |= 1 << irq;	}	figure_RS_timer();}/* * ------------------------------------------------------------------- * Here ends the serial interrupt routines. * ------------------------------------------------------------------- *//* * This routine is called when we receive a break on a serial line. * It is executed out of the software interrupt routine. */static inline void handle_rs_break(struct async_struct *info){	if (info->flags & ASYNC_SAK)		do_SAK(info->tty);			if (!I_IGNBRK(info->tty) && I_BRKINT(info->tty)) {		flush_input(info->tty);		flush_output(info->tty);		if (info->tty->pgrp > 0)			kill_pg(info->tty->pgrp, SIGINT,1);	}}/* * 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 * rs_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 rs_sched_event(), and they get done here. */static void do_softint(void *unused){	int			i;	struct async_struct	*info;		for (i = 0, info = rs_table; i < NR_PORTS; i++,info++) {		if (clear_bit(i, rs_event)) {			if (!info->tty)					continue;			if (clear_bit(RS_EVENT_READ_PROCESS, &info->event)) {				TTY_READ_FLUSH(info->tty);			}			if (clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {				wake_up_interruptible(&info->tty->write_q.proc_list);			}			if (clear_bit(RS_EVENT_HANGUP, &info->event)) {				tty_hangup(info->tty);				wake_up_interruptible(&info->open_wait);				info->flags &= ~(ASYNC_NORMAL_ACTIVE|						 ASYNC_CALLOUT_ACTIVE);			}			if (clear_bit(RS_EVENT_BREAK, &info->event))				handle_rs_break(info);			if (clear_bit(RS_EVENT_OPEN_WAKEUP, &info->event)) {				wake_up_interruptible(&info->open_wait);			}		}	}}/* * This subroutine is called when the RS_TIMER goes off.  It is used * by the serial driver to run the rs_interrupt routine at certain * intervals, either because a serial interrupt might have been lost, * or because (in the case of IRQ=0) the serial port does not have an * interrupt, and is being checked only via the timer interrupts. */static void rs_timer(void){	int	i, mask;	int	timeout = 0;	for (i = 0, mask = 1; mask <= IRQ_active; i++, mask <<= 1) {		if ((mask & IRQ_active) && (IRQ_timer[i] <= jiffies)) {			IRQ_active &= ~mask;			cli();#ifdef SERIAL_DEBUG_TIMER			printk("rs_timer: rs_interrupt(%d)...", i);#endif			rs_interrupt(i);			sti();		}		if (mask & IRQ_active) {			if (!timeout || (IRQ_timer[i] < timeout))				timeout = IRQ_timer[i];		}	}	if (timeout) {		timer_table[RS_TIMER].expires = timeout;		timer_active |= 1 << RS_TIMER;	}}/* * --------------------------------------------------------------- * Low level utility subroutines for the serial driver:  routines to * figure out the appropriate timeout for an interrupt chain, routines * to initialize and startup a serial port, and routines to shutdown a * serial port.  Useful stuff like that. * --------------------------------------------------------------- *//* * Grab all interrupts in preparation for doing an automatic irq * detection.  dontgrab is a mask of irq's _not_ to grab.  Returns a * mask of irq's which were grabbed and should therefore be freed * using free_all_interrupts(). */static int grab_all_interrupts(int dontgrab){	int 			irq_lines = 0;	int			i, mask;	struct sigaction 	sa;		sa.sa_handler = rs_probe;	sa.sa_flags = (SA_INTERRUPT);	sa.sa_mask = 0;	sa.sa_restorer = NULL;		for (i = 0, mask = 1; i < 16; i++, mask <<= 1) {		if (!(mask & dontgrab) && !irqaction(i, &sa)) {			irq_lines |= mask;		}	}	return irq_lines;}/* * Release all interrupts grabbed by grab_all_interrupts */static void free_all_interrupts(int irq_lines){	int	i;		for (i = 0; i < 16; i++) {		if (irq_lines & (1 << i))			free_irq(i);	}}/* * This routine figures out the correct timeout for a particular IRQ. * It uses the smallest timeout of all of the serial ports in a * particular interrupt chain. */static void figure_IRQ_timeout(int irq){	struct	async_struct	*info;	int	timeout = 6000;	/* 60 seconds === a long time :-) */	info = IRQ_ports[irq];	if (!info) {		IRQ_timeout[irq] = 6000;		return;	}	while (info) {		if (info->timeout < timeout)			timeout = info->timeout;		info = info->next_port;	}	if (!irq)		timeout = timeout / 2;	IRQ_timeout[irq] = timeout ? timeout : 1;}static int startup(struct async_struct * info, int get_irq){	unsigned short ICP;	unsigned long flags;	struct sigaction	sa;	int			retval;	if (info->flags & ASYNC_INITIALIZED)		return 0;	if (!info->port || !info->type) {		if (info->tty)			set_bit(TTY_IO_ERROR, &info->tty->flags);		return 0;	}	save_flags(flags); cli();#ifdef SERIAL_DEBUG_OPEN	printk("starting up ttys%d (irq %d)...", info->line, info->irq);#endif	/*	 * Allocate the IRQ if necessary	 */	if (get_irq && info->irq && !IRQ_ports[info->irq]) {		sa.sa_handler = rs_interrupt;		sa.sa_flags = (SA_INTERRUPT);		sa.sa_mask = 0;		sa.sa_restorer = NULL;		retval = irqaction(info->irq,&sa);		if (retval) {			restore_flags(flags);			return retval;		}	}	/*	 * Clear the FIFO buffers and disable them	 * (they will be reenabled in change_speed())	 */	if (info->type == PORT_16550A) {		serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR |					     UART_FCR_CLEAR_XMIT));		info->xmit_fifo_size = 16;	} else		info->xmit_fifo_size = 1;	/*	 * Clear the interrupt registers.	 */	(void)serial_inp(info, UART_LSR);	(void)serial_inp(info, UART_RX);	(void)serial_inp(info, UART_IIR);	(void)serial_inp(info, UART_MSR);	/*	 * Now, initialize the UART 	 */	serial_outp(info, UART_LCR, UART_LCR_WLEN8);	/* reset DLAB */	if (info->flags & ASYNC_FOURPORT) 		serial_outp(info, UART_MCR, UART_MCR_DTR | UART_MCR_RTS);	else		serial_outp(info, UART_MCR,			    UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);		/*	 * Finally, enable interrupts	 */#ifdef ISR_HACK	info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;	serial_outp(info, UART_IER, info->IER);	/* enable interrupts */#else	info->IER = (UART_IER_MSI | UART_IER_RLSI |		     UART_IER_THRI | UART_IER_RDI);	serial_outp(info, UART_IER, info->IER);	/* enable all intrs */#endif	if (info->flags & ASYNC_FOURPORT) {		/* Enable interrupts on the AST Fourport board */		ICP = (info->port & 0xFE0) | 0x01F;		outb_p(0x80, ICP);		(void) inb_p(ICP);	}	/*	 * And clear the interrupt registers again for luck.	 */	(void)serial_inp(info, UART_LSR);	(void)serial_inp(info, UART_RX);	(void)serial_inp(info, UART_IIR);	(void)serial_inp(info, UART_MSR);	if (info->tty)		clear_bit(TTY_IO_ERROR, &info->tty->flags);	/*	 * Set up parity check flag	 */	if (info->tty && info->tty->termios && I_INPCK(info->tty))		info->read_status_mask = (UART_LSR_OE | UART_LSR_BI |					  UART_LSR_FE | UART_LSR_PE);	else		info->read_status_mask = (UART_LSR_OE | UART_LSR_BI |					  UART_LSR_FE);	/*	 * Insert serial port into IRQ chain.	 */	info->prev_port = 0;	info->next_port = IRQ_ports[info->irq];	if (info->next_port)		info->next_port->prev_port = info;	IRQ_ports[info->irq] = info;	figure_IRQ_timeout(info->irq);	/*	 * Set up serial timers...	 */	IRQ_active |= 1 << info->irq;	figure_RS_timer();	/*	 * and set the speed of the serial port	 */	change_speed(info->line);	info->flags |= ASYNC_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 async_struct * info, int do_free_irq){	unsigned long flags;	if (!(info->flags & ASYNC_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 */		/*	 * First unlink the serial port from the IRQ chain...	 */	if (info->next_port)		info->next_port->prev_port = info->prev_port;	if (info->prev_port)		info->prev_port->next_port = info->next_port;	else		IRQ_ports[info->irq] = info->next_port;	figure_IRQ_timeout(info->irq);		/*	 * Free the IRQ, if necessary	 */	if (do_free_irq && info->irq && !IRQ_ports[info->irq])		free_irq(info->irq);		info->IER = 0;	serial_outp(info, UART_IER, 0x00);	/* disable all intrs */	if (info->flags & ASYNC_FOURPORT) {		/* reset interrupts on the AST Fourport board */		(void) inb((info->port & 0xFE0) | 0x01F);	}	if (info->tty && !(info->tty->termios->c_cflag & HUPCL))		serial_outp(info, UART_MCR, UART_MCR_DTR);	else		/* reset DTR,RTS,OUT_2 */				serial_outp(info, UART_MCR, 0x00);	/* disable FIFO's */		serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR |				     UART_FCR_CLEAR_XMIT));	(void)serial_in(info, UART_RX);    /* read data port to reset things */		if (info->tty)		set_bit(TTY_IO_ERROR, &info->tty->flags);		info->flags &= ~ASYNC_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(unsigned int line){	struct async_struct * info;	unsigned short port;	int	quot = 0;	unsigned cflag,cval,mcr,fcr;	int	i;	if (line >= NR_PORTS)		return;	info = rs_table + line;	if (!info->tty || !info->tty->termios)		return;	cflag = info->tty->termios->c_cflag;	if (!(port = info->port))		return;	i = cflag & CBAUD;	if (i == 15) {		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)			i += 1;		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)			i += 2;		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)			quot = info->custom_divisor;	}	if (quot) {		info->timeout = ((info->xmit_fifo_size*HZ*15*quot) /				 info->baud_base) + 2;	} else if (baud_table[i] == 134) {		quot = (2*info->baud_base / 269);		info->timeout = (info->xmit_fifo_size*HZ*30/269) + 2;	} else if (baud_table[i]) {		quot = info->baud_base / baud_table[i];		info->timeout = (info->xmit_fifo_size*HZ*15/baud_table[i]) + 2;	} else {		quot = 0;		info->timeout = 0;	}	cli();	mcr = serial_in(info, UART_MCR);	if (quot) {		serial_out(info, UART_MCR, mcr | UART_MCR_DTR);	} else {		serial_out(info, UART_MCR, mcr & ~UART_MCR_DTR);		sti();		return;	}	sti();	/* byte size and parity */	cval = cflag & (CSIZE | CSTOPB);	cval >>= 4;	if (cflag & PARENB)		cval |= UART_LCR_PARITY;	if (!(cflag & PARODD))		cval |= UART_LCR_EPAR;	if (info->type == PORT_16550A) {		if ((info->baud_base / quot) < 2400)			fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;		else			fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8;	} else		fcr = 0;		cli();	serial_outp(info, UART_LCR, cval | UART_LCR_DLAB);	/* set DLAB */	serial_outp(info, UART_DLL, quot & 0xff);	/* LS of divisor */	serial_outp(info, UART_DLM, quot >> 8);		/* MS of divisor */	serial_outp(info, UART_LCR, cval);		/* reset DLAB */	serial_outp(info, UART_FCR, fcr); 	/* set fcr */	sti();}/* * ------------------------------------------------------------ * rs_write() and friends * ------------------------------------------------------------ *//* * This routine is used by rs_write to restart transmitter interrupts, * which are disabled after we have a transmitter interrupt which went * unacknowledged because we had run out of data to transmit. *  * Note: this subroutine must be called with the interrupts *off* */static inline void restart_port(struct async_struct *info){	struct tty_queue * queue;	int head, tail, count;		if (!info)		return;	if (serial_inp(info, UART_LSR) & UART_LSR_THRE) {		if (info->x_char) {			serial_outp(info, UART_TX, info->x_char);			info->x_char = 0;		} else {			queue = &info->tty->write_q;			head = queue->head;			tail = queue->tail;			count = info->xmit_fifo_size;			while (count--) {				if (tail == head)					break;				serial_outp(info, UART_TX, queue->buf[tail++]);				tail &= TTY_BUF_SIZE-1;			}			queue->tail = tail;		}	}}	/* * This routine gets called when tty_write has put something into * the write_queue.   */void rs_write(struct tty_struct * tty){	struct async_struct *info;	if (!tty || tty->stopped || tty->hw_stopped)		return;	info = rs_table + DEV_TO_SL(tty->line);	cli();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产普通话蜜臀| 粉嫩蜜臀av国产精品网站| 一本色道久久综合亚洲精品按摩| 久久精品夜色噜噜亚洲a∨| 国内精品不卡在线| 精品国产乱码久久久久久久| 精品制服美女久久| 亚洲国产成人在线| 99re热这里只有精品免费视频 | 蜜臀av一区二区| 欧美xxx久久| 成人av先锋影音| 亚洲影视资源网| 日韩欧美一区二区久久婷婷| 国产风韵犹存在线视精品| 国产精品久久久久9999吃药| 91成人免费网站| 亚洲一线二线三线视频| 日韩三级视频中文字幕| 国产成人免费视频精品含羞草妖精| 国产精品久久久久久久岛一牛影视| www.综合网.com| 午夜电影一区二区| 国产亚洲精品超碰| 欧美日韩在线精品一区二区三区激情 | 国产真实乱偷精品视频免| 国产精品女人毛片| 欧美日韩国产中文| 国产精品888| 亚洲第一综合色| 久久精品男人天堂av| 欧美亚洲高清一区二区三区不卡| 精品一区二区在线观看| 麻豆中文一区二区| 亚洲天堂网中文字| 欧美成人精品3d动漫h| 91丝袜高跟美女视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品久久久久久久久搜平片 | 在线视频一区二区三区| 国内精品伊人久久久久av一坑| 亚洲码国产岛国毛片在线| 日韩欧美国产三级电影视频| 色婷婷香蕉在线一区二区| 韩国中文字幕2020精品| 午夜精品一区在线观看| 国产精品久久影院| 精品欧美一区二区久久 | 91麻豆精品国产综合久久久久久| 国产成a人亚洲| 全国精品久久少妇| 一区二区三区精品视频在线| 国产欧美日产一区| 欧美xxxx在线观看| 欧美二区三区91| 91久久香蕉国产日韩欧美9色| 国产成人免费视频精品含羞草妖精| 日韩一区精品视频| 亚洲影院在线观看| 亚洲精品国产一区二区精华液 | 自拍偷拍欧美激情| 久久久不卡网国产精品一区| 日韩精品中文字幕一区二区三区 | 成人高清伦理免费影院在线观看| 久久精品国产一区二区三| 天天操天天综合网| 亚洲午夜在线观看视频在线| 一区二区三区在线影院| 国产精品欧美久久久久一区二区| 国产欧美一二三区| 国产欧美一区二区精品性色超碰 | 中文字幕欧美国产| 久久精品一区二区| 久久久激情视频| 欧美成人三级电影在线| 国产精品网站在线| 中文字幕一区在线观看视频| 97se狠狠狠综合亚洲狠狠| 大桥未久av一区二区三区中文| 国产综合色产在线精品| 国产精品羞羞答答xxdd | 国产精品资源站在线| 久久电影网电视剧免费观看| 免费xxxx性欧美18vr| 久久99久国产精品黄毛片色诱| 看电视剧不卡顿的网站| 激情综合色综合久久| 国产一区二区久久| 成人午夜av电影| 成人理论电影网| 色综合天天综合狠狠| 欧美在线观看视频在线| 欧美日韩免费视频| 欧美一区二区三区的| 久久综合久久久久88| 国产欧美一区视频| 亚洲男人的天堂在线aⅴ视频| 夜夜亚洲天天久久| 日韩电影免费在线观看网站| 毛片不卡一区二区| 国产精品 日产精品 欧美精品| 国产成人福利片| 欧美怡红院视频| 在线播放91灌醉迷j高跟美女 | 在线播放欧美女士性生活| 欧美精品一区二区三区四区| 国产婷婷色一区二区三区四区| 亚洲欧洲另类国产综合| 午夜一区二区三区视频| 九色综合狠狠综合久久| 99v久久综合狠狠综合久久| 欧美日韩高清一区二区不卡| 精品盗摄一区二区三区| 亚洲丝袜精品丝袜在线| 亚洲视频在线一区二区| 精品在线视频一区| 亚洲精品日韩综合观看成人91| 亚洲成a人片在线观看中文| 久久国产福利国产秒拍| 色综合天天综合色综合av | 亚洲中国最大av网站| 精品一区二区在线看| 在线观看www91| 亚洲一区中文在线| 国产在线播放一区三区四| 91国偷自产一区二区使用方法| 精品美女在线播放| 有码一区二区三区| 国产大陆亚洲精品国产| 欧美日产在线观看| 国产精品免费久久久久| 免费在线观看精品| 色婷婷综合久久久中文字幕| 久久久久综合网| 日韩在线播放一区二区| 97精品电影院| 国产亚洲人成网站| 免费在线一区观看| 欧美日韩二区三区| 国产精品久久久爽爽爽麻豆色哟哟| 青青草伊人久久| 欧美性生活大片视频| 中文字幕亚洲在| 国产成人精品aa毛片| 欧美精品一区二区三区在线| 青青草视频一区| 在线不卡一区二区| 亚洲国产欧美另类丝袜| 91网站在线播放| 国产精品久久国产精麻豆99网站| 国产精品主播直播| 日韩欧美综合在线| 日韩成人伦理电影在线观看| 欧美影视一区在线| 亚洲一级电影视频| 91国产丝袜在线播放| 亚洲视频免费在线观看| 高清免费成人av| 国产女人水真多18毛片18精品视频 | 久久精品欧美一区二区三区麻豆 | 国产精品乱人伦一区二区| 激情深爱一区二区| 久久亚洲综合色一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 91精品婷婷国产综合久久性色| 亚洲一区二区三区四区的| 色综合色综合色综合色综合色综合 | 国产亚洲一区二区三区在线观看| 国产在线不卡一卡二卡三卡四卡| 精品国产一区二区三区久久影院| 美国十次综合导航| 欧美tk—视频vk| 国产高清在线观看免费不卡| 久久久久综合网| 福利一区二区在线观看| 国产精品久久久久久久久果冻传媒 | 欧美极品xxx| eeuss国产一区二区三区| 国产精品乱子久久久久| 一本一道久久a久久精品| 亚洲国产一区视频| 91精品国产综合久久久久久漫画| 免费观看在线综合| 精品国产亚洲一区二区三区在线观看| 经典三级一区二区| 日本一区二区三区在线不卡| 色伊人久久综合中文字幕| 亚洲国产精品嫩草影院| 日韩你懂的在线播放| 国产成人午夜精品5599| 日韩美女视频一区二区| 欧美日韩三级一区二区| 狠狠色伊人亚洲综合成人| 国产精品免费av| 欧美网站大全在线观看| 精品一区二区三区影院在线午夜| 亚洲国产高清aⅴ视频| 欧美午夜电影一区| 欧美怡红院视频| 韩日欧美一区二区三区|